blob: 883c560c695e873fc910de1b1160f8699a51ed94 [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),
Jens Wiklander16de19d2022-12-09 18:00:08 +01001314 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_224, TEE_TYPE_HMAC_SHA3_224,
1315 mac_data_sha3_224_key1,
1316 13, mac_data_sha3_224_in1, mac_data_sha3_224_out1),
1317 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_256, TEE_TYPE_HMAC_SHA3_256,
1318 mac_data_sha3_256_key1,
1319 13, mac_data_sha3_256_in1, mac_data_sha3_256_out1),
1320 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_384, TEE_TYPE_HMAC_SHA3_384,
1321 mac_data_sha3_384_key1,
1322 13, mac_data_sha3_384_in1, mac_data_sha3_384_out1),
1323 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA3_512, TEE_TYPE_HMAC_SHA3_512,
1324 mac_data_sha3_512_key1,
1325 13, mac_data_sha3_512_in1, mac_data_sha3_512_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02001326
1327 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1328 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1329 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1330 17),
1331 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1332 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1333 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1334 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1335 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1336 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1337 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001338 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001339
1340 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1341 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1342 ARRAY_SIZE(mac_cmac_vect1_out) },
1343 XTEST_MAC_CMAC_CASE(vect2, 9),
1344 XTEST_MAC_CMAC_CASE(vect3, 9),
1345 XTEST_MAC_CMAC_CASE(vect4, 9),
1346 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1347 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1348 ARRAY_SIZE(mac_cmac_vect5_out) },
1349 XTEST_MAC_CMAC_CASE(vect6, 9),
1350 XTEST_MAC_CMAC_CASE(vect7, 9),
1351 XTEST_MAC_CMAC_CASE(vect8, 9),
1352 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1353 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1354 ARRAY_SIZE(mac_cmac_vect9_out) },
1355 XTEST_MAC_CMAC_CASE(vect10, 9),
1356 XTEST_MAC_CMAC_CASE(vect11, 9),
1357 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001358 XTEST_MAC_CMAC_CASE(vect12, 16),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001359
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001360 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1361 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1362 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1363 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1364 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1365 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1366 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1367 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1368 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1369 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1370 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1371 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1372
Jerome Forissier9f17e262019-12-13 14:12:41 +01001373 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1374 mac_data_sm3_d31_key,
1375 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1376 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1377 mac_data_sm3_d32_key,
1378 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001379};
1380
1381static void xtest_tee_test_4002(ADBG_Case_t *c)
1382{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001383 TEEC_Session session = { };
1384 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1385 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001386 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001387 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1388 uint8_t out[64] = { };
1389 size_t out_size = 0;
1390 uint32_t ret_orig = 0;
1391 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001392
1393 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1394 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1395 &ret_orig)))
1396 return;
1397
1398 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001399 TEE_Attribute key_attr = { };
1400 size_t key_size = 0;
1401 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001402
1403 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1404 (int)n, (unsigned int)mac_cases[n].algo);
1405
1406 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1407 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1408 key_attr.content.ref.length = mac_cases[n].key_len;
1409
1410 key_size = key_attr.content.ref.length * 8;
1411 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1412 mac_cases[n].key_type == TEE_TYPE_DES3)
1413 /* Exclude parity in bit size of key */
1414 key_size -= key_size / 8;
1415
1416 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1417 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1418 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1419 goto out;
1420
1421 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1422 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1423 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1424 goto out;
1425
1426 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001427 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1428 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1429 goto out;
1430
1431 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001432 ta_crypt_cmd_allocate_transient_object(c, &session,
1433 mac_cases[n].key_type, key_size, &key_handle)))
1434 goto out;
1435
1436 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1437 ta_crypt_cmd_populate_transient_object(c, &session,
1438 key_handle, &key_attr, 1)))
1439 goto out;
1440
1441 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1442 ta_crypt_cmd_set_operation_key(c, &session, op1,
1443 key_handle)))
1444 goto out;
1445
1446 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1447 ta_crypt_cmd_free_transient_object(c, &session,
1448 key_handle)))
1449 goto out;
1450
1451 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1452 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1453 goto out;
1454
Jerome Forissier4f419512021-07-07 14:56:10 +02001455 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1456 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1457 goto out;
1458
Jerome Forissier3dec7442019-01-30 17:50:05 +01001459 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001460 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001461 while (offs + mac_cases[n].in_incr <
1462 mac_cases[n].in_len) {
1463 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1464 ta_crypt_cmd_mac_update(c, &session,
1465 op1, mac_cases[n].in + offs,
1466 mac_cases[n].in_incr)))
1467 goto out;
1468 offs += mac_cases[n].in_incr;
1469 if (!mac_cases[n].multiple_incr)
1470 break;
1471 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001472 }
1473
1474 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1475 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1476 goto out;
1477
1478 out_size = sizeof(out);
1479 memset(out, 0, sizeof(out));
1480 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1481 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001482 mac_cases[n].in + offs,
1483 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001484 out, &out_size)))
1485 goto out;
1486
1487 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1488 mac_cases[n].out_len, out, out_size);
1489
1490 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1491 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1492 goto out;
1493
1494 out_size = sizeof(out);
1495 memset(out, 0, sizeof(out));
1496 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1497 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1498 mac_cases[n].in, mac_cases[n].in_len, out,
1499 &out_size)))
1500 goto out;
1501
1502 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1503 mac_cases[n].out_len, out, out_size);
1504
1505 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001506 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1507 mac_cases[n].in, mac_cases[n].in_len,
1508 mac_cases[n].out, mac_cases[n].out_len)))
1509 goto out;
1510
1511 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001512 ta_crypt_cmd_free_operation(c, &session, op1)))
1513 goto out;
1514
1515 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1516 ta_crypt_cmd_free_operation(c, &session, op2)))
1517 goto out;
1518
Jerome Forissier4f419512021-07-07 14:56:10 +02001519 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1520 ta_crypt_cmd_free_operation(c, &session, op3)))
1521 goto out;
1522
Pascal Brandc639ac82015-07-02 08:53:34 +02001523 Do_ADBG_EndSubCase(c, NULL);
1524 }
1525out:
1526 TEEC_CloseSession(&session);
1527}
Jens Wiklander14f48872018-06-29 15:30:13 +02001528ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1529 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001530
Pascal Brandc639ac82015-07-02 08:53:34 +02001531static const uint8_t ciph_data_aes_key1[] = {
1532 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1533 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1534};
1535
Jerome Forissier0780ad42018-06-05 15:02:37 +02001536static const uint8_t ciph_data_aes_key2[] = {
1537 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1538 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1539};
1540
Pascal Brandc639ac82015-07-02 08:53:34 +02001541static const uint8_t ciph_data_des_key1[] = {
1542 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1543};
1544
1545static const uint8_t ciph_data_des_key2[] = {
1546 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1547};
1548
1549
1550static const uint8_t ciph_data_des3_key1[] = {
1551 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1552 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1553 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1554};
1555
1556static const uint8_t ciph_data_des3_key2[] = {
1557 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1558 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1559 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1560};
1561
1562static const uint8_t ciph_data_des2_key1[] = {
1563 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1564 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1565};
1566
1567static const uint8_t ciph_data_in1[] = {
1568 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1569 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1570 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1571 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1572 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1573 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1574};
1575
1576static const uint8_t ciph_data_in3[] = {
1577 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1578 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1579 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1580 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1581 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1582 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1583};
1584
Jerome Forissier45218eb2018-04-11 13:03:26 +02001585static const uint8_t ciph_data_in4[] = {
1586 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1587 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1588 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1589 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1590 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1591 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1592 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1593 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1594};
1595
Jerome Forissier0780ad42018-06-05 15:02:37 +02001596static const uint8_t ciph_data_in5[] = {
1597 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1598 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1599 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1600 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1601 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1602 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1603 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1604 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001605 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1606 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001607 0x01, 0x01, 0x01
1608};
1609
Pascal Brandc639ac82015-07-02 08:53:34 +02001610static const uint8_t ciph_data_128_iv1[] = {
1611 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1612 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1613};
1614
Jerome Forissier0780ad42018-06-05 15:02:37 +02001615static const uint8_t ciph_data_128_iv2[] = {
1616 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1617 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1618};
1619
Pascal Brandc639ac82015-07-02 08:53:34 +02001620static const uint8_t ciph_data_64_iv1[] = {
1621 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1622};
1623
1624static const uint8_t ciph_data_in2[] = {
1625 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1626};
1627
1628static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1629 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1630 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1631 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1632 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1633 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1634 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1635};
1636
1637static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1638 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1639 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1640 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1641 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1642 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1643 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1644};
1645
1646static const uint8_t ciph_data_aes_ctr_out1[] = {
1647 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1648 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1649 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1650 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1651 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1652 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1653};
1654
1655static const uint8_t ciph_data_aes_ctr_out2[] = {
1656 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1657 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1658 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1659 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1660 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1661 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1662};
1663
Jerome Forissier45218eb2018-04-11 13:03:26 +02001664static const uint8_t ciph_data_aes_ctr_out4[] = {
1665 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1666 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1667 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1668 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1669 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1670 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1671 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1672 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1673};
1674
Jerome Forissier0780ad42018-06-05 15:02:37 +02001675static const uint8_t ciph_data_aes_ctr_out5[] = {
1676 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1677 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1678 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1679 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1680 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1681 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1682 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1683 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001684 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1685 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1686 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001687};
1688
Pascal Brandc639ac82015-07-02 08:53:34 +02001689static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1690 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1691 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1692};
1693
1694static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1695 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1696 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1697};
1698
1699static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1700 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1701 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1702 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1703 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1704 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1705 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1706 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1707 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1708 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1709 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1710 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1711 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1712 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1713 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1714 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1715 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1716 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1717 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1718 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1719 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1720};
1721
1722static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1723 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1724 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1725 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1726 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1727 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1728 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1729 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1730 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1731 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1732 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1733 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1734 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1735 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1736 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1737 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1738 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1739 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1740 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1741 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1742 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1743};
1744
1745/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1746 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1747static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1748 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1749 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1750};
1751
1752static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1753 0x00
1754};
1755
1756static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1757 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1758 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1759 0x20
1760};
1761
1762static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1763 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1764 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1765 0x97
1766};
1767
1768#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1769#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1770static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1771 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1772 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1773 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1774 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1775};
1776
1777static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1778 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1779 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1780 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1781 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1782};
1783
1784#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1785#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1786static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1787 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1788 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1789 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1790 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1791};
1792
1793static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1794 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1795 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1796 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1797 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1798};
1799
1800#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1801#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1802static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1803 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1804 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1805 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1806 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1807 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1808 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1809};
1810
1811static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1812 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1813 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1814 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1815 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1816 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1817 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1818};
1819
1820#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1821#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1822static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1823 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1824 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1825 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1826 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1827 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1828 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1829};
1830
1831static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1832 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1833 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1834 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1835 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1836 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1837 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1838};
1839
1840#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1841#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1842static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1843 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1844 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1845 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1846 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1847 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1848 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1849 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1850 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1851};
1852
1853static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1854 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1855 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1856 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1857 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1858 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1859 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1860 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1861 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1862};
1863
Jerome Forissiered00e162017-01-20 09:22:52 +01001864/*
1865 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1866 * 80 bytes of data, processed in two steps (32 + 48).
1867 */
1868
1869#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1870
1871static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1872 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1873 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1874};
1875
1876static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1877 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1878 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1879 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1880 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1881 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1882 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1883 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1884 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1885 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1886 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1887};
1888
1889/*
1890 * Ciphertext was generated by an online tool for AES CBC.
1891 * Since the input size is a multiple of the block size, and the ciphertext
1892 * format is CS3, the output is the same as plain AES CBC with the last
1893 * two blocks swapped.
1894 */
1895static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1896 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1897 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1898 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1899 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1900 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1901 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1902 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1903 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1904 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1905 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1906};
1907
Pascal Brandc639ac82015-07-02 08:53:34 +02001908static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1909 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1910 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1911 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1912 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1913 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1914 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1915};
1916
1917static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1918 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1919};
1920
1921static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1922 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1923 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1924 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1925 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1926 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1927 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1928};
1929
1930static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1931 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1932 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1933 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1934 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1935 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1936 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1937};
1938
1939static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1940 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1941 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1942 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1943 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1944 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1945 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1946};
1947
1948static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1949 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1950 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1951 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1952 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1953 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1954 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1955};
1956
1957static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1958 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1959 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1960 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1961 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1962 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1963 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1964};
1965
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001966/* SM4 ECB */
1967
1968static const uint8_t ciph_data_sm4_key1[] = {
1969 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1970 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1971};
1972
1973static const uint8_t ciph_data_sm4_in1[] = {
1974 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1975 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1976};
1977
1978static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1979 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1980 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1981};
1982
1983/*
1984 * SM4 CBC
1985 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1986 */
1987static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1988 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1989 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1990};
1991
1992static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1993 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1994 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1995};
1996
1997static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1998 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1999 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2000 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2001 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2002};
2003
2004static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
2005 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
2006 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
2007 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
2008 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
2009};
2010
2011/*
2012 * SM4 CBC
2013 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
2014 */
2015static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
2016 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2017 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2018};
2019
2020static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
2021 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2022 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2023};
2024
2025static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
2026 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2027 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2028 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2029 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2030};
2031
2032static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
2033 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
2034 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
2035 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
2036 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
2037};
2038
2039/*
2040 * SM4 CTR
2041 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
2042 */
2043static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
2044 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2045 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2046};
2047
2048static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
2049 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2050 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2051};
2052
2053static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
2054 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2055 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2056 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2057 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2058 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2059 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2060 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2061 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2062};
2063
2064static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
2065 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
2066 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
2067 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
2068 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
2069 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
2070 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
2071 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
2072 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
2073};
2074
2075/*
2076 * SM4 CTR
2077 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
2078 */
2079static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
2080 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2081 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2082};
2083
2084static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
2085 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2086 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2087};
2088
2089static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
2090 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2091 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2092 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2093 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2094 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2095 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2096 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2097 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2098};
2099
2100static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
2101 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
2102 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
2103 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
2104 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
2105 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
2106 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
2107 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
2108 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
2109};
2110
Pascal Brandc639ac82015-07-02 08:53:34 +02002111struct xtest_ciph_case {
2112 uint32_t algo;
2113 uint32_t mode;
2114 uint32_t key_type;
2115 const uint8_t *key1;
2116 size_t key1_len;
2117 const uint8_t *key2;
2118 size_t key2_len;
2119 const uint8_t *iv;
2120 size_t iv_len;
2121 size_t in_incr;
2122 const uint8_t *in;
2123 size_t in_len;
2124 const uint8_t *out;
2125 size_t out_len;
2126 size_t line;
2127};
2128
2129#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
2130 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2131 NULL, 0, NULL, 0, \
2132 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
2133 __LINE__ }, \
2134 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2135 NULL, 0, NULL, 0, \
2136 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
2137
2138#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
2139 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2140 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
2141 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
2142 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2143 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
2144 (ptx), ARRAY_SIZE(ptx), __LINE__ }
2145
2146#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
2147 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, 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 ## _ptx, \
2156 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
2157 ciph_data_aes_xts_ ## vect ## _ctx, \
2158 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2159 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2160 ciph_data_aes_xts_ ## vect ## _key1, \
2161 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2162 ciph_data_aes_xts_ ## vect ## _key2, \
2163 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2164 ciph_data_aes_xts_ ## vect ## _iv, \
2165 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2166 (in_incr), \
2167 ciph_data_aes_xts_ ## vect ## _ctx, \
2168 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2169 ciph_data_aes_xts_ ## vect ## _ptx, \
2170 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2171
2172#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2173 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2174 ciph_data_aes_cbc_ ## vect ## _key, \
2175 ciph_data_aes_cbc_ ## vect ## _iv, \
2176 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2177 ciph_data_aes_cbc_ ## vect ## _ctx)
2178
2179#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2180 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2181 ciph_data_aes_cts_ ## vect ## _key, \
2182 ciph_data_aes_cts_ ## vect ## _iv, \
2183 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2184 ciph_data_aes_cts_ ## vect ## _ctx)
2185
2186static const struct xtest_ciph_case ciph_cases[] = {
2187 /* AES */
2188 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2189 ciph_data_aes_key1, 11, ciph_data_in1,
2190 ciph_data_aes_ecb_nopad_out1),
2191 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2192 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2193 ciph_data_in1,
2194 ciph_data_aes_cbc_nopad_out1),
2195 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2196 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2197 ciph_data_in1,
2198 ciph_data_aes_ctr_out1),
2199 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2200 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2201 ciph_data_in3,
2202 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002203 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2204 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2205 ciph_data_in3,
2206 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002207 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2208 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2209 ciph_data_in4,
2210 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002211 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2212 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2213 ciph_data_in5,
2214 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002215
2216 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002217 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002218
2219 /* AES-CTS */
2220 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2221 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2222 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2223 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2224 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2225 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2226 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002227 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002228
2229 /* DES */
2230 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2231 ciph_data_des_key1, 14, ciph_data_in1,
2232 ciph_data_des_ecb_nopad_out1),
2233 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2234 ciph_data_des_key2, 3, ciph_data_in2,
2235 ciph_data_des_ecb_nopad_out2),
2236 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2237 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2238 ciph_data_des_cbc_nopad_out1),
2239
2240 /* DES3 */
2241 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2242 ciph_data_des3_key1, 11, ciph_data_in1,
2243 ciph_data_des3_ecb_nopad_out1),
2244 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2245 ciph_data_des3_key2, 3, ciph_data_in2,
2246 ciph_data_des_ecb_nopad_out2),
2247 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2248 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2249 ciph_data_in1,
2250 ciph_data_des3_cbc_nopad_out1),
2251
2252 /* DES2 */
2253 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2254 ciph_data_des2_key1, 11, ciph_data_in1,
2255 ciph_data_des2_ecb_nopad_out1),
2256 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2257 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2258 ciph_data_in1,
2259 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002260
Pascal Brandc639ac82015-07-02 08:53:34 +02002261 /* AES-XTS */
2262 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2263 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2264 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2265 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2266 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2267 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2268 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2269 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2270 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2271 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2272 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2273 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2274 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2275 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2276 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2277 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2278 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2279 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2280 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002281
2282 /* SM4 */
2283 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2284 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2285 ciph_data_sm4_ecb_nopad_out1),
2286 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2287 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2288 11, ciph_data_sm4_cbc_a221_in,
2289 ciph_data_sm4_cbc_a221_out),
2290 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2291 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2292 11, ciph_data_sm4_cbc_a222_in,
2293 ciph_data_sm4_cbc_a222_out),
2294 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2295 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2296 11, ciph_data_sm4_ctr_a251_in,
2297 ciph_data_sm4_ctr_a251_out),
2298 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2299 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2300 11, ciph_data_sm4_ctr_a252_in,
2301 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002302};
2303
Jerome Forissier23256842018-02-16 09:25:35 +01002304static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002305{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002306 TEEC_Session session = { };
2307 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002308 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002309 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2310 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002311 uint8_t out[2048] = { };
2312 size_t out_size = 0;
2313 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002314 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002315 uint32_t ret_orig = 0;
2316 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002317
2318 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2319 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2320 &ret_orig)))
2321 return;
2322
2323 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002324 TEE_Attribute key_attr = { };
2325 size_t key_size = 0;
2326 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002327
Jerome Forissier817d99f2020-01-22 16:33:12 +01002328 switch (ciph_cases[n].algo) {
2329 case TEE_ALG_SM4_CTR:
2330 case TEE_ALG_SM4_CBC_NOPAD:
2331 case TEE_ALG_SM4_ECB_NOPAD:
2332 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2333 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2334 Do_ADBG_Log("SM4 not supported: skip subcase");
2335 continue;
2336 }
2337 break;
2338 default:
2339 break;
2340 }
2341
Pascal Brandc639ac82015-07-02 08:53:34 +02002342 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2343 (int)n, (unsigned int)ciph_cases[n].algo,
2344 (int)ciph_cases[n].line);
2345
2346 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2347 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2348 key_attr.content.ref.length = ciph_cases[n].key1_len;
2349
2350 key_size = key_attr.content.ref.length * 8;
2351 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2352 ciph_cases[n].key_type == TEE_TYPE_DES3)
2353 /* Exclude parity in bit size of key */
2354 key_size -= key_size / 8;
2355
2356 op_key_size = key_size;
2357 if (ciph_cases[n].key2 != NULL)
2358 op_key_size *= 2;
2359
2360 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2361 ta_crypt_cmd_allocate_operation(c, &session, &op,
2362 ciph_cases[n].algo, ciph_cases[n].mode,
2363 op_key_size)))
2364 goto out;
2365
2366 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002367 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2368 ciph_cases[n].algo, ciph_cases[n].mode,
2369 op_key_size)))
2370 goto out;
2371
2372 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002373 ta_crypt_cmd_allocate_transient_object(c, &session,
2374 ciph_cases[n].key_type, key_size,
2375 &key1_handle)))
2376 goto out;
2377
2378 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2379 ta_crypt_cmd_populate_transient_object(c, &session,
2380 key1_handle, &key_attr, 1)))
2381 goto out;
2382
2383 if (ciph_cases[n].key2 != NULL) {
2384 key_attr.content.ref.buffer =
2385 (void *)ciph_cases[n].key2;
2386 key_attr.content.ref.length = ciph_cases[n].key2_len;
2387
2388 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2389 ta_crypt_cmd_allocate_transient_object(c,
2390 &session, ciph_cases[n].key_type,
2391 key_attr.content.ref.length * 8,
2392 &key2_handle)))
2393 goto out;
2394
2395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2396 ta_crypt_cmd_populate_transient_object(c,
2397 &session, key2_handle, &key_attr, 1)))
2398 goto out;
2399
2400 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2401 ta_crypt_cmd_set_operation_key2(c, &session, op,
2402 key1_handle, key2_handle)))
2403 goto out;
2404 } else {
2405 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2406 ta_crypt_cmd_set_operation_key(c, &session, op,
2407 key1_handle)))
2408 goto out;
2409 }
2410
2411 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2412 ta_crypt_cmd_free_transient_object(c, &session,
2413 key1_handle)))
2414 goto out;
2415 key1_handle = TEE_HANDLE_NULL;
2416
2417 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2418 ta_crypt_cmd_free_transient_object(c, &session,
2419 key2_handle)))
2420 goto out;
2421 key2_handle = TEE_HANDLE_NULL;
2422
2423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2424 ta_crypt_cmd_cipher_init(c, &session, op,
2425 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2426 goto out;
2427
2428 out_offs = 0;
2429 out_size = sizeof(out);
2430 memset(out, 0, sizeof(out));
2431 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2432 ta_crypt_cmd_cipher_update(c, &session, op,
2433 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2434 &out_size)))
2435 goto out;
2436
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002437 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2438 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2439 ciph_cases[n].in_incr);
2440
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002441 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2442 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2443 goto out;
2444
Pascal Brandc639ac82015-07-02 08:53:34 +02002445 out_offs += out_size;
2446 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002447 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002448
2449 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2450 ta_crypt_cmd_cipher_do_final(c, &session, op,
2451 ciph_cases[n].in + ciph_cases[n].in_incr,
2452 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2453 out + out_offs,
2454 &out_size)))
2455 goto out;
2456
2457 out_offs += out_size;
2458
2459 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2460 ciph_cases[n].out_len, out, out_offs);
2461
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002462 /* test on the copied op2 */
2463 out_size = sizeof(out) - out_offs2;
2464
2465 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2466 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2467 ciph_cases[n].in + ciph_cases[n].in_incr,
2468 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2469 out + out_offs2,
2470 &out_size)))
2471 goto out;
2472
2473 out_offs2 += out_size;
2474
2475 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2476 out, out_offs2);
2477
Pascal Brandc639ac82015-07-02 08:53:34 +02002478 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2479 ta_crypt_cmd_free_operation(c, &session, op)))
2480 goto out;
2481
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002482 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2483 ta_crypt_cmd_free_operation(c, &session, op2)))
2484 goto out;
2485
Pascal Brandc639ac82015-07-02 08:53:34 +02002486 Do_ADBG_EndSubCase(c, NULL);
2487 }
2488out:
2489 TEEC_CloseSession(&session);
2490}
Jens Wiklander14f48872018-06-29 15:30:13 +02002491ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2492 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002493
Pascal Brandc639ac82015-07-02 08:53:34 +02002494static void xtest_tee_test_4004(ADBG_Case_t *c)
2495{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002496 TEEC_Session session = { };
2497 uint32_t ret_orig = 0;
2498 uint8_t buf1[45] = { };
2499 uint8_t buf2[45] = { };
2500 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002501
2502 Do_ADBG_BeginSubCase(c, "TEE get random");
2503 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2504 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2505 &ret_orig)))
2506 return;
2507
2508 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2509 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2510 sizeof(buf1))))
2511 goto out;
2512
2513 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2514 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2515
2516 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2517 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2518 sizeof(buf2))))
2519 goto out;
2520
2521 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2522 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2523
2524 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2525 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2526out:
2527 TEEC_CloseSession(&session);
2528 Do_ADBG_EndSubCase(c, "TEE get random");
2529}
Jens Wiklander14f48872018-06-29 15:30:13 +02002530ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2531 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002532
2533struct xtest_ae_case {
2534 uint32_t algo;
2535 uint32_t mode;
2536 uint32_t key_type;
2537 const uint8_t *key;
2538 size_t key_len;
2539 const uint8_t *nonce;
2540 size_t nonce_len;
2541 size_t aad_incr;
2542 const uint8_t *aad;
2543 size_t aad_len;
2544 size_t in_incr;
2545 const uint8_t *ptx;
2546 size_t ptx_len;
2547 const uint8_t *ctx;
2548 size_t ctx_len;
2549 const uint8_t *tag;
2550 size_t tag_len;
2551 size_t line;
2552};
2553
2554
2555#define ARRAY(a) a, ARRAY_SIZE(a)
2556#define NULL_ARRAY(a) NULL, 0
2557
2558#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2559 aad_array, ptx_array, ctx_array) \
2560 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2561 ARRAY(vect ## _nonce), (aad_incr), \
2562 aad_array(vect ## _aad), (in_incr), \
2563 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2564 ARRAY(vect ## _tag), \
2565 __LINE__ }, \
2566 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2567 ARRAY(vect ## _nonce), (aad_incr), \
2568 aad_array(vect ## _aad), (in_incr), \
2569 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2570 ARRAY(vect ## _tag), \
2571 __LINE__ }
2572
2573#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2574 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2575 in_incr, ARRAY, ARRAY, ARRAY)
2576
2577#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2578 aad_array, ptx_array, ctx_array) \
2579 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2580 in_incr, aad_array, ptx_array, ctx_array)
2581
2582
2583
2584static const struct xtest_ae_case ae_cases[] = {
2585 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2586 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2587 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2588
2589 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2590 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2591 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002592 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2593 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002594 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2595 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2596 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2597 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2598 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2599 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2600 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2601 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2602 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2603 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2604 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2605 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2606 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2607 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002608#ifdef CFG_GCM_NIST_VECTORS
2609#include "gcmDecrypt128.h"
2610#include "gcmDecrypt192.h"
2611#include "gcmDecrypt256.h"
2612#include "gcmEncryptExtIV128.h"
2613#include "gcmEncryptExtIV192.h"
2614#include "gcmEncryptExtIV256.h"
2615#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002616};
2617
2618static void xtest_tee_test_4005(ADBG_Case_t *c)
2619{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002620 TEEC_Session session = { };
2621 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002622 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002623 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002624 TEE_Attribute key_attr = { };
2625 uint8_t out[512] = { };
2626 size_t out_size = 0;
2627 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002628 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002629 uint32_t ret_orig = 0;
2630 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002631
2632 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2633 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2634 &ret_orig)))
2635 return;
2636
2637 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2638 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2639 (int)n, (unsigned int)ae_cases[n].algo,
2640 (int)ae_cases[n].line);
2641
2642 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2643 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2644 key_attr.content.ref.length = ae_cases[n].key_len;
2645
2646 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2647 ta_crypt_cmd_allocate_operation(c, &session, &op,
2648 ae_cases[n].algo, ae_cases[n].mode,
2649 key_attr.content.ref.length * 8)))
2650 goto out;
2651
2652 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002653 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2654 ae_cases[n].algo, ae_cases[n].mode,
2655 key_attr.content.ref.length * 8)))
2656 goto out;
2657
2658 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002659 ta_crypt_cmd_allocate_transient_object(c, &session,
2660 ae_cases[n].key_type,
2661 key_attr.content.ref.length * 8,
2662 &key_handle)))
2663 goto out;
2664
2665 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2666 ta_crypt_cmd_populate_transient_object(c, &session,
2667 key_handle, &key_attr, 1)))
2668 goto out;
2669
2670 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2671 ta_crypt_cmd_set_operation_key(c, &session, op,
2672 key_handle)))
2673 goto out;
2674
2675 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2676 ta_crypt_cmd_free_transient_object(c, &session,
2677 key_handle)))
2678 goto out;
2679 key_handle = TEE_HANDLE_NULL;
2680
2681 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2682 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2683 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2684 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2685 goto out;
2686
2687 if (ae_cases[n].aad != NULL) {
2688 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2689 ta_crypt_cmd_ae_update_aad(c, &session, op,
2690 ae_cases[n].aad, ae_cases[n].aad_incr)))
2691 goto out;
2692
2693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2694 ta_crypt_cmd_ae_update_aad(c, &session, op,
2695 ae_cases[n].aad + ae_cases[n].aad_incr,
2696 ae_cases [n].aad_len -
2697 ae_cases[n].aad_incr)))
2698 goto out;
2699 }
2700
2701 out_offs = 0;
2702 out_size = sizeof(out);
2703 memset(out, 0, sizeof(out));
2704 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2705 if (ae_cases[n].ptx != NULL) {
2706 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2707 ta_crypt_cmd_ae_update(c, &session, op,
2708 ae_cases[n].ptx,
2709 ae_cases[n].in_incr, out,
2710 &out_size)))
2711 goto out;
2712 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002713 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2714 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2715 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002716 }
2717 } else {
2718 if (ae_cases[n].ctx != NULL) {
2719 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2720 ta_crypt_cmd_ae_update(c, &session, op,
2721 ae_cases[n].ctx,
2722 ae_cases[n].in_incr, out,
2723 &out_size)))
2724 goto out;
2725 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002726 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2727 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2728 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002729 }
2730 }
2731
Jens Wiklander7404c072020-12-15 08:06:32 +01002732 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2733 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2734 goto out;
2735
Pascal Brandc639ac82015-07-02 08:53:34 +02002736 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002737 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002738 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2739 uint8_t out_tag[64];
2740 size_t out_tag_len = MIN(sizeof(out_tag),
2741 ae_cases[n].tag_len);
2742
2743 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2744 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2745 ae_cases[n].ptx + ae_cases[n].in_incr,
2746 ae_cases[n].ptx_len -
2747 ae_cases[n].in_incr,
2748 out + out_offs,
2749 &out_size, out_tag, &out_tag_len)))
2750 goto out;
2751
2752 (void)ADBG_EXPECT_BUFFER(c,
2753 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2754 out_tag_len);
2755
2756 out_offs += out_size;
2757
2758 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2759 ae_cases[n].ctx_len, out, out_offs);
2760 } else {
2761 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2762 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2763 ae_cases[n].ctx + ae_cases[n].in_incr,
2764 ae_cases[n].ctx_len -
2765 ae_cases[n].in_incr,
2766 out + out_offs,
2767 &out_size, ae_cases[n].tag,
2768 ae_cases[n].tag_len)))
2769 goto out;
2770
2771 out_offs += out_size;
2772
2773 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2774 ae_cases[n].ptx_len, out, out_offs);
2775 }
2776
Jens Wiklander7404c072020-12-15 08:06:32 +01002777 /* test on the copied op2 */
2778 out_size = sizeof(out) - out_offs2;
2779 memset(out + out_offs2, 0, out_size);
2780 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2781 uint8_t out_tag[64] = { 0 };
2782 size_t out_tag_len = MIN(sizeof(out_tag),
2783 ae_cases[n].tag_len);
2784
2785 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2786 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2787 ae_cases[n].ptx + ae_cases[n].in_incr,
2788 ae_cases[n].ptx_len -
2789 ae_cases[n].in_incr,
2790 out + out_offs2,
2791 &out_size, out_tag, &out_tag_len)))
2792 goto out;
2793
2794 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2795 ae_cases[n].tag_len, out_tag,
2796 out_tag_len);
2797
2798 out_offs2 += out_size;
2799
2800 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2801 ae_cases[n].ctx_len, out, out_offs2);
2802 } else {
2803 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2804 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2805 ae_cases[n].ctx + ae_cases[n].in_incr,
2806 ae_cases[n].ctx_len -
2807 ae_cases[n].in_incr,
2808 out + out_offs2,
2809 &out_size, ae_cases[n].tag,
2810 ae_cases[n].tag_len)))
2811 goto out;
2812
2813 out_offs2 += out_size;
2814
2815 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2816 ae_cases[n].ptx_len, out, out_offs2);
2817 }
2818
Pascal Brandc639ac82015-07-02 08:53:34 +02002819 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2820 ta_crypt_cmd_free_operation(c, &session, op)))
2821 goto out;
2822
Jens Wiklander7404c072020-12-15 08:06:32 +01002823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2824 ta_crypt_cmd_free_operation(c, &session, op2)))
2825 goto out;
2826
Pascal Brandc639ac82015-07-02 08:53:34 +02002827 Do_ADBG_EndSubCase(c, NULL);
2828 }
2829out:
2830 TEEC_CloseSession(&session);
2831}
Jens Wiklander14f48872018-06-29 15:30:13 +02002832ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2833 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002834
2835struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002836 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002837 uint32_t algo;
2838 TEE_OperationMode mode;
2839
2840 union {
2841 struct {
2842 const uint8_t *modulus;
2843 size_t modulus_len;
2844
2845 const uint8_t *pub_exp;
2846 size_t pub_exp_len;
2847
2848 const uint8_t *priv_exp;
2849 size_t priv_exp_len;
2850
2851 const uint8_t *prime1; /* q */
2852 size_t prime1_len;
2853 const uint8_t *prime2; /* p */
2854 size_t prime2_len;
2855 const uint8_t *exp1; /* dp */
2856 size_t exp1_len;
2857 const uint8_t *exp2; /* dq */
2858 size_t exp2_len;
2859 const uint8_t *coeff; /* iq */
2860 size_t coeff_len;
2861
2862 int salt_len;
2863 } rsa;
2864 struct {
2865 const uint8_t *prime;
2866 size_t prime_len;
2867 const uint8_t *sub_prime;
2868 size_t sub_prime_len;
2869 const uint8_t *base;
2870 size_t base_len;
2871 const uint8_t *pub_val;
2872 size_t pub_val_len;
2873 const uint8_t *priv_val;
2874 size_t priv_val_len;
2875 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002876 struct {
2877 const uint8_t *private;
2878 size_t private_len;
2879 const uint8_t *public_x;
2880 size_t public_x_len;
2881 const uint8_t *public_y;
2882 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002883 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002884 struct {
2885 const uint8_t *private;
2886 size_t private_len;
2887 const uint8_t *public;
2888 size_t public_len;
2889 const uint8_t flag;
2890 const uint8_t *context;
2891 size_t context_len;
2892 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002893 } params;
2894
2895 const uint8_t *ptx;
2896 size_t ptx_len;
2897 const uint8_t *ctx;
2898 size_t ctx_len;
2899 size_t line;
2900};
2901
2902#define WITHOUT_SALT(x) -1
2903#define WITH_SALT(x) x
2904
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002905#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2906 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002907 ARRAY(vect ## _ptx), \
2908 ARRAY(vect ## _out), \
2909 __LINE__ }
2910
2911#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2912 { .rsa = { \
2913 ARRAY(vect ## _modulus), \
2914 ARRAY(vect ## _pub_exp), \
2915 ARRAY(vect ## _priv_exp), \
2916 opt_crt_array(vect ## _prime1), \
2917 opt_crt_array(vect ## _prime2), \
2918 opt_crt_array(vect ## _exp1), \
2919 opt_crt_array(vect ## _exp2), \
2920 opt_crt_array(vect ## _coeff), \
2921 opt_salt(vect ## _salt_len) \
2922 } }
2923
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002924#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2925 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002926 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2927
2928#define XTEST_AC_DSA_UNION(vect) \
2929 { .dsa = { \
2930 ARRAY(vect ## _prime), \
2931 ARRAY(vect ## _sub_prime), \
2932 ARRAY(vect ## _base), \
2933 ARRAY(vect ## _pub_val), \
2934 ARRAY(vect ## _priv_val), \
2935 } }
2936
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002937#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2938 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002939
Pascal Brand3e143ee2015-07-15 17:17:16 +02002940#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002941 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002942 ARRAY(vect ## _private), \
2943 ARRAY(vect ## _public_x), \
2944 ARRAY(vect ## _public_y), \
2945 } }
2946
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002947#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002948 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002949
Valerii Chubarab9863c2022-08-12 07:42:29 +00002950#define XTEST_AC_EDDSA_UNION(vect, flag) \
2951 { .eddsa = { \
2952 ARRAY(vect ## _private), \
2953 ARRAY(vect ## _public), \
2954 flag, \
2955 } }
2956
2957#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2958 { .eddsa = { \
2959 ARRAY(vect ## _private), \
2960 ARRAY(vect ## _public), \
2961 flag, \
2962 ARRAY(vect ## _context), \
2963 } }
2964
2965#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2966 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2967
2968#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2969 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2970
Pascal Brandc639ac82015-07-02 08:53:34 +02002971static const struct xtest_ac_case xtest_ac_cases[] = {
2972 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002973 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002974 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002975 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002976 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002977 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002978 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002979 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002980 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002981 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2982 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2983 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2984 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002985 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2986 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2987 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2988 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002989 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002990 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002991 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002992 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002993 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002994 ac_rsassa_vect4, 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_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002997 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002998 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002999 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003000 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003001 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003002 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003003 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003004 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003005 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003006 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003007 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003008 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003009 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
3010 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
3011 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
3012 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003013
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003014 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003015 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003016 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003019#ifdef CFG_CRYPTO_RSASSA_NA1
3020 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
3021 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3022 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
3023 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3024#endif
3025
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003026 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003027 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003028 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003029 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003030
3031 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003032 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003033 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003034 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003035
3036 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003037 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003038 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003039 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
3040
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003041 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3042 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003043 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003044 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003045 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003046
3047 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3048 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003049 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003050 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3051 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003052 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003053
3054 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3055 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003056 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003057 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3058 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003059 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003060
3061 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3062 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003063 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003064 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3065 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003066 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003067
3068 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3069 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003070 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003071 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3072 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003073 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
3074
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003075 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003076 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003077 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003078 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003079 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003080 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003081 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003082 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003083 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003084 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003085 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003086 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3087
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003088 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3089 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003090 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003091 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3092 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003093 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003094 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3095 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003096 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003097 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3098 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003099 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003100 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3101 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003102 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003103 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3104 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003105 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
3106
3107 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003108 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003109 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003110 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003111 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003112 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003113 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003114 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003115 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003116 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003117 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003118 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003119 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003120 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003121 ac_rsassa_vect4, 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_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003124 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003125 ac_rsassa_vect5, 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_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003128 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003129 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003130 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003131 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003132 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003133 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003134 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003135 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003136 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003137 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003138 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003139 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003140 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003141 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003142 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003143 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003144 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003145 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003146 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003147 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003148 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003149 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003150 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003151 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3152
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003153 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3154 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003155 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003156 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003157 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003158 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3159 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003160 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003161 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3162 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003163 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003164 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3165 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003166 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003167 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3168 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003169 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003170 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3171 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003172 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003173 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3174 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003175 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003176 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3177 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003178 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003179 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3180 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003181 ac_rsassa_vect15, ARRAY, WITH_SALT),
3182
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003183 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003184 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003185 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003186 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003187 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003188 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003189 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003190 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003191 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003192 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003193 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003194 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3195
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003196 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3197 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003198 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003199 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3200 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003201 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003202 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3203 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003204 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003205 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3206 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003207 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003208 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3209 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003210 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003211 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3212 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003213 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3214
3215 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003216 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003217 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3218 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003219 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3220 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3221 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3222 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3223 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3224 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3225 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3226 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3227 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3229 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3230 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3231 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3232 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3233 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3234 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3235 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003247 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3248 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3249 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3250 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3251 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3252 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003253 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3254 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3256 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3257 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3258 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3259 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3260 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3261 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3262 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3263 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3264 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3265 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3266 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3267 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3268 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3269 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3270 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3271 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3272 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3273 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3274 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3275 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3276 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3277 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3278 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3279 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3280 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3281 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3282 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003283 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003284 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3285 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3286 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3287 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3288 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3289 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3290 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3291 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3292 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3293 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3294 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3295 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3296 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3297 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3298 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3299 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3300 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3301 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3302 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3303 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3304 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3305 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3306 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3307 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3308 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3309 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3310 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3311 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3312 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3313 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003314 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3315 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3316 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3317 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003318 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3319 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003320 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3321 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3322 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3323 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3324 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3325 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3326 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3327 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3328 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3329 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3330 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3331 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3332 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3333 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3334 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3335 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3336 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3337 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3338 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3339 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3340 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3341 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3342 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3343 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3344 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3345 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3346 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3347 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003348 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003349 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3350 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003351 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3352 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3353 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3354 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3355 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3356 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3357 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3358 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3359 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3360 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3361 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3362 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3363 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3364 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3365 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3366 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3367 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3368 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3369 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3370 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3371 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3372 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3373 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3374 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3375 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3376 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3377 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3378 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003379 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3380 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3381 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3382 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3383 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003384 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3385 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003386 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3387 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3388 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3389 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3390 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3391 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3392 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3393 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3394 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3395 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3396 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3397 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3398 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3399 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3400 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3401 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3402 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3403 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3404 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3405 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3406 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3407 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3408 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3409 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3410 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3411 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3412 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3413 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003414 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3415 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003416
3417 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003418 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003419 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3420 nist_186_2_ecdsa_testvector_1),
3421 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3422 nist_186_2_ecdsa_testvector_1),
3423 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3424 nist_186_2_ecdsa_testvector_2),
3425 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3426 nist_186_2_ecdsa_testvector_2),
3427 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3428 nist_186_2_ecdsa_testvector_3),
3429 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3430 nist_186_2_ecdsa_testvector_3),
3431 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3432 nist_186_2_ecdsa_testvector_4),
3433 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3434 nist_186_2_ecdsa_testvector_4),
3435 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3436 nist_186_2_ecdsa_testvector_5),
3437 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3438 nist_186_2_ecdsa_testvector_5),
3439 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3440 nist_186_2_ecdsa_testvector_6),
3441 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3442 nist_186_2_ecdsa_testvector_6),
3443 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3444 nist_186_2_ecdsa_testvector_7),
3445 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3446 nist_186_2_ecdsa_testvector_7),
3447 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3448 nist_186_2_ecdsa_testvector_8),
3449 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3450 nist_186_2_ecdsa_testvector_8),
3451 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3452 nist_186_2_ecdsa_testvector_9),
3453 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3454 nist_186_2_ecdsa_testvector_9),
3455 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3456 nist_186_2_ecdsa_testvector_10),
3457 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3458 nist_186_2_ecdsa_testvector_10),
3459 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3460 nist_186_2_ecdsa_testvector_11),
3461 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3462 nist_186_2_ecdsa_testvector_11),
3463 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3464 nist_186_2_ecdsa_testvector_12),
3465 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3466 nist_186_2_ecdsa_testvector_12),
3467 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3468 nist_186_2_ecdsa_testvector_13),
3469 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3470 nist_186_2_ecdsa_testvector_13),
3471 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3472 nist_186_2_ecdsa_testvector_14),
3473 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3474 nist_186_2_ecdsa_testvector_14),
3475 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3476 nist_186_2_ecdsa_testvector_15),
3477 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3478 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003479 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003480 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3481 nist_186_2_ecdsa_testvector_16),
3482 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3483 nist_186_2_ecdsa_testvector_16),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3485 nist_186_2_ecdsa_testvector_17),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3487 nist_186_2_ecdsa_testvector_17),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3489 nist_186_2_ecdsa_testvector_18),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3491 nist_186_2_ecdsa_testvector_18),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3493 nist_186_2_ecdsa_testvector_19),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3495 nist_186_2_ecdsa_testvector_19),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3497 nist_186_2_ecdsa_testvector_20),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3499 nist_186_2_ecdsa_testvector_20),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3501 nist_186_2_ecdsa_testvector_21),
3502 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3503 nist_186_2_ecdsa_testvector_21),
3504 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3505 nist_186_2_ecdsa_testvector_22),
3506 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3507 nist_186_2_ecdsa_testvector_22),
3508 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3509 nist_186_2_ecdsa_testvector_23),
3510 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3511 nist_186_2_ecdsa_testvector_23),
3512 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3513 nist_186_2_ecdsa_testvector_24),
3514 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3515 nist_186_2_ecdsa_testvector_24),
3516 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3517 nist_186_2_ecdsa_testvector_25),
3518 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3519 nist_186_2_ecdsa_testvector_25),
3520 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3521 nist_186_2_ecdsa_testvector_26),
3522 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3523 nist_186_2_ecdsa_testvector_26),
3524 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3525 nist_186_2_ecdsa_testvector_27),
3526 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3527 nist_186_2_ecdsa_testvector_27),
3528 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3529 nist_186_2_ecdsa_testvector_28),
3530 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3531 nist_186_2_ecdsa_testvector_28),
3532 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3533 nist_186_2_ecdsa_testvector_29),
3534 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3535 nist_186_2_ecdsa_testvector_29),
3536 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3537 nist_186_2_ecdsa_testvector_30),
3538 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3539 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003540 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003541 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3542 nist_186_2_ecdsa_testvector_31),
3543 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3544 nist_186_2_ecdsa_testvector_31),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3546 nist_186_2_ecdsa_testvector_32),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3548 nist_186_2_ecdsa_testvector_32),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3550 nist_186_2_ecdsa_testvector_33),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3552 nist_186_2_ecdsa_testvector_33),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3554 nist_186_2_ecdsa_testvector_34),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3556 nist_186_2_ecdsa_testvector_34),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3558 nist_186_2_ecdsa_testvector_35),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3560 nist_186_2_ecdsa_testvector_35),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3562 nist_186_2_ecdsa_testvector_36),
3563 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3564 nist_186_2_ecdsa_testvector_36),
3565 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3566 nist_186_2_ecdsa_testvector_37),
3567 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3568 nist_186_2_ecdsa_testvector_37),
3569 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3570 nist_186_2_ecdsa_testvector_38),
3571 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3572 nist_186_2_ecdsa_testvector_38),
3573 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3574 nist_186_2_ecdsa_testvector_39),
3575 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3576 nist_186_2_ecdsa_testvector_39),
3577 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3578 nist_186_2_ecdsa_testvector_40),
3579 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3580 nist_186_2_ecdsa_testvector_40),
3581 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3582 nist_186_2_ecdsa_testvector_41),
3583 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3584 nist_186_2_ecdsa_testvector_41),
3585 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3586 nist_186_2_ecdsa_testvector_42),
3587 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3588 nist_186_2_ecdsa_testvector_42),
3589 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3590 nist_186_2_ecdsa_testvector_43),
3591 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3592 nist_186_2_ecdsa_testvector_43),
3593 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3594 nist_186_2_ecdsa_testvector_44),
3595 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3596 nist_186_2_ecdsa_testvector_44),
3597 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3598 nist_186_2_ecdsa_testvector_45),
3599 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3600 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003601 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003602 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3603 nist_186_2_ecdsa_testvector_46),
3604 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3605 nist_186_2_ecdsa_testvector_46),
3606 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3607 nist_186_2_ecdsa_testvector_47),
3608 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3609 nist_186_2_ecdsa_testvector_47),
3610 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3611 nist_186_2_ecdsa_testvector_48),
3612 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3613 nist_186_2_ecdsa_testvector_48),
3614 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3615 nist_186_2_ecdsa_testvector_49),
3616 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3617 nist_186_2_ecdsa_testvector_49),
3618 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3619 nist_186_2_ecdsa_testvector_50),
3620 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3621 nist_186_2_ecdsa_testvector_50),
3622 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3623 nist_186_2_ecdsa_testvector_51),
3624 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3625 nist_186_2_ecdsa_testvector_51),
3626 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3627 nist_186_2_ecdsa_testvector_52),
3628 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3629 nist_186_2_ecdsa_testvector_52),
3630 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3631 nist_186_2_ecdsa_testvector_53),
3632 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3633 nist_186_2_ecdsa_testvector_53),
3634 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3635 nist_186_2_ecdsa_testvector_54),
3636 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3637 nist_186_2_ecdsa_testvector_54),
3638 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3639 nist_186_2_ecdsa_testvector_55),
3640 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3641 nist_186_2_ecdsa_testvector_55),
3642 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3643 nist_186_2_ecdsa_testvector_56),
3644 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3645 nist_186_2_ecdsa_testvector_56),
3646 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3647 nist_186_2_ecdsa_testvector_57),
3648 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3649 nist_186_2_ecdsa_testvector_57),
3650 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3651 nist_186_2_ecdsa_testvector_58),
3652 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3653 nist_186_2_ecdsa_testvector_58),
3654 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3655 nist_186_2_ecdsa_testvector_59),
3656 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3657 nist_186_2_ecdsa_testvector_59),
3658 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3659 nist_186_2_ecdsa_testvector_60),
3660 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3661 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003662 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003663 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3664 nist_186_2_ecdsa_testvector_61),
3665 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3666 nist_186_2_ecdsa_testvector_61),
3667 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3668 nist_186_2_ecdsa_testvector_62),
3669 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3670 nist_186_2_ecdsa_testvector_62),
3671 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3672 nist_186_2_ecdsa_testvector_63),
3673 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3674 nist_186_2_ecdsa_testvector_63),
3675 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3676 nist_186_2_ecdsa_testvector_64),
3677 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3678 nist_186_2_ecdsa_testvector_64),
3679 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3680 nist_186_2_ecdsa_testvector_65),
3681 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3682 nist_186_2_ecdsa_testvector_65),
3683 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3684 nist_186_2_ecdsa_testvector_66),
3685 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3686 nist_186_2_ecdsa_testvector_66),
3687 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3688 nist_186_2_ecdsa_testvector_67),
3689 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3690 nist_186_2_ecdsa_testvector_67),
3691 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3692 nist_186_2_ecdsa_testvector_68),
3693 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3694 nist_186_2_ecdsa_testvector_68),
3695 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3696 nist_186_2_ecdsa_testvector_69),
3697 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3698 nist_186_2_ecdsa_testvector_69),
3699 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3700 nist_186_2_ecdsa_testvector_70),
3701 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3702 nist_186_2_ecdsa_testvector_70),
3703 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3704 nist_186_2_ecdsa_testvector_71),
3705 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3706 nist_186_2_ecdsa_testvector_71),
3707 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3708 nist_186_2_ecdsa_testvector_72),
3709 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3710 nist_186_2_ecdsa_testvector_72),
3711 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3712 nist_186_2_ecdsa_testvector_73),
3713 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3714 nist_186_2_ecdsa_testvector_73),
3715 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3716 nist_186_2_ecdsa_testvector_74),
3717 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3718 nist_186_2_ecdsa_testvector_74),
3719 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3720 nist_186_2_ecdsa_testvector_75),
3721 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3722 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003723 /* [K-163] - GP NOT SUPPORTED */
3724 /* [K-233] - GP NOT SUPPORTED */
3725 /* [K-283] - GP NOT SUPPORTED */
3726 /* [K-409] - GP NOT SUPPORTED */
3727 /* [K-571] - GP NOT SUPPORTED */
3728 /* [B-163] - GP NOT SUPPORTED */
3729 /* [B-233] - GP NOT SUPPORTED */
3730 /* [B-283] - GP NOT SUPPORTED */
3731 /* [B-409] - GP NOT SUPPORTED */
3732 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003733
3734 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3735 gmt_0003_part5_c2_sm2_testvector),
3736 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3737 gmt_0003_part5_c2_sm2_testvector),
3738 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3739 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003740
3741 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3742 gmt_003_part5_a2),
3743 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3744 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003745};
3746
Valerii Chubarab9863c2022-08-12 07:42:29 +00003747static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3748
3749 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3750 ed25519_rfc_8032_7_1, 0),
3751 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3752 ed25519_rfc_8032_7_1, 0),
3753
3754 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3755 ed25519ctx_rfc_8032_7_2, 0),
3756 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3757 ed25519ctx_rfc_8032_7_2, 0),
3758
3759 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3760 ed25519ph_rfc_8032_7_3, 1),
3761 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3762 ed25519ph_rfc_8032_7_3, 1),
3763};
3764
Pascal Brandc639ac82015-07-02 08:53:34 +02003765static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3766 uint32_t max_key_size, uint32_t key_type,
3767 TEE_Attribute *attrs, size_t num_attrs,
3768 TEE_ObjectHandle *handle)
3769{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003770 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003771
3772 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3773 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3774 max_key_size, handle)))
3775 return false;
3776
3777 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3778 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3779 num_attrs)))
3780 return false;
3781
3782 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003783 uint8_t out[512] = { };
3784 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003785
3786 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3787 continue;
3788
Pascal Brandc639ac82015-07-02 08:53:34 +02003789 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3790 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3791 attrs[n].attributeID, out, &out_size)))
3792 return false;
3793
Pascal Brand3e143ee2015-07-15 17:17:16 +02003794 if (out_size < attrs[n].content.ref.length) {
3795 memmove(out + (attrs[n].content.ref.length - out_size),
3796 out,
3797 attrs[n].content.ref.length);
3798 memset(out, 0, attrs[n].content.ref.length - out_size);
3799 out_size = attrs[n].content.ref.length;
3800 }
3801
Pascal Brandc639ac82015-07-02 08:53:34 +02003802 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3803 attrs[n].content.ref.length, out, out_size))
3804 return false;
3805 }
3806
3807 return true;
3808}
3809
Jerome Forissier26393882022-03-09 21:22:30 +01003810#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3811
Pascal Brandc639ac82015-07-02 08:53:34 +02003812static void xtest_tee_test_4006(ADBG_Case_t *c)
3813{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003814 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003815 TEE_OperationHandle op = TEE_HANDLE_NULL;
3816 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3817 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003818 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003819 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003820 size_t num_algo_params = 0;
3821 uint8_t out[512] = { };
3822 size_t out_size = 0;
3823 uint8_t out_enc[512] = { };
3824 size_t out_enc_size = 0;
3825 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003826 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003827 size_t max_key_size = 0;
3828 size_t num_key_attrs = 0;
3829 uint32_t ret_orig = 0;
3830 size_t n = 0;
3831 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003832 uint32_t pub_key_type = 0;
3833 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003834 uint32_t hash_algo = 0;
Etienne Carrierea286b572023-06-28 14:30:19 +02003835 uint32_t sha1_algo_id = TEE_ALG_SHA1;
Pascal Brandc639ac82015-07-02 08:53:34 +02003836
3837 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3838 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3839 &ret_orig)))
3840 return;
3841
3842 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3843 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3844
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003845 if (tv->level > level)
3846 continue;
3847
Jerome Forissier4b03e282020-01-22 16:33:12 +01003848 if ((tv->algo == TEE_ALG_SM2_PKE ||
3849 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3850 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3851 TEE_ECC_CURVE_SM2)) {
3852 Do_ADBG_Log("SM2 not supported: skip subcase");
3853 continue;
3854 }
3855
Pascal Brandc639ac82015-07-02 08:53:34 +02003856 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3857 (int)n, (unsigned int)tv->algo,
3858 (int)tv->line);
3859
3860 /*
3861 * When signing or verifying we're working with the hash of
3862 * the payload.
3863 */
3864 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003865 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3866 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003867#if defined(CFG_CRYPTO_RSASSA_NA1)
3868 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3869 hash_algo = TEE_ALG_SHA256;
3870#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003871 else
3872 hash_algo = TEE_ALG_HASH_ALGO(
3873 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003874
3875 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3876 ta_crypt_cmd_allocate_operation(c, &session,
3877 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3878 goto out;
3879
3880 ptx_hash_size = sizeof(ptx_hash);
3881 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3882 ta_crypt_cmd_digest_do_final(c, & session, op,
3883 tv->ptx, tv->ptx_len, ptx_hash,
3884 &ptx_hash_size)))
3885 goto out;
3886
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003887 /*
3888 * When we use DSA algorithms, the size of the hash we
3889 * consider equals the min between the size of the
3890 * "subprime" in the key and the size of the hash
3891 */
3892 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3893 TEE_MAIN_ALGO_DSA) {
3894 if (tv->params.dsa.sub_prime_len <=
3895 ptx_hash_size)
3896 ptx_hash_size =
3897 tv->params.dsa.sub_prime_len;
3898 }
3899
Pascal Brandc639ac82015-07-02 08:53:34 +02003900 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3901 ta_crypt_cmd_free_operation(c, &session, op)))
3902 goto out;
3903 }
3904
3905 num_algo_params = 0;
3906 num_key_attrs = 0;
3907 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3908 case TEE_MAIN_ALGO_RSA:
3909 if (tv->params.rsa.salt_len > 0) {
3910 algo_params[0].attributeID =
3911 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3912 algo_params[0].content.value.a =
3913 tv->params.rsa.salt_len;
3914 algo_params[0].content.value.b = 0;
3915 num_algo_params = 1;
3916 }
3917
3918 max_key_size = tv->params.rsa.modulus_len * 8;
3919
3920 xtest_add_attr(&num_key_attrs, key_attrs,
3921 TEE_ATTR_RSA_MODULUS,
3922 tv->params.rsa.modulus,
3923 tv->params.rsa.modulus_len);
3924 xtest_add_attr(&num_key_attrs, key_attrs,
3925 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3926 tv->params.rsa.pub_exp,
3927 tv->params.rsa.pub_exp_len);
3928
3929 if (!ADBG_EXPECT_TRUE(c,
3930 create_key(c, &session,
3931 max_key_size,
3932 TEE_TYPE_RSA_PUBLIC_KEY,
3933 key_attrs,
3934 num_key_attrs,
3935 &pub_key_handle)))
3936 goto out;
3937
3938 xtest_add_attr(&num_key_attrs, key_attrs,
3939 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3940 tv->params.rsa.priv_exp,
3941 tv->params.rsa.priv_exp_len);
3942
3943 if (tv->params.rsa.prime1_len != 0) {
3944 xtest_add_attr(&num_key_attrs, key_attrs,
3945 TEE_ATTR_RSA_PRIME1,
3946 tv->params.rsa.prime1,
3947 tv->params.rsa.prime1_len);
3948 }
3949
3950 if (tv->params.rsa.prime2_len != 0) {
3951 xtest_add_attr(&num_key_attrs, key_attrs,
3952 TEE_ATTR_RSA_PRIME2,
3953 tv->params.rsa.prime2,
3954 tv->params.rsa.prime2_len);
3955 }
3956
3957 if (tv->params.rsa.exp1_len != 0) {
3958 xtest_add_attr(&num_key_attrs, key_attrs,
3959 TEE_ATTR_RSA_EXPONENT1,
3960 tv->params.rsa.exp1,
3961 tv->params.rsa.exp1_len);
3962 }
3963
3964 if (tv->params.rsa.exp2_len != 0) {
3965 xtest_add_attr(&num_key_attrs, key_attrs,
3966 TEE_ATTR_RSA_EXPONENT2,
3967 tv->params.rsa.exp2,
3968 tv->params.rsa.exp2_len);
3969 }
3970
3971 if (tv->params.rsa.coeff_len != 0) {
3972 xtest_add_attr(&num_key_attrs, key_attrs,
3973 TEE_ATTR_RSA_COEFFICIENT,
3974 tv->params.rsa.coeff,
3975 tv->params.rsa.coeff_len);
3976 }
3977
3978 if (!ADBG_EXPECT_TRUE(c,
3979 create_key(c, &session,
3980 max_key_size,
3981 TEE_TYPE_RSA_KEYPAIR,
3982 key_attrs,
3983 num_key_attrs,
3984 &priv_key_handle)))
3985 goto out;
3986 break;
3987
3988 case TEE_MAIN_ALGO_DSA:
3989 max_key_size = tv->params.dsa.prime_len * 8;
3990
3991 xtest_add_attr(&num_key_attrs, key_attrs,
3992 TEE_ATTR_DSA_PRIME,
3993 tv->params.dsa.prime,
3994 tv->params.dsa.prime_len);
3995 xtest_add_attr(&num_key_attrs, key_attrs,
3996 TEE_ATTR_DSA_SUBPRIME,
3997 tv->params.dsa.sub_prime,
3998 tv->params.dsa.sub_prime_len);
3999 xtest_add_attr(&num_key_attrs, key_attrs,
4000 TEE_ATTR_DSA_BASE,
4001 tv->params.dsa.base,
4002 tv->params.dsa.base_len);
4003 xtest_add_attr(&num_key_attrs, key_attrs,
4004 TEE_ATTR_DSA_PUBLIC_VALUE,
4005 tv->params.dsa.pub_val,
4006 tv->params.dsa.pub_val_len);
4007
4008 if (!ADBG_EXPECT_TRUE(c,
4009 create_key(c, &session, max_key_size,
4010 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
4011 num_key_attrs, &pub_key_handle)))
4012 goto out;
4013
4014 xtest_add_attr(&num_key_attrs, key_attrs,
4015 TEE_ATTR_DSA_PRIVATE_VALUE,
4016 tv->params.dsa.priv_val,
4017 tv->params.dsa.priv_val_len);
4018
4019 if (!ADBG_EXPECT_TRUE(c,
4020 create_key(c, &session, max_key_size,
4021 TEE_TYPE_DSA_KEYPAIR, key_attrs,
4022 num_key_attrs, &priv_key_handle)))
4023 goto out;
4024 break;
4025
Pascal Brand3e143ee2015-07-15 17:17:16 +02004026 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004027 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01004028 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02004029 switch (tv->algo) {
4030 case TEE_ALG_ECDSA_P192:
4031 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004032 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4033 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004034 break;
4035 case TEE_ALG_ECDSA_P224:
4036 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004037 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4038 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004039 break;
4040 case TEE_ALG_ECDSA_P256:
4041 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004042 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4043 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004044 break;
4045 case TEE_ALG_ECDSA_P384:
4046 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004047 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4048 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004049 break;
4050 case TEE_ALG_ECDSA_P521:
4051 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004052 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4053 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
4054 break;
4055 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01004056 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004057 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
4058 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004059 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004060 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01004061 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004062 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
4063 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
4064 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004065 default:
4066 curve = 0xFF;
4067 break;
4068 }
4069
4070 if (tv->algo == TEE_ALG_ECDSA_P521)
4071 max_key_size = 521;
4072 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004073 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004074
Jerome Forissier26393882022-03-09 21:22:30 +01004075 if (curve != XTEST_NO_CURVE)
4076 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004077 TEE_ATTR_ECC_CURVE, curve, 0);
4078 xtest_add_attr(&num_key_attrs, key_attrs,
4079 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004080 tv->params.ecc.public_x,
4081 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004082 xtest_add_attr(&num_key_attrs, key_attrs,
4083 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004084 tv->params.ecc.public_y,
4085 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004086
4087 if (!ADBG_EXPECT_TRUE(c,
4088 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004089 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004090 num_key_attrs, &pub_key_handle)))
4091 goto out;
4092
4093 xtest_add_attr(&num_key_attrs, key_attrs,
4094 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004095 tv->params.ecc.private,
4096 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004097
4098 if (!ADBG_EXPECT_TRUE(c,
4099 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004100 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004101 num_key_attrs, &priv_key_handle)))
4102 goto out;
4103 break;
4104
Pascal Brandc639ac82015-07-02 08:53:34 +02004105 default:
4106 ADBG_EXPECT_TRUE(c, false);
4107 goto out;
4108 }
4109
4110 out_size = sizeof(out);
4111 memset(out, 0, sizeof(out));
4112 switch (tv->mode) {
4113 case TEE_MODE_ENCRYPT:
4114 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4115 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004116 &op, tv->algo, TEE_MODE_ENCRYPT,
4117 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004118 goto out;
4119
4120 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4121 ta_crypt_cmd_set_operation_key(c, &session, op,
4122 pub_key_handle)))
4123 goto out;
4124
4125 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4126 ta_crypt_cmd_free_transient_object(c, &session,
4127 pub_key_handle)))
4128 goto out;
4129 pub_key_handle = TEE_HANDLE_NULL;
4130
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004131 num_algo_params = 0;
4132 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1) {
4133 algo_params[0].attributeID =
4134 TEE_ATTR_RSA_OAEP_MGF_HASH;
4135 algo_params[0].content.ref.length =
Etienne Carrierea286b572023-06-28 14:30:19 +02004136 sizeof(sha1_algo_id);
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004137 algo_params[0].content.ref.buffer =
Etienne Carrierea286b572023-06-28 14:30:19 +02004138 &sha1_algo_id;
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004139 num_algo_params = 1;
4140 }
4141
4142
Pascal Brandc639ac82015-07-02 08:53:34 +02004143 out_enc_size = sizeof(out_enc);
4144 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4145 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004146 algo_params, num_algo_params, tv->ptx,
4147 tv->ptx_len, out_enc, &out_enc_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004148 goto out;
4149
4150 /*
4151 * A PS which is random is added when formatting the
4152 * message internally of the algorithm so we can't
4153 * verify against precomputed values, instead we use the
4154 * decrypt operation to see that output is correct.
4155 */
4156
4157 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4158 ta_crypt_cmd_free_operation(c, &session, op)))
4159 goto out;
4160
4161 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4162 ta_crypt_cmd_allocate_operation(c, &session,
4163 &op, tv->algo, TEE_MODE_DECRYPT,
4164 max_key_size)))
4165 goto out;
4166
4167 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4168 ta_crypt_cmd_set_operation_key(c, &session, op,
4169 priv_key_handle)))
4170 goto out;
4171
4172 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4173 ta_crypt_cmd_free_transient_object(c, &session,
4174 priv_key_handle)))
4175 goto out;
4176
4177 priv_key_handle = TEE_HANDLE_NULL;
4178
4179 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4180 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4181 NULL, 0, out_enc, out_enc_size, out,
4182 &out_size)))
4183 goto out;
4184
4185 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4186 out_size);
4187 break;
4188
4189 case TEE_MODE_DECRYPT:
4190 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4191 ta_crypt_cmd_allocate_operation(c, &session,
4192 &op, tv->algo, TEE_MODE_DECRYPT,
4193 max_key_size)))
4194 goto out;
4195
4196 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4197 ta_crypt_cmd_set_operation_key(c, &session, op,
4198 priv_key_handle)))
4199 goto out;
4200
4201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4202 ta_crypt_cmd_free_transient_object(c, &session,
4203 priv_key_handle)))
4204 goto out;
4205
4206 priv_key_handle = TEE_HANDLE_NULL;
4207
4208 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4209 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4210 NULL, 0, tv->ctx, tv->ctx_len, out,
4211 &out_size)))
4212 goto out;
4213
4214 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4215 out_size);
4216 break;
4217
4218 case TEE_MODE_VERIFY:
4219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4220 ta_crypt_cmd_allocate_operation(c, &session,
4221 &op, tv->algo, TEE_MODE_VERIFY,
4222 max_key_size)))
4223 goto out;
4224
4225 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4226 ta_crypt_cmd_set_operation_key(c, &session, op,
4227 pub_key_handle)))
4228 goto out;
4229
4230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4231 ta_crypt_cmd_free_transient_object(c, &session,
4232 pub_key_handle)))
4233 goto out;
4234
4235 pub_key_handle = TEE_HANDLE_NULL;
4236
4237 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4238 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4239 algo_params, num_algo_params, ptx_hash,
4240 ptx_hash_size, tv->ctx, tv->ctx_len)))
4241 goto out;
4242 break;
4243
4244 case TEE_MODE_SIGN:
4245 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4246 ta_crypt_cmd_allocate_operation(c, &session,
4247 &op, tv->algo, TEE_MODE_SIGN,
4248 max_key_size)))
4249 goto out;
4250
4251 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4252 ta_crypt_cmd_set_operation_key(c, &session, op,
4253 priv_key_handle)))
4254 goto out;
4255
4256 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4257 ta_crypt_cmd_free_transient_object(c, &session,
4258 priv_key_handle)))
4259 goto out;
4260
4261 priv_key_handle = TEE_HANDLE_NULL;
4262
4263 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4264 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4265 algo_params, num_algo_params, ptx_hash,
4266 ptx_hash_size, out, &out_size)))
4267 goto out;
4268
4269 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4270 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004271 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004272 tv->algo == TEE_ALG_DSA_SHA224 ||
4273 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004274 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004275 TEE_MAIN_ALGO_ECDSA ||
4276 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004277 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4278 ta_crypt_cmd_free_operation(c, &session,
4279 op)))
4280 goto out;
4281 /*
4282 * The salt or K is random so we can't verify
4283 * signing against precomputed values, instead
4284 * we use the verify operation to see that
4285 * output is correct.
4286 */
4287 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4288 ta_crypt_cmd_allocate_operation(c,
4289 &session, &op, tv->algo,
4290 TEE_MODE_VERIFY, max_key_size)))
4291 goto out;
4292
4293 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4294 ta_crypt_cmd_set_operation_key(c,
4295 &session, op, pub_key_handle)))
4296 goto out;
4297
4298 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4299 ta_crypt_cmd_free_transient_object(c,
4300 &session, pub_key_handle)))
4301 goto out;
4302
4303 pub_key_handle = TEE_HANDLE_NULL;
4304
4305 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4306 ta_crypt_cmd_asymmetric_verify(c,
4307 &session, op, algo_params,
4308 num_algo_params, ptx_hash,
4309 ptx_hash_size, out, out_size)))
4310 goto out;
4311 } else {
4312 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4313 tv->ctx_len, out,
4314 out_size);
4315 }
4316 break;
4317
4318 default:
4319 break;
4320 }
4321
4322 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4323 ta_crypt_cmd_free_operation(c, &session, op)))
4324 goto out;
4325
4326 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4327 ta_crypt_cmd_free_transient_object(c, &session,
4328 pub_key_handle)))
4329 goto out;
4330 pub_key_handle = TEE_HANDLE_NULL;
4331
4332 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4333 ta_crypt_cmd_free_transient_object(c, &session,
4334 priv_key_handle)))
4335 goto out;
4336
4337 priv_key_handle = TEE_HANDLE_NULL;
4338
4339 Do_ADBG_EndSubCase(c, NULL);
4340 }
4341out:
4342 TEEC_CloseSession(&session);
4343}
Jens Wiklander14f48872018-06-29 15:30:13 +02004344ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4345 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004346
4347#define KEY_ATTR(x, y) { #x, (x), y }
4348
4349struct key_attrs {
4350 const char *name;
4351 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004352 /*
4353 * When keysize_check != 0: size of attribute is checked
4354 * Expected value is key_size bits except for DH in which case it is
4355 * the value of keysize_check.
4356 */
4357 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004358};
4359
4360static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4361 TEE_ObjectHandle key, uint32_t key_size,
4362 struct key_attrs *attrs, size_t num_attrs)
4363{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004364 uint8_t out[2048] = { };
4365 size_t out_size = 0;
4366 size_t n = 0;
4367 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004368
4369 for (m = 0; m < num_attrs; m++) {
4370 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4371 out_size = sizeof(out);
4372 memset(out, 0, sizeof(out));
4373 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4374 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4375 key, attrs[m].attr, out, &out_size)))
4376 return false;
4377
4378 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004379 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004380 key_size / 8);
4381
4382 if (out_size > 0) {
4383 /* Check that buffer isn't all zeroes */
4384 for (n = 0; n < out_size; n++)
4385 if (out[n] != 0)
4386 break;
4387 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4388 out_size))
4389 return false;
4390 }
4391 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004392 uint32_t a = 0;
4393 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004394
4395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4396 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4397 attrs[m].attr, &a, &b)))
4398 return false;
4399 }
4400 }
4401 return true;
4402}
4403
4404static bool test_secret_value(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_SECRET_VALUE, true),
4409 };
4410
4411 return test_keygen_attributes(c, s, key, key_size,
4412 (struct key_attrs *)&attrs,
4413 ARRAY_SIZE(attrs));
4414}
4415
4416
4417static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4418 TEE_ObjectHandle key, uint32_t key_size)
4419{
4420 const struct key_attrs attrs[] = {
4421 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4422 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4423 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4424 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4425 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4426 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4427 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4428 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4429 };
4430
4431 return test_keygen_attributes(c, s, key, key_size,
4432 (struct key_attrs *)&attrs,
4433 ARRAY_SIZE(attrs));
4434}
4435
Pascal Brande61133f2015-07-08 15:38:37 +02004436static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4437 TEE_ObjectHandle key, uint32_t key_size)
4438{
4439 const struct key_attrs attrs[] = {
4440 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4441 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4442 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4443 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4444 };
4445
4446 return test_keygen_attributes(c, s, key, key_size,
4447 (struct key_attrs *)&attrs,
4448 ARRAY_SIZE(attrs));
4449}
4450
Pascal Brandc639ac82015-07-02 08:53:34 +02004451static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004452 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004453{
4454 const struct key_attrs attrs[] = {
4455 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4456 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4457 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4458 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4459 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4460 };
4461
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004462 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004463 (struct key_attrs *)&attrs,
4464 ARRAY_SIZE(attrs));
4465}
4466
4467static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4468 TEE_ObjectHandle key, uint32_t key_size)
4469{
4470 const struct key_attrs attrs[] = {
4471 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4472 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4473 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4474 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4475 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_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
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004483static bool test_x25519_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_X25519_PRIVATE_VALUE, false),
4488 KEY_ATTR(TEE_ATTR_X25519_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
Valerii Chubarab9863c2022-08-12 07:42:29 +00004496static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4497 TEE_ObjectHandle key, uint32_t key_size)
4498{
4499 const struct key_attrs attrs[] = {
4500 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4501 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4502 };
4503
4504 return test_keygen_attributes(c, s, key, key_size,
4505 (struct key_attrs *)&attrs,
4506 ARRAY_SIZE(attrs));
4507}
4508
Pascal Brandc639ac82015-07-02 08:53:34 +02004509static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4510 uint32_t key_type, uint32_t check_keysize,
4511 uint32_t key_size,
4512 TEE_Attribute *params, size_t param_count)
4513{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004514 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004515 bool ret_val = true;
4516
4517 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4518 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4519 &key)))
4520 return false;
4521
4522 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4523 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4524 param_count)))
4525 return false;
4526
4527 switch (key_type) {
4528 case TEE_TYPE_DES:
4529 case TEE_TYPE_DES3:
4530 ret_val = ADBG_EXPECT_TRUE(c,
4531 test_secret_value(c, s, key,
4532 key_size + key_size / 7));
4533 break;
4534 case TEE_TYPE_AES:
4535 case TEE_TYPE_HMAC_MD5:
4536 case TEE_TYPE_HMAC_SHA1:
4537 case TEE_TYPE_HMAC_SHA224:
4538 case TEE_TYPE_HMAC_SHA256:
4539 case TEE_TYPE_HMAC_SHA384:
4540 case TEE_TYPE_HMAC_SHA512:
4541 case TEE_TYPE_GENERIC_SECRET:
4542 ret_val = ADBG_EXPECT_TRUE(c,
4543 test_secret_value(c, s, key, key_size));
4544 break;
4545
4546 case TEE_TYPE_RSA_KEYPAIR:
4547 ret_val = ADBG_EXPECT_TRUE(c,
4548 test_rsa_key_pair(c, s, key, key_size));
4549 break;
4550
Pascal Brande61133f2015-07-08 15:38:37 +02004551 case TEE_TYPE_ECDSA_KEYPAIR:
4552 case TEE_TYPE_ECDH_KEYPAIR:
4553 ret_val = ADBG_EXPECT_TRUE(c,
4554 test_ecc_key_pair(c, s, key, key_size));
4555 break;
4556
Pascal Brandc639ac82015-07-02 08:53:34 +02004557 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004558 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004559 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004560 break;
4561
4562 case TEE_TYPE_DSA_KEYPAIR:
4563 ret_val = ADBG_EXPECT_TRUE(c,
4564 test_dsa_key_pair(c, s, key, key_size));
4565 break;
4566
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004567 case TEE_TYPE_X25519_KEYPAIR:
4568 ret_val = ADBG_EXPECT_TRUE(c,
4569 test_x25519_key_pair(c, s, key, key_size));
4570 break;
4571
Valerii Chubarab9863c2022-08-12 07:42:29 +00004572 case TEE_TYPE_ED25519_KEYPAIR:
4573 ret_val = ADBG_EXPECT_TRUE(c,
4574 test_ed25519_key_pair(c, s, key, key_size));
4575 break;
4576
Pascal Brandc639ac82015-07-02 08:53:34 +02004577 default:
4578 ret_val = false;
4579 break;
4580 }
4581
4582 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4583 ta_crypt_cmd_free_transient_object(c, s, key)))
4584 return false;
4585
4586 return ret_val;
4587}
4588
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004589struct key_types_noparam {
4590 unsigned level;
4591 const char *name;
4592 uint32_t key_type;
4593 uint32_t quanta;
4594 uint32_t min_size;
4595 uint32_t max_size;
4596};
4597
4598static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4599 const struct key_types_noparam *key_types,
4600 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004601{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004602 size_t n = 0;
4603 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004604
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004605 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004606 uint32_t min_size = key_types[n].min_size;
4607 uint32_t max_size = key_types[n].max_size;
4608 uint32_t quanta = key_types[n].quanta;
4609
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004610 if (key_types[n].level > level)
4611 continue;
4612
Pascal Brandc639ac82015-07-02 08:53:34 +02004613 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4614
4615 for (key_size = min_size; key_size <= max_size;
4616 key_size += quanta) {
4617 if (!ADBG_EXPECT_TRUE(c,
4618 generate_and_test_key(c, session, key_types
4619 [n].key_type, 1, key_size, NULL, 0)))
4620 break;
4621 }
4622
4623 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4624 }
4625}
4626
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004627static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004628{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004629 TEEC_Session session = { };
4630 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004631 static const struct key_types_noparam key_types[] = {
4632 { 0, "AES", TEE_TYPE_AES, 64, 128,
4633 256 /* valid sizes 128, 192, 256 */ },
4634 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4635 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4636 168 /* valid sizes 112, 168 */ },
4637 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4638 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4639 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4640 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4641 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4642 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4643 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4644 };
4645
4646 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4647 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4648 &ret_orig)))
4649 return;
4650
4651 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4652
4653 TEEC_CloseSession(&session);
4654}
4655ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4656 "Test TEE Internal API Generate Symmetric key");
4657
4658static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4659{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004660 TEEC_Session session = { };
4661 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004662 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004663#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004664 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4665 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004666#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004667 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004668#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004669 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4670 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4671 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004672#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004673 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4674 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4675 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4676 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4677 };
4678
4679 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4680 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4681 &ret_orig)))
4682 return;
4683
4684 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4685
4686 TEEC_CloseSession(&session);
4687}
4688ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4689 "Test TEE Internal API Generate RSA key");
4690
4691static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4692{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004693 TEEC_Session session = { };
4694 uint32_t ret_orig = 0;
4695 size_t n = 0;
4696 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004697 /*
4698 * Note that the key size parameter is not used when creating the keys
4699 * but specifying these sizes make it possible to test the expected size
4700 * of the private value. This also means that the keysize must match the
4701 * size of p or what is specified in private_bits or the equvivalent
4702 * size of the subprime parameter.
4703 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004704 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004705
4706#define XTEST_DH_GK_DATA(vect) \
4707 ARRAY(vect ## _p), \
4708 ARRAY(vect ## _g), \
4709 &vect ## _private_bits, \
4710 0, 0
4711#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4712 ARRAY(vect ## _p), \
4713 ARRAY(vect ## _g), \
4714 &vect ## _private_bits, \
4715 ARRAY(vect ## _subprime)
4716 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004717 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004718 uint32_t key_size;
4719 const uint8_t *p;
4720 size_t p_len;
4721 const uint8_t *g;
4722 size_t g_len;
4723 const uint32_t *private_bits;
4724 const uint8_t *subprime;
4725 size_t subprime_len;
4726 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004727 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004728 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004729 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004730 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004731 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004732 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004733 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004734 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004735 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004736 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004737 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004738 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004739 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004740 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004741 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004742 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004743 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004744 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004745 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004746 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004747 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004748 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004749 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004750 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004751 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004752 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004753 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004754 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004755 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004756 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004757 };
4758
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004759 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4760 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4761 &ret_orig)))
4762 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004763
4764 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004765 if (key_types[n].level > level)
4766 continue;
4767
Pascal Brandc639ac82015-07-02 08:53:34 +02004768 Do_ADBG_BeginSubCase(c,
4769 "Generate DH key %d bits - Private bits = %d",
4770 key_types[n].key_size,
4771 *key_types[n].private_bits);
4772 param_count = 0;
4773
4774 xtest_add_attr(&param_count, params,
4775 TEE_ATTR_DH_PRIME,
4776 key_types[n].p, key_types[n].p_len);
4777
4778 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4779 key_types[n].g, key_types[n].g_len);
4780
4781 if (key_types[n].private_bits != 0) {
4782 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4783
4784 params[param_count].content.value.a =
4785 *key_types[n].private_bits;
4786
4787 params[param_count].content.value.b = 0;
4788 param_count++;
4789 }
4790
4791 if (key_types[n].subprime != 0) {
4792 xtest_add_attr(&param_count, params,
4793 TEE_ATTR_DH_SUBPRIME,
4794 key_types[n].subprime,
4795 key_types[n].subprime_len);
4796 }
4797
4798 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004799 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004800 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004801 key_types[n]. key_size, params, param_count)))
4802 break;
4803
4804 Do_ADBG_EndSubCase(c,
4805 "Generate DH key %d bits - Private bits = %d",
4806 key_types[n].key_size,
4807 *key_types[n].private_bits);
4808 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004809
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004810 TEEC_CloseSession(&session);
4811}
4812ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4813 "Test TEE Internal API Generate DH key");
4814
4815static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004816{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004817 TEEC_Session session = { };
4818 uint32_t ret_orig = 0;
4819 size_t n = 0;
4820 size_t param_count = 0;
4821 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004822
4823#define XTEST_DSA_GK_DATA(vect) \
4824 ARRAY(vect ## _p), \
4825 ARRAY(vect ## _g), \
4826 ARRAY(vect ## _q)
4827 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004828 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004829 uint32_t key_size;
4830 const uint8_t *prime;
4831 size_t prime_len;
4832 const uint8_t *base;
4833 size_t base_len;
4834 const uint8_t *sub_prime;
4835 size_t sub_prime_len;
4836 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004837 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004838 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004839 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4840 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4841 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4842 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4843 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4844 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4845 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4846 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004847 };
4848
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004849 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4850 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4851 &ret_orig)))
4852 return;
4853
Pascal Brandc639ac82015-07-02 08:53:34 +02004854 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004855 if (key_types[n].level > level)
4856 continue;
4857
Pascal Brandc639ac82015-07-02 08:53:34 +02004858 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4859 key_types[n].key_size);
4860 param_count = 0;
4861
4862
4863 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4864 key_types[n].prime, key_types[n].prime_len);
4865
4866 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4867 key_types[n].sub_prime,
4868 key_types[n].sub_prime_len);
4869
4870 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4871 key_types[n].base, key_types[n].base_len);
4872
4873 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004874 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004875 1, key_types[n]. key_size, params,
4876 param_count)))
4877 break;
4878
4879 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4880 key_types[n].key_size);
4881 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004882
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004883 TEEC_CloseSession(&session);
4884}
4885ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4886 "Test TEE Internal API Generate DSA key");
4887
4888static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004889{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004890 TEEC_Session session = { };
4891 uint32_t ret_orig = 0;
4892 size_t n = 0;
4893 size_t param_count = 0;
4894 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004895
4896 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004897 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004898 const char *name;
4899 uint32_t algo;
4900 uint32_t curve;
4901 uint32_t key_size;
4902 } key_types[] = {
4903 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004904 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4905 192 },
4906 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4907 224 },
4908 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4909 256 },
4910 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4911 384 },
4912 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4913 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004914
4915 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004916 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4917 192 },
4918 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4919 224 },
4920 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4921 256 },
4922 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4923 384 },
4924 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4925 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004926 };
4927
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004928 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4929 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4930 &ret_orig)))
4931 return;
4932
Pascal Brande61133f2015-07-08 15:38:37 +02004933 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004934 if (key_types[n].level > level)
4935 continue;
4936
Pascal Brande61133f2015-07-08 15:38:37 +02004937 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4938 param_count = 0;
4939
4940 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4941 key_types[n].curve, 0);
4942
4943 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004944 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004945 0, key_types[n].key_size, params,
4946 param_count)))
4947 break;
4948
4949 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4950 }
Pascal Brande61133f2015-07-08 15:38:37 +02004951
Pascal Brandc639ac82015-07-02 08:53:34 +02004952 TEEC_CloseSession(&session);
4953}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004954ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4955 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004956
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004957static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4958{
4959 TEEC_Session session = { };
4960 uint32_t ret_orig = 0;
4961
4962 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4963 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4964 NULL, &ret_orig)))
4965 return;
4966
Jerome Forissier366179c2022-06-28 10:12:58 +02004967 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4968 TEE_ECC_CURVE_25519)) {
4969 Do_ADBG_Log("X25519 not supported: skip subcase");
4970 goto out;
4971 }
4972
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004973 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4974
4975 if (!ADBG_EXPECT_TRUE(c,
4976 generate_and_test_key(c, &session,
4977 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4978 NULL, 0)))
4979 return;
4980
4981 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004982out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004983 TEEC_CloseSession(&session);
4984}
4985ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4986 "Test TEE Internal API Generate X25519 key");
4987
Valerii Chubarab9863c2022-08-12 07:42:29 +00004988
4989static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4990{
4991 TEEC_Session session = { };
4992 uint32_t ret_orig = 0;
4993
4994 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4995 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4996 NULL, &ret_orig)))
4997 return;
4998
4999 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5000 TEE_ECC_CURVE_25519)) {
5001 Do_ADBG_Log("ED25519 not supported: skip subcase");
5002 goto out;
5003 }
5004
5005 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
5006
5007 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
5008 TEE_TYPE_ED25519_KEYPAIR,
5009 0, 256, NULL, 0));
5010
5011 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
5012out:
5013 TEEC_CloseSession(&session);
5014}
5015ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
5016 "Test TEE Internal API Generate ed25519 key");
5017
Pascal Brandc639ac82015-07-02 08:53:34 +02005018static void xtest_tee_test_4008(ADBG_Case_t *c)
5019{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005020 TEEC_Session session = { };
5021 uint32_t ret_orig = 0;
5022 TEE_OperationHandle op = TEE_HANDLE_NULL;
5023 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5024 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5025 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005026 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005027 uint8_t out[2048] = { };
5028 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005029
5030 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5031 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5032 &ret_orig)))
5033 return;
5034
5035 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5036
5037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5038 ta_crypt_cmd_allocate_operation(c, &session, &op,
5039 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5040 derive_key_max_keysize)))
5041 goto out;
5042
5043 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5044 ta_crypt_cmd_allocate_transient_object(c, & session,
5045 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5046 &key_handle)))
5047 goto out;
5048
5049 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5050 ARRAY(derive_key_dh_prime));
5051
5052 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5053 ARRAY(derive_key_dh_base));
5054
5055 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5056 ARRAY(derive_key_dh_public_value));
5057
5058 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5059 ARRAY(derive_key_dh_private_value));
5060
5061 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5062 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5063 params, param_count)))
5064 goto out;
5065
5066 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5067 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5068 goto out;
5069
5070 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5071 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5072 goto out;
5073
5074 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5075 ta_crypt_cmd_allocate_transient_object(c, &session,
5076 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5077 &sv_handle)))
5078 goto out;
5079
Pascal Brand2b92b642015-07-16 13:29:42 +02005080 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005081 param_count = 0;
5082
5083 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5084 ARRAY(derive_key_dh_public_value_2));
5085
5086 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5087 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5088 param_count)))
5089 goto out;
5090
5091 out_size = sizeof(out);
5092 memset(out, 0, sizeof(out));
5093 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5094 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5095 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5096 goto out;
5097
5098 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5099 sizeof(derive_key_dh_shared_secret), out,
5100 out_size))
5101 goto out;
5102
5103 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5104 ta_crypt_cmd_free_operation(c, &session, op)))
5105 goto out;
5106
5107 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5108 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5109 goto out;
5110out:
5111 Do_ADBG_EndSubCase(c, "Derive DH key success");
5112 TEEC_CloseSession(&session);
5113}
Jens Wiklander14f48872018-06-29 15:30:13 +02005114ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5115 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005116
5117static void xtest_tee_test_4009(ADBG_Case_t *c)
5118{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005119 TEEC_Session session = { };
5120 uint32_t ret_orig = 0;
5121 TEE_OperationHandle op = TEE_HANDLE_NULL;
5122 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5123 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5124 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005125 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005126 uint8_t out[2048] = { };
5127 size_t out_size = 0;
5128 uint32_t size_bytes = 0;
5129 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305130 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005131
5132 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5133 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5134 &ret_orig)))
5135 return;
5136
5137 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5138 pt = &derive_key_ecdh[i];
5139
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005140 if (pt->level > level)
5141 continue;
5142
Pascal Brand2b92b642015-07-16 13:29:42 +02005143 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5144 pt->algo);
5145 size_bytes = (pt->keysize + 7) / 8;
5146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5147 ta_crypt_cmd_allocate_operation(c, &session, &op,
5148 pt->algo,
5149 TEE_MODE_DERIVE, pt->keysize)))
5150 goto out;
5151
5152 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5153 ta_crypt_cmd_allocate_transient_object(c, & session,
5154 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5155 &key_handle)))
5156 goto out;
5157
5158 param_count = 0;
5159 xtest_add_attr_value(&param_count, params,
5160 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5161 xtest_add_attr(&param_count, params,
5162 TEE_ATTR_ECC_PRIVATE_VALUE,
5163 pt->private, size_bytes);
5164 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005165 * The public value is not used, but we should provide a valid
5166 * one to avoid rejection in case TEE_PopulateTransientObject()
5167 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005168 */
5169 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005170 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5171 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005172 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005173 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5174 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005175
5176 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5177 ta_crypt_cmd_populate_transient_object(c,
5178 &session,
5179 key_handle, params, param_count)))
5180 goto out;
5181
5182 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5183 ta_crypt_cmd_set_operation_key(c, &session, op,
5184 key_handle)))
5185 goto out;
5186
5187 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5188 ta_crypt_cmd_free_transient_object(c, & session,
5189 key_handle)))
5190 goto out;
5191
5192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5193 ta_crypt_cmd_allocate_transient_object(c, &session,
5194 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5195 &sv_handle)))
5196 goto out;
5197
5198 /* reuse but reset params and param-count */
5199 param_count = 0;
5200
5201 xtest_add_attr(&param_count, params,
5202 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5203 pt->public_x, size_bytes);
5204 xtest_add_attr(&param_count, params,
5205 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5206 pt->public_y, size_bytes);
5207
5208 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5209 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5210 params, param_count)))
5211 goto out;
5212
5213 out_size = sizeof(out);
5214 memset(out, 0, sizeof(out));
5215 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5216 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5217 sv_handle,
5218 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5219 goto out;
5220
5221 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5222 out, out_size))
5223 goto out;
5224
5225 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5226 ta_crypt_cmd_free_operation(c, &session, op)))
5227 goto out;
5228
5229 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5230 ta_crypt_cmd_free_transient_object(c, &session,
5231 sv_handle)))
5232 goto out;
5233
5234 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5235 pt->algo);
5236 }
5237
5238 goto noerror;
5239
5240out:
5241 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5242
5243noerror:
5244 TEEC_CloseSession(&session);
5245}
Jens Wiklander14f48872018-06-29 15:30:13 +02005246ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5247 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005248
5249static void xtest_tee_test_4010(ADBG_Case_t *c)
5250{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005251 TEEC_Session session = { };
5252 uint32_t ret_orig = 0;
5253 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005254 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5255 static const TEE_Attribute attr = {
5256 .attributeID = TEE_ATTR_SECRET_VALUE,
5257 .content.ref.buffer = (void *)large_key,
5258 .content.ref.length = sizeof(large_key),
5259 };
5260
5261 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5262 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5263 &ret_orig)))
5264 return;
5265
5266 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5267 ta_crypt_cmd_allocate_transient_object(c, &session,
5268 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5269 goto out;
5270
5271 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5272 ta_crypt_cmd_populate_transient_object(c, &session, o,
5273 &attr, 1));
5274
5275out:
5276 TEEC_CloseSession(&session);
5277}
Jens Wiklander14f48872018-06-29 15:30:13 +02005278ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5279 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005280
5281static void xtest_tee_test_4011(ADBG_Case_t *c)
5282{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005283 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005284 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005285 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5286 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5287 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5288 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5289 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5290 uint32_t ret_orig = 0;
5291 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5292 uint8_t out[1024] = { };
5293 uint8_t tmp[1024] = { };
5294 size_t out_size = 0;
5295 size_t tmp_size = 0;
5296 size_t n = 0;
5297 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005298 size_t i = 0;
5299
5300 /* Setup session, initialize message to sign, create a keypair */
5301 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5302 &crypt_user_ta_uuid, NULL, &ret_orig)))
5303 return;
5304 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5305 &s, in, sizeof(in))))
5306 goto out;
5307 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5308 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5309 goto out;
5310 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5311 key, key_size, NULL, 0)))
5312 goto out;
5313
5314 /* Allocate operations for sign, verify, encrypt and decrypt */
5315 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5316 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5317 key_size)))
5318 goto out;
5319 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5320 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5321 key_size)))
5322 goto out;
5323 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5324 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5325 goto out;
5326 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5327 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5328 goto out;
5329
5330 /* Assign the keypair to all operations */
5331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5332 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5333 goto out;
5334 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5335 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5336 goto out;
5337 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5338 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5339 goto out;
5340 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5341 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5342 goto out;
5343
5344 /*
5345 * The core of the test case is inspired by the one in libtomcrypt:
5346 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5347 *
5348 * Testcase for Bleichenbacher attack
5349 *
5350 * (1) Create a valid signature
5351 * (2) Check that it can be verified
5352 * (3) Transform the package to fetch plain text (using the encrypt
5353 * operation in GP TEE Internal API)
5354 * (4) Forge the structure of PKCS#1-EMSA encoded data
5355 * (4.1) Search for start and end of the padding string
5356 * (4.2) Move the signature to the front of the padding string
5357 * (4.3) Zero the message until the end
5358 * (5) Transform the package back (using the decrypt operation in
5359 * GP TEE Internal API)
5360 * (6) The result should not be valid if the implementation is robust.
5361 */
5362
5363
5364 for (i = 0; i < 9; i++) {
5365 Do_ADBG_Log("Iteration %zu", i);
5366
5367 /* 1 */
5368 out_size = sizeof(out);
5369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5370 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5371 in, sizeof(in), out, &out_size)))
5372 goto out;
5373
5374 /* 2 */
5375 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5376 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5377 in, sizeof(in), out, out_size)))
5378 goto out;
5379
5380 /* 3 */
5381 tmp_size = sizeof(tmp);
5382 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5383 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5384 out, out_size, tmp, &tmp_size)))
5385 goto out;
5386
Etienne Carriere0953bf02018-12-21 15:36:25 +01005387 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5388 goto out;
5389
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005390 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005391 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005392 if (tmp[n] == 0xff)
5393 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005394
5395 /* Shall find at least a padding start before buffer end */
5396 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5397 goto out;
5398
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005399 for (m = n + 1; m < tmp_size; m++)
5400 if (tmp[m] != 0xff)
5401 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005402
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005403 /* 4.2 */
5404 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005405
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005406 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005407 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005408
5409 /* Prevent overrun when zeroing buffer end */
5410 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5411 goto out;
5412
Etienne Carriere0953bf02018-12-21 15:36:25 +01005413 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005414
5415 /* 5 */
5416 out_size = sizeof(out);
5417 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5418 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5419 tmp, tmp_size, out, &out_size)))
5420 goto out;
5421
5422 /* 6 */
5423 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5424 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5425 in, sizeof(in), out, out_size)))
5426 goto out;
5427 }
5428
5429out:
5430 TEEC_CloseSession(&s);
5431}
Jens Wiklander14f48872018-06-29 15:30:13 +02005432ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5433 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005434
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005435static void xtest_tee_test_4012(ADBG_Case_t *c)
5436{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005437 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005438 TEEC_Session session = { };
5439 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005440 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5441 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005442 uint8_t pool_input[32] = { };
5443 time_t t = 0;
5444 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005445
5446 t = time(NULL);
5447 tm_local = *localtime(&t);
5448
5449 memcpy((void *)pool_input, (void *)&tm_local,
5450 sizeof(pool_input) < sizeof(tm_local) ?
5451 sizeof(pool_input) : sizeof(tm_local));
5452
5453
5454 op.params[0].tmpref.buffer = pool_input;
5455 op.params[0].tmpref.size = sizeof(pool_input);
5456 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5457 TEEC_NONE,
5458 TEEC_NONE,
5459 TEEC_NONE);
5460 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5461 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5462 &ret_orig)))
5463 return;
5464
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005465 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5466 &op, &ret_orig);
5467 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5468 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5469 TEEC_ORIGIN_TRUSTED_APP))
5470 Do_ADBG_Log("System PTA not available, skipping test 4012");
5471 else
5472 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5473
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005474 TEEC_CloseSession(&session);
5475}
Jens Wiklander14f48872018-06-29 15:30:13 +02005476ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5477 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005478
5479static void xtest_tee_test_4013(ADBG_Case_t *c)
5480{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005481 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005482 TEEC_Session session = { };
5483 uint32_t ret_orig = 0;
5484 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5485 uint8_t key[32] = { };
5486 uint8_t extra_data[32] = { };
5487
5488 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5489 TEEC_NONE,
5490 TEEC_NONE,
5491 TEEC_NONE);
5492 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5493 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5494 NULL, &ret_orig)))
5495 return;
5496
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005497 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5498 &op, &ret_orig);
5499 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5500 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5501 TEEC_ORIGIN_TRUSTED_APP)) {
5502 Do_ADBG_Log("System PTA not available, skipping test 4013");
5503 goto out;
5504 }
5505 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005506
5507 /* Negative test using non-secure memory */
5508 memset(&op, 0, sizeof(op));
5509 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5510 TEEC_MEMREF_TEMP_OUTPUT,
5511 TEEC_NONE,
5512 TEEC_NONE);
5513
5514 op.params[0].tmpref.buffer = extra_data;
5515 op.params[0].tmpref.size = sizeof(extra_data);
5516 op.params[1].tmpref.buffer = key;
5517 op.params[1].tmpref.size = sizeof(key);
5518 (void)ADBG_EXPECT_TEEC_RESULT(c,
5519 TEEC_ERROR_SECURITY,
5520 TEEC_InvokeCommand(&session,
5521 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5522 &op,
5523 &ret_orig));
5524
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005525out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005526 TEEC_CloseSession(&session);
5527}
5528ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5529 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005530
5531static void xtest_tee_test_4014(ADBG_Case_t *c)
5532{
5533 TEEC_Session session = { };
5534 uint32_t ret_orig = 0;
5535 TEE_OperationHandle op = TEE_HANDLE_NULL;
5536 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5537 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5538 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5539 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5540 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5541 TEE_Attribute params[9] = { };
5542 size_t param_count = 0;
5543 uint8_t out[128] = { };
5544 size_t out_size = 0;
5545 uint8_t conf_A[32] = { };
5546 uint8_t conf_B[32] = { };
5547
5548 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5549 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5550 &ret_orig)))
5551 return;
5552
5553 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5554 TEE_ECC_CURVE_SM2)) {
5555 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5556 goto out;
5557 }
5558
5559 Do_ADBG_BeginSubCase(c, "Initiator side");
5560
5561 /*
5562 * Key exchange protocol running on user A's side. A is initiator.
5563 */
5564
5565 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5566 ta_crypt_cmd_allocate_operation(c, &session, &op,
5567 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5568 goto out;
5569
5570 /* Allocate and initialize keypair of user A */
5571
5572 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5573 ta_crypt_cmd_allocate_transient_object(c, &session,
5574 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5575 goto out;
5576
5577 param_count = 0;
5578
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005579 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5580 ARRAY(gmt_003_part5_b2_public_xA));
5581
5582 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5583 ARRAY(gmt_003_part5_b2_public_yA));
5584
5585 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5586 ARRAY(gmt_003_part5_b2_private_A));
5587
5588 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5589 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5590 params, param_count)))
5591 goto out;
5592
5593 /*
5594 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5595 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5596 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5597 * user B.
5598 */
5599
5600 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5601 ta_crypt_cmd_allocate_transient_object(c, &session,
5602 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5603 goto out;
5604
5605 param_count = 0;
5606
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005607 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5608 ARRAY(gmt_003_part5_b2_eph_public_xA));
5609
5610 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5611 ARRAY(gmt_003_part5_b2_eph_public_yA));
5612
5613 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5614 ARRAY(gmt_003_part5_b2_eph_private_A));
5615
5616 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5617 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5618 params, param_count)))
5619 goto out;
5620
5621 /* Associate user A keys with operation */
5622
5623 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5624 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5625 eph_keyA)))
5626 goto out;
5627
5628 /* Keys have been set, free key objects */
5629
5630 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5631 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5632 goto out;
5633
5634 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5635 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5636 goto out;
5637
5638 /* Allocate output object */
5639
5640 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5641 ta_crypt_cmd_allocate_transient_object(c, &session,
5642 TEE_TYPE_GENERIC_SECRET,
5643 sizeof(gmt_003_part5_b2_shared_secret),
5644 &sv_handle)))
5645 goto out;
5646
5647 /* Set key derivation parameters: user A role, user B information */
5648
5649 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5650 params[0].content.value.a = 0; /* Initiator role */
5651 params[0].content.value.b = 0; /* Not used */
5652 param_count = 1;
5653
5654 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5655 ARRAY(gmt_003_part5_b2_public_xB));
5656
5657 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5658 ARRAY(gmt_003_part5_b2_public_yB));
5659
5660 xtest_add_attr(&param_count, params,
5661 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5662 ARRAY(gmt_003_part5_b2_eph_public_xB));
5663
5664 xtest_add_attr(&param_count, params,
5665 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5666 ARRAY(gmt_003_part5_b2_eph_public_yB));
5667
5668 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5669 ARRAY(gmt_003_part5_b2_id_A));
5670
5671 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5672 ARRAY(gmt_003_part5_b2_id_B));
5673
5674 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5675 ARRAY(gmt_003_part5_b2_conf_B));
5676
5677 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5678 ARRAY(conf_A));
5679
5680 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5681 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5682 param_count)))
5683 goto out;
5684
5685 out_size = sizeof(out);
5686 memset(out, 0, sizeof(out));
5687 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5688 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5689 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5690 goto out;
5691
5692 /* Check derived key */
5693 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5694 sizeof(gmt_003_part5_b2_shared_secret), out,
5695 out_size))
5696 goto out;
5697
5698 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5699 ta_crypt_cmd_free_operation(c, &session, op)))
5700 goto out;
5701
5702 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5703 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5704 goto out;
5705
5706 Do_ADBG_EndSubCase(c, "Initiator side");
5707
5708 Do_ADBG_BeginSubCase(c, "Responder side");
5709
5710 /*
5711 * Key derivation on user B's side
5712 */
5713
5714 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5715 ta_crypt_cmd_allocate_operation(c, &session, &op,
5716 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5717 goto out;
5718
5719 /* Allocate and initialize keypair of user B */
5720
5721 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5722 ta_crypt_cmd_allocate_transient_object(c, &session,
5723 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5724 goto out;
5725
5726 param_count = 0;
5727
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005728 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5729 ARRAY(gmt_003_part5_b2_public_xB));
5730
5731 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5732 ARRAY(gmt_003_part5_b2_public_yB));
5733
5734 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5735 ARRAY(gmt_003_part5_b2_private_B));
5736
5737 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5738 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5739 params, param_count)))
5740 goto out;
5741
5742 /* Allocate and set ephemeral key of user B */
5743
5744 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5745 ta_crypt_cmd_allocate_transient_object(c, &session,
5746 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5747 goto out;
5748
5749 param_count = 0;
5750
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005751 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5752 ARRAY(gmt_003_part5_b2_eph_public_xB));
5753
5754 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5755 ARRAY(gmt_003_part5_b2_eph_public_yB));
5756
5757 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5758 ARRAY(gmt_003_part5_b2_eph_private_B));
5759
5760 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5761 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5762 params, param_count)))
5763 goto out;
5764
5765 /* Associate user B keys with operation */
5766
5767 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5768 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5769 eph_keyB)))
5770 goto out;
5771
5772 /* Keys have been set, free key objects */
5773
5774 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5775 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5776 goto out;
5777
5778 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5779 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5780 goto out;
5781
5782 /* Allocate output object */
5783
5784 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5785 ta_crypt_cmd_allocate_transient_object(c, &session,
5786 TEE_TYPE_GENERIC_SECRET,
5787 sizeof(gmt_003_part5_b2_shared_secret),
5788 &sv_handle)))
5789 goto out;
5790
5791 /* Set key derivation parameters: user B role, user A information */
5792
5793 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5794 params[0].content.value.a = 1; /* Responder role */
5795 params[0].content.value.b = 0; /* Not used */
5796 param_count = 1;
5797
5798 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5799 ARRAY(gmt_003_part5_b2_public_xA));
5800
5801 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5802 ARRAY(gmt_003_part5_b2_public_yA));
5803
5804 xtest_add_attr(&param_count, params,
5805 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5806 ARRAY(gmt_003_part5_b2_eph_public_xA));
5807
5808 xtest_add_attr(&param_count, params,
5809 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5810 ARRAY(gmt_003_part5_b2_eph_public_yA));
5811
5812 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5813 ARRAY(gmt_003_part5_b2_id_A));
5814
5815 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5816 ARRAY(gmt_003_part5_b2_id_B));
5817
5818 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5819 ARRAY(gmt_003_part5_b2_conf_A));
5820
5821 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5822 ARRAY(conf_B));
5823
5824 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5825 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5826 param_count)))
5827 goto out;
5828
5829 out_size = sizeof(out);
5830 memset(out, 0, sizeof(out));
5831 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5832 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5833 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5834 goto out;
5835
5836 /* Check derived key */
5837 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5838 sizeof(gmt_003_part5_b2_shared_secret), out,
5839 out_size))
5840 goto out;
5841
5842 Do_ADBG_EndSubCase(c, "Responder side");
5843
5844out:
5845 TEEC_CloseSession(&session);
5846}
5847ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5848 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005849
5850static void xtest_tee_test_4015(ADBG_Case_t *c)
5851{
5852 TEEC_Session session = { };
5853 uint32_t ret_orig = 0;
5854 TEE_OperationHandle op = TEE_HANDLE_NULL;
5855 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5856 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5857 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5858 TEE_Attribute params[2] = { };
5859 size_t param_count = 0;
5860 uint8_t out[32] = { };
5861 size_t out_size = 0;
5862 char case_str[40] = "Alice side computes shared secret";
5863
5864 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5865 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5866 &ret_orig)))
5867 return;
5868
5869 Do_ADBG_BeginSubCase(c, "%s", case_str);
5870
5871 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5872 TEE_ECC_CURVE_25519)) {
5873 Do_ADBG_Log("X25519 not supported: skip subcase");
5874 goto out;
5875 }
5876
5877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5878 ta_crypt_cmd_allocate_operation(c, &session, &op,
5879 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5880 goto out;
5881
5882 /* Allocate and initialize keypair of Alice */
5883 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5884 ta_crypt_cmd_allocate_transient_object(c, &session,
5885 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5886 goto out;
5887
5888 param_count = 0;
5889
5890 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5891 ARRAY(x25519_alice_public));
5892
5893 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5894 ARRAY(x25519_alice_private));
5895
5896 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5897 ta_crypt_cmd_populate_transient_object(c, &session,
5898 key_alice, params, param_count)))
5899 goto out;
5900
5901 /* Associate Alices's keys with operation */
5902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5903 ta_crypt_cmd_set_operation_key(c, &session, op,
5904 key_alice)))
5905 goto out;
5906
5907 /* Keys have been set, free key objects */
5908 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5909 ta_crypt_cmd_free_transient_object(c, &session,
5910 key_alice)))
5911 goto out;
5912
5913 /* Allocate shared secret output object */
5914 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5915 ta_crypt_cmd_allocate_transient_object(c, &session,
5916 TEE_TYPE_GENERIC_SECRET,
5917 sizeof(x25519_shared_secret), &sv_handle)))
5918 goto out;
5919
5920 /* Reset params */
5921 param_count = 0;
5922
5923 /* Set Bob's public key for Alice side */
5924 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5925 ARRAY(x25519_bob_public));
5926
5927 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5928 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5929 params, param_count)))
5930 goto out;
5931
5932 out_size = sizeof(out);
5933 memset(out, 0, sizeof(out));
5934 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5935 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5936 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5937 &out_size)))
5938 goto out;
5939
5940 /* Check derived key */
5941 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5942 sizeof(x25519_shared_secret), out,
5943 out_size))
5944 goto out;
5945
5946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5947 ta_crypt_cmd_free_operation(c, &session, op)))
5948 goto out;
5949
5950 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5951 ta_crypt_cmd_free_transient_object(c, &session,
5952 sv_handle)))
5953 goto out;
5954
5955 Do_ADBG_EndSubCase(c, "%s", case_str);
5956
5957 strncpy(case_str, "Bob side computes shared secret",
5958 sizeof(case_str) - 1);
5959
5960 Do_ADBG_BeginSubCase(c, "%s", case_str);
5961
5962 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5963 ta_crypt_cmd_allocate_operation(c, &session, &op,
5964 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5965 goto out;
5966
5967 /* Allocate and initialize keypair of Bob */
5968 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5969 ta_crypt_cmd_allocate_transient_object(c, &session,
5970 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5971 goto out;
5972
5973 /* Reset params */
5974 param_count = 0;
5975
5976 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5977 ARRAY(x25519_bob_public));
5978
5979 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5980 ARRAY(x25519_bob_private));
5981
5982 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5983 ta_crypt_cmd_populate_transient_object(c, &session,
5984 key_bob, params, param_count)))
5985 goto out;
5986
5987 /* Associate Bob's keys with operation */
5988 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5989 ta_crypt_cmd_set_operation_key(c, &session, op,
5990 key_bob)))
5991 goto out;
5992
5993 /* Keys have been set, free key objects */
5994 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5995 ta_crypt_cmd_free_transient_object(c, &session,
5996 key_bob)))
5997 goto out;
5998
5999 /* Allocate shared secret output object */
6000 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6001 ta_crypt_cmd_allocate_transient_object(c, &session,
6002 TEE_TYPE_GENERIC_SECRET,
6003 sizeof(x25519_shared_secret), &sv_handle)))
6004 goto out;
6005
6006 /* Reset params */
6007 param_count = 0;
6008
6009 /* Set Alice's public key for Bob side */
6010 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
6011 ARRAY(x25519_alice_public));
6012
6013 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6014 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
6015 params, param_count)))
6016 goto out;
6017
6018 out_size = sizeof(out);
6019 memset(out, 0, sizeof(out));
6020 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6021 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
6022 sv_handle, TEE_ATTR_SECRET_VALUE, out,
6023 &out_size)))
6024 goto out;
6025
6026 /* Check derived key */
6027 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
6028 sizeof(x25519_shared_secret), out,
6029 out_size))
6030 goto out;
6031
6032 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6033 ta_crypt_cmd_free_operation(c, &session, op)))
6034 goto out;
6035
6036 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6037 ta_crypt_cmd_free_transient_object(c, &session,
6038 sv_handle)))
6039 goto out;
6040
6041out:
6042 Do_ADBG_EndSubCase(c, "%s", case_str);
6043 TEEC_CloseSession(&session);
6044}
6045ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
6046 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00006047
6048static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
6049{
6050 TEEC_Session session = { };
6051 TEE_OperationHandle op = TEE_HANDLE_NULL;
6052 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
6053 TEE_Attribute key_attrs[2] = { };
6054 size_t num_key_attrs = 0;
6055 TEE_Attribute attrs[2] = { };
6056 size_t num_attrs = 0;
6057 uint8_t out[64] = { };
6058 size_t out_size = sizeof(out);
6059 size_t n = 0;
6060 uint32_t ret_orig = 0;
6061 size_t max_key_size = 0;
6062
6063 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6064 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
6065 NULL, &ret_orig)))
6066 return;
6067
6068 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
6069 TEE_ECC_CURVE_25519)) {
6070 Do_ADBG_Log("ED25519 not supported: skip subcase");
6071 goto out;
6072 }
6073
6074 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
6075 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
6076
6077 if (tv->algo != TEE_ALG_ED25519)
6078 continue;
6079
6080 num_attrs = 0;
6081 num_key_attrs = 0;
6082 max_key_size = tv->params.eddsa.private_len * 8;
6083
6084 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6085 ta_crypt_cmd_allocate_operation(c, &session, &op,
6086 TEE_ALG_ED25519, tv->mode, max_key_size)))
6087 goto out;
6088
6089 xtest_add_attr(&num_key_attrs, key_attrs,
6090 TEE_ATTR_ED25519_PUBLIC_VALUE,
6091 tv->params.eddsa.public,
6092 tv->params.eddsa.public_len);
6093
6094 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006095 xtest_add_attr_value(&num_attrs, attrs,
6096 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006097
6098 if (tv->params.eddsa.context_len > 0)
6099 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6100 tv->params.eddsa.context,
6101 tv->params.eddsa.context_len);
6102
6103 switch (tv->mode) {
6104 case TEE_MODE_SIGN:
6105 xtest_add_attr(&num_key_attrs, key_attrs,
6106 TEE_ATTR_ED25519_PRIVATE_VALUE,
6107 tv->params.eddsa.private,
6108 tv->params.eddsa.private_len);
6109
6110 if (!ADBG_EXPECT_TRUE(c,
6111 create_key(c, &session, max_key_size,
6112 TEE_TYPE_ED25519_KEYPAIR,
6113 key_attrs, num_key_attrs,
6114 &key_handle)))
6115 goto out;
6116
6117 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6118 ta_crypt_cmd_set_operation_key(c,
6119 &session, op, key_handle)))
6120 goto out;
6121
6122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6123 ta_crypt_cmd_asymmetric_sign(c,
6124 &session, op,
6125 attrs, num_attrs, tv->ptx,
6126 tv->ptx_len, out, &out_size)))
6127 goto out;
6128
6129 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6130
6131 break;
6132
6133 case TEE_MODE_VERIFY:
6134 if (!ADBG_EXPECT_TRUE(c,
6135 create_key(c, &session, max_key_size,
6136 TEE_TYPE_ED25519_PUBLIC_KEY,
6137 key_attrs, num_key_attrs,
6138 &key_handle)))
6139 goto out;
6140
6141 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6142 ta_crypt_cmd_set_operation_key(c,
6143 &session, op, key_handle)))
6144 goto out;
6145
6146 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6147 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6148 attrs, num_attrs,
6149 tv->ptx,
6150 tv->ptx_len,
6151 tv->ctx,
6152 tv->ctx_len)))
6153 goto out;
6154 break;
6155
6156 default:
6157 break;
6158 }
6159
6160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6161 ta_crypt_cmd_free_operation(c, &session, op)))
6162 goto out;
6163 }
6164out:
6165 TEEC_CloseSession(&session);
6166}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006167ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006168 "Test TEE Internal API ED25519 sign/verify");