blob: c840d78e5bfdea382bf8aa9e124b88063e2868c9 [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>
Pascal Brandc639ac82015-07-02 08:53:34 +020018#include <ta_crypt.h>
19#include <utee_defines.h>
20#include <util.h>
21
Jerome Forissier213ca8a2017-03-31 11:27:56 +020022#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020023#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020024
25#include <assert.h>
26
Pascal Brandc639ac82015-07-02 08:53:34 +020027static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
28 TEE_OperationHandle oph)
29{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010030 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020031 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010032 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020033
34 assert((uintptr_t)oph <= UINT32_MAX);
35 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
36 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
37 TEEC_NONE);
38 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
39 &ret_orig);
40 if (res != TEEC_SUCCESS) {
41 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
42 ret_orig);
43 }
44 return res;
45}
46
47static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
48 TEEC_Session *s,
49 TEE_OperationHandle dst_oph,
50 TEE_OperationHandle src_oph)
51{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010052 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020053 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010054 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020055
56 assert((uintptr_t)dst_oph <= UINT32_MAX);
57 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
58
59 assert((uintptr_t)src_oph <= UINT32_MAX);
60 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
61 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
62 TEEC_NONE);
63
64 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
65 &ret_orig);
66
67 if (res != TEEC_SUCCESS) {
68 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
69 ret_orig);
70 }
71 return res;
72}
73
74static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
75 TEE_OperationHandle oph,
76 const void *chunk,
77 size_t chunk_size)
78{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010079 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020080 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010081 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020082
83 assert((uintptr_t)oph <= UINT32_MAX);
84 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
85 op.params[1].tmpref.buffer = (void *)chunk;
86 op.params[1].tmpref.size = chunk_size;
87
88 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
89 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
90 TEEC_NONE);
91
92 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
93
94 if (res != TEEC_SUCCESS) {
95 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
96 ret_orig);
97 }
98
99 return res;
100}
101
102static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
103 TEE_OperationHandle oph,
104 const void *chunk,
105 size_t chunk_len, void *hash,
106 size_t *hash_len)
107{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100108 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200109 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100110 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200111
112 assert((uintptr_t)oph <= UINT32_MAX);
113 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
114
115 op.params[1].tmpref.buffer = (void *)chunk;
116 op.params[1].tmpref.size = chunk_len;
117
118 op.params[2].tmpref.buffer = (void *)hash;
119 op.params[2].tmpref.size = *hash_len;
120
121 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
122 TEEC_MEMREF_TEMP_INPUT,
123 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
124
125 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
126 &ret_orig);
127
128 if (res != TEEC_SUCCESS) {
129 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
130 ret_orig);
131 }
132
133 if (res == TEEC_SUCCESS)
134 *hash_len = op.params[2].tmpref.size;
135
136 return res;
137}
138
139static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
140 TEEC_Session *s,
141 TEE_OperationHandle oph,
142 TEE_ObjectHandle key1,
143 TEE_ObjectHandle key2)
144{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100145 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200146 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100147 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200148
149 assert((uintptr_t)oph <= UINT32_MAX);
150 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
151
152 assert((uintptr_t)key1 <= UINT32_MAX);
153 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
154
155 assert((uintptr_t)key2 <= UINT32_MAX);
156 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
157 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
158 TEEC_NONE, TEEC_NONE);
159
160 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
161 &ret_orig);
162
163 if (res != TEEC_SUCCESS) {
164 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
165 ret_orig);
166 }
167
168 return res;
169}
170
171static TEEC_Result ta_crypt_cmd_mac_init(ADBG_Case_t *c, TEEC_Session *s,
172 TEE_OperationHandle oph,
173 const void *iv, size_t iv_len)
174{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100175 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200176 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100177 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200178
179 assert((uintptr_t)oph <= UINT32_MAX);
180 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
181
182 if (iv != NULL) {
183 op.params[1].tmpref.buffer = (void *)iv;
184 op.params[1].tmpref.size = iv_len;
185 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
186 TEEC_MEMREF_TEMP_INPUT,
187 TEEC_NONE, TEEC_NONE);
188 } else {
189 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
190 TEEC_NONE, TEEC_NONE);
191 }
192
193 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &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_update(ADBG_Case_t *c, TEEC_Session *s,
204 TEE_OperationHandle oph,
205 const void *chunk, size_t chunk_size)
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 op.params[1].tmpref.buffer = (void *)chunk;
215 op.params[1].tmpref.size = chunk_size;
216
217 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
218 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
219 TEEC_NONE);
220
221 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
222
223 if (res != TEEC_SUCCESS) {
224 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
225 ret_orig);
226 }
227
228 return res;
229}
230
231static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
232 TEEC_Session *s,
233 TEE_OperationHandle oph,
234 const void *chunk,
235 size_t chunk_len,
236 void *hash,
237 size_t *hash_len)
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_len;
248
249 op.params[2].tmpref.buffer = (void *)hash;
250 op.params[2].tmpref.size = *hash_len;
251
252 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
253 TEEC_MEMREF_TEMP_INPUT,
254 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
255
256 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
257 &ret_orig);
258
259 if (res != TEEC_SUCCESS) {
260 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
261 ret_orig);
262 }
263
264 if (res == TEEC_SUCCESS)
265 *hash_len = op.params[2].tmpref.size;
266
267 return res;
268}
269
Jerome Forissier4f419512021-07-07 14:56:10 +0200270static TEEC_Result ta_crypt_cmd_mac_final_compare(ADBG_Case_t *c,
271 TEEC_Session *s,
272 TEE_OperationHandle oph,
273 const void *chunk,
274 size_t chunk_len,
275 const uint8_t *hash,
276 size_t hash_len)
277{
278 TEEC_Result res = TEEC_ERROR_GENERIC;
279 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
280 uint32_t ret_orig = 0;
281
282 assert((uintptr_t)oph <= UINT32_MAX);
283 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
284
285 op.params[1].tmpref.buffer = (void *)chunk;
286 op.params[1].tmpref.size = chunk_len;
287
288 op.params[2].tmpref.buffer = (void *)hash;
289 op.params[2].tmpref.size = hash_len;
290
291 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
292 TEEC_MEMREF_TEMP_INPUT,
293 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE);
294
295 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPARE, &op,
296 &ret_orig);
297
298 if (res != TEEC_SUCCESS) {
299 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
300 ret_orig);
301 }
302
303 return res;
304}
305
Pascal Brandc639ac82015-07-02 08:53:34 +0200306static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
307 TEE_OperationHandle oph,
308 const void *iv, size_t iv_len)
309{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100310 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200311 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100312 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200313
314 assert((uintptr_t)oph <= UINT32_MAX);
315 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
316
317 if (iv != NULL) {
318 op.params[1].tmpref.buffer = (void *)iv;
319 op.params[1].tmpref.size = iv_len;
320
321 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
322 TEEC_MEMREF_TEMP_INPUT,
323 TEEC_NONE, TEEC_NONE);
324 } else {
325 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
326 TEEC_NONE, TEEC_NONE);
327 }
328
329 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &op, &ret_orig);
330
331 if (res != TEEC_SUCCESS) {
332 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
333 ret_orig);
334 }
335
336 return res;
337}
338
339static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
340 TEE_OperationHandle oph,
341 const void *src, size_t src_len,
342 void *dst, size_t *dst_len)
343{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100344 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200345 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100346 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200347
348 assert((uintptr_t)oph <= UINT32_MAX);
349 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
350
351 op.params[1].tmpref.buffer = (void *)src;
352 op.params[1].tmpref.size = src_len;
353
354 op.params[2].tmpref.buffer = dst;
355 op.params[2].tmpref.size = *dst_len;
356
357 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
358 TEEC_MEMREF_TEMP_INPUT,
359 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
360
361 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &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 if (res == TEEC_SUCCESS)
369 *dst_len = op.params[2].tmpref.size;
370
371 return res;
372}
373
374static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
375 TEEC_Session *s,
376 TEE_OperationHandle oph,
377 const void *src,
378 size_t src_len,
379 void *dst,
380 size_t *dst_len)
381{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100382 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200383 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100384 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200385
386 assert((uintptr_t)oph <= UINT32_MAX);
387 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
388
389 op.params[1].tmpref.buffer = (void *)src;
390 op.params[1].tmpref.size = src_len;
391
392 op.params[2].tmpref.buffer = (void *)dst;
393 op.params[2].tmpref.size = *dst_len;
394
395 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
396 TEEC_MEMREF_TEMP_INPUT,
397 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
398
399 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
400 &ret_orig);
401
402 if (res != TEEC_SUCCESS) {
403 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
404 ret_orig);
405 }
406
407 if (res == TEEC_SUCCESS)
408 *dst_len = op.params[2].tmpref.size;
409
410 return res;
411}
412
413static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
414 TEEC_Session *s,
415 void *buf,
416 size_t blen)
417{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100418 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200419 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100420 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200421
422 op.params[0].tmpref.buffer = buf;
423 op.params[0].tmpref.size = blen;
424
425 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
426 TEEC_NONE, TEEC_NONE);
427
Joakim Bech81f97e32020-05-27 12:14:23 +0200428 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200429 &ret_orig);
430
431 if (res != TEEC_SUCCESS) {
432 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
433 ret_orig);
434 }
435
436 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
437 op.params[0].tmpref.size);
438 return res;
439}
440
441static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
442 TEE_OperationHandle oph,
443 const void *nonce, size_t nonce_len,
444 size_t tag_len, size_t aad_len,
445 size_t payload_len)
446{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100447 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200448 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100449 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200450
451 assert((uintptr_t)oph <= UINT32_MAX);
452 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
453 op.params[0].value.b = tag_len;
454
455 op.params[1].tmpref.buffer = (void *)nonce;
456 op.params[1].tmpref.size = nonce_len;
457
458 op.params[2].value.a = aad_len;
459 op.params[2].value.b = payload_len;
460
461 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
462 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200463 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200464
465 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
466
467 if (res != TEEC_SUCCESS) {
468 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
469 ret_orig);
470 }
471 return res;
472}
473
474static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
475 TEE_OperationHandle oph,
476 const void *aad, size_t aad_len)
477{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100478 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200479 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100480 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200481
482 assert((uintptr_t)oph <= UINT32_MAX);
483 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
484
485 op.params[1].tmpref.buffer = (void *)aad;
486 op.params[1].tmpref.size = aad_len;
487
488 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
489 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
490 TEEC_NONE);
491
492 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
493
494 if (res != TEEC_SUCCESS) {
495 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
496 ret_orig);
497 }
498
499 return res;
500}
501
502static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
503 TEEC_Session *s,
504 TEE_OperationHandle oph,
505 const void *src,
506 size_t src_len,
507 void *dst,
508 size_t *dst_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 *)src;
518 op.params[1].tmpref.size = src_len;
519
520 op.params[2].tmpref.buffer = (void *)dst;
521 op.params[2].tmpref.size = *dst_len;
522
523 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
524 TEEC_MEMREF_TEMP_INPUT,
525 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
526
527 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
528
529 if (res != TEEC_SUCCESS) {
530 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
531 ret_orig);
532 }
533
534 if (res == TEEC_SUCCESS)
535 *dst_len = op.params[2].tmpref.size;
536
537 return res;
538}
539
540static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
541 TEEC_Session *s,
542 TEE_OperationHandle oph,
543 const void *src,
544 size_t src_len, void *dst,
545 size_t *dst_len, void *tag,
546 size_t *tag_len)
547{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100548 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200549 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100550 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200551
552 assert((uintptr_t)oph <= UINT32_MAX);
553 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
554
555 op.params[1].tmpref.buffer = (void *)src;
556 op.params[1].tmpref.size = src_len;
557
558 op.params[2].tmpref.buffer = (void *)dst;
559 op.params[2].tmpref.size = *dst_len;
560
561 op.params[3].tmpref.buffer = (void *)tag;
562 op.params[3].tmpref.size = *tag_len;
563
564 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
565 TEEC_MEMREF_TEMP_INPUT,
566 TEEC_MEMREF_TEMP_OUTPUT,
567 TEEC_MEMREF_TEMP_OUTPUT);
568
569 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
570 &ret_orig);
571
572 if (res != TEEC_SUCCESS) {
573 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
574 ret_orig);
575 }
576
577 if (res == TEEC_SUCCESS) {
578 *dst_len = op.params[2].tmpref.size;
579 *tag_len = op.params[3].tmpref.size;
580 }
581
582 return res;
583}
584
585static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
586 TEEC_Session *s,
587 TEE_OperationHandle oph,
588 const void *src, size_t src_len,
589 void *dst, size_t *dst_len,
590 const void *tag, size_t tag_len)
591{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100592 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200593 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100594 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200595
596 assert((uintptr_t)oph <= UINT32_MAX);
597 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
598
599 op.params[1].tmpref.buffer = (void *)src;
600 op.params[1].tmpref.size = src_len;
601
602 op.params[2].tmpref.buffer = dst;
603 op.params[2].tmpref.size = *dst_len;
604
605 op.params[3].tmpref.buffer = (void *)tag;
606 op.params[3].tmpref.size = tag_len;
607
608 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
609 TEEC_MEMREF_TEMP_INPUT,
610 TEEC_MEMREF_TEMP_OUTPUT,
611 TEEC_MEMREF_TEMP_INPUT);
612
613 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
614 &ret_orig);
615
616 if (res != TEEC_SUCCESS) {
617 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
618 ret_orig);
619 }
620
621 if (res == TEEC_SUCCESS)
622 *dst_len = op.params[2].tmpref.size;
623
624 return res;
625}
626
627static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
628 TEEC_Session *s,
629 TEE_OperationHandle oph,
630 uint32_t cmd,
631 const TEE_Attribute *params,
632 uint32_t paramCount,
633 const void *src,
634 size_t src_len,
635 void *dst,
636 size_t *dst_len)
637{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100638 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200639 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100640 uint32_t ret_orig = 0;
641 uint8_t *buf = NULL;
642 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200643
644 res = pack_attrs(params, paramCount, &buf, &blen);
645 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
646 return res;
647
648 assert((uintptr_t)oph <= UINT32_MAX);
649 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
650
651 op.params[1].tmpref.buffer = buf;
652 op.params[1].tmpref.size = blen;
653
654 op.params[2].tmpref.buffer = (void *)src;
655 op.params[2].tmpref.size = src_len;
656
657 op.params[3].tmpref.buffer = dst;
658 op.params[3].tmpref.size = *dst_len;
659
660 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
661 TEEC_MEMREF_TEMP_INPUT,
662 TEEC_MEMREF_TEMP_INPUT,
663 TEEC_MEMREF_TEMP_OUTPUT);
664
665 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
666
667 if (res != TEEC_SUCCESS) {
668 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
669 ret_orig);
670 }
671
672 if (res == TEEC_SUCCESS)
673 *dst_len = op.params[3].tmpref.size;
674
675 free(buf);
676 return res;
677}
678
679static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
680 TEEC_Session *s,
681 TEE_OperationHandle oph,
682 const TEE_Attribute *params,
683 uint32_t paramCount,
684 const void *src,
685 size_t src_len,
686 void *dst,
687 size_t *dst_len)
688{
689 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
690 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
691 params, paramCount,
692 src, src_len, dst, dst_len);
693}
694
695static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
696 TEEC_Session *s,
697 TEE_OperationHandle oph,
698 const TEE_Attribute *params,
699 uint32_t paramCount,
700 const void *src,
701 size_t src_len,
702 void *dst,
703 size_t *dst_len)
704{
705 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
706 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
707 params, paramCount,
708 src, src_len, dst, dst_len);
709}
710
711static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
712 TEEC_Session *s,
713 TEE_OperationHandle oph,
714 const TEE_Attribute *params,
715 uint32_t paramCount,
716 const void *digest,
717 size_t digest_len,
718 void *signature,
719 size_t *signature_len)
720{
721 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
722 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
723 digest, digest_len, signature, signature_len);
724}
725
726static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
727 TEEC_Session *s,
728 TEE_OperationHandle oph,
729 const TEE_Attribute *params,
730 uint32_t paramCount,
731 const void *digest,
732 size_t digest_len,
733 const void *signature,
734 size_t signature_len)
735{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100736 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200737 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100738 uint32_t ret_orig = 0;
739 uint8_t *buf = NULL;
740 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200741
742 res = pack_attrs(params, paramCount, &buf, &blen);
743 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
744 return res;
745
746 assert((uintptr_t)oph <= UINT32_MAX);
747 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
748
749 op.params[1].tmpref.buffer = buf;
750 op.params[1].tmpref.size = blen;
751
752 op.params[2].tmpref.buffer = (void *)digest;
753 op.params[2].tmpref.size = digest_len;
754
755 op.params[3].tmpref.buffer = (void *)signature;
756 op.params[3].tmpref.size = signature_len;
757
758 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
759 TEEC_MEMREF_TEMP_INPUT,
760 TEEC_MEMREF_TEMP_INPUT,
761 TEEC_MEMREF_TEMP_INPUT);
762
763 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
764 &op, &ret_orig);
765
766 if (res != TEEC_SUCCESS) {
767 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
768 ret_orig);
769 }
770
771 free(buf);
772 return res;
773}
774
775static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
776 TEEC_Session *s,
777 TEE_ObjectHandle o,
778 uint32_t attr_id,
779 uint32_t *valuea,
780 uint32_t *valueb)
781{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100782 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200783 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100784 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200785
786 assert((uintptr_t)o <= UINT32_MAX);
787 op.params[0].value.a = (uint32_t)(uintptr_t)o;
788 op.params[0].value.b = attr_id;
789 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
790 TEEC_NONE, TEEC_NONE);
791
792 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
793 &op, &ret_orig);
794
795 if (res != TEEC_SUCCESS) {
796 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
797 ret_orig);
798 }
799
800 if (res == TEEC_SUCCESS) {
801 *valuea = op.params[1].value.a;
802 *valueb = op.params[1].value.b;
803 }
804
805 return res;
806}
807
808static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
809 TEEC_Session *s,
810 TEE_ObjectHandle o,
811 uint32_t key_size,
812 const TEE_Attribute *params,
813 uint32_t paramCount)
814{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100815 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200816 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100817 uint32_t ret_orig = 0;
818 uint8_t *buf = NULL;
819 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200820
821 res = pack_attrs(params, paramCount, &buf, &blen);
822 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
823 return res;
824
825 assert((uintptr_t)o <= UINT32_MAX);
826 op.params[0].value.a = (uint32_t)(uintptr_t)o;
827 op.params[0].value.b = key_size;
828
829 op.params[1].tmpref.buffer = buf;
830 op.params[1].tmpref.size = blen;
831
832 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
833 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
834 TEEC_NONE);
835
836 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
837
838 if (res != TEEC_SUCCESS) {
839 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
840 ret_orig);
841 }
842
843 free(buf);
844 return res;
845}
846
847static const uint8_t hash_data_md5_in1[] = {
848 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
849};
850
851static const uint8_t hash_data_md5_out1[] = {
852 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
853 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
854};
855
856static const uint8_t hash_data_sha1_in1[] = {
857 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
858};
859
860static const uint8_t hash_data_sha1_out1[] = {
861 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
862 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
863 0xc1, 0x5e, 0x7c, 0x9c
864};
865
866static const uint8_t hash_data_sha224_in1[] = {
867 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
868};
869
870static const uint8_t hash_data_sha224_out1[] = {
871 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
872 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
873 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
874 0x92, 0x49, 0xd8, 0x44
875};
876
877static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
878
879static const uint8_t hash_data_sha256_out1[] = {
880 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
881 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
882 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
883 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
884};
885
886static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
887
888static const uint8_t hash_data_sha256_out2[] = {
889 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
890 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
891 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
892 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
893};
894
895
896static const uint8_t hash_data_sha384_in1[] = {
897 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
898};
899
900static const uint8_t hash_data_sha384_out1[] = {
901 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
902 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
903 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
904 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
905 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
906 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
907};
908
909static const uint8_t hash_data_sha512_in1[] = {
910 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
911};
912
913static const uint8_t hash_data_sha512_out1[] = {
914 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
915 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
916 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
917 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
918 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
919 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
920 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
921 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
922};
923
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100924/*
925 * SM3
926 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100927 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100928 */
929static const uint8_t hash_data_sm3_a1_in[3] = "abc";
930
931static const uint8_t hash_data_sm3_a1_out[] = {
932 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
933 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
934 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
935 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
936};
937
938/*
939 * SM3
940 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100941 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100942 */
943static const uint8_t hash_data_sm3_a2_in[] = {
944 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
945 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
946 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
947 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
948 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
949 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
950 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
951 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
952};
953
954static const uint8_t hash_data_sm3_a2_out[] = {
955 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
956 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
957 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
958 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
959};
960
Pascal Brandc639ac82015-07-02 08:53:34 +0200961struct xtest_hash_case {
962 uint32_t algo;
963 size_t in_incr;
964 const uint8_t *in;
965 size_t in_len;
966 const uint8_t *out;
967 size_t out_len;
968};
969
970#define XTEST_HASH_CASE(algo, in_incr, in, out) \
971 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
972
973static const struct xtest_hash_case hash_cases[] = {
974 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
975 hash_data_md5_out1),
976 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
977 hash_data_sha1_out1),
978 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
979 hash_data_sha224_out1),
980 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
981 hash_data_sha256_out1),
982 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
983 hash_data_sha256_out2),
984 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
985 hash_data_sha384_out1),
986 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
987 hash_data_sha512_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100988 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
989 hash_data_sm3_a1_out),
990 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
991 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +0200992};
993
994static void xtest_tee_test_4001(ADBG_Case_t *c)
995{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100996 TEEC_Session session = { };
997 uint32_t ret_orig = 0;
998 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200999
1000 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1001 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1002 &ret_orig)))
1003 return;
1004
1005
1006 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001007 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1008 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1009 uint8_t out[64] = { };
1010 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001011
Jerome Forissier87b00c02020-01-22 16:33:12 +01001012 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1013 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1014 TEE_CRYPTO_ELEMENT_NONE)) {
1015 Do_ADBG_Log("SM3 not supported: skip subcase");
1016 continue;
1017 }
1018
Pascal Brandc639ac82015-07-02 08:53:34 +02001019 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1020 (int)n, (unsigned int)hash_cases[n].algo);
1021
1022 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1023 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1024 hash_cases[n].algo,
1025 TEE_MODE_DIGEST, 0)))
1026 goto out;
1027
1028 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1029 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1030 hash_cases[n].algo,
1031 TEE_MODE_DIGEST, 0)))
1032 goto out;
1033
1034 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1035 ta_crypt_cmd_digest_update(c, &session, op1,
1036 hash_cases[n].in,
1037 hash_cases[n].in_incr)))
1038 goto out;
1039
1040 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1041 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1042 goto out;
1043
1044 out_size = sizeof(out);
1045 memset(out, 0, sizeof(out));
1046 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1047 ta_crypt_cmd_digest_do_final(c, &session, op2,
1048 hash_cases[n].in + hash_cases[n].in_incr,
1049 hash_cases[n].in_len - hash_cases[n].in_incr,
1050 out, &out_size)))
1051 goto out;
1052
1053 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1054 hash_cases[n].out_len, out, out_size);
1055
1056 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1057 ta_crypt_cmd_reset_operation(c, &session, op1)))
1058 goto out;
1059
1060 out_size = sizeof(out);
1061 memset(out, 0, sizeof(out));
1062 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1063 ta_crypt_cmd_digest_do_final(c, &session, op1,
1064 hash_cases[n].in,
1065 hash_cases[n].in_len, out,
1066 &out_size)))
1067 goto out;
1068
1069 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1070 hash_cases[n].out_len, out, out_size);
1071
Jerome Forissier1e05e262015-07-29 16:09:07 +02001072 /*
1073 * Invoke TEE_DigestDoFinal() a second time to check that state
1074 * was properly reset
1075 */
1076 out_size = sizeof(out);
1077 memset(out, 0, sizeof(out));
1078 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1079 ta_crypt_cmd_digest_do_final(c, &session, op1,
1080 hash_cases[n].in,
1081 hash_cases[n].in_len, out,
1082 &out_size)))
1083 goto out;
1084
1085 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1086 hash_cases[n].out_len, out, out_size);
1087
Pascal Brandc639ac82015-07-02 08:53:34 +02001088 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1089 ta_crypt_cmd_free_operation(c, &session, op1)))
1090 goto out;
1091
1092 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1093 ta_crypt_cmd_free_operation(c, &session, op2)))
1094 goto out;
1095
1096 Do_ADBG_EndSubCase(c, NULL);
1097 }
1098
1099out:
1100 TEEC_CloseSession(&session);
1101}
Jens Wiklander14f48872018-06-29 15:30:13 +02001102ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1103 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001104
Pascal Brandc639ac82015-07-02 08:53:34 +02001105struct xtest_mac_case {
1106 uint32_t algo;
1107 uint32_t key_type;
1108 const uint8_t *key;
1109 size_t key_len;
1110 size_t in_incr;
1111 const uint8_t *in;
1112 size_t in_len;
1113 const uint8_t *out;
1114 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001115 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001116};
1117
Jerome Forissier3dec7442019-01-30 17:50:05 +01001118#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001119 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001120 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1121
1122#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1123 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1124 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1125
1126#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1127 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1128 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001129
1130#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1131 XTEST_MAC_CASE((algo), (key_type), \
1132 mac_cbc_ ## vect ## _key, (in_incr), \
1133 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1134
1135#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1136 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1137 mac_cmac_ ## vect ## _key, (in_incr), \
1138 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1139
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001140#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1141 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1142 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1143 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1144
Pascal Brandc639ac82015-07-02 08:53:34 +02001145static const struct xtest_mac_case mac_cases[] = {
1146 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1147 mac_data_md5_key1,
1148 4, mac_data_md5_in1, mac_data_md5_out1),
1149 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1150 mac_data_sha1_key1,
1151 5, mac_data_sha1_in1, mac_data_sha1_out1),
1152 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1153 mac_data_sha224_key1,
1154 8, mac_data_sha224_in1, mac_data_sha224_out1),
1155 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1156 mac_data_sha256_key1,
1157 1, mac_data_sha256_in1, mac_data_sha256_out1),
1158 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1159 mac_data_sha256_key2,
1160 7, mac_data_sha256_in2, mac_data_sha256_out2),
1161 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1162 mac_data_sha384_key1,
1163 11, mac_data_sha384_in1, mac_data_sha384_out1),
1164 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1165 mac_data_sha512_key1,
1166 13, mac_data_sha512_in1, mac_data_sha512_out1),
1167
1168 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1169 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1170 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1171 17),
1172 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1173 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1174 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1175 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1176 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1177 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1178 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001179 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001180
1181 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1182 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1183 ARRAY_SIZE(mac_cmac_vect1_out) },
1184 XTEST_MAC_CMAC_CASE(vect2, 9),
1185 XTEST_MAC_CMAC_CASE(vect3, 9),
1186 XTEST_MAC_CMAC_CASE(vect4, 9),
1187 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1188 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1189 ARRAY_SIZE(mac_cmac_vect5_out) },
1190 XTEST_MAC_CMAC_CASE(vect6, 9),
1191 XTEST_MAC_CMAC_CASE(vect7, 9),
1192 XTEST_MAC_CMAC_CASE(vect8, 9),
1193 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1194 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1195 ARRAY_SIZE(mac_cmac_vect9_out) },
1196 XTEST_MAC_CMAC_CASE(vect10, 9),
1197 XTEST_MAC_CMAC_CASE(vect11, 9),
1198 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001199 XTEST_MAC_CMAC_CASE(vect12, 16),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001200
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001201 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1202 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1203 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1204 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1205 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1206 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1207 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1208 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1209 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1210 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1211 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1212 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1213
Jerome Forissier9f17e262019-12-13 14:12:41 +01001214 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1215 mac_data_sm3_d31_key,
1216 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1217 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1218 mac_data_sm3_d32_key,
1219 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001220};
1221
1222static void xtest_tee_test_4002(ADBG_Case_t *c)
1223{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001224 TEEC_Session session = { };
1225 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1226 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001227 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001228 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1229 uint8_t out[64] = { };
1230 size_t out_size = 0;
1231 uint32_t ret_orig = 0;
1232 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001233
1234 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1235 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1236 &ret_orig)))
1237 return;
1238
1239 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001240 TEE_Attribute key_attr = { };
1241 size_t key_size = 0;
1242 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001243
1244 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1245 (int)n, (unsigned int)mac_cases[n].algo);
1246
1247 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1248 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1249 key_attr.content.ref.length = mac_cases[n].key_len;
1250
1251 key_size = key_attr.content.ref.length * 8;
1252 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1253 mac_cases[n].key_type == TEE_TYPE_DES3)
1254 /* Exclude parity in bit size of key */
1255 key_size -= key_size / 8;
1256
1257 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1258 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1259 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1260 goto out;
1261
1262 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1263 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1264 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1265 goto out;
1266
1267 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001268 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1269 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1270 goto out;
1271
1272 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001273 ta_crypt_cmd_allocate_transient_object(c, &session,
1274 mac_cases[n].key_type, key_size, &key_handle)))
1275 goto out;
1276
1277 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1278 ta_crypt_cmd_populate_transient_object(c, &session,
1279 key_handle, &key_attr, 1)))
1280 goto out;
1281
1282 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1283 ta_crypt_cmd_set_operation_key(c, &session, op1,
1284 key_handle)))
1285 goto out;
1286
1287 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1288 ta_crypt_cmd_free_transient_object(c, &session,
1289 key_handle)))
1290 goto out;
1291
1292 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1293 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1294 goto out;
1295
Jerome Forissier4f419512021-07-07 14:56:10 +02001296 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1297 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1298 goto out;
1299
Jerome Forissier3dec7442019-01-30 17:50:05 +01001300 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001301 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001302 while (offs + mac_cases[n].in_incr <
1303 mac_cases[n].in_len) {
1304 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1305 ta_crypt_cmd_mac_update(c, &session,
1306 op1, mac_cases[n].in + offs,
1307 mac_cases[n].in_incr)))
1308 goto out;
1309 offs += mac_cases[n].in_incr;
1310 if (!mac_cases[n].multiple_incr)
1311 break;
1312 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001313 }
1314
1315 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1316 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1317 goto out;
1318
1319 out_size = sizeof(out);
1320 memset(out, 0, sizeof(out));
1321 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1322 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001323 mac_cases[n].in + offs,
1324 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001325 out, &out_size)))
1326 goto out;
1327
1328 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1329 mac_cases[n].out_len, out, out_size);
1330
1331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1332 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1333 goto out;
1334
1335 out_size = sizeof(out);
1336 memset(out, 0, sizeof(out));
1337 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1338 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1339 mac_cases[n].in, mac_cases[n].in_len, out,
1340 &out_size)))
1341 goto out;
1342
1343 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1344 mac_cases[n].out_len, out, out_size);
1345
1346 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001347 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1348 mac_cases[n].in, mac_cases[n].in_len,
1349 mac_cases[n].out, mac_cases[n].out_len)))
1350 goto out;
1351
1352 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001353 ta_crypt_cmd_free_operation(c, &session, op1)))
1354 goto out;
1355
1356 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1357 ta_crypt_cmd_free_operation(c, &session, op2)))
1358 goto out;
1359
Jerome Forissier4f419512021-07-07 14:56:10 +02001360 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1361 ta_crypt_cmd_free_operation(c, &session, op3)))
1362 goto out;
1363
Pascal Brandc639ac82015-07-02 08:53:34 +02001364 Do_ADBG_EndSubCase(c, NULL);
1365 }
1366out:
1367 TEEC_CloseSession(&session);
1368}
Jens Wiklander14f48872018-06-29 15:30:13 +02001369ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1370 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001371
Pascal Brandc639ac82015-07-02 08:53:34 +02001372static const uint8_t ciph_data_aes_key1[] = {
1373 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1374 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1375};
1376
Jerome Forissier0780ad42018-06-05 15:02:37 +02001377static const uint8_t ciph_data_aes_key2[] = {
1378 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1379 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1380};
1381
Pascal Brandc639ac82015-07-02 08:53:34 +02001382static const uint8_t ciph_data_des_key1[] = {
1383 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1384};
1385
1386static const uint8_t ciph_data_des_key2[] = {
1387 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1388};
1389
1390
1391static const uint8_t ciph_data_des3_key1[] = {
1392 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1393 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1394 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1395};
1396
1397static const uint8_t ciph_data_des3_key2[] = {
1398 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1399 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1400 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1401};
1402
1403static const uint8_t ciph_data_des2_key1[] = {
1404 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1405 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1406};
1407
1408static const uint8_t ciph_data_in1[] = {
1409 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1410 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1411 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1412 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1413 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1414 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1415};
1416
1417static const uint8_t ciph_data_in3[] = {
1418 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1419 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1420 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1421 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1422 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1423 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1424};
1425
Jerome Forissier45218eb2018-04-11 13:03:26 +02001426static const uint8_t ciph_data_in4[] = {
1427 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1428 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1429 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1430 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1431 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1432 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1433 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1434 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1435};
1436
Jerome Forissier0780ad42018-06-05 15:02:37 +02001437static const uint8_t ciph_data_in5[] = {
1438 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1439 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1440 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1441 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1442 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1443 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1444 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1445 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001446 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1447 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001448 0x01, 0x01, 0x01
1449};
1450
Pascal Brandc639ac82015-07-02 08:53:34 +02001451static const uint8_t ciph_data_128_iv1[] = {
1452 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1453 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1454};
1455
Jerome Forissier0780ad42018-06-05 15:02:37 +02001456static const uint8_t ciph_data_128_iv2[] = {
1457 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1458 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1459};
1460
Pascal Brandc639ac82015-07-02 08:53:34 +02001461static const uint8_t ciph_data_64_iv1[] = {
1462 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1463};
1464
1465static const uint8_t ciph_data_in2[] = {
1466 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1467};
1468
1469static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1470 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1471 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1472 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1473 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1474 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1475 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1476};
1477
1478static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1479 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1480 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1481 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1482 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1483 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1484 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1485};
1486
1487static const uint8_t ciph_data_aes_ctr_out1[] = {
1488 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1489 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1490 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1491 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1492 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1493 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1494};
1495
1496static const uint8_t ciph_data_aes_ctr_out2[] = {
1497 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1498 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1499 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1500 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1501 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1502 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1503};
1504
Jerome Forissier45218eb2018-04-11 13:03:26 +02001505static const uint8_t ciph_data_aes_ctr_out4[] = {
1506 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1507 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1508 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1509 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1510 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1511 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1512 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1513 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1514};
1515
Jerome Forissier0780ad42018-06-05 15:02:37 +02001516static const uint8_t ciph_data_aes_ctr_out5[] = {
1517 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1518 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1519 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1520 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1521 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1522 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1523 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1524 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001525 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1526 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1527 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001528};
1529
Pascal Brandc639ac82015-07-02 08:53:34 +02001530static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1531 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1532 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1533};
1534
1535static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1538};
1539
1540static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1541 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1542 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1543 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1544 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1545 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1546 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1547 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1548 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1549 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1550 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1551 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1552 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1553 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1554 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1555 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1556 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1557 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1558 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1559 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1560 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1561};
1562
1563static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1564 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1565 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1566 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1567 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1568 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1569 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1570 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1571 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1572 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1573 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1574 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1575 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1576 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1577 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1578 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1579 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1580 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1581 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1582 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1583 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1584};
1585
1586/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1587 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1588static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1589 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1590 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1591};
1592
1593static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1594 0x00
1595};
1596
1597static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1598 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1599 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1600 0x20
1601};
1602
1603static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1604 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1605 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1606 0x97
1607};
1608
1609#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1610#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1611static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1612 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1613 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1614 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1615 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1616};
1617
1618static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1619 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1620 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1621 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1622 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1623};
1624
1625#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1626#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1627static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1628 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1629 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1630 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1631 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1632};
1633
1634static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1635 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1636 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1637 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1638 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1639};
1640
1641#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1642#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1643static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1644 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1645 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1646 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1647 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1648 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1649 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1650};
1651
1652static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1653 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1654 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1655 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1656 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1657 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1658 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1659};
1660
1661#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1662#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1663static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1664 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1665 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1666 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1667 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1668 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1669 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1670};
1671
1672static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1673 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1674 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1675 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1676 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1677 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1678 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1679};
1680
1681#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1682#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1683static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1684 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1685 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1686 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1687 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1688 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1689 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1690 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1691 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1692};
1693
1694static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1695 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1696 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1697 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1698 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1699 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1700 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1701 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1702 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1703};
1704
Jerome Forissiered00e162017-01-20 09:22:52 +01001705/*
1706 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1707 * 80 bytes of data, processed in two steps (32 + 48).
1708 */
1709
1710#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1711
1712static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1713 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1714 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1715};
1716
1717static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1718 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1719 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1720 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1721 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1722 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1723 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1724 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1725 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1726 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1727 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1728};
1729
1730/*
1731 * Ciphertext was generated by an online tool for AES CBC.
1732 * Since the input size is a multiple of the block size, and the ciphertext
1733 * format is CS3, the output is the same as plain AES CBC with the last
1734 * two blocks swapped.
1735 */
1736static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1737 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1738 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1739 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1740 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1741 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1742 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1743 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1744 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1745 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1746 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1747};
1748
Pascal Brandc639ac82015-07-02 08:53:34 +02001749static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1750 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1751 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1752 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1753 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1754 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1755 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1756};
1757
1758static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1759 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1760};
1761
1762static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1763 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1764 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1765 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1766 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1767 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1768 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1769};
1770
1771static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1772 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1773 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1774 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1775 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1776 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1777 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1778};
1779
1780static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1781 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1782 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1783 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1784 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1785 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1786 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1787};
1788
1789static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1790 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1791 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1792 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1793 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1794 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1795 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1796};
1797
1798static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1799 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1800 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1801 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1802 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1803 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1804 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1805};
1806
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001807/* SM4 ECB */
1808
1809static const uint8_t ciph_data_sm4_key1[] = {
1810 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1811 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1812};
1813
1814static const uint8_t ciph_data_sm4_in1[] = {
1815 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1816 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1817};
1818
1819static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1820 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1821 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1822};
1823
1824/*
1825 * SM4 CBC
1826 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1827 */
1828static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1829 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1830 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1831};
1832
1833static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1834 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1835 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1836};
1837
1838static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1839 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1840 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1841 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1842 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1843};
1844
1845static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
1846 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
1847 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
1848 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
1849 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
1850};
1851
1852/*
1853 * SM4 CBC
1854 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
1855 */
1856static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
1857 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1858 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1859};
1860
1861static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
1862 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1863 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1864};
1865
1866static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
1867 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1868 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1869 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1870 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1871};
1872
1873static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
1874 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
1875 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
1876 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
1877 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
1878};
1879
1880/*
1881 * SM4 CTR
1882 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
1883 */
1884static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
1885 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1886 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1887};
1888
1889static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
1890 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1891 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1892};
1893
1894static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
1895 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1896 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1897 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1898 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1899 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1900 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1901 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1902 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1903};
1904
1905static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
1906 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
1907 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
1908 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
1909 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
1910 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
1911 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
1912 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
1913 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
1914};
1915
1916/*
1917 * SM4 CTR
1918 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
1919 */
1920static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
1921 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1922 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1923};
1924
1925static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
1926 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1927 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1928};
1929
1930static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
1931 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1932 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1933 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1934 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1935 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1936 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1937 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1938 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1939};
1940
1941static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
1942 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
1943 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
1944 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
1945 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
1946 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
1947 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
1948 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
1949 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
1950};
1951
Pascal Brandc639ac82015-07-02 08:53:34 +02001952struct xtest_ciph_case {
1953 uint32_t algo;
1954 uint32_t mode;
1955 uint32_t key_type;
1956 const uint8_t *key1;
1957 size_t key1_len;
1958 const uint8_t *key2;
1959 size_t key2_len;
1960 const uint8_t *iv;
1961 size_t iv_len;
1962 size_t in_incr;
1963 const uint8_t *in;
1964 size_t in_len;
1965 const uint8_t *out;
1966 size_t out_len;
1967 size_t line;
1968};
1969
1970#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
1971 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1972 NULL, 0, NULL, 0, \
1973 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
1974 __LINE__ }, \
1975 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1976 NULL, 0, NULL, 0, \
1977 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
1978
1979#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
1980 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1981 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
1982 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
1983 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1984 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
1985 (ptx), ARRAY_SIZE(ptx), __LINE__ }
1986
1987#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
1988 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
1989 ciph_data_aes_xts_ ## vect ## _key1, \
1990 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
1991 ciph_data_aes_xts_ ## vect ## _key2, \
1992 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
1993 ciph_data_aes_xts_ ## vect ## _iv, \
1994 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
1995 (in_incr), \
1996 ciph_data_aes_xts_ ## vect ## _ptx, \
1997 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
1998 ciph_data_aes_xts_ ## vect ## _ctx, \
1999 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2000 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2001 ciph_data_aes_xts_ ## vect ## _key1, \
2002 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2003 ciph_data_aes_xts_ ## vect ## _key2, \
2004 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2005 ciph_data_aes_xts_ ## vect ## _iv, \
2006 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2007 (in_incr), \
2008 ciph_data_aes_xts_ ## vect ## _ctx, \
2009 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2010 ciph_data_aes_xts_ ## vect ## _ptx, \
2011 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2012
2013#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2014 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2015 ciph_data_aes_cbc_ ## vect ## _key, \
2016 ciph_data_aes_cbc_ ## vect ## _iv, \
2017 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2018 ciph_data_aes_cbc_ ## vect ## _ctx)
2019
2020#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2021 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2022 ciph_data_aes_cts_ ## vect ## _key, \
2023 ciph_data_aes_cts_ ## vect ## _iv, \
2024 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2025 ciph_data_aes_cts_ ## vect ## _ctx)
2026
2027static const struct xtest_ciph_case ciph_cases[] = {
2028 /* AES */
2029 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2030 ciph_data_aes_key1, 11, ciph_data_in1,
2031 ciph_data_aes_ecb_nopad_out1),
2032 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2033 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2034 ciph_data_in1,
2035 ciph_data_aes_cbc_nopad_out1),
2036 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2037 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2038 ciph_data_in1,
2039 ciph_data_aes_ctr_out1),
2040 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2041 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2042 ciph_data_in3,
2043 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002044 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2045 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2046 ciph_data_in3,
2047 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002048 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2049 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2050 ciph_data_in4,
2051 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002052 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2053 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2054 ciph_data_in5,
2055 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002056
2057 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002058 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002059
2060 /* AES-CTS */
2061 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2062 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2063 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2064 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2065 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2066 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2067 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002068 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002069
2070 /* DES */
2071 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2072 ciph_data_des_key1, 14, ciph_data_in1,
2073 ciph_data_des_ecb_nopad_out1),
2074 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2075 ciph_data_des_key2, 3, ciph_data_in2,
2076 ciph_data_des_ecb_nopad_out2),
2077 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2078 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2079 ciph_data_des_cbc_nopad_out1),
2080
2081 /* DES3 */
2082 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2083 ciph_data_des3_key1, 11, ciph_data_in1,
2084 ciph_data_des3_ecb_nopad_out1),
2085 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2086 ciph_data_des3_key2, 3, ciph_data_in2,
2087 ciph_data_des_ecb_nopad_out2),
2088 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2089 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2090 ciph_data_in1,
2091 ciph_data_des3_cbc_nopad_out1),
2092
2093 /* DES2 */
2094 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2095 ciph_data_des2_key1, 11, ciph_data_in1,
2096 ciph_data_des2_ecb_nopad_out1),
2097 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2098 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2099 ciph_data_in1,
2100 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002101
Pascal Brandc639ac82015-07-02 08:53:34 +02002102 /* AES-XTS */
2103 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2104 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2105 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2106 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2107 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2108 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2109 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2110 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2111 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2112 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2113 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2114 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2115 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2116 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2117 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2118 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2119 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2120 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2121 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002122
2123 /* SM4 */
2124 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2125 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2126 ciph_data_sm4_ecb_nopad_out1),
2127 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2128 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2129 11, ciph_data_sm4_cbc_a221_in,
2130 ciph_data_sm4_cbc_a221_out),
2131 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2132 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2133 11, ciph_data_sm4_cbc_a222_in,
2134 ciph_data_sm4_cbc_a222_out),
2135 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2136 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2137 11, ciph_data_sm4_ctr_a251_in,
2138 ciph_data_sm4_ctr_a251_out),
2139 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2140 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2141 11, ciph_data_sm4_ctr_a252_in,
2142 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002143};
2144
Jerome Forissier23256842018-02-16 09:25:35 +01002145static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002146{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002147 TEEC_Session session = { };
2148 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002149 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002150 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2151 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002152 uint8_t out[2048] = { };
2153 size_t out_size = 0;
2154 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002155 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002156 uint32_t ret_orig = 0;
2157 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002158
2159 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2160 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2161 &ret_orig)))
2162 return;
2163
2164 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002165 TEE_Attribute key_attr = { };
2166 size_t key_size = 0;
2167 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002168
Jerome Forissier817d99f2020-01-22 16:33:12 +01002169 switch (ciph_cases[n].algo) {
2170 case TEE_ALG_SM4_CTR:
2171 case TEE_ALG_SM4_CBC_NOPAD:
2172 case TEE_ALG_SM4_ECB_NOPAD:
2173 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2174 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2175 Do_ADBG_Log("SM4 not supported: skip subcase");
2176 continue;
2177 }
2178 break;
2179 default:
2180 break;
2181 }
2182
Pascal Brandc639ac82015-07-02 08:53:34 +02002183 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2184 (int)n, (unsigned int)ciph_cases[n].algo,
2185 (int)ciph_cases[n].line);
2186
2187 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2188 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2189 key_attr.content.ref.length = ciph_cases[n].key1_len;
2190
2191 key_size = key_attr.content.ref.length * 8;
2192 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2193 ciph_cases[n].key_type == TEE_TYPE_DES3)
2194 /* Exclude parity in bit size of key */
2195 key_size -= key_size / 8;
2196
2197 op_key_size = key_size;
2198 if (ciph_cases[n].key2 != NULL)
2199 op_key_size *= 2;
2200
2201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2202 ta_crypt_cmd_allocate_operation(c, &session, &op,
2203 ciph_cases[n].algo, ciph_cases[n].mode,
2204 op_key_size)))
2205 goto out;
2206
2207 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002208 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2209 ciph_cases[n].algo, ciph_cases[n].mode,
2210 op_key_size)))
2211 goto out;
2212
2213 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002214 ta_crypt_cmd_allocate_transient_object(c, &session,
2215 ciph_cases[n].key_type, key_size,
2216 &key1_handle)))
2217 goto out;
2218
2219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2220 ta_crypt_cmd_populate_transient_object(c, &session,
2221 key1_handle, &key_attr, 1)))
2222 goto out;
2223
2224 if (ciph_cases[n].key2 != NULL) {
2225 key_attr.content.ref.buffer =
2226 (void *)ciph_cases[n].key2;
2227 key_attr.content.ref.length = ciph_cases[n].key2_len;
2228
2229 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2230 ta_crypt_cmd_allocate_transient_object(c,
2231 &session, ciph_cases[n].key_type,
2232 key_attr.content.ref.length * 8,
2233 &key2_handle)))
2234 goto out;
2235
2236 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2237 ta_crypt_cmd_populate_transient_object(c,
2238 &session, key2_handle, &key_attr, 1)))
2239 goto out;
2240
2241 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2242 ta_crypt_cmd_set_operation_key2(c, &session, op,
2243 key1_handle, key2_handle)))
2244 goto out;
2245 } else {
2246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2247 ta_crypt_cmd_set_operation_key(c, &session, op,
2248 key1_handle)))
2249 goto out;
2250 }
2251
2252 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2253 ta_crypt_cmd_free_transient_object(c, &session,
2254 key1_handle)))
2255 goto out;
2256 key1_handle = TEE_HANDLE_NULL;
2257
2258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2259 ta_crypt_cmd_free_transient_object(c, &session,
2260 key2_handle)))
2261 goto out;
2262 key2_handle = TEE_HANDLE_NULL;
2263
2264 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2265 ta_crypt_cmd_cipher_init(c, &session, op,
2266 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2267 goto out;
2268
2269 out_offs = 0;
2270 out_size = sizeof(out);
2271 memset(out, 0, sizeof(out));
2272 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2273 ta_crypt_cmd_cipher_update(c, &session, op,
2274 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2275 &out_size)))
2276 goto out;
2277
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002278 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2279 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2280 ciph_cases[n].in_incr);
2281
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002282 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2283 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2284 goto out;
2285
Pascal Brandc639ac82015-07-02 08:53:34 +02002286 out_offs += out_size;
2287 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002288 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002289
2290 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2291 ta_crypt_cmd_cipher_do_final(c, &session, op,
2292 ciph_cases[n].in + ciph_cases[n].in_incr,
2293 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2294 out + out_offs,
2295 &out_size)))
2296 goto out;
2297
2298 out_offs += out_size;
2299
2300 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2301 ciph_cases[n].out_len, out, out_offs);
2302
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002303 /* test on the copied op2 */
2304 out_size = sizeof(out) - out_offs2;
2305
2306 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2307 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2308 ciph_cases[n].in + ciph_cases[n].in_incr,
2309 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2310 out + out_offs2,
2311 &out_size)))
2312 goto out;
2313
2314 out_offs2 += out_size;
2315
2316 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2317 out, out_offs2);
2318
Pascal Brandc639ac82015-07-02 08:53:34 +02002319 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2320 ta_crypt_cmd_free_operation(c, &session, op)))
2321 goto out;
2322
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002323 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2324 ta_crypt_cmd_free_operation(c, &session, op2)))
2325 goto out;
2326
Pascal Brandc639ac82015-07-02 08:53:34 +02002327 Do_ADBG_EndSubCase(c, NULL);
2328 }
2329out:
2330 TEEC_CloseSession(&session);
2331}
Jens Wiklander14f48872018-06-29 15:30:13 +02002332ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2333 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002334
Pascal Brandc639ac82015-07-02 08:53:34 +02002335static void xtest_tee_test_4004(ADBG_Case_t *c)
2336{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002337 TEEC_Session session = { };
2338 uint32_t ret_orig = 0;
2339 uint8_t buf1[45] = { };
2340 uint8_t buf2[45] = { };
2341 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002342
2343 Do_ADBG_BeginSubCase(c, "TEE get random");
2344 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2345 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2346 &ret_orig)))
2347 return;
2348
2349 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2350 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2351 sizeof(buf1))))
2352 goto out;
2353
2354 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2355 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2356
2357 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2358 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2359 sizeof(buf2))))
2360 goto out;
2361
2362 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2363 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2364
2365 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2366 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2367out:
2368 TEEC_CloseSession(&session);
2369 Do_ADBG_EndSubCase(c, "TEE get random");
2370}
Jens Wiklander14f48872018-06-29 15:30:13 +02002371ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2372 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002373
2374struct xtest_ae_case {
2375 uint32_t algo;
2376 uint32_t mode;
2377 uint32_t key_type;
2378 const uint8_t *key;
2379 size_t key_len;
2380 const uint8_t *nonce;
2381 size_t nonce_len;
2382 size_t aad_incr;
2383 const uint8_t *aad;
2384 size_t aad_len;
2385 size_t in_incr;
2386 const uint8_t *ptx;
2387 size_t ptx_len;
2388 const uint8_t *ctx;
2389 size_t ctx_len;
2390 const uint8_t *tag;
2391 size_t tag_len;
2392 size_t line;
2393};
2394
2395
2396#define ARRAY(a) a, ARRAY_SIZE(a)
2397#define NULL_ARRAY(a) NULL, 0
2398
2399#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2400 aad_array, ptx_array, ctx_array) \
2401 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2402 ARRAY(vect ## _nonce), (aad_incr), \
2403 aad_array(vect ## _aad), (in_incr), \
2404 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2405 ARRAY(vect ## _tag), \
2406 __LINE__ }, \
2407 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2408 ARRAY(vect ## _nonce), (aad_incr), \
2409 aad_array(vect ## _aad), (in_incr), \
2410 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2411 ARRAY(vect ## _tag), \
2412 __LINE__ }
2413
2414#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2415 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2416 in_incr, ARRAY, ARRAY, ARRAY)
2417
2418#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2419 aad_array, ptx_array, ctx_array) \
2420 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2421 in_incr, aad_array, ptx_array, ctx_array)
2422
2423
2424
2425static const struct xtest_ae_case ae_cases[] = {
2426 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2427 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2428 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2429
2430 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2431 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2432 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002433 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2434 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002435 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2436 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2437 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2438 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2439 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2440 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2441 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2442 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2443 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2444 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2445 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2446 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2447 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2448 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002449#ifdef CFG_GCM_NIST_VECTORS
2450#include "gcmDecrypt128.h"
2451#include "gcmDecrypt192.h"
2452#include "gcmDecrypt256.h"
2453#include "gcmEncryptExtIV128.h"
2454#include "gcmEncryptExtIV192.h"
2455#include "gcmEncryptExtIV256.h"
2456#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002457};
2458
2459static void xtest_tee_test_4005(ADBG_Case_t *c)
2460{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002461 TEEC_Session session = { };
2462 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002463 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002464 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002465 TEE_Attribute key_attr = { };
2466 uint8_t out[512] = { };
2467 size_t out_size = 0;
2468 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002469 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002470 uint32_t ret_orig = 0;
2471 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002472
2473 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2474 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2475 &ret_orig)))
2476 return;
2477
2478 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2479 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2480 (int)n, (unsigned int)ae_cases[n].algo,
2481 (int)ae_cases[n].line);
2482
2483 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2484 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2485 key_attr.content.ref.length = ae_cases[n].key_len;
2486
2487 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2488 ta_crypt_cmd_allocate_operation(c, &session, &op,
2489 ae_cases[n].algo, ae_cases[n].mode,
2490 key_attr.content.ref.length * 8)))
2491 goto out;
2492
2493 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002494 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2495 ae_cases[n].algo, ae_cases[n].mode,
2496 key_attr.content.ref.length * 8)))
2497 goto out;
2498
2499 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002500 ta_crypt_cmd_allocate_transient_object(c, &session,
2501 ae_cases[n].key_type,
2502 key_attr.content.ref.length * 8,
2503 &key_handle)))
2504 goto out;
2505
2506 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2507 ta_crypt_cmd_populate_transient_object(c, &session,
2508 key_handle, &key_attr, 1)))
2509 goto out;
2510
2511 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2512 ta_crypt_cmd_set_operation_key(c, &session, op,
2513 key_handle)))
2514 goto out;
2515
2516 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2517 ta_crypt_cmd_free_transient_object(c, &session,
2518 key_handle)))
2519 goto out;
2520 key_handle = TEE_HANDLE_NULL;
2521
2522 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2523 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2524 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2525 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2526 goto out;
2527
2528 if (ae_cases[n].aad != NULL) {
2529 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2530 ta_crypt_cmd_ae_update_aad(c, &session, op,
2531 ae_cases[n].aad, ae_cases[n].aad_incr)))
2532 goto out;
2533
2534 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2535 ta_crypt_cmd_ae_update_aad(c, &session, op,
2536 ae_cases[n].aad + ae_cases[n].aad_incr,
2537 ae_cases [n].aad_len -
2538 ae_cases[n].aad_incr)))
2539 goto out;
2540 }
2541
2542 out_offs = 0;
2543 out_size = sizeof(out);
2544 memset(out, 0, sizeof(out));
2545 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2546 if (ae_cases[n].ptx != NULL) {
2547 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2548 ta_crypt_cmd_ae_update(c, &session, op,
2549 ae_cases[n].ptx,
2550 ae_cases[n].in_incr, out,
2551 &out_size)))
2552 goto out;
2553 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002554 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2555 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2556 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002557 }
2558 } else {
2559 if (ae_cases[n].ctx != NULL) {
2560 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2561 ta_crypt_cmd_ae_update(c, &session, op,
2562 ae_cases[n].ctx,
2563 ae_cases[n].in_incr, out,
2564 &out_size)))
2565 goto out;
2566 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002567 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2568 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2569 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002570 }
2571 }
2572
Jens Wiklander7404c072020-12-15 08:06:32 +01002573 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2574 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2575 goto out;
2576
Pascal Brandc639ac82015-07-02 08:53:34 +02002577 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002578 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002579 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2580 uint8_t out_tag[64];
2581 size_t out_tag_len = MIN(sizeof(out_tag),
2582 ae_cases[n].tag_len);
2583
2584 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2585 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2586 ae_cases[n].ptx + ae_cases[n].in_incr,
2587 ae_cases[n].ptx_len -
2588 ae_cases[n].in_incr,
2589 out + out_offs,
2590 &out_size, out_tag, &out_tag_len)))
2591 goto out;
2592
2593 (void)ADBG_EXPECT_BUFFER(c,
2594 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2595 out_tag_len);
2596
2597 out_offs += out_size;
2598
2599 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2600 ae_cases[n].ctx_len, out, out_offs);
2601 } else {
2602 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2603 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2604 ae_cases[n].ctx + ae_cases[n].in_incr,
2605 ae_cases[n].ctx_len -
2606 ae_cases[n].in_incr,
2607 out + out_offs,
2608 &out_size, ae_cases[n].tag,
2609 ae_cases[n].tag_len)))
2610 goto out;
2611
2612 out_offs += out_size;
2613
2614 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2615 ae_cases[n].ptx_len, out, out_offs);
2616 }
2617
Jens Wiklander7404c072020-12-15 08:06:32 +01002618 /* test on the copied op2 */
2619 out_size = sizeof(out) - out_offs2;
2620 memset(out + out_offs2, 0, out_size);
2621 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2622 uint8_t out_tag[64] = { 0 };
2623 size_t out_tag_len = MIN(sizeof(out_tag),
2624 ae_cases[n].tag_len);
2625
2626 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2627 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2628 ae_cases[n].ptx + ae_cases[n].in_incr,
2629 ae_cases[n].ptx_len -
2630 ae_cases[n].in_incr,
2631 out + out_offs2,
2632 &out_size, out_tag, &out_tag_len)))
2633 goto out;
2634
2635 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2636 ae_cases[n].tag_len, out_tag,
2637 out_tag_len);
2638
2639 out_offs2 += out_size;
2640
2641 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2642 ae_cases[n].ctx_len, out, out_offs2);
2643 } else {
2644 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2645 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2646 ae_cases[n].ctx + ae_cases[n].in_incr,
2647 ae_cases[n].ctx_len -
2648 ae_cases[n].in_incr,
2649 out + out_offs2,
2650 &out_size, ae_cases[n].tag,
2651 ae_cases[n].tag_len)))
2652 goto out;
2653
2654 out_offs2 += out_size;
2655
2656 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2657 ae_cases[n].ptx_len, out, out_offs2);
2658 }
2659
Pascal Brandc639ac82015-07-02 08:53:34 +02002660 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2661 ta_crypt_cmd_free_operation(c, &session, op)))
2662 goto out;
2663
Jens Wiklander7404c072020-12-15 08:06:32 +01002664 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2665 ta_crypt_cmd_free_operation(c, &session, op2)))
2666 goto out;
2667
Pascal Brandc639ac82015-07-02 08:53:34 +02002668 Do_ADBG_EndSubCase(c, NULL);
2669 }
2670out:
2671 TEEC_CloseSession(&session);
2672}
Jens Wiklander14f48872018-06-29 15:30:13 +02002673ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2674 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002675
2676struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002677 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002678 uint32_t algo;
2679 TEE_OperationMode mode;
2680
2681 union {
2682 struct {
2683 const uint8_t *modulus;
2684 size_t modulus_len;
2685
2686 const uint8_t *pub_exp;
2687 size_t pub_exp_len;
2688
2689 const uint8_t *priv_exp;
2690 size_t priv_exp_len;
2691
2692 const uint8_t *prime1; /* q */
2693 size_t prime1_len;
2694 const uint8_t *prime2; /* p */
2695 size_t prime2_len;
2696 const uint8_t *exp1; /* dp */
2697 size_t exp1_len;
2698 const uint8_t *exp2; /* dq */
2699 size_t exp2_len;
2700 const uint8_t *coeff; /* iq */
2701 size_t coeff_len;
2702
2703 int salt_len;
2704 } rsa;
2705 struct {
2706 const uint8_t *prime;
2707 size_t prime_len;
2708 const uint8_t *sub_prime;
2709 size_t sub_prime_len;
2710 const uint8_t *base;
2711 size_t base_len;
2712 const uint8_t *pub_val;
2713 size_t pub_val_len;
2714 const uint8_t *priv_val;
2715 size_t priv_val_len;
2716 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002717 struct {
2718 const uint8_t *private;
2719 size_t private_len;
2720 const uint8_t *public_x;
2721 size_t public_x_len;
2722 const uint8_t *public_y;
2723 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002724 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002725 struct {
2726 const uint8_t *private;
2727 size_t private_len;
2728 const uint8_t *public;
2729 size_t public_len;
2730 const uint8_t flag;
2731 const uint8_t *context;
2732 size_t context_len;
2733 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002734 } params;
2735
2736 const uint8_t *ptx;
2737 size_t ptx_len;
2738 const uint8_t *ctx;
2739 size_t ctx_len;
2740 size_t line;
2741};
2742
2743#define WITHOUT_SALT(x) -1
2744#define WITH_SALT(x) x
2745
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002746#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2747 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002748 ARRAY(vect ## _ptx), \
2749 ARRAY(vect ## _out), \
2750 __LINE__ }
2751
2752#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2753 { .rsa = { \
2754 ARRAY(vect ## _modulus), \
2755 ARRAY(vect ## _pub_exp), \
2756 ARRAY(vect ## _priv_exp), \
2757 opt_crt_array(vect ## _prime1), \
2758 opt_crt_array(vect ## _prime2), \
2759 opt_crt_array(vect ## _exp1), \
2760 opt_crt_array(vect ## _exp2), \
2761 opt_crt_array(vect ## _coeff), \
2762 opt_salt(vect ## _salt_len) \
2763 } }
2764
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002765#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2766 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002767 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2768
2769#define XTEST_AC_DSA_UNION(vect) \
2770 { .dsa = { \
2771 ARRAY(vect ## _prime), \
2772 ARRAY(vect ## _sub_prime), \
2773 ARRAY(vect ## _base), \
2774 ARRAY(vect ## _pub_val), \
2775 ARRAY(vect ## _priv_val), \
2776 } }
2777
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002778#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2779 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002780
Pascal Brand3e143ee2015-07-15 17:17:16 +02002781#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002782 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002783 ARRAY(vect ## _private), \
2784 ARRAY(vect ## _public_x), \
2785 ARRAY(vect ## _public_y), \
2786 } }
2787
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002788#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002789 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002790
Valerii Chubarab9863c2022-08-12 07:42:29 +00002791#define XTEST_AC_EDDSA_UNION(vect, flag) \
2792 { .eddsa = { \
2793 ARRAY(vect ## _private), \
2794 ARRAY(vect ## _public), \
2795 flag, \
2796 } }
2797
2798#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2799 { .eddsa = { \
2800 ARRAY(vect ## _private), \
2801 ARRAY(vect ## _public), \
2802 flag, \
2803 ARRAY(vect ## _context), \
2804 } }
2805
2806#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2807 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2808
2809#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2810 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2811
Pascal Brandc639ac82015-07-02 08:53:34 +02002812static const struct xtest_ac_case xtest_ac_cases[] = {
2813 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002814 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002815 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002816 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002817 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002818 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002819 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002820 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002821 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002822 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2823 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2824 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2825 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002826 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2827 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2828 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2829 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002830 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002831 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002832 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002833 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002834 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002835 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002836 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002837 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002838 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002839 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002840 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002841 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002842 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002843 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002844 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002845 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002846 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002847 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002848 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002849 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002850 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2851 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2852 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2853 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002854
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002855 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002856 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002857 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002858 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002859
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002860#ifdef CFG_CRYPTO_RSASSA_NA1
2861 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2862 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2863 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2864 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2865#endif
2866
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002867 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002868 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002869 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002870 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002871
2872 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002873 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002874 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002875 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002876
2877 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002878 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002879 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002880 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2881
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002882 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2883 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002884 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002885 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002886 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002887
2888 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2889 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002890 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002891 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2892 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002893 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002894
2895 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2896 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002897 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002898 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2899 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002900 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002901
2902 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2903 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002904 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002905 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2906 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002907 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002908
2909 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2910 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002911 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002912 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2913 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002914 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2915
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002916 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002917 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002918 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002919 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002920 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002921 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002922 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002923 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002924 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002925 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002926 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002927 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
2928
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002929 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2930 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002931 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002932 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2933 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002934 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002935 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2936 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002937 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002938 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2939 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002940 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002941 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2942 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002943 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002944 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2945 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002946 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
2947
2948 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002949 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002950 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002951 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002952 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002953 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002954 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002955 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002956 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002957 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002958 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002959 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002960 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002961 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002962 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002963 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002964 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002965 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002966 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002967 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002968 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002969 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002970 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002971 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002972 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002973 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002974 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002975 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002976 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002977 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002978 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002979 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002980 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002981 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002982 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002983 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002984 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002985 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002986 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002987 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002988 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002989 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002990 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002991 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002992 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
2993
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002994 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2995 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002996 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002997 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002998 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002999 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3000 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003001 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003002 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3003 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003004 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003005 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3006 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003007 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003008 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3009 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003010 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003011 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3012 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003013 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003014 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3015 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003016 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003017 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3018 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003019 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003020 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3021 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003022 ac_rsassa_vect15, ARRAY, WITH_SALT),
3023
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003024 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003025 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003026 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003027 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003028 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003029 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003030 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003031 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003032 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003033 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003034 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003035 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3036
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003037 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3038 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003039 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003040 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3041 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003042 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003043 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3044 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003045 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003046 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3047 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003048 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003049 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3050 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003051 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003052 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3053 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003054 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3055
3056 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003057 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003058 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3059 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003060 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3061 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3062 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3063 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3064 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3065 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3066 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3067 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3068 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3069 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3070 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3071 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3072 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3073 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3074 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3075 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3076 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3077 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3078 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3079 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3080 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3081 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3082 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3083 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3084 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3085 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3086 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3087 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003088 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3089 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3090 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3091 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3092 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3093 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003094 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3095 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003096 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3097 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3098 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3099 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3100 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3101 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3102 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3103 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3104 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3105 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3106 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3107 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3108 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3109 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3110 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3111 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3112 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3113 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3114 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3115 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3116 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3117 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3118 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3119 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3120 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3121 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3122 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3123 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003124 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003125 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3126 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3127 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3128 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3129 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3130 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3131 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3132 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3133 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3134 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3135 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3136 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3137 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3138 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3139 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3140 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3141 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3142 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3143 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3144 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3145 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3146 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3147 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3148 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3149 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3150 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3151 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3152 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3153 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3154 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003155 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3156 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3157 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3158 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003159 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3160 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003161 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3162 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3163 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3164 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3165 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3166 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3167 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3168 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3169 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3170 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3171 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3172 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3173 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3174 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3175 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3176 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3177 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3178 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3179 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3180 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3181 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3182 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3183 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3184 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3185 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3186 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3187 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3188 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003189 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003190 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3191 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003192 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3193 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3194 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3195 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3196 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3197 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3198 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3199 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3200 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3201 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3202 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3203 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3204 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3205 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3206 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3207 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3208 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3209 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3210 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3211 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3212 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3213 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3214 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3215 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3216 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3217 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3218 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3219 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003220 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3221 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3222 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3223 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3224 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003225 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3226 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003227 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3229 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3230 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3231 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3232 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3233 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3234 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3235 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003255 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3256 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003257
3258 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003259 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003260 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3261 nist_186_2_ecdsa_testvector_1),
3262 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3263 nist_186_2_ecdsa_testvector_1),
3264 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3265 nist_186_2_ecdsa_testvector_2),
3266 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3267 nist_186_2_ecdsa_testvector_2),
3268 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3269 nist_186_2_ecdsa_testvector_3),
3270 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3271 nist_186_2_ecdsa_testvector_3),
3272 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3273 nist_186_2_ecdsa_testvector_4),
3274 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3275 nist_186_2_ecdsa_testvector_4),
3276 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3277 nist_186_2_ecdsa_testvector_5),
3278 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3279 nist_186_2_ecdsa_testvector_5),
3280 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3281 nist_186_2_ecdsa_testvector_6),
3282 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3283 nist_186_2_ecdsa_testvector_6),
3284 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3285 nist_186_2_ecdsa_testvector_7),
3286 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3287 nist_186_2_ecdsa_testvector_7),
3288 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3289 nist_186_2_ecdsa_testvector_8),
3290 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3291 nist_186_2_ecdsa_testvector_8),
3292 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3293 nist_186_2_ecdsa_testvector_9),
3294 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3295 nist_186_2_ecdsa_testvector_9),
3296 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3297 nist_186_2_ecdsa_testvector_10),
3298 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3299 nist_186_2_ecdsa_testvector_10),
3300 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3301 nist_186_2_ecdsa_testvector_11),
3302 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3303 nist_186_2_ecdsa_testvector_11),
3304 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3305 nist_186_2_ecdsa_testvector_12),
3306 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3307 nist_186_2_ecdsa_testvector_12),
3308 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3309 nist_186_2_ecdsa_testvector_13),
3310 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3311 nist_186_2_ecdsa_testvector_13),
3312 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3313 nist_186_2_ecdsa_testvector_14),
3314 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3315 nist_186_2_ecdsa_testvector_14),
3316 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3317 nist_186_2_ecdsa_testvector_15),
3318 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3319 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003320 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003321 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3322 nist_186_2_ecdsa_testvector_16),
3323 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3324 nist_186_2_ecdsa_testvector_16),
3325 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3326 nist_186_2_ecdsa_testvector_17),
3327 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3328 nist_186_2_ecdsa_testvector_17),
3329 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3330 nist_186_2_ecdsa_testvector_18),
3331 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3332 nist_186_2_ecdsa_testvector_18),
3333 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3334 nist_186_2_ecdsa_testvector_19),
3335 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3336 nist_186_2_ecdsa_testvector_19),
3337 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3338 nist_186_2_ecdsa_testvector_20),
3339 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3340 nist_186_2_ecdsa_testvector_20),
3341 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3342 nist_186_2_ecdsa_testvector_21),
3343 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3344 nist_186_2_ecdsa_testvector_21),
3345 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3346 nist_186_2_ecdsa_testvector_22),
3347 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3348 nist_186_2_ecdsa_testvector_22),
3349 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3350 nist_186_2_ecdsa_testvector_23),
3351 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3352 nist_186_2_ecdsa_testvector_23),
3353 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3354 nist_186_2_ecdsa_testvector_24),
3355 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3356 nist_186_2_ecdsa_testvector_24),
3357 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3358 nist_186_2_ecdsa_testvector_25),
3359 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3360 nist_186_2_ecdsa_testvector_25),
3361 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3362 nist_186_2_ecdsa_testvector_26),
3363 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3364 nist_186_2_ecdsa_testvector_26),
3365 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3366 nist_186_2_ecdsa_testvector_27),
3367 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3368 nist_186_2_ecdsa_testvector_27),
3369 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3370 nist_186_2_ecdsa_testvector_28),
3371 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3372 nist_186_2_ecdsa_testvector_28),
3373 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3374 nist_186_2_ecdsa_testvector_29),
3375 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3376 nist_186_2_ecdsa_testvector_29),
3377 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3378 nist_186_2_ecdsa_testvector_30),
3379 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3380 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003381 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003382 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3383 nist_186_2_ecdsa_testvector_31),
3384 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3385 nist_186_2_ecdsa_testvector_31),
3386 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3387 nist_186_2_ecdsa_testvector_32),
3388 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3389 nist_186_2_ecdsa_testvector_32),
3390 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3391 nist_186_2_ecdsa_testvector_33),
3392 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3393 nist_186_2_ecdsa_testvector_33),
3394 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3395 nist_186_2_ecdsa_testvector_34),
3396 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3397 nist_186_2_ecdsa_testvector_34),
3398 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3399 nist_186_2_ecdsa_testvector_35),
3400 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3401 nist_186_2_ecdsa_testvector_35),
3402 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3403 nist_186_2_ecdsa_testvector_36),
3404 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3405 nist_186_2_ecdsa_testvector_36),
3406 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3407 nist_186_2_ecdsa_testvector_37),
3408 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3409 nist_186_2_ecdsa_testvector_37),
3410 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3411 nist_186_2_ecdsa_testvector_38),
3412 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3413 nist_186_2_ecdsa_testvector_38),
3414 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3415 nist_186_2_ecdsa_testvector_39),
3416 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3417 nist_186_2_ecdsa_testvector_39),
3418 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3419 nist_186_2_ecdsa_testvector_40),
3420 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3421 nist_186_2_ecdsa_testvector_40),
3422 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3423 nist_186_2_ecdsa_testvector_41),
3424 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3425 nist_186_2_ecdsa_testvector_41),
3426 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3427 nist_186_2_ecdsa_testvector_42),
3428 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3429 nist_186_2_ecdsa_testvector_42),
3430 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3431 nist_186_2_ecdsa_testvector_43),
3432 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3433 nist_186_2_ecdsa_testvector_43),
3434 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3435 nist_186_2_ecdsa_testvector_44),
3436 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3437 nist_186_2_ecdsa_testvector_44),
3438 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3439 nist_186_2_ecdsa_testvector_45),
3440 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3441 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003442 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003443 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3444 nist_186_2_ecdsa_testvector_46),
3445 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3446 nist_186_2_ecdsa_testvector_46),
3447 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3448 nist_186_2_ecdsa_testvector_47),
3449 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3450 nist_186_2_ecdsa_testvector_47),
3451 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3452 nist_186_2_ecdsa_testvector_48),
3453 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3454 nist_186_2_ecdsa_testvector_48),
3455 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3456 nist_186_2_ecdsa_testvector_49),
3457 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3458 nist_186_2_ecdsa_testvector_49),
3459 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3460 nist_186_2_ecdsa_testvector_50),
3461 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3462 nist_186_2_ecdsa_testvector_50),
3463 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3464 nist_186_2_ecdsa_testvector_51),
3465 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3466 nist_186_2_ecdsa_testvector_51),
3467 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3468 nist_186_2_ecdsa_testvector_52),
3469 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3470 nist_186_2_ecdsa_testvector_52),
3471 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3472 nist_186_2_ecdsa_testvector_53),
3473 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3474 nist_186_2_ecdsa_testvector_53),
3475 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3476 nist_186_2_ecdsa_testvector_54),
3477 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3478 nist_186_2_ecdsa_testvector_54),
3479 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3480 nist_186_2_ecdsa_testvector_55),
3481 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3482 nist_186_2_ecdsa_testvector_55),
3483 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3484 nist_186_2_ecdsa_testvector_56),
3485 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3486 nist_186_2_ecdsa_testvector_56),
3487 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3488 nist_186_2_ecdsa_testvector_57),
3489 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3490 nist_186_2_ecdsa_testvector_57),
3491 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3492 nist_186_2_ecdsa_testvector_58),
3493 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3494 nist_186_2_ecdsa_testvector_58),
3495 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3496 nist_186_2_ecdsa_testvector_59),
3497 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3498 nist_186_2_ecdsa_testvector_59),
3499 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3500 nist_186_2_ecdsa_testvector_60),
3501 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3502 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003503 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003504 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3505 nist_186_2_ecdsa_testvector_61),
3506 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3507 nist_186_2_ecdsa_testvector_61),
3508 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3509 nist_186_2_ecdsa_testvector_62),
3510 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3511 nist_186_2_ecdsa_testvector_62),
3512 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3513 nist_186_2_ecdsa_testvector_63),
3514 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3515 nist_186_2_ecdsa_testvector_63),
3516 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3517 nist_186_2_ecdsa_testvector_64),
3518 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3519 nist_186_2_ecdsa_testvector_64),
3520 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3521 nist_186_2_ecdsa_testvector_65),
3522 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3523 nist_186_2_ecdsa_testvector_65),
3524 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3525 nist_186_2_ecdsa_testvector_66),
3526 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3527 nist_186_2_ecdsa_testvector_66),
3528 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3529 nist_186_2_ecdsa_testvector_67),
3530 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3531 nist_186_2_ecdsa_testvector_67),
3532 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3533 nist_186_2_ecdsa_testvector_68),
3534 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3535 nist_186_2_ecdsa_testvector_68),
3536 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3537 nist_186_2_ecdsa_testvector_69),
3538 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3539 nist_186_2_ecdsa_testvector_69),
3540 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3541 nist_186_2_ecdsa_testvector_70),
3542 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3543 nist_186_2_ecdsa_testvector_70),
3544 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3545 nist_186_2_ecdsa_testvector_71),
3546 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3547 nist_186_2_ecdsa_testvector_71),
3548 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3549 nist_186_2_ecdsa_testvector_72),
3550 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3551 nist_186_2_ecdsa_testvector_72),
3552 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3553 nist_186_2_ecdsa_testvector_73),
3554 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3555 nist_186_2_ecdsa_testvector_73),
3556 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3557 nist_186_2_ecdsa_testvector_74),
3558 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3559 nist_186_2_ecdsa_testvector_74),
3560 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3561 nist_186_2_ecdsa_testvector_75),
3562 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3563 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003564 /* [K-163] - GP NOT SUPPORTED */
3565 /* [K-233] - GP NOT SUPPORTED */
3566 /* [K-283] - GP NOT SUPPORTED */
3567 /* [K-409] - GP NOT SUPPORTED */
3568 /* [K-571] - GP NOT SUPPORTED */
3569 /* [B-163] - GP NOT SUPPORTED */
3570 /* [B-233] - GP NOT SUPPORTED */
3571 /* [B-283] - GP NOT SUPPORTED */
3572 /* [B-409] - GP NOT SUPPORTED */
3573 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003574
3575 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3576 gmt_0003_part5_c2_sm2_testvector),
3577 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3578 gmt_0003_part5_c2_sm2_testvector),
3579 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3580 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003581
3582 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3583 gmt_003_part5_a2),
3584 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3585 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003586};
3587
Valerii Chubarab9863c2022-08-12 07:42:29 +00003588static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3589
3590 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3591 ed25519_rfc_8032_7_1, 0),
3592 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3593 ed25519_rfc_8032_7_1, 0),
3594
3595 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3596 ed25519ctx_rfc_8032_7_2, 0),
3597 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3598 ed25519ctx_rfc_8032_7_2, 0),
3599
3600 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3601 ed25519ph_rfc_8032_7_3, 1),
3602 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3603 ed25519ph_rfc_8032_7_3, 1),
3604};
3605
Pascal Brandc639ac82015-07-02 08:53:34 +02003606static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3607 uint32_t max_key_size, uint32_t key_type,
3608 TEE_Attribute *attrs, size_t num_attrs,
3609 TEE_ObjectHandle *handle)
3610{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003611 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003612
3613 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3614 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3615 max_key_size, handle)))
3616 return false;
3617
3618 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3619 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3620 num_attrs)))
3621 return false;
3622
3623 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003624 uint8_t out[512] = { };
3625 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003626
3627 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3628 continue;
3629
Pascal Brandc639ac82015-07-02 08:53:34 +02003630 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3631 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3632 attrs[n].attributeID, out, &out_size)))
3633 return false;
3634
Pascal Brand3e143ee2015-07-15 17:17:16 +02003635 if (out_size < attrs[n].content.ref.length) {
3636 memmove(out + (attrs[n].content.ref.length - out_size),
3637 out,
3638 attrs[n].content.ref.length);
3639 memset(out, 0, attrs[n].content.ref.length - out_size);
3640 out_size = attrs[n].content.ref.length;
3641 }
3642
Pascal Brandc639ac82015-07-02 08:53:34 +02003643 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3644 attrs[n].content.ref.length, out, out_size))
3645 return false;
3646 }
3647
3648 return true;
3649}
3650
Jerome Forissier26393882022-03-09 21:22:30 +01003651#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3652
Pascal Brandc639ac82015-07-02 08:53:34 +02003653static void xtest_tee_test_4006(ADBG_Case_t *c)
3654{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003655 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003656 TEE_OperationHandle op = TEE_HANDLE_NULL;
3657 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3658 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003659 TEE_Attribute key_attrs[8] = { };
3660 TEE_Attribute algo_params[1] = { };
3661 size_t num_algo_params = 0;
3662 uint8_t out[512] = { };
3663 size_t out_size = 0;
3664 uint8_t out_enc[512] = { };
3665 size_t out_enc_size = 0;
3666 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003667 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003668 size_t max_key_size = 0;
3669 size_t num_key_attrs = 0;
3670 uint32_t ret_orig = 0;
3671 size_t n = 0;
3672 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003673 uint32_t pub_key_type = 0;
3674 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003675 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003676
3677 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3678 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3679 &ret_orig)))
3680 return;
3681
3682 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3683 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3684
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003685 if (tv->level > level)
3686 continue;
3687
Jerome Forissier4b03e282020-01-22 16:33:12 +01003688 if ((tv->algo == TEE_ALG_SM2_PKE ||
3689 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3690 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3691 TEE_ECC_CURVE_SM2)) {
3692 Do_ADBG_Log("SM2 not supported: skip subcase");
3693 continue;
3694 }
3695
Pascal Brandc639ac82015-07-02 08:53:34 +02003696 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3697 (int)n, (unsigned int)tv->algo,
3698 (int)tv->line);
3699
3700 /*
3701 * When signing or verifying we're working with the hash of
3702 * the payload.
3703 */
3704 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003705 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3706 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003707#if defined(CFG_CRYPTO_RSASSA_NA1)
3708 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3709 hash_algo = TEE_ALG_SHA256;
3710#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003711 else
3712 hash_algo = TEE_ALG_HASH_ALGO(
3713 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003714
3715 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3716 ta_crypt_cmd_allocate_operation(c, &session,
3717 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3718 goto out;
3719
3720 ptx_hash_size = sizeof(ptx_hash);
3721 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3722 ta_crypt_cmd_digest_do_final(c, & session, op,
3723 tv->ptx, tv->ptx_len, ptx_hash,
3724 &ptx_hash_size)))
3725 goto out;
3726
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003727 /*
3728 * When we use DSA algorithms, the size of the hash we
3729 * consider equals the min between the size of the
3730 * "subprime" in the key and the size of the hash
3731 */
3732 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3733 TEE_MAIN_ALGO_DSA) {
3734 if (tv->params.dsa.sub_prime_len <=
3735 ptx_hash_size)
3736 ptx_hash_size =
3737 tv->params.dsa.sub_prime_len;
3738 }
3739
Pascal Brandc639ac82015-07-02 08:53:34 +02003740 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3741 ta_crypt_cmd_free_operation(c, &session, op)))
3742 goto out;
3743 }
3744
3745 num_algo_params = 0;
3746 num_key_attrs = 0;
3747 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3748 case TEE_MAIN_ALGO_RSA:
3749 if (tv->params.rsa.salt_len > 0) {
3750 algo_params[0].attributeID =
3751 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3752 algo_params[0].content.value.a =
3753 tv->params.rsa.salt_len;
3754 algo_params[0].content.value.b = 0;
3755 num_algo_params = 1;
3756 }
3757
3758 max_key_size = tv->params.rsa.modulus_len * 8;
3759
3760 xtest_add_attr(&num_key_attrs, key_attrs,
3761 TEE_ATTR_RSA_MODULUS,
3762 tv->params.rsa.modulus,
3763 tv->params.rsa.modulus_len);
3764 xtest_add_attr(&num_key_attrs, key_attrs,
3765 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3766 tv->params.rsa.pub_exp,
3767 tv->params.rsa.pub_exp_len);
3768
3769 if (!ADBG_EXPECT_TRUE(c,
3770 create_key(c, &session,
3771 max_key_size,
3772 TEE_TYPE_RSA_PUBLIC_KEY,
3773 key_attrs,
3774 num_key_attrs,
3775 &pub_key_handle)))
3776 goto out;
3777
3778 xtest_add_attr(&num_key_attrs, key_attrs,
3779 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3780 tv->params.rsa.priv_exp,
3781 tv->params.rsa.priv_exp_len);
3782
3783 if (tv->params.rsa.prime1_len != 0) {
3784 xtest_add_attr(&num_key_attrs, key_attrs,
3785 TEE_ATTR_RSA_PRIME1,
3786 tv->params.rsa.prime1,
3787 tv->params.rsa.prime1_len);
3788 }
3789
3790 if (tv->params.rsa.prime2_len != 0) {
3791 xtest_add_attr(&num_key_attrs, key_attrs,
3792 TEE_ATTR_RSA_PRIME2,
3793 tv->params.rsa.prime2,
3794 tv->params.rsa.prime2_len);
3795 }
3796
3797 if (tv->params.rsa.exp1_len != 0) {
3798 xtest_add_attr(&num_key_attrs, key_attrs,
3799 TEE_ATTR_RSA_EXPONENT1,
3800 tv->params.rsa.exp1,
3801 tv->params.rsa.exp1_len);
3802 }
3803
3804 if (tv->params.rsa.exp2_len != 0) {
3805 xtest_add_attr(&num_key_attrs, key_attrs,
3806 TEE_ATTR_RSA_EXPONENT2,
3807 tv->params.rsa.exp2,
3808 tv->params.rsa.exp2_len);
3809 }
3810
3811 if (tv->params.rsa.coeff_len != 0) {
3812 xtest_add_attr(&num_key_attrs, key_attrs,
3813 TEE_ATTR_RSA_COEFFICIENT,
3814 tv->params.rsa.coeff,
3815 tv->params.rsa.coeff_len);
3816 }
3817
3818 if (!ADBG_EXPECT_TRUE(c,
3819 create_key(c, &session,
3820 max_key_size,
3821 TEE_TYPE_RSA_KEYPAIR,
3822 key_attrs,
3823 num_key_attrs,
3824 &priv_key_handle)))
3825 goto out;
3826 break;
3827
3828 case TEE_MAIN_ALGO_DSA:
3829 max_key_size = tv->params.dsa.prime_len * 8;
3830
3831 xtest_add_attr(&num_key_attrs, key_attrs,
3832 TEE_ATTR_DSA_PRIME,
3833 tv->params.dsa.prime,
3834 tv->params.dsa.prime_len);
3835 xtest_add_attr(&num_key_attrs, key_attrs,
3836 TEE_ATTR_DSA_SUBPRIME,
3837 tv->params.dsa.sub_prime,
3838 tv->params.dsa.sub_prime_len);
3839 xtest_add_attr(&num_key_attrs, key_attrs,
3840 TEE_ATTR_DSA_BASE,
3841 tv->params.dsa.base,
3842 tv->params.dsa.base_len);
3843 xtest_add_attr(&num_key_attrs, key_attrs,
3844 TEE_ATTR_DSA_PUBLIC_VALUE,
3845 tv->params.dsa.pub_val,
3846 tv->params.dsa.pub_val_len);
3847
3848 if (!ADBG_EXPECT_TRUE(c,
3849 create_key(c, &session, max_key_size,
3850 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3851 num_key_attrs, &pub_key_handle)))
3852 goto out;
3853
3854 xtest_add_attr(&num_key_attrs, key_attrs,
3855 TEE_ATTR_DSA_PRIVATE_VALUE,
3856 tv->params.dsa.priv_val,
3857 tv->params.dsa.priv_val_len);
3858
3859 if (!ADBG_EXPECT_TRUE(c,
3860 create_key(c, &session, max_key_size,
3861 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3862 num_key_attrs, &priv_key_handle)))
3863 goto out;
3864 break;
3865
Pascal Brand3e143ee2015-07-15 17:17:16 +02003866 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003867 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003868 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003869 switch (tv->algo) {
3870 case TEE_ALG_ECDSA_P192:
3871 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003872 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3873 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003874 break;
3875 case TEE_ALG_ECDSA_P224:
3876 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003877 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3878 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003879 break;
3880 case TEE_ALG_ECDSA_P256:
3881 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003882 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3883 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003884 break;
3885 case TEE_ALG_ECDSA_P384:
3886 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003887 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3888 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003889 break;
3890 case TEE_ALG_ECDSA_P521:
3891 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003892 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3893 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3894 break;
3895 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01003896 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003897 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3898 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003899 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003900 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01003901 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003902 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3903 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3904 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003905 default:
3906 curve = 0xFF;
3907 break;
3908 }
3909
3910 if (tv->algo == TEE_ALG_ECDSA_P521)
3911 max_key_size = 521;
3912 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003913 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003914
Jerome Forissier26393882022-03-09 21:22:30 +01003915 if (curve != XTEST_NO_CURVE)
3916 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003917 TEE_ATTR_ECC_CURVE, curve, 0);
3918 xtest_add_attr(&num_key_attrs, key_attrs,
3919 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003920 tv->params.ecc.public_x,
3921 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003922 xtest_add_attr(&num_key_attrs, key_attrs,
3923 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003924 tv->params.ecc.public_y,
3925 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003926
3927 if (!ADBG_EXPECT_TRUE(c,
3928 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003929 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003930 num_key_attrs, &pub_key_handle)))
3931 goto out;
3932
3933 xtest_add_attr(&num_key_attrs, key_attrs,
3934 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003935 tv->params.ecc.private,
3936 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003937
3938 if (!ADBG_EXPECT_TRUE(c,
3939 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003940 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003941 num_key_attrs, &priv_key_handle)))
3942 goto out;
3943 break;
3944
Pascal Brandc639ac82015-07-02 08:53:34 +02003945 default:
3946 ADBG_EXPECT_TRUE(c, false);
3947 goto out;
3948 }
3949
3950 out_size = sizeof(out);
3951 memset(out, 0, sizeof(out));
3952 switch (tv->mode) {
3953 case TEE_MODE_ENCRYPT:
3954 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3955 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003956 &op, tv->algo, TEE_MODE_ENCRYPT,
3957 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003958 goto out;
3959
3960 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3961 ta_crypt_cmd_set_operation_key(c, &session, op,
3962 pub_key_handle)))
3963 goto out;
3964
3965 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3966 ta_crypt_cmd_free_transient_object(c, &session,
3967 pub_key_handle)))
3968 goto out;
3969 pub_key_handle = TEE_HANDLE_NULL;
3970
3971 out_enc_size = sizeof(out_enc);
3972 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3973 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
3974 NULL, 0, tv->ptx, tv->ptx_len, out_enc,
3975 &out_enc_size)))
3976 goto out;
3977
3978 /*
3979 * A PS which is random is added when formatting the
3980 * message internally of the algorithm so we can't
3981 * verify against precomputed values, instead we use the
3982 * decrypt operation to see that output is correct.
3983 */
3984
3985 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3986 ta_crypt_cmd_free_operation(c, &session, op)))
3987 goto out;
3988
3989 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3990 ta_crypt_cmd_allocate_operation(c, &session,
3991 &op, tv->algo, TEE_MODE_DECRYPT,
3992 max_key_size)))
3993 goto out;
3994
3995 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3996 ta_crypt_cmd_set_operation_key(c, &session, op,
3997 priv_key_handle)))
3998 goto out;
3999
4000 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4001 ta_crypt_cmd_free_transient_object(c, &session,
4002 priv_key_handle)))
4003 goto out;
4004
4005 priv_key_handle = TEE_HANDLE_NULL;
4006
4007 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4008 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4009 NULL, 0, out_enc, out_enc_size, out,
4010 &out_size)))
4011 goto out;
4012
4013 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4014 out_size);
4015 break;
4016
4017 case TEE_MODE_DECRYPT:
4018 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4019 ta_crypt_cmd_allocate_operation(c, &session,
4020 &op, tv->algo, TEE_MODE_DECRYPT,
4021 max_key_size)))
4022 goto out;
4023
4024 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4025 ta_crypt_cmd_set_operation_key(c, &session, op,
4026 priv_key_handle)))
4027 goto out;
4028
4029 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4030 ta_crypt_cmd_free_transient_object(c, &session,
4031 priv_key_handle)))
4032 goto out;
4033
4034 priv_key_handle = TEE_HANDLE_NULL;
4035
4036 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4037 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4038 NULL, 0, tv->ctx, tv->ctx_len, out,
4039 &out_size)))
4040 goto out;
4041
4042 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4043 out_size);
4044 break;
4045
4046 case TEE_MODE_VERIFY:
4047 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4048 ta_crypt_cmd_allocate_operation(c, &session,
4049 &op, tv->algo, TEE_MODE_VERIFY,
4050 max_key_size)))
4051 goto out;
4052
4053 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4054 ta_crypt_cmd_set_operation_key(c, &session, op,
4055 pub_key_handle)))
4056 goto out;
4057
4058 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4059 ta_crypt_cmd_free_transient_object(c, &session,
4060 pub_key_handle)))
4061 goto out;
4062
4063 pub_key_handle = TEE_HANDLE_NULL;
4064
4065 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4066 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4067 algo_params, num_algo_params, ptx_hash,
4068 ptx_hash_size, tv->ctx, tv->ctx_len)))
4069 goto out;
4070 break;
4071
4072 case TEE_MODE_SIGN:
4073 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4074 ta_crypt_cmd_allocate_operation(c, &session,
4075 &op, tv->algo, TEE_MODE_SIGN,
4076 max_key_size)))
4077 goto out;
4078
4079 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4080 ta_crypt_cmd_set_operation_key(c, &session, op,
4081 priv_key_handle)))
4082 goto out;
4083
4084 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4085 ta_crypt_cmd_free_transient_object(c, &session,
4086 priv_key_handle)))
4087 goto out;
4088
4089 priv_key_handle = TEE_HANDLE_NULL;
4090
4091 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4092 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4093 algo_params, num_algo_params, ptx_hash,
4094 ptx_hash_size, out, &out_size)))
4095 goto out;
4096
4097 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4098 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004099 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004100 tv->algo == TEE_ALG_DSA_SHA224 ||
4101 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004102 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004103 TEE_MAIN_ALGO_ECDSA ||
4104 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004105 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4106 ta_crypt_cmd_free_operation(c, &session,
4107 op)))
4108 goto out;
4109 /*
4110 * The salt or K is random so we can't verify
4111 * signing against precomputed values, instead
4112 * we use the verify operation to see that
4113 * output is correct.
4114 */
4115 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4116 ta_crypt_cmd_allocate_operation(c,
4117 &session, &op, tv->algo,
4118 TEE_MODE_VERIFY, max_key_size)))
4119 goto out;
4120
4121 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4122 ta_crypt_cmd_set_operation_key(c,
4123 &session, op, pub_key_handle)))
4124 goto out;
4125
4126 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4127 ta_crypt_cmd_free_transient_object(c,
4128 &session, pub_key_handle)))
4129 goto out;
4130
4131 pub_key_handle = TEE_HANDLE_NULL;
4132
4133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4134 ta_crypt_cmd_asymmetric_verify(c,
4135 &session, op, algo_params,
4136 num_algo_params, ptx_hash,
4137 ptx_hash_size, out, out_size)))
4138 goto out;
4139 } else {
4140 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4141 tv->ctx_len, out,
4142 out_size);
4143 }
4144 break;
4145
4146 default:
4147 break;
4148 }
4149
4150 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4151 ta_crypt_cmd_free_operation(c, &session, op)))
4152 goto out;
4153
4154 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4155 ta_crypt_cmd_free_transient_object(c, &session,
4156 pub_key_handle)))
4157 goto out;
4158 pub_key_handle = TEE_HANDLE_NULL;
4159
4160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4161 ta_crypt_cmd_free_transient_object(c, &session,
4162 priv_key_handle)))
4163 goto out;
4164
4165 priv_key_handle = TEE_HANDLE_NULL;
4166
4167 Do_ADBG_EndSubCase(c, NULL);
4168 }
4169out:
4170 TEEC_CloseSession(&session);
4171}
Jens Wiklander14f48872018-06-29 15:30:13 +02004172ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4173 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004174
4175#define KEY_ATTR(x, y) { #x, (x), y }
4176
4177struct key_attrs {
4178 const char *name;
4179 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004180 /*
4181 * When keysize_check != 0: size of attribute is checked
4182 * Expected value is key_size bits except for DH in which case it is
4183 * the value of keysize_check.
4184 */
4185 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004186};
4187
4188static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4189 TEE_ObjectHandle key, uint32_t key_size,
4190 struct key_attrs *attrs, size_t num_attrs)
4191{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004192 uint8_t out[2048] = { };
4193 size_t out_size = 0;
4194 size_t n = 0;
4195 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004196
4197 for (m = 0; m < num_attrs; m++) {
4198 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4199 out_size = sizeof(out);
4200 memset(out, 0, sizeof(out));
4201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4202 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4203 key, attrs[m].attr, out, &out_size)))
4204 return false;
4205
4206 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004207 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004208 key_size / 8);
4209
4210 if (out_size > 0) {
4211 /* Check that buffer isn't all zeroes */
4212 for (n = 0; n < out_size; n++)
4213 if (out[n] != 0)
4214 break;
4215 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4216 out_size))
4217 return false;
4218 }
4219 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004220 uint32_t a = 0;
4221 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004222
4223 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4224 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4225 attrs[m].attr, &a, &b)))
4226 return false;
4227 }
4228 }
4229 return true;
4230}
4231
4232static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4233 TEE_ObjectHandle key, uint32_t key_size)
4234{
4235 const struct key_attrs attrs[] = {
4236 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4237 };
4238
4239 return test_keygen_attributes(c, s, key, key_size,
4240 (struct key_attrs *)&attrs,
4241 ARRAY_SIZE(attrs));
4242}
4243
4244
4245static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4246 TEE_ObjectHandle key, uint32_t key_size)
4247{
4248 const struct key_attrs attrs[] = {
4249 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4250 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4251 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4252 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4253 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4254 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4255 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4256 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4257 };
4258
4259 return test_keygen_attributes(c, s, key, key_size,
4260 (struct key_attrs *)&attrs,
4261 ARRAY_SIZE(attrs));
4262}
4263
Pascal Brande61133f2015-07-08 15:38:37 +02004264static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4265 TEE_ObjectHandle key, uint32_t key_size)
4266{
4267 const struct key_attrs attrs[] = {
4268 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4269 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4270 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4271 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4272 };
4273
4274 return test_keygen_attributes(c, s, key, key_size,
4275 (struct key_attrs *)&attrs,
4276 ARRAY_SIZE(attrs));
4277}
4278
Pascal Brandc639ac82015-07-02 08:53:34 +02004279static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004280 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004281{
4282 const struct key_attrs attrs[] = {
4283 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4284 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4285 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4286 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4287 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4288 };
4289
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004290 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004291 (struct key_attrs *)&attrs,
4292 ARRAY_SIZE(attrs));
4293}
4294
4295static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4296 TEE_ObjectHandle key, uint32_t key_size)
4297{
4298 const struct key_attrs attrs[] = {
4299 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4300 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4301 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4302 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4303 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4304 };
4305
4306 return test_keygen_attributes(c, s, key, key_size,
4307 (struct key_attrs *)&attrs,
4308 ARRAY_SIZE(attrs));
4309}
4310
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004311static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4312 TEE_ObjectHandle key, uint32_t key_size)
4313{
4314 const struct key_attrs attrs[] = {
4315 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4316 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4317 };
4318
4319 return test_keygen_attributes(c, s, key, key_size,
4320 (struct key_attrs *)&attrs,
4321 ARRAY_SIZE(attrs));
4322}
4323
Valerii Chubarab9863c2022-08-12 07:42:29 +00004324static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4325 TEE_ObjectHandle key, uint32_t key_size)
4326{
4327 const struct key_attrs attrs[] = {
4328 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4329 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4330 };
4331
4332 return test_keygen_attributes(c, s, key, key_size,
4333 (struct key_attrs *)&attrs,
4334 ARRAY_SIZE(attrs));
4335}
4336
Pascal Brandc639ac82015-07-02 08:53:34 +02004337static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4338 uint32_t key_type, uint32_t check_keysize,
4339 uint32_t key_size,
4340 TEE_Attribute *params, size_t param_count)
4341{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004342 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004343 bool ret_val = true;
4344
4345 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4346 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4347 &key)))
4348 return false;
4349
4350 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4351 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4352 param_count)))
4353 return false;
4354
4355 switch (key_type) {
4356 case TEE_TYPE_DES:
4357 case TEE_TYPE_DES3:
4358 ret_val = ADBG_EXPECT_TRUE(c,
4359 test_secret_value(c, s, key,
4360 key_size + key_size / 7));
4361 break;
4362 case TEE_TYPE_AES:
4363 case TEE_TYPE_HMAC_MD5:
4364 case TEE_TYPE_HMAC_SHA1:
4365 case TEE_TYPE_HMAC_SHA224:
4366 case TEE_TYPE_HMAC_SHA256:
4367 case TEE_TYPE_HMAC_SHA384:
4368 case TEE_TYPE_HMAC_SHA512:
4369 case TEE_TYPE_GENERIC_SECRET:
4370 ret_val = ADBG_EXPECT_TRUE(c,
4371 test_secret_value(c, s, key, key_size));
4372 break;
4373
4374 case TEE_TYPE_RSA_KEYPAIR:
4375 ret_val = ADBG_EXPECT_TRUE(c,
4376 test_rsa_key_pair(c, s, key, key_size));
4377 break;
4378
Pascal Brande61133f2015-07-08 15:38:37 +02004379 case TEE_TYPE_ECDSA_KEYPAIR:
4380 case TEE_TYPE_ECDH_KEYPAIR:
4381 ret_val = ADBG_EXPECT_TRUE(c,
4382 test_ecc_key_pair(c, s, key, key_size));
4383 break;
4384
Pascal Brandc639ac82015-07-02 08:53:34 +02004385 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004386 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004387 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004388 break;
4389
4390 case TEE_TYPE_DSA_KEYPAIR:
4391 ret_val = ADBG_EXPECT_TRUE(c,
4392 test_dsa_key_pair(c, s, key, key_size));
4393 break;
4394
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004395 case TEE_TYPE_X25519_KEYPAIR:
4396 ret_val = ADBG_EXPECT_TRUE(c,
4397 test_x25519_key_pair(c, s, key, key_size));
4398 break;
4399
Valerii Chubarab9863c2022-08-12 07:42:29 +00004400 case TEE_TYPE_ED25519_KEYPAIR:
4401 ret_val = ADBG_EXPECT_TRUE(c,
4402 test_ed25519_key_pair(c, s, key, key_size));
4403 break;
4404
Pascal Brandc639ac82015-07-02 08:53:34 +02004405 default:
4406 ret_val = false;
4407 break;
4408 }
4409
4410 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4411 ta_crypt_cmd_free_transient_object(c, s, key)))
4412 return false;
4413
4414 return ret_val;
4415}
4416
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004417struct key_types_noparam {
4418 unsigned level;
4419 const char *name;
4420 uint32_t key_type;
4421 uint32_t quanta;
4422 uint32_t min_size;
4423 uint32_t max_size;
4424};
4425
4426static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4427 const struct key_types_noparam *key_types,
4428 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004429{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004430 size_t n = 0;
4431 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004432
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004433 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004434 uint32_t min_size = key_types[n].min_size;
4435 uint32_t max_size = key_types[n].max_size;
4436 uint32_t quanta = key_types[n].quanta;
4437
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004438 if (key_types[n].level > level)
4439 continue;
4440
Pascal Brandc639ac82015-07-02 08:53:34 +02004441 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4442
4443 for (key_size = min_size; key_size <= max_size;
4444 key_size += quanta) {
4445 if (!ADBG_EXPECT_TRUE(c,
4446 generate_and_test_key(c, session, key_types
4447 [n].key_type, 1, key_size, NULL, 0)))
4448 break;
4449 }
4450
4451 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4452 }
4453}
4454
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004455static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004456{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004457 TEEC_Session session = { };
4458 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004459 static const struct key_types_noparam key_types[] = {
4460 { 0, "AES", TEE_TYPE_AES, 64, 128,
4461 256 /* valid sizes 128, 192, 256 */ },
4462 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4463 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4464 168 /* valid sizes 112, 168 */ },
4465 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4466 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4467 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4468 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4469 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4470 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4471 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4472 };
4473
4474 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4475 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4476 &ret_orig)))
4477 return;
4478
4479 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4480
4481 TEEC_CloseSession(&session);
4482}
4483ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4484 "Test TEE Internal API Generate Symmetric key");
4485
4486static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4487{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004488 TEEC_Session session = { };
4489 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004490 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004491#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004492 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4493 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004494#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004495 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004496#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004497 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4498 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4499 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004500#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004501 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4502 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4503 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4504 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4505 };
4506
4507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4508 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4509 &ret_orig)))
4510 return;
4511
4512 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4513
4514 TEEC_CloseSession(&session);
4515}
4516ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4517 "Test TEE Internal API Generate RSA key");
4518
4519static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4520{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004521 TEEC_Session session = { };
4522 uint32_t ret_orig = 0;
4523 size_t n = 0;
4524 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004525 /*
4526 * Note that the key size parameter is not used when creating the keys
4527 * but specifying these sizes make it possible to test the expected size
4528 * of the private value. This also means that the keysize must match the
4529 * size of p or what is specified in private_bits or the equvivalent
4530 * size of the subprime parameter.
4531 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004532 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004533
4534#define XTEST_DH_GK_DATA(vect) \
4535 ARRAY(vect ## _p), \
4536 ARRAY(vect ## _g), \
4537 &vect ## _private_bits, \
4538 0, 0
4539#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4540 ARRAY(vect ## _p), \
4541 ARRAY(vect ## _g), \
4542 &vect ## _private_bits, \
4543 ARRAY(vect ## _subprime)
4544 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004545 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004546 uint32_t key_size;
4547 const uint8_t *p;
4548 size_t p_len;
4549 const uint8_t *g;
4550 size_t g_len;
4551 const uint32_t *private_bits;
4552 const uint8_t *subprime;
4553 size_t subprime_len;
4554 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004555 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004556 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004557 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004558 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004559 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004560 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004561 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004562 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004563 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004564 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004565 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004566 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004567 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004568 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004569 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004570 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004571 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004572 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004573 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004574 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004575 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004576 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004577 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004578 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004579 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004580 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004581 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004582 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004583 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004584 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004585 };
4586
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004587 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4588 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4589 &ret_orig)))
4590 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004591
4592 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004593 if (key_types[n].level > level)
4594 continue;
4595
Pascal Brandc639ac82015-07-02 08:53:34 +02004596 Do_ADBG_BeginSubCase(c,
4597 "Generate DH key %d bits - Private bits = %d",
4598 key_types[n].key_size,
4599 *key_types[n].private_bits);
4600 param_count = 0;
4601
4602 xtest_add_attr(&param_count, params,
4603 TEE_ATTR_DH_PRIME,
4604 key_types[n].p, key_types[n].p_len);
4605
4606 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4607 key_types[n].g, key_types[n].g_len);
4608
4609 if (key_types[n].private_bits != 0) {
4610 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4611
4612 params[param_count].content.value.a =
4613 *key_types[n].private_bits;
4614
4615 params[param_count].content.value.b = 0;
4616 param_count++;
4617 }
4618
4619 if (key_types[n].subprime != 0) {
4620 xtest_add_attr(&param_count, params,
4621 TEE_ATTR_DH_SUBPRIME,
4622 key_types[n].subprime,
4623 key_types[n].subprime_len);
4624 }
4625
4626 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004627 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004628 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004629 key_types[n]. key_size, params, param_count)))
4630 break;
4631
4632 Do_ADBG_EndSubCase(c,
4633 "Generate DH key %d bits - Private bits = %d",
4634 key_types[n].key_size,
4635 *key_types[n].private_bits);
4636 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004637
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004638 TEEC_CloseSession(&session);
4639}
4640ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4641 "Test TEE Internal API Generate DH key");
4642
4643static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004644{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004645 TEEC_Session session = { };
4646 uint32_t ret_orig = 0;
4647 size_t n = 0;
4648 size_t param_count = 0;
4649 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004650
4651#define XTEST_DSA_GK_DATA(vect) \
4652 ARRAY(vect ## _p), \
4653 ARRAY(vect ## _g), \
4654 ARRAY(vect ## _q)
4655 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004656 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004657 uint32_t key_size;
4658 const uint8_t *prime;
4659 size_t prime_len;
4660 const uint8_t *base;
4661 size_t base_len;
4662 const uint8_t *sub_prime;
4663 size_t sub_prime_len;
4664 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004665 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004666 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004667 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4668 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4669 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4670 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4671 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4672 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4673 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4674 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004675 };
4676
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004677 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4678 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4679 &ret_orig)))
4680 return;
4681
Pascal Brandc639ac82015-07-02 08:53:34 +02004682 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004683 if (key_types[n].level > level)
4684 continue;
4685
Pascal Brandc639ac82015-07-02 08:53:34 +02004686 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4687 key_types[n].key_size);
4688 param_count = 0;
4689
4690
4691 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4692 key_types[n].prime, key_types[n].prime_len);
4693
4694 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4695 key_types[n].sub_prime,
4696 key_types[n].sub_prime_len);
4697
4698 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4699 key_types[n].base, key_types[n].base_len);
4700
4701 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004702 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004703 1, key_types[n]. key_size, params,
4704 param_count)))
4705 break;
4706
4707 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4708 key_types[n].key_size);
4709 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004710
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004711 TEEC_CloseSession(&session);
4712}
4713ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4714 "Test TEE Internal API Generate DSA key");
4715
4716static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004717{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004718 TEEC_Session session = { };
4719 uint32_t ret_orig = 0;
4720 size_t n = 0;
4721 size_t param_count = 0;
4722 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004723
4724 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004725 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004726 const char *name;
4727 uint32_t algo;
4728 uint32_t curve;
4729 uint32_t key_size;
4730 } key_types[] = {
4731 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004732 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4733 192 },
4734 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4735 224 },
4736 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4737 256 },
4738 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4739 384 },
4740 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4741 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004742
4743 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004744 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4745 192 },
4746 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4747 224 },
4748 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4749 256 },
4750 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4751 384 },
4752 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4753 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004754 };
4755
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004756 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4757 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4758 &ret_orig)))
4759 return;
4760
Pascal Brande61133f2015-07-08 15:38:37 +02004761 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004762 if (key_types[n].level > level)
4763 continue;
4764
Pascal Brande61133f2015-07-08 15:38:37 +02004765 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4766 param_count = 0;
4767
4768 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4769 key_types[n].curve, 0);
4770
4771 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004772 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004773 0, key_types[n].key_size, params,
4774 param_count)))
4775 break;
4776
4777 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4778 }
Pascal Brande61133f2015-07-08 15:38:37 +02004779
Pascal Brandc639ac82015-07-02 08:53:34 +02004780 TEEC_CloseSession(&session);
4781}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004782ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4783 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004784
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004785static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4786{
4787 TEEC_Session session = { };
4788 uint32_t ret_orig = 0;
4789
4790 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4791 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4792 NULL, &ret_orig)))
4793 return;
4794
Jerome Forissier366179c2022-06-28 10:12:58 +02004795 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4796 TEE_ECC_CURVE_25519)) {
4797 Do_ADBG_Log("X25519 not supported: skip subcase");
4798 goto out;
4799 }
4800
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004801 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4802
4803 if (!ADBG_EXPECT_TRUE(c,
4804 generate_and_test_key(c, &session,
4805 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4806 NULL, 0)))
4807 return;
4808
4809 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004810out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004811 TEEC_CloseSession(&session);
4812}
4813ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4814 "Test TEE Internal API Generate X25519 key");
4815
Valerii Chubarab9863c2022-08-12 07:42:29 +00004816
4817static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4818{
4819 TEEC_Session session = { };
4820 uint32_t ret_orig = 0;
4821
4822 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4823 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4824 NULL, &ret_orig)))
4825 return;
4826
4827 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
4828 TEE_ECC_CURVE_25519)) {
4829 Do_ADBG_Log("ED25519 not supported: skip subcase");
4830 goto out;
4831 }
4832
4833 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
4834
4835 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
4836 TEE_TYPE_ED25519_KEYPAIR,
4837 0, 256, NULL, 0));
4838
4839 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
4840out:
4841 TEEC_CloseSession(&session);
4842}
4843ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
4844 "Test TEE Internal API Generate ed25519 key");
4845
Pascal Brandc639ac82015-07-02 08:53:34 +02004846static void xtest_tee_test_4008(ADBG_Case_t *c)
4847{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004848 TEEC_Session session = { };
4849 uint32_t ret_orig = 0;
4850 TEE_OperationHandle op = TEE_HANDLE_NULL;
4851 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4852 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4853 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004854 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004855 uint8_t out[2048] = { };
4856 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004857
4858 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4859 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4860 &ret_orig)))
4861 return;
4862
4863 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4864
4865 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4866 ta_crypt_cmd_allocate_operation(c, &session, &op,
4867 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4868 derive_key_max_keysize)))
4869 goto out;
4870
4871 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4872 ta_crypt_cmd_allocate_transient_object(c, & session,
4873 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4874 &key_handle)))
4875 goto out;
4876
4877 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4878 ARRAY(derive_key_dh_prime));
4879
4880 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4881 ARRAY(derive_key_dh_base));
4882
4883 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4884 ARRAY(derive_key_dh_public_value));
4885
4886 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4887 ARRAY(derive_key_dh_private_value));
4888
4889 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4890 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4891 params, param_count)))
4892 goto out;
4893
4894 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4895 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4896 goto out;
4897
4898 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4899 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4900 goto out;
4901
4902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4903 ta_crypt_cmd_allocate_transient_object(c, &session,
4904 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4905 &sv_handle)))
4906 goto out;
4907
Pascal Brand2b92b642015-07-16 13:29:42 +02004908 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004909 param_count = 0;
4910
4911 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4912 ARRAY(derive_key_dh_public_value_2));
4913
4914 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4915 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
4916 param_count)))
4917 goto out;
4918
4919 out_size = sizeof(out);
4920 memset(out, 0, sizeof(out));
4921 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4922 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
4923 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4924 goto out;
4925
4926 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
4927 sizeof(derive_key_dh_shared_secret), out,
4928 out_size))
4929 goto out;
4930
4931 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4932 ta_crypt_cmd_free_operation(c, &session, op)))
4933 goto out;
4934
4935 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4936 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
4937 goto out;
4938out:
4939 Do_ADBG_EndSubCase(c, "Derive DH key success");
4940 TEEC_CloseSession(&session);
4941}
Jens Wiklander14f48872018-06-29 15:30:13 +02004942ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
4943 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02004944
4945static void xtest_tee_test_4009(ADBG_Case_t *c)
4946{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004947 TEEC_Session session = { };
4948 uint32_t ret_orig = 0;
4949 TEE_OperationHandle op = TEE_HANDLE_NULL;
4950 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4951 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4952 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02004953 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004954 uint8_t out[2048] = { };
4955 size_t out_size = 0;
4956 uint32_t size_bytes = 0;
4957 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05304958 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02004959
4960 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4961 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4962 &ret_orig)))
4963 return;
4964
4965 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
4966 pt = &derive_key_ecdh[i];
4967
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02004968 if (pt->level > level)
4969 continue;
4970
Pascal Brand2b92b642015-07-16 13:29:42 +02004971 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
4972 pt->algo);
4973 size_bytes = (pt->keysize + 7) / 8;
4974 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4975 ta_crypt_cmd_allocate_operation(c, &session, &op,
4976 pt->algo,
4977 TEE_MODE_DERIVE, pt->keysize)))
4978 goto out;
4979
4980 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4981 ta_crypt_cmd_allocate_transient_object(c, & session,
4982 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
4983 &key_handle)))
4984 goto out;
4985
4986 param_count = 0;
4987 xtest_add_attr_value(&param_count, params,
4988 TEE_ATTR_ECC_CURVE, pt->curve, 0);
4989 xtest_add_attr(&param_count, params,
4990 TEE_ATTR_ECC_PRIVATE_VALUE,
4991 pt->private, size_bytes);
4992 /*
Cedric Auger719047c2019-09-11 12:08:14 +02004993 * The public value is not used, but we should provide a valid
4994 * one to avoid rejection in case TEE_PopulateTransientObject()
4995 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02004996 */
4997 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004998 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4999 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005000 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005001 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5002 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005003
5004 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5005 ta_crypt_cmd_populate_transient_object(c,
5006 &session,
5007 key_handle, params, param_count)))
5008 goto out;
5009
5010 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5011 ta_crypt_cmd_set_operation_key(c, &session, op,
5012 key_handle)))
5013 goto out;
5014
5015 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5016 ta_crypt_cmd_free_transient_object(c, & session,
5017 key_handle)))
5018 goto out;
5019
5020 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5021 ta_crypt_cmd_allocate_transient_object(c, &session,
5022 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5023 &sv_handle)))
5024 goto out;
5025
5026 /* reuse but reset params and param-count */
5027 param_count = 0;
5028
5029 xtest_add_attr(&param_count, params,
5030 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5031 pt->public_x, size_bytes);
5032 xtest_add_attr(&param_count, params,
5033 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5034 pt->public_y, size_bytes);
5035
5036 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5037 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5038 params, param_count)))
5039 goto out;
5040
5041 out_size = sizeof(out);
5042 memset(out, 0, sizeof(out));
5043 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5044 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5045 sv_handle,
5046 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5047 goto out;
5048
5049 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5050 out, out_size))
5051 goto out;
5052
5053 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5054 ta_crypt_cmd_free_operation(c, &session, op)))
5055 goto out;
5056
5057 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5058 ta_crypt_cmd_free_transient_object(c, &session,
5059 sv_handle)))
5060 goto out;
5061
5062 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5063 pt->algo);
5064 }
5065
5066 goto noerror;
5067
5068out:
5069 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5070
5071noerror:
5072 TEEC_CloseSession(&session);
5073}
Jens Wiklander14f48872018-06-29 15:30:13 +02005074ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5075 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005076
5077static void xtest_tee_test_4010(ADBG_Case_t *c)
5078{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005079 TEEC_Session session = { };
5080 uint32_t ret_orig = 0;
5081 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005082 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5083 static const TEE_Attribute attr = {
5084 .attributeID = TEE_ATTR_SECRET_VALUE,
5085 .content.ref.buffer = (void *)large_key,
5086 .content.ref.length = sizeof(large_key),
5087 };
5088
5089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5090 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5091 &ret_orig)))
5092 return;
5093
5094 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5095 ta_crypt_cmd_allocate_transient_object(c, &session,
5096 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5097 goto out;
5098
5099 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5100 ta_crypt_cmd_populate_transient_object(c, &session, o,
5101 &attr, 1));
5102
5103out:
5104 TEEC_CloseSession(&session);
5105}
Jens Wiklander14f48872018-06-29 15:30:13 +02005106ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5107 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005108
5109static void xtest_tee_test_4011(ADBG_Case_t *c)
5110{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005111 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005112 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005113 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5114 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5115 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5116 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5117 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5118 uint32_t ret_orig = 0;
5119 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5120 uint8_t out[1024] = { };
5121 uint8_t tmp[1024] = { };
5122 size_t out_size = 0;
5123 size_t tmp_size = 0;
5124 size_t n = 0;
5125 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005126 size_t i = 0;
5127
5128 /* Setup session, initialize message to sign, create a keypair */
5129 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5130 &crypt_user_ta_uuid, NULL, &ret_orig)))
5131 return;
5132 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5133 &s, in, sizeof(in))))
5134 goto out;
5135 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5136 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5137 goto out;
5138 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5139 key, key_size, NULL, 0)))
5140 goto out;
5141
5142 /* Allocate operations for sign, verify, encrypt and decrypt */
5143 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5144 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5145 key_size)))
5146 goto out;
5147 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5148 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5149 key_size)))
5150 goto out;
5151 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5152 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5153 goto out;
5154 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5155 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5156 goto out;
5157
5158 /* Assign the keypair to all operations */
5159 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5160 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5161 goto out;
5162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5163 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5164 goto out;
5165 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5166 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5167 goto out;
5168 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5169 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5170 goto out;
5171
5172 /*
5173 * The core of the test case is inspired by the one in libtomcrypt:
5174 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5175 *
5176 * Testcase for Bleichenbacher attack
5177 *
5178 * (1) Create a valid signature
5179 * (2) Check that it can be verified
5180 * (3) Transform the package to fetch plain text (using the encrypt
5181 * operation in GP TEE Internal API)
5182 * (4) Forge the structure of PKCS#1-EMSA encoded data
5183 * (4.1) Search for start and end of the padding string
5184 * (4.2) Move the signature to the front of the padding string
5185 * (4.3) Zero the message until the end
5186 * (5) Transform the package back (using the decrypt operation in
5187 * GP TEE Internal API)
5188 * (6) The result should not be valid if the implementation is robust.
5189 */
5190
5191
5192 for (i = 0; i < 9; i++) {
5193 Do_ADBG_Log("Iteration %zu", i);
5194
5195 /* 1 */
5196 out_size = sizeof(out);
5197 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5198 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5199 in, sizeof(in), out, &out_size)))
5200 goto out;
5201
5202 /* 2 */
5203 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5204 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5205 in, sizeof(in), out, out_size)))
5206 goto out;
5207
5208 /* 3 */
5209 tmp_size = sizeof(tmp);
5210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5211 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5212 out, out_size, tmp, &tmp_size)))
5213 goto out;
5214
Etienne Carriere0953bf02018-12-21 15:36:25 +01005215 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5216 goto out;
5217
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005218 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005219 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005220 if (tmp[n] == 0xff)
5221 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005222
5223 /* Shall find at least a padding start before buffer end */
5224 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5225 goto out;
5226
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005227 for (m = n + 1; m < tmp_size; m++)
5228 if (tmp[m] != 0xff)
5229 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005230
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005231 /* 4.2 */
5232 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005233
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005234 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005235 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005236
5237 /* Prevent overrun when zeroing buffer end */
5238 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5239 goto out;
5240
Etienne Carriere0953bf02018-12-21 15:36:25 +01005241 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005242
5243 /* 5 */
5244 out_size = sizeof(out);
5245 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5246 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5247 tmp, tmp_size, out, &out_size)))
5248 goto out;
5249
5250 /* 6 */
5251 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5252 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5253 in, sizeof(in), out, out_size)))
5254 goto out;
5255 }
5256
5257out:
5258 TEEC_CloseSession(&s);
5259}
Jens Wiklander14f48872018-06-29 15:30:13 +02005260ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5261 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005262
5263#ifdef CFG_SYSTEM_PTA
5264static void xtest_tee_test_4012(ADBG_Case_t *c)
5265{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005266 TEEC_Session session = { };
5267 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005268 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5269 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005270 uint8_t pool_input[32] = { };
5271 time_t t = 0;
5272 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005273
5274 t = time(NULL);
5275 tm_local = *localtime(&t);
5276
5277 memcpy((void *)pool_input, (void *)&tm_local,
5278 sizeof(pool_input) < sizeof(tm_local) ?
5279 sizeof(pool_input) : sizeof(tm_local));
5280
5281
5282 op.params[0].tmpref.buffer = pool_input;
5283 op.params[0].tmpref.size = sizeof(pool_input);
5284 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5285 TEEC_NONE,
5286 TEEC_NONE,
5287 TEEC_NONE);
5288 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5289 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5290 &ret_orig)))
5291 return;
5292
5293 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5294 TEEC_InvokeCommand(&session,
5295 TA_CRYPT_CMD_SEED_RNG_POOL,
5296 &op,
5297 &ret_orig));
5298 TEEC_CloseSession(&session);
5299}
Jens Wiklander14f48872018-06-29 15:30:13 +02005300ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5301 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005302
5303static void xtest_tee_test_4013(ADBG_Case_t *c)
5304{
5305 TEEC_Session session = { };
5306 uint32_t ret_orig = 0;
5307 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5308 uint8_t key[32] = { };
5309 uint8_t extra_data[32] = { };
5310
5311 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5312 TEEC_NONE,
5313 TEEC_NONE,
5314 TEEC_NONE);
5315 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5316 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5317 NULL, &ret_orig)))
5318 return;
5319
5320 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5321 TEEC_InvokeCommand(&session,
5322 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5323 &op,
5324 &ret_orig));
5325
5326 /* Negative test using non-secure memory */
5327 memset(&op, 0, sizeof(op));
5328 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5329 TEEC_MEMREF_TEMP_OUTPUT,
5330 TEEC_NONE,
5331 TEEC_NONE);
5332
5333 op.params[0].tmpref.buffer = extra_data;
5334 op.params[0].tmpref.size = sizeof(extra_data);
5335 op.params[1].tmpref.buffer = key;
5336 op.params[1].tmpref.size = sizeof(key);
5337 (void)ADBG_EXPECT_TEEC_RESULT(c,
5338 TEEC_ERROR_SECURITY,
5339 TEEC_InvokeCommand(&session,
5340 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5341 &op,
5342 &ret_orig));
5343
5344 TEEC_CloseSession(&session);
5345}
5346ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5347 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005348
5349static void xtest_tee_test_4014(ADBG_Case_t *c)
5350{
5351 TEEC_Session session = { };
5352 uint32_t ret_orig = 0;
5353 TEE_OperationHandle op = TEE_HANDLE_NULL;
5354 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5355 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5356 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5357 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5358 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5359 TEE_Attribute params[9] = { };
5360 size_t param_count = 0;
5361 uint8_t out[128] = { };
5362 size_t out_size = 0;
5363 uint8_t conf_A[32] = { };
5364 uint8_t conf_B[32] = { };
5365
5366 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5367 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5368 &ret_orig)))
5369 return;
5370
5371 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5372 TEE_ECC_CURVE_SM2)) {
5373 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5374 goto out;
5375 }
5376
5377 Do_ADBG_BeginSubCase(c, "Initiator side");
5378
5379 /*
5380 * Key exchange protocol running on user A's side. A is initiator.
5381 */
5382
5383 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5384 ta_crypt_cmd_allocate_operation(c, &session, &op,
5385 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5386 goto out;
5387
5388 /* Allocate and initialize keypair of user A */
5389
5390 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5391 ta_crypt_cmd_allocate_transient_object(c, &session,
5392 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5393 goto out;
5394
5395 param_count = 0;
5396
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005397 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5398 ARRAY(gmt_003_part5_b2_public_xA));
5399
5400 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5401 ARRAY(gmt_003_part5_b2_public_yA));
5402
5403 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5404 ARRAY(gmt_003_part5_b2_private_A));
5405
5406 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5407 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5408 params, param_count)))
5409 goto out;
5410
5411 /*
5412 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5413 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5414 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5415 * user B.
5416 */
5417
5418 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5419 ta_crypt_cmd_allocate_transient_object(c, &session,
5420 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5421 goto out;
5422
5423 param_count = 0;
5424
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005425 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5426 ARRAY(gmt_003_part5_b2_eph_public_xA));
5427
5428 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5429 ARRAY(gmt_003_part5_b2_eph_public_yA));
5430
5431 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5432 ARRAY(gmt_003_part5_b2_eph_private_A));
5433
5434 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5435 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5436 params, param_count)))
5437 goto out;
5438
5439 /* Associate user A keys with operation */
5440
5441 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5442 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5443 eph_keyA)))
5444 goto out;
5445
5446 /* Keys have been set, free key objects */
5447
5448 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5449 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5450 goto out;
5451
5452 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5453 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5454 goto out;
5455
5456 /* Allocate output object */
5457
5458 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5459 ta_crypt_cmd_allocate_transient_object(c, &session,
5460 TEE_TYPE_GENERIC_SECRET,
5461 sizeof(gmt_003_part5_b2_shared_secret),
5462 &sv_handle)))
5463 goto out;
5464
5465 /* Set key derivation parameters: user A role, user B information */
5466
5467 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5468 params[0].content.value.a = 0; /* Initiator role */
5469 params[0].content.value.b = 0; /* Not used */
5470 param_count = 1;
5471
5472 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5473 ARRAY(gmt_003_part5_b2_public_xB));
5474
5475 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5476 ARRAY(gmt_003_part5_b2_public_yB));
5477
5478 xtest_add_attr(&param_count, params,
5479 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5480 ARRAY(gmt_003_part5_b2_eph_public_xB));
5481
5482 xtest_add_attr(&param_count, params,
5483 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5484 ARRAY(gmt_003_part5_b2_eph_public_yB));
5485
5486 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5487 ARRAY(gmt_003_part5_b2_id_A));
5488
5489 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5490 ARRAY(gmt_003_part5_b2_id_B));
5491
5492 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5493 ARRAY(gmt_003_part5_b2_conf_B));
5494
5495 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5496 ARRAY(conf_A));
5497
5498 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5499 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5500 param_count)))
5501 goto out;
5502
5503 out_size = sizeof(out);
5504 memset(out, 0, sizeof(out));
5505 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5506 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5507 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5508 goto out;
5509
5510 /* Check derived key */
5511 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5512 sizeof(gmt_003_part5_b2_shared_secret), out,
5513 out_size))
5514 goto out;
5515
5516 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5517 ta_crypt_cmd_free_operation(c, &session, op)))
5518 goto out;
5519
5520 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5521 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5522 goto out;
5523
5524 Do_ADBG_EndSubCase(c, "Initiator side");
5525
5526 Do_ADBG_BeginSubCase(c, "Responder side");
5527
5528 /*
5529 * Key derivation on user B's side
5530 */
5531
5532 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5533 ta_crypt_cmd_allocate_operation(c, &session, &op,
5534 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5535 goto out;
5536
5537 /* Allocate and initialize keypair of user B */
5538
5539 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5540 ta_crypt_cmd_allocate_transient_object(c, &session,
5541 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5542 goto out;
5543
5544 param_count = 0;
5545
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005546 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5547 ARRAY(gmt_003_part5_b2_public_xB));
5548
5549 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5550 ARRAY(gmt_003_part5_b2_public_yB));
5551
5552 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5553 ARRAY(gmt_003_part5_b2_private_B));
5554
5555 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5556 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5557 params, param_count)))
5558 goto out;
5559
5560 /* Allocate and set ephemeral key of user B */
5561
5562 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5563 ta_crypt_cmd_allocate_transient_object(c, &session,
5564 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5565 goto out;
5566
5567 param_count = 0;
5568
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005569 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5570 ARRAY(gmt_003_part5_b2_eph_public_xB));
5571
5572 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5573 ARRAY(gmt_003_part5_b2_eph_public_yB));
5574
5575 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5576 ARRAY(gmt_003_part5_b2_eph_private_B));
5577
5578 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5579 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5580 params, param_count)))
5581 goto out;
5582
5583 /* Associate user B keys with operation */
5584
5585 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5586 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5587 eph_keyB)))
5588 goto out;
5589
5590 /* Keys have been set, free key objects */
5591
5592 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5593 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5594 goto out;
5595
5596 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5597 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5598 goto out;
5599
5600 /* Allocate output object */
5601
5602 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5603 ta_crypt_cmd_allocate_transient_object(c, &session,
5604 TEE_TYPE_GENERIC_SECRET,
5605 sizeof(gmt_003_part5_b2_shared_secret),
5606 &sv_handle)))
5607 goto out;
5608
5609 /* Set key derivation parameters: user B role, user A information */
5610
5611 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5612 params[0].content.value.a = 1; /* Responder role */
5613 params[0].content.value.b = 0; /* Not used */
5614 param_count = 1;
5615
5616 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5617 ARRAY(gmt_003_part5_b2_public_xA));
5618
5619 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5620 ARRAY(gmt_003_part5_b2_public_yA));
5621
5622 xtest_add_attr(&param_count, params,
5623 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5624 ARRAY(gmt_003_part5_b2_eph_public_xA));
5625
5626 xtest_add_attr(&param_count, params,
5627 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5628 ARRAY(gmt_003_part5_b2_eph_public_yA));
5629
5630 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5631 ARRAY(gmt_003_part5_b2_id_A));
5632
5633 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5634 ARRAY(gmt_003_part5_b2_id_B));
5635
5636 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5637 ARRAY(gmt_003_part5_b2_conf_A));
5638
5639 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5640 ARRAY(conf_B));
5641
5642 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5643 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5644 param_count)))
5645 goto out;
5646
5647 out_size = sizeof(out);
5648 memset(out, 0, sizeof(out));
5649 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5650 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5651 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5652 goto out;
5653
5654 /* Check derived key */
5655 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5656 sizeof(gmt_003_part5_b2_shared_secret), out,
5657 out_size))
5658 goto out;
5659
5660 Do_ADBG_EndSubCase(c, "Responder side");
5661
5662out:
5663 TEEC_CloseSession(&session);
5664}
5665ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5666 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005667
5668static void xtest_tee_test_4015(ADBG_Case_t *c)
5669{
5670 TEEC_Session session = { };
5671 uint32_t ret_orig = 0;
5672 TEE_OperationHandle op = TEE_HANDLE_NULL;
5673 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5674 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5675 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5676 TEE_Attribute params[2] = { };
5677 size_t param_count = 0;
5678 uint8_t out[32] = { };
5679 size_t out_size = 0;
5680 char case_str[40] = "Alice side computes shared secret";
5681
5682 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5683 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5684 &ret_orig)))
5685 return;
5686
5687 Do_ADBG_BeginSubCase(c, "%s", case_str);
5688
5689 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5690 TEE_ECC_CURVE_25519)) {
5691 Do_ADBG_Log("X25519 not supported: skip subcase");
5692 goto out;
5693 }
5694
5695 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5696 ta_crypt_cmd_allocate_operation(c, &session, &op,
5697 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5698 goto out;
5699
5700 /* Allocate and initialize keypair of Alice */
5701 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5702 ta_crypt_cmd_allocate_transient_object(c, &session,
5703 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5704 goto out;
5705
5706 param_count = 0;
5707
5708 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5709 ARRAY(x25519_alice_public));
5710
5711 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5712 ARRAY(x25519_alice_private));
5713
5714 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5715 ta_crypt_cmd_populate_transient_object(c, &session,
5716 key_alice, params, param_count)))
5717 goto out;
5718
5719 /* Associate Alices's keys with operation */
5720 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5721 ta_crypt_cmd_set_operation_key(c, &session, op,
5722 key_alice)))
5723 goto out;
5724
5725 /* Keys have been set, free key objects */
5726 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5727 ta_crypt_cmd_free_transient_object(c, &session,
5728 key_alice)))
5729 goto out;
5730
5731 /* Allocate shared secret output object */
5732 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5733 ta_crypt_cmd_allocate_transient_object(c, &session,
5734 TEE_TYPE_GENERIC_SECRET,
5735 sizeof(x25519_shared_secret), &sv_handle)))
5736 goto out;
5737
5738 /* Reset params */
5739 param_count = 0;
5740
5741 /* Set Bob's public key for Alice side */
5742 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5743 ARRAY(x25519_bob_public));
5744
5745 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5746 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5747 params, param_count)))
5748 goto out;
5749
5750 out_size = sizeof(out);
5751 memset(out, 0, sizeof(out));
5752 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5753 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5754 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5755 &out_size)))
5756 goto out;
5757
5758 /* Check derived key */
5759 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5760 sizeof(x25519_shared_secret), out,
5761 out_size))
5762 goto out;
5763
5764 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5765 ta_crypt_cmd_free_operation(c, &session, op)))
5766 goto out;
5767
5768 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5769 ta_crypt_cmd_free_transient_object(c, &session,
5770 sv_handle)))
5771 goto out;
5772
5773 Do_ADBG_EndSubCase(c, "%s", case_str);
5774
5775 strncpy(case_str, "Bob side computes shared secret",
5776 sizeof(case_str) - 1);
5777
5778 Do_ADBG_BeginSubCase(c, "%s", case_str);
5779
5780 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5781 ta_crypt_cmd_allocate_operation(c, &session, &op,
5782 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5783 goto out;
5784
5785 /* Allocate and initialize keypair of Bob */
5786 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5787 ta_crypt_cmd_allocate_transient_object(c, &session,
5788 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5789 goto out;
5790
5791 /* Reset params */
5792 param_count = 0;
5793
5794 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5795 ARRAY(x25519_bob_public));
5796
5797 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5798 ARRAY(x25519_bob_private));
5799
5800 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5801 ta_crypt_cmd_populate_transient_object(c, &session,
5802 key_bob, params, param_count)))
5803 goto out;
5804
5805 /* Associate Bob's keys with operation */
5806 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5807 ta_crypt_cmd_set_operation_key(c, &session, op,
5808 key_bob)))
5809 goto out;
5810
5811 /* Keys have been set, free key objects */
5812 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5813 ta_crypt_cmd_free_transient_object(c, &session,
5814 key_bob)))
5815 goto out;
5816
5817 /* Allocate shared secret output object */
5818 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5819 ta_crypt_cmd_allocate_transient_object(c, &session,
5820 TEE_TYPE_GENERIC_SECRET,
5821 sizeof(x25519_shared_secret), &sv_handle)))
5822 goto out;
5823
5824 /* Reset params */
5825 param_count = 0;
5826
5827 /* Set Alice's public key for Bob side */
5828 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5829 ARRAY(x25519_alice_public));
5830
5831 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5832 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5833 params, param_count)))
5834 goto out;
5835
5836 out_size = sizeof(out);
5837 memset(out, 0, sizeof(out));
5838 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5839 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5840 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5841 &out_size)))
5842 goto out;
5843
5844 /* Check derived key */
5845 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5846 sizeof(x25519_shared_secret), out,
5847 out_size))
5848 goto out;
5849
5850 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5851 ta_crypt_cmd_free_operation(c, &session, op)))
5852 goto out;
5853
5854 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5855 ta_crypt_cmd_free_transient_object(c, &session,
5856 sv_handle)))
5857 goto out;
5858
5859out:
5860 Do_ADBG_EndSubCase(c, "%s", case_str);
5861 TEEC_CloseSession(&session);
5862}
5863ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
5864 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00005865
5866static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
5867{
5868 TEEC_Session session = { };
5869 TEE_OperationHandle op = TEE_HANDLE_NULL;
5870 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5871 TEE_Attribute key_attrs[2] = { };
5872 size_t num_key_attrs = 0;
5873 TEE_Attribute attrs[2] = { };
5874 size_t num_attrs = 0;
5875 uint8_t out[64] = { };
5876 size_t out_size = sizeof(out);
5877 size_t n = 0;
5878 uint32_t ret_orig = 0;
5879 size_t max_key_size = 0;
5880
5881 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5882 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5883 NULL, &ret_orig)))
5884 return;
5885
5886 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5887 TEE_ECC_CURVE_25519)) {
5888 Do_ADBG_Log("ED25519 not supported: skip subcase");
5889 goto out;
5890 }
5891
5892 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
5893 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
5894
5895 if (tv->algo != TEE_ALG_ED25519)
5896 continue;
5897
5898 num_attrs = 0;
5899 num_key_attrs = 0;
5900 max_key_size = tv->params.eddsa.private_len * 8;
5901
5902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5903 ta_crypt_cmd_allocate_operation(c, &session, &op,
5904 TEE_ALG_ED25519, tv->mode, max_key_size)))
5905 goto out;
5906
5907 xtest_add_attr(&num_key_attrs, key_attrs,
5908 TEE_ATTR_ED25519_PUBLIC_VALUE,
5909 tv->params.eddsa.public,
5910 tv->params.eddsa.public_len);
5911
5912 if (tv->params.eddsa.flag == 1)
5913 xtest_add_attr(&num_attrs, attrs,
5914 TEE_ATTR_EDDSA_PREHASH, NULL, 0);
5915
5916 if (tv->params.eddsa.context_len > 0)
5917 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
5918 tv->params.eddsa.context,
5919 tv->params.eddsa.context_len);
5920
5921 switch (tv->mode) {
5922 case TEE_MODE_SIGN:
5923 xtest_add_attr(&num_key_attrs, key_attrs,
5924 TEE_ATTR_ED25519_PRIVATE_VALUE,
5925 tv->params.eddsa.private,
5926 tv->params.eddsa.private_len);
5927
5928 if (!ADBG_EXPECT_TRUE(c,
5929 create_key(c, &session, max_key_size,
5930 TEE_TYPE_ED25519_KEYPAIR,
5931 key_attrs, num_key_attrs,
5932 &key_handle)))
5933 goto out;
5934
5935 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5936 ta_crypt_cmd_set_operation_key(c,
5937 &session, op, key_handle)))
5938 goto out;
5939
5940 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5941 ta_crypt_cmd_asymmetric_sign(c,
5942 &session, op,
5943 attrs, num_attrs, tv->ptx,
5944 tv->ptx_len, out, &out_size)))
5945 goto out;
5946
5947 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
5948
5949 break;
5950
5951 case TEE_MODE_VERIFY:
5952 if (!ADBG_EXPECT_TRUE(c,
5953 create_key(c, &session, max_key_size,
5954 TEE_TYPE_ED25519_PUBLIC_KEY,
5955 key_attrs, num_key_attrs,
5956 &key_handle)))
5957 goto out;
5958
5959 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5960 ta_crypt_cmd_set_operation_key(c,
5961 &session, op, key_handle)))
5962 goto out;
5963
5964 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5965 ta_crypt_cmd_asymmetric_verify(c, &session, op,
5966 attrs, num_attrs,
5967 tv->ptx,
5968 tv->ptx_len,
5969 tv->ctx,
5970 tv->ctx_len)))
5971 goto out;
5972 break;
5973
5974 default:
5975 break;
5976 }
5977
5978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5979 ta_crypt_cmd_free_operation(c, &session, op)))
5980 goto out;
5981 }
5982out:
5983 TEEC_CloseSession(&session);
5984}
5985ADBG_CASE_DEFINE(regression, 4016_ed25519, xtest_tee_test_4016_ed25519,
5986 "Test TEE Internal API ED25519 sign/verify");
5987
Jens Wiklander14f48872018-06-29 15:30:13 +02005988#endif /*CFG_SYSTEM_PTA*/