blob: c38123ef3b9a298b6d7014cff6d2002085c5766c [file] [log] [blame]
Etienne Carriere9b7b70d2020-05-16 10:27:23 +02001// SPDX-License-Identifier: GPL-2.0
Pascal Brandc639ac82015-07-02 08:53:34 +02002/*
3 * Copyright (c) 2014, STMicroelectronics International N.V.
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01004 * Copyright (c) 2021, SumUp Services GmbH
Pascal Brandc639ac82015-07-02 08:53:34 +02005 */
6
7#include <stdio.h>
8#include <string.h>
9#include <inttypes.h>
10#include <malloc.h>
Igor Opaniuk7ddaa782018-05-25 15:14:05 +030011#include <time.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020012
13#include "xtest_test.h"
14#include "xtest_helpers.h"
15
16#include <tee_api_types.h>
Gabor Szekely2ad190f2018-09-14 14:05:06 +000017#include <tee_api_defines_extensions.h>
Jens Wiklandercbd8fd12022-11-26 20:38:47 +010018#include <tee_api_compat.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020019#include <ta_crypt.h>
20#include <utee_defines.h>
21#include <util.h>
22
Jerome Forissier213ca8a2017-03-31 11:27:56 +020023#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020024#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020025
26#include <assert.h>
27
Pascal Brandc639ac82015-07-02 08:53:34 +020028static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
29 TEE_OperationHandle oph)
30{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010031 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020032 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010033 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020034
35 assert((uintptr_t)oph <= UINT32_MAX);
36 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
37 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
38 TEEC_NONE);
39 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
40 &ret_orig);
41 if (res != TEEC_SUCCESS) {
42 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
43 ret_orig);
44 }
45 return res;
46}
47
48static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
49 TEEC_Session *s,
50 TEE_OperationHandle dst_oph,
51 TEE_OperationHandle src_oph)
52{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010053 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020054 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010055 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020056
57 assert((uintptr_t)dst_oph <= UINT32_MAX);
58 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
59
60 assert((uintptr_t)src_oph <= UINT32_MAX);
61 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
62 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
63 TEEC_NONE);
64
65 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
66 &ret_orig);
67
68 if (res != TEEC_SUCCESS) {
69 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
70 ret_orig);
71 }
72 return res;
73}
74
75static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
76 TEE_OperationHandle oph,
77 const void *chunk,
78 size_t chunk_size)
79{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010080 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020081 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010082 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020083
84 assert((uintptr_t)oph <= UINT32_MAX);
85 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
86 op.params[1].tmpref.buffer = (void *)chunk;
87 op.params[1].tmpref.size = chunk_size;
88
89 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
90 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
91 TEEC_NONE);
92
93 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
94
95 if (res != TEEC_SUCCESS) {
96 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
97 ret_orig);
98 }
99
100 return res;
101}
102
103static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
104 TEE_OperationHandle oph,
105 const void *chunk,
106 size_t chunk_len, void *hash,
107 size_t *hash_len)
108{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100109 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200110 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100111 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200112
113 assert((uintptr_t)oph <= UINT32_MAX);
114 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
115
116 op.params[1].tmpref.buffer = (void *)chunk;
117 op.params[1].tmpref.size = chunk_len;
118
119 op.params[2].tmpref.buffer = (void *)hash;
120 op.params[2].tmpref.size = *hash_len;
121
122 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
123 TEEC_MEMREF_TEMP_INPUT,
124 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
125
126 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
127 &ret_orig);
128
129 if (res != TEEC_SUCCESS) {
130 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
131 ret_orig);
132 }
133
134 if (res == TEEC_SUCCESS)
135 *hash_len = op.params[2].tmpref.size;
136
137 return res;
138}
139
140static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
141 TEEC_Session *s,
142 TEE_OperationHandle oph,
143 TEE_ObjectHandle key1,
144 TEE_ObjectHandle key2)
145{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100146 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200147 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100148 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200149
150 assert((uintptr_t)oph <= UINT32_MAX);
151 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
152
153 assert((uintptr_t)key1 <= UINT32_MAX);
154 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
155
156 assert((uintptr_t)key2 <= UINT32_MAX);
157 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
158 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
159 TEEC_NONE, TEEC_NONE);
160
161 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
162 &ret_orig);
163
164 if (res != TEEC_SUCCESS) {
165 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
166 ret_orig);
167 }
168
169 return res;
170}
171
172static TEEC_Result ta_crypt_cmd_mac_init(ADBG_Case_t *c, TEEC_Session *s,
173 TEE_OperationHandle oph,
174 const void *iv, size_t iv_len)
175{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100176 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200177 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100178 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200179
180 assert((uintptr_t)oph <= UINT32_MAX);
181 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
182
183 if (iv != NULL) {
184 op.params[1].tmpref.buffer = (void *)iv;
185 op.params[1].tmpref.size = iv_len;
186 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
187 TEEC_MEMREF_TEMP_INPUT,
188 TEEC_NONE, TEEC_NONE);
189 } else {
190 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
191 TEEC_NONE, TEEC_NONE);
192 }
193
194 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &ret_orig);
195
196 if (res != TEEC_SUCCESS) {
197 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
198 ret_orig);
199 }
200
201 return res;
202}
203
204static TEEC_Result ta_crypt_cmd_mac_update(ADBG_Case_t *c, TEEC_Session *s,
205 TEE_OperationHandle oph,
206 const void *chunk, size_t chunk_size)
207{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100208 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200209 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100210 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200211
212 assert((uintptr_t)oph <= UINT32_MAX);
213 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
214
215 op.params[1].tmpref.buffer = (void *)chunk;
216 op.params[1].tmpref.size = chunk_size;
217
218 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
219 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
220 TEEC_NONE);
221
222 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
223
224 if (res != TEEC_SUCCESS) {
225 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
226 ret_orig);
227 }
228
229 return res;
230}
231
232static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
233 TEEC_Session *s,
234 TEE_OperationHandle oph,
235 const void *chunk,
236 size_t chunk_len,
237 void *hash,
238 size_t *hash_len)
239{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100240 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200241 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100242 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200243
244 assert((uintptr_t)oph <= UINT32_MAX);
245 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
246
247 op.params[1].tmpref.buffer = (void *)chunk;
248 op.params[1].tmpref.size = chunk_len;
249
250 op.params[2].tmpref.buffer = (void *)hash;
251 op.params[2].tmpref.size = *hash_len;
252
253 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
254 TEEC_MEMREF_TEMP_INPUT,
255 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
256
257 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
258 &ret_orig);
259
260 if (res != TEEC_SUCCESS) {
261 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
262 ret_orig);
263 }
264
265 if (res == TEEC_SUCCESS)
266 *hash_len = op.params[2].tmpref.size;
267
268 return res;
269}
270
Jerome Forissier4f419512021-07-07 14:56:10 +0200271static TEEC_Result ta_crypt_cmd_mac_final_compare(ADBG_Case_t *c,
272 TEEC_Session *s,
273 TEE_OperationHandle oph,
274 const void *chunk,
275 size_t chunk_len,
276 const uint8_t *hash,
277 size_t hash_len)
278{
279 TEEC_Result res = TEEC_ERROR_GENERIC;
280 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
281 uint32_t ret_orig = 0;
282
283 assert((uintptr_t)oph <= UINT32_MAX);
284 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
285
286 op.params[1].tmpref.buffer = (void *)chunk;
287 op.params[1].tmpref.size = chunk_len;
288
289 op.params[2].tmpref.buffer = (void *)hash;
290 op.params[2].tmpref.size = hash_len;
291
292 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
293 TEEC_MEMREF_TEMP_INPUT,
294 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE);
295
296 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPARE, &op,
297 &ret_orig);
298
299 if (res != TEEC_SUCCESS) {
300 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
301 ret_orig);
302 }
303
304 return res;
305}
306
Pascal Brandc639ac82015-07-02 08:53:34 +0200307static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
308 TEE_OperationHandle oph,
309 const void *iv, size_t iv_len)
310{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100311 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200312 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100313 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200314
315 assert((uintptr_t)oph <= UINT32_MAX);
316 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
317
318 if (iv != NULL) {
319 op.params[1].tmpref.buffer = (void *)iv;
320 op.params[1].tmpref.size = iv_len;
321
322 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
323 TEEC_MEMREF_TEMP_INPUT,
324 TEEC_NONE, TEEC_NONE);
325 } else {
326 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
327 TEEC_NONE, TEEC_NONE);
328 }
329
330 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &op, &ret_orig);
331
332 if (res != TEEC_SUCCESS) {
333 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
334 ret_orig);
335 }
336
337 return res;
338}
339
340static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
341 TEE_OperationHandle oph,
342 const void *src, size_t src_len,
343 void *dst, size_t *dst_len)
344{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100345 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200346 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100347 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200348
349 assert((uintptr_t)oph <= UINT32_MAX);
350 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
351
352 op.params[1].tmpref.buffer = (void *)src;
353 op.params[1].tmpref.size = src_len;
354
355 op.params[2].tmpref.buffer = dst;
356 op.params[2].tmpref.size = *dst_len;
357
358 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
359 TEEC_MEMREF_TEMP_INPUT,
360 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
361
362 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &op, &ret_orig);
363
364 if (res != TEEC_SUCCESS) {
365 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
366 ret_orig);
367 }
368
369 if (res == TEEC_SUCCESS)
370 *dst_len = op.params[2].tmpref.size;
371
372 return res;
373}
374
375static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
376 TEEC_Session *s,
377 TEE_OperationHandle oph,
378 const void *src,
379 size_t src_len,
380 void *dst,
381 size_t *dst_len)
382{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100383 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200384 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100385 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200386
387 assert((uintptr_t)oph <= UINT32_MAX);
388 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
389
390 op.params[1].tmpref.buffer = (void *)src;
391 op.params[1].tmpref.size = src_len;
392
393 op.params[2].tmpref.buffer = (void *)dst;
394 op.params[2].tmpref.size = *dst_len;
395
396 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
397 TEEC_MEMREF_TEMP_INPUT,
398 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
399
400 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
401 &ret_orig);
402
403 if (res != TEEC_SUCCESS) {
404 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
405 ret_orig);
406 }
407
408 if (res == TEEC_SUCCESS)
409 *dst_len = op.params[2].tmpref.size;
410
411 return res;
412}
413
414static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
415 TEEC_Session *s,
416 void *buf,
417 size_t blen)
418{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100419 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200420 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100421 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200422
423 op.params[0].tmpref.buffer = buf;
424 op.params[0].tmpref.size = blen;
425
426 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
427 TEEC_NONE, TEEC_NONE);
428
Joakim Bech81f97e32020-05-27 12:14:23 +0200429 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200430 &ret_orig);
431
432 if (res != TEEC_SUCCESS) {
433 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
434 ret_orig);
435 }
436
437 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
438 op.params[0].tmpref.size);
439 return res;
440}
441
442static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
443 TEE_OperationHandle oph,
444 const void *nonce, size_t nonce_len,
445 size_t tag_len, size_t aad_len,
446 size_t payload_len)
447{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100448 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200449 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100450 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200451
452 assert((uintptr_t)oph <= UINT32_MAX);
453 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
454 op.params[0].value.b = tag_len;
455
456 op.params[1].tmpref.buffer = (void *)nonce;
457 op.params[1].tmpref.size = nonce_len;
458
459 op.params[2].value.a = aad_len;
460 op.params[2].value.b = payload_len;
461
462 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
463 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200464 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200465
466 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
467
468 if (res != TEEC_SUCCESS) {
469 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
470 ret_orig);
471 }
472 return res;
473}
474
475static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
476 TEE_OperationHandle oph,
477 const void *aad, size_t aad_len)
478{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100479 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200480 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100481 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200482
483 assert((uintptr_t)oph <= UINT32_MAX);
484 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
485
486 op.params[1].tmpref.buffer = (void *)aad;
487 op.params[1].tmpref.size = aad_len;
488
489 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
490 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
491 TEEC_NONE);
492
493 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
494
495 if (res != TEEC_SUCCESS) {
496 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
497 ret_orig);
498 }
499
500 return res;
501}
502
503static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
504 TEEC_Session *s,
505 TEE_OperationHandle oph,
506 const void *src,
507 size_t src_len,
508 void *dst,
509 size_t *dst_len)
510{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100511 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200512 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100513 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200514
515 assert((uintptr_t)oph <= UINT32_MAX);
516 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
517
518 op.params[1].tmpref.buffer = (void *)src;
519 op.params[1].tmpref.size = src_len;
520
521 op.params[2].tmpref.buffer = (void *)dst;
522 op.params[2].tmpref.size = *dst_len;
523
524 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
525 TEEC_MEMREF_TEMP_INPUT,
526 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
527
528 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
529
530 if (res != TEEC_SUCCESS) {
531 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
532 ret_orig);
533 }
534
535 if (res == TEEC_SUCCESS)
536 *dst_len = op.params[2].tmpref.size;
537
538 return res;
539}
540
541static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
542 TEEC_Session *s,
543 TEE_OperationHandle oph,
544 const void *src,
545 size_t src_len, void *dst,
546 size_t *dst_len, void *tag,
547 size_t *tag_len)
548{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100549 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200550 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100551 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200552
553 assert((uintptr_t)oph <= UINT32_MAX);
554 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
555
556 op.params[1].tmpref.buffer = (void *)src;
557 op.params[1].tmpref.size = src_len;
558
559 op.params[2].tmpref.buffer = (void *)dst;
560 op.params[2].tmpref.size = *dst_len;
561
562 op.params[3].tmpref.buffer = (void *)tag;
563 op.params[3].tmpref.size = *tag_len;
564
565 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
566 TEEC_MEMREF_TEMP_INPUT,
567 TEEC_MEMREF_TEMP_OUTPUT,
568 TEEC_MEMREF_TEMP_OUTPUT);
569
570 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
571 &ret_orig);
572
573 if (res != TEEC_SUCCESS) {
574 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
575 ret_orig);
576 }
577
578 if (res == TEEC_SUCCESS) {
579 *dst_len = op.params[2].tmpref.size;
580 *tag_len = op.params[3].tmpref.size;
581 }
582
583 return res;
584}
585
586static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
587 TEEC_Session *s,
588 TEE_OperationHandle oph,
589 const void *src, size_t src_len,
590 void *dst, size_t *dst_len,
591 const void *tag, size_t tag_len)
592{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100593 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200594 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100595 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200596
597 assert((uintptr_t)oph <= UINT32_MAX);
598 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
599
600 op.params[1].tmpref.buffer = (void *)src;
601 op.params[1].tmpref.size = src_len;
602
603 op.params[2].tmpref.buffer = dst;
604 op.params[2].tmpref.size = *dst_len;
605
606 op.params[3].tmpref.buffer = (void *)tag;
607 op.params[3].tmpref.size = tag_len;
608
609 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
610 TEEC_MEMREF_TEMP_INPUT,
611 TEEC_MEMREF_TEMP_OUTPUT,
612 TEEC_MEMREF_TEMP_INPUT);
613
614 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
615 &ret_orig);
616
617 if (res != TEEC_SUCCESS) {
618 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
619 ret_orig);
620 }
621
622 if (res == TEEC_SUCCESS)
623 *dst_len = op.params[2].tmpref.size;
624
625 return res;
626}
627
628static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
629 TEEC_Session *s,
630 TEE_OperationHandle oph,
631 uint32_t cmd,
632 const TEE_Attribute *params,
633 uint32_t paramCount,
634 const void *src,
635 size_t src_len,
636 void *dst,
637 size_t *dst_len)
638{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100639 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200640 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100641 uint32_t ret_orig = 0;
642 uint8_t *buf = NULL;
643 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200644
645 res = pack_attrs(params, paramCount, &buf, &blen);
646 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
647 return res;
648
649 assert((uintptr_t)oph <= UINT32_MAX);
650 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
651
652 op.params[1].tmpref.buffer = buf;
653 op.params[1].tmpref.size = blen;
654
655 op.params[2].tmpref.buffer = (void *)src;
656 op.params[2].tmpref.size = src_len;
657
658 op.params[3].tmpref.buffer = dst;
659 op.params[3].tmpref.size = *dst_len;
660
661 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
662 TEEC_MEMREF_TEMP_INPUT,
663 TEEC_MEMREF_TEMP_INPUT,
664 TEEC_MEMREF_TEMP_OUTPUT);
665
666 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
667
668 if (res != TEEC_SUCCESS) {
669 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
670 ret_orig);
671 }
672
673 if (res == TEEC_SUCCESS)
674 *dst_len = op.params[3].tmpref.size;
675
676 free(buf);
677 return res;
678}
679
680static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
681 TEEC_Session *s,
682 TEE_OperationHandle oph,
683 const TEE_Attribute *params,
684 uint32_t paramCount,
685 const void *src,
686 size_t src_len,
687 void *dst,
688 size_t *dst_len)
689{
690 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
691 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
692 params, paramCount,
693 src, src_len, dst, dst_len);
694}
695
696static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
697 TEEC_Session *s,
698 TEE_OperationHandle oph,
699 const TEE_Attribute *params,
700 uint32_t paramCount,
701 const void *src,
702 size_t src_len,
703 void *dst,
704 size_t *dst_len)
705{
706 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
707 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
708 params, paramCount,
709 src, src_len, dst, dst_len);
710}
711
712static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
713 TEEC_Session *s,
714 TEE_OperationHandle oph,
715 const TEE_Attribute *params,
716 uint32_t paramCount,
717 const void *digest,
718 size_t digest_len,
719 void *signature,
720 size_t *signature_len)
721{
722 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
723 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
724 digest, digest_len, signature, signature_len);
725}
726
727static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
728 TEEC_Session *s,
729 TEE_OperationHandle oph,
730 const TEE_Attribute *params,
731 uint32_t paramCount,
732 const void *digest,
733 size_t digest_len,
734 const void *signature,
735 size_t signature_len)
736{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100737 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200738 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100739 uint32_t ret_orig = 0;
740 uint8_t *buf = NULL;
741 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200742
743 res = pack_attrs(params, paramCount, &buf, &blen);
744 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
745 return res;
746
747 assert((uintptr_t)oph <= UINT32_MAX);
748 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
749
750 op.params[1].tmpref.buffer = buf;
751 op.params[1].tmpref.size = blen;
752
753 op.params[2].tmpref.buffer = (void *)digest;
754 op.params[2].tmpref.size = digest_len;
755
756 op.params[3].tmpref.buffer = (void *)signature;
757 op.params[3].tmpref.size = signature_len;
758
759 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
760 TEEC_MEMREF_TEMP_INPUT,
761 TEEC_MEMREF_TEMP_INPUT,
762 TEEC_MEMREF_TEMP_INPUT);
763
764 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
765 &op, &ret_orig);
766
767 if (res != TEEC_SUCCESS) {
768 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
769 ret_orig);
770 }
771
772 free(buf);
773 return res;
774}
775
776static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
777 TEEC_Session *s,
778 TEE_ObjectHandle o,
779 uint32_t attr_id,
780 uint32_t *valuea,
781 uint32_t *valueb)
782{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100783 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200784 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100785 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200786
787 assert((uintptr_t)o <= UINT32_MAX);
788 op.params[0].value.a = (uint32_t)(uintptr_t)o;
789 op.params[0].value.b = attr_id;
790 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
791 TEEC_NONE, TEEC_NONE);
792
793 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
794 &op, &ret_orig);
795
796 if (res != TEEC_SUCCESS) {
797 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
798 ret_orig);
799 }
800
801 if (res == TEEC_SUCCESS) {
802 *valuea = op.params[1].value.a;
803 *valueb = op.params[1].value.b;
804 }
805
806 return res;
807}
808
809static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
810 TEEC_Session *s,
811 TEE_ObjectHandle o,
812 uint32_t key_size,
813 const TEE_Attribute *params,
814 uint32_t paramCount)
815{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100816 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200817 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100818 uint32_t ret_orig = 0;
819 uint8_t *buf = NULL;
820 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200821
822 res = pack_attrs(params, paramCount, &buf, &blen);
823 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
824 return res;
825
826 assert((uintptr_t)o <= UINT32_MAX);
827 op.params[0].value.a = (uint32_t)(uintptr_t)o;
828 op.params[0].value.b = key_size;
829
830 op.params[1].tmpref.buffer = buf;
831 op.params[1].tmpref.size = blen;
832
833 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
834 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
835 TEEC_NONE);
836
837 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
838
839 if (res != TEEC_SUCCESS) {
840 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
841 ret_orig);
842 }
843
844 free(buf);
845 return res;
846}
847
848static const uint8_t hash_data_md5_in1[] = {
849 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
850};
851
852static const uint8_t hash_data_md5_out1[] = {
853 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
854 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
855};
856
857static const uint8_t hash_data_sha1_in1[] = {
858 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
859};
860
861static const uint8_t hash_data_sha1_out1[] = {
862 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
863 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
864 0xc1, 0x5e, 0x7c, 0x9c
865};
866
867static const uint8_t hash_data_sha224_in1[] = {
868 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
869};
870
871static const uint8_t hash_data_sha224_out1[] = {
872 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
873 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
874 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
875 0x92, 0x49, 0xd8, 0x44
876};
877
878static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
879
880static const uint8_t hash_data_sha256_out1[] = {
881 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
882 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
883 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
884 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
885};
886
887static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
888
889static const uint8_t hash_data_sha256_out2[] = {
890 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
891 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
892 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
893 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
894};
895
896
897static const uint8_t hash_data_sha384_in1[] = {
898 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
899};
900
901static const uint8_t hash_data_sha384_out1[] = {
902 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
903 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
904 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
905 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
906 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
907 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
908};
909
910static const uint8_t hash_data_sha512_in1[] = {
911 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
912};
913
914static const uint8_t hash_data_sha512_out1[] = {
915 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
916 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
917 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
918 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
919 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
920 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
921 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
922 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
923};
924
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100925/*
926 * SM3
927 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100928 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100929 */
930static const uint8_t hash_data_sm3_a1_in[3] = "abc";
931
932static const uint8_t hash_data_sm3_a1_out[] = {
933 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
934 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
935 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
936 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
937};
938
939/*
940 * SM3
941 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100942 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100943 */
944static const uint8_t hash_data_sm3_a2_in[] = {
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 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
953};
954
955static const uint8_t hash_data_sm3_a2_out[] = {
956 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
957 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
958 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
959 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
960};
961
Pascal Brandc639ac82015-07-02 08:53:34 +0200962struct xtest_hash_case {
963 uint32_t algo;
964 size_t in_incr;
965 const uint8_t *in;
966 size_t in_len;
967 const uint8_t *out;
968 size_t out_len;
969};
970
971#define XTEST_HASH_CASE(algo, in_incr, in, out) \
972 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
973
974static const struct xtest_hash_case hash_cases[] = {
975 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
976 hash_data_md5_out1),
977 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
978 hash_data_sha1_out1),
979 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
980 hash_data_sha224_out1),
981 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
982 hash_data_sha256_out1),
983 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
984 hash_data_sha256_out2),
985 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
986 hash_data_sha384_out1),
987 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
988 hash_data_sha512_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100989 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
990 hash_data_sm3_a1_out),
991 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
992 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +0200993};
994
995static void xtest_tee_test_4001(ADBG_Case_t *c)
996{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100997 TEEC_Session session = { };
998 uint32_t ret_orig = 0;
999 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001000
1001 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1002 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1003 &ret_orig)))
1004 return;
1005
1006
1007 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001008 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1009 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1010 uint8_t out[64] = { };
1011 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001012
Jerome Forissier87b00c02020-01-22 16:33:12 +01001013 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1014 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1015 TEE_CRYPTO_ELEMENT_NONE)) {
1016 Do_ADBG_Log("SM3 not supported: skip subcase");
1017 continue;
1018 }
1019
Pascal Brandc639ac82015-07-02 08:53:34 +02001020 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1021 (int)n, (unsigned int)hash_cases[n].algo);
1022
1023 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1024 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1025 hash_cases[n].algo,
1026 TEE_MODE_DIGEST, 0)))
1027 goto out;
1028
1029 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1030 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1031 hash_cases[n].algo,
1032 TEE_MODE_DIGEST, 0)))
1033 goto out;
1034
1035 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1036 ta_crypt_cmd_digest_update(c, &session, op1,
1037 hash_cases[n].in,
1038 hash_cases[n].in_incr)))
1039 goto out;
1040
1041 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1042 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1043 goto out;
1044
1045 out_size = sizeof(out);
1046 memset(out, 0, sizeof(out));
1047 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1048 ta_crypt_cmd_digest_do_final(c, &session, op2,
1049 hash_cases[n].in + hash_cases[n].in_incr,
1050 hash_cases[n].in_len - hash_cases[n].in_incr,
1051 out, &out_size)))
1052 goto out;
1053
1054 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1055 hash_cases[n].out_len, out, out_size);
1056
1057 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1058 ta_crypt_cmd_reset_operation(c, &session, op1)))
1059 goto out;
1060
1061 out_size = sizeof(out);
1062 memset(out, 0, sizeof(out));
1063 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1064 ta_crypt_cmd_digest_do_final(c, &session, op1,
1065 hash_cases[n].in,
1066 hash_cases[n].in_len, out,
1067 &out_size)))
1068 goto out;
1069
1070 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1071 hash_cases[n].out_len, out, out_size);
1072
Jerome Forissier1e05e262015-07-29 16:09:07 +02001073 /*
1074 * Invoke TEE_DigestDoFinal() a second time to check that state
1075 * was properly reset
1076 */
1077 out_size = sizeof(out);
1078 memset(out, 0, sizeof(out));
1079 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1080 ta_crypt_cmd_digest_do_final(c, &session, op1,
1081 hash_cases[n].in,
1082 hash_cases[n].in_len, out,
1083 &out_size)))
1084 goto out;
1085
1086 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1087 hash_cases[n].out_len, out, out_size);
1088
Pascal Brandc639ac82015-07-02 08:53:34 +02001089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1090 ta_crypt_cmd_free_operation(c, &session, op1)))
1091 goto out;
1092
1093 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1094 ta_crypt_cmd_free_operation(c, &session, op2)))
1095 goto out;
1096
1097 Do_ADBG_EndSubCase(c, NULL);
1098 }
1099
1100out:
1101 TEEC_CloseSession(&session);
1102}
Jens Wiklander14f48872018-06-29 15:30:13 +02001103ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1104 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001105
Pascal Brandc639ac82015-07-02 08:53:34 +02001106struct xtest_mac_case {
1107 uint32_t algo;
1108 uint32_t key_type;
1109 const uint8_t *key;
1110 size_t key_len;
1111 size_t in_incr;
1112 const uint8_t *in;
1113 size_t in_len;
1114 const uint8_t *out;
1115 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001116 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001117};
1118
Jerome Forissier3dec7442019-01-30 17:50:05 +01001119#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001120 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001121 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1122
1123#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1124 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1125 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1126
1127#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1128 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1129 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001130
1131#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1132 XTEST_MAC_CASE((algo), (key_type), \
1133 mac_cbc_ ## vect ## _key, (in_incr), \
1134 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1135
1136#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1137 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1138 mac_cmac_ ## vect ## _key, (in_incr), \
1139 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1140
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001141#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1142 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1143 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1144 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1145
Pascal Brandc639ac82015-07-02 08:53:34 +02001146static const struct xtest_mac_case mac_cases[] = {
1147 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1148 mac_data_md5_key1,
1149 4, mac_data_md5_in1, mac_data_md5_out1),
1150 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1151 mac_data_sha1_key1,
1152 5, mac_data_sha1_in1, mac_data_sha1_out1),
1153 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1154 mac_data_sha224_key1,
1155 8, mac_data_sha224_in1, mac_data_sha224_out1),
1156 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1157 mac_data_sha256_key1,
1158 1, mac_data_sha256_in1, mac_data_sha256_out1),
1159 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1160 mac_data_sha256_key2,
1161 7, mac_data_sha256_in2, mac_data_sha256_out2),
1162 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1163 mac_data_sha384_key1,
1164 11, mac_data_sha384_in1, mac_data_sha384_out1),
1165 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1166 mac_data_sha512_key1,
1167 13, mac_data_sha512_in1, mac_data_sha512_out1),
1168
1169 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1170 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1171 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1172 17),
1173 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1174 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1175 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1176 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1177 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1178 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1179 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001180 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001181
1182 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1183 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1184 ARRAY_SIZE(mac_cmac_vect1_out) },
1185 XTEST_MAC_CMAC_CASE(vect2, 9),
1186 XTEST_MAC_CMAC_CASE(vect3, 9),
1187 XTEST_MAC_CMAC_CASE(vect4, 9),
1188 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1189 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1190 ARRAY_SIZE(mac_cmac_vect5_out) },
1191 XTEST_MAC_CMAC_CASE(vect6, 9),
1192 XTEST_MAC_CMAC_CASE(vect7, 9),
1193 XTEST_MAC_CMAC_CASE(vect8, 9),
1194 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1195 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1196 ARRAY_SIZE(mac_cmac_vect9_out) },
1197 XTEST_MAC_CMAC_CASE(vect10, 9),
1198 XTEST_MAC_CMAC_CASE(vect11, 9),
1199 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001200 XTEST_MAC_CMAC_CASE(vect12, 16),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001201
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001202 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1203 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1204 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1205 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1206 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1207 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1208 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1209 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1210 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1211 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1212 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1213 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1214
Jerome Forissier9f17e262019-12-13 14:12:41 +01001215 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1216 mac_data_sm3_d31_key,
1217 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1218 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1219 mac_data_sm3_d32_key,
1220 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001221};
1222
1223static void xtest_tee_test_4002(ADBG_Case_t *c)
1224{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001225 TEEC_Session session = { };
1226 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1227 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001228 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001229 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1230 uint8_t out[64] = { };
1231 size_t out_size = 0;
1232 uint32_t ret_orig = 0;
1233 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001234
1235 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1236 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1237 &ret_orig)))
1238 return;
1239
1240 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001241 TEE_Attribute key_attr = { };
1242 size_t key_size = 0;
1243 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001244
1245 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1246 (int)n, (unsigned int)mac_cases[n].algo);
1247
1248 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1249 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1250 key_attr.content.ref.length = mac_cases[n].key_len;
1251
1252 key_size = key_attr.content.ref.length * 8;
1253 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1254 mac_cases[n].key_type == TEE_TYPE_DES3)
1255 /* Exclude parity in bit size of key */
1256 key_size -= key_size / 8;
1257
1258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1259 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1260 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1261 goto out;
1262
1263 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1264 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1265 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1266 goto out;
1267
1268 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001269 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1270 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1271 goto out;
1272
1273 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001274 ta_crypt_cmd_allocate_transient_object(c, &session,
1275 mac_cases[n].key_type, key_size, &key_handle)))
1276 goto out;
1277
1278 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1279 ta_crypt_cmd_populate_transient_object(c, &session,
1280 key_handle, &key_attr, 1)))
1281 goto out;
1282
1283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1284 ta_crypt_cmd_set_operation_key(c, &session, op1,
1285 key_handle)))
1286 goto out;
1287
1288 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1289 ta_crypt_cmd_free_transient_object(c, &session,
1290 key_handle)))
1291 goto out;
1292
1293 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1294 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1295 goto out;
1296
Jerome Forissier4f419512021-07-07 14:56:10 +02001297 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1298 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1299 goto out;
1300
Jerome Forissier3dec7442019-01-30 17:50:05 +01001301 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001302 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001303 while (offs + mac_cases[n].in_incr <
1304 mac_cases[n].in_len) {
1305 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1306 ta_crypt_cmd_mac_update(c, &session,
1307 op1, mac_cases[n].in + offs,
1308 mac_cases[n].in_incr)))
1309 goto out;
1310 offs += mac_cases[n].in_incr;
1311 if (!mac_cases[n].multiple_incr)
1312 break;
1313 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001314 }
1315
1316 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1317 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1318 goto out;
1319
1320 out_size = sizeof(out);
1321 memset(out, 0, sizeof(out));
1322 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1323 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001324 mac_cases[n].in + offs,
1325 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001326 out, &out_size)))
1327 goto out;
1328
1329 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1330 mac_cases[n].out_len, out, out_size);
1331
1332 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1333 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1334 goto out;
1335
1336 out_size = sizeof(out);
1337 memset(out, 0, sizeof(out));
1338 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1339 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1340 mac_cases[n].in, mac_cases[n].in_len, out,
1341 &out_size)))
1342 goto out;
1343
1344 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1345 mac_cases[n].out_len, out, out_size);
1346
1347 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001348 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1349 mac_cases[n].in, mac_cases[n].in_len,
1350 mac_cases[n].out, mac_cases[n].out_len)))
1351 goto out;
1352
1353 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001354 ta_crypt_cmd_free_operation(c, &session, op1)))
1355 goto out;
1356
1357 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1358 ta_crypt_cmd_free_operation(c, &session, op2)))
1359 goto out;
1360
Jerome Forissier4f419512021-07-07 14:56:10 +02001361 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1362 ta_crypt_cmd_free_operation(c, &session, op3)))
1363 goto out;
1364
Pascal Brandc639ac82015-07-02 08:53:34 +02001365 Do_ADBG_EndSubCase(c, NULL);
1366 }
1367out:
1368 TEEC_CloseSession(&session);
1369}
Jens Wiklander14f48872018-06-29 15:30:13 +02001370ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1371 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001372
Pascal Brandc639ac82015-07-02 08:53:34 +02001373static const uint8_t ciph_data_aes_key1[] = {
1374 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1375 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1376};
1377
Jerome Forissier0780ad42018-06-05 15:02:37 +02001378static const uint8_t ciph_data_aes_key2[] = {
1379 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1380 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1381};
1382
Pascal Brandc639ac82015-07-02 08:53:34 +02001383static const uint8_t ciph_data_des_key1[] = {
1384 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1385};
1386
1387static const uint8_t ciph_data_des_key2[] = {
1388 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1389};
1390
1391
1392static const uint8_t ciph_data_des3_key1[] = {
1393 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1394 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1395 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1396};
1397
1398static const uint8_t ciph_data_des3_key2[] = {
1399 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1400 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1401 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1402};
1403
1404static const uint8_t ciph_data_des2_key1[] = {
1405 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1406 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1407};
1408
1409static const uint8_t ciph_data_in1[] = {
1410 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1411 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1412 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1413 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1414 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1415 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1416};
1417
1418static const uint8_t ciph_data_in3[] = {
1419 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1420 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1421 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1422 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1423 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1424 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1425};
1426
Jerome Forissier45218eb2018-04-11 13:03:26 +02001427static const uint8_t ciph_data_in4[] = {
1428 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1429 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1430 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1431 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1432 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1433 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1434 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1435 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1436};
1437
Jerome Forissier0780ad42018-06-05 15:02:37 +02001438static const uint8_t ciph_data_in5[] = {
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,
1446 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001447 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1448 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001449 0x01, 0x01, 0x01
1450};
1451
Pascal Brandc639ac82015-07-02 08:53:34 +02001452static const uint8_t ciph_data_128_iv1[] = {
1453 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1454 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1455};
1456
Jerome Forissier0780ad42018-06-05 15:02:37 +02001457static const uint8_t ciph_data_128_iv2[] = {
1458 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1459 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1460};
1461
Pascal Brandc639ac82015-07-02 08:53:34 +02001462static const uint8_t ciph_data_64_iv1[] = {
1463 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1464};
1465
1466static const uint8_t ciph_data_in2[] = {
1467 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1468};
1469
1470static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1471 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1472 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1473 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1474 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1475 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1476 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1477};
1478
1479static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1480 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1481 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1482 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1483 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1484 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1485 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1486};
1487
1488static const uint8_t ciph_data_aes_ctr_out1[] = {
1489 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1490 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1491 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1492 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1493 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1494 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1495};
1496
1497static const uint8_t ciph_data_aes_ctr_out2[] = {
1498 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1499 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1500 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1501 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1502 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1503 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1504};
1505
Jerome Forissier45218eb2018-04-11 13:03:26 +02001506static const uint8_t ciph_data_aes_ctr_out4[] = {
1507 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1508 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1509 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1510 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1511 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1512 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1513 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1514 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1515};
1516
Jerome Forissier0780ad42018-06-05 15:02:37 +02001517static const uint8_t ciph_data_aes_ctr_out5[] = {
1518 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1519 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1520 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1521 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1522 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1523 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1524 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1525 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001526 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1527 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1528 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001529};
1530
Pascal Brandc639ac82015-07-02 08:53:34 +02001531static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1532 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1533 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1534};
1535
1536static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1539};
1540
1541static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1542 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1543 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1544 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1545 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1546 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1547 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1548 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1549 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1550 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1551 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1552 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1553 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1554 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1555 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1556 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1557 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1558 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1559 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1560 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1561 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1562};
1563
1564static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1565 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1566 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1567 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1568 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1569 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1570 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1571 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1572 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1573 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1574 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1575 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1576 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1577 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1578 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1579 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1580 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1581 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1582 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1583 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1584 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1585};
1586
1587/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1588 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1589static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1590 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1591 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1592};
1593
1594static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1595 0x00
1596};
1597
1598static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1599 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1600 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1601 0x20
1602};
1603
1604static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1605 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1606 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1607 0x97
1608};
1609
1610#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1611#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1612static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1613 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1614 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1615 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1616 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1617};
1618
1619static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1620 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1621 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1622 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1623 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1624};
1625
1626#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1627#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1628static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1629 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1630 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1631 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1632 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1633};
1634
1635static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1636 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1637 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1638 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1639 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1640};
1641
1642#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1643#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1644static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1645 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1646 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1647 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1648 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1649 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1650 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1651};
1652
1653static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1654 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1655 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1656 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1657 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1658 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1659 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1660};
1661
1662#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1663#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1664static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1665 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1666 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1667 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1668 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1669 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1670 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1671};
1672
1673static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1674 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1675 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1676 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1677 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1678 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1679 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1680};
1681
1682#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1683#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1684static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1685 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1686 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1687 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1688 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1689 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1690 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1691 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1692 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1693};
1694
1695static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1696 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1697 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1698 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1699 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1700 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1701 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1702 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1703 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1704};
1705
Jerome Forissiered00e162017-01-20 09:22:52 +01001706/*
1707 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1708 * 80 bytes of data, processed in two steps (32 + 48).
1709 */
1710
1711#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1712
1713static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1714 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1715 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1716};
1717
1718static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1719 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1720 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1721 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1722 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1723 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1724 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1725 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1726 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1727 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1728 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1729};
1730
1731/*
1732 * Ciphertext was generated by an online tool for AES CBC.
1733 * Since the input size is a multiple of the block size, and the ciphertext
1734 * format is CS3, the output is the same as plain AES CBC with the last
1735 * two blocks swapped.
1736 */
1737static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1738 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1739 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1740 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1741 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1742 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1743 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1744 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1745 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1746 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1747 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1748};
1749
Pascal Brandc639ac82015-07-02 08:53:34 +02001750static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1751 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1752 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1753 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1754 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1755 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1756 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1757};
1758
1759static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1760 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1761};
1762
1763static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1764 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1765 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1766 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1767 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1768 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1769 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1770};
1771
1772static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1773 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1774 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1775 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1776 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1777 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1778 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1779};
1780
1781static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1782 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1783 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1784 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1785 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1786 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1787 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1788};
1789
1790static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1791 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1792 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1793 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1794 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1795 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1796 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1797};
1798
1799static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1800 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1801 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1802 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1803 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1804 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1805 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1806};
1807
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001808/* SM4 ECB */
1809
1810static const uint8_t ciph_data_sm4_key1[] = {
1811 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1812 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1813};
1814
1815static const uint8_t ciph_data_sm4_in1[] = {
1816 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1817 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1818};
1819
1820static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1821 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1822 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1823};
1824
1825/*
1826 * SM4 CBC
1827 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1828 */
1829static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1830 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1831 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1832};
1833
1834static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1835 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1836 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1837};
1838
1839static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1840 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1841 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1842 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1843 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1844};
1845
1846static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
1847 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
1848 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
1849 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
1850 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
1851};
1852
1853/*
1854 * SM4 CBC
1855 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
1856 */
1857static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
1858 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1859 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1860};
1861
1862static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
1863 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1864 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1865};
1866
1867static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
1868 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1869 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1870 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1871 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1872};
1873
1874static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
1875 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
1876 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
1877 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
1878 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
1879};
1880
1881/*
1882 * SM4 CTR
1883 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
1884 */
1885static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
1886 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1887 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1888};
1889
1890static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
1891 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1892 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1893};
1894
1895static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
1896 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1897 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1898 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1899 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1900 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1901 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1902 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1903 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1904};
1905
1906static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
1907 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
1908 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
1909 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
1910 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
1911 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
1912 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
1913 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
1914 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
1915};
1916
1917/*
1918 * SM4 CTR
1919 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
1920 */
1921static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
1922 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1923 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1924};
1925
1926static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
1927 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1928 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1929};
1930
1931static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
1932 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1933 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1934 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1935 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1936 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1937 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1938 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1939 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1940};
1941
1942static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
1943 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
1944 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
1945 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
1946 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
1947 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
1948 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
1949 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
1950 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
1951};
1952
Pascal Brandc639ac82015-07-02 08:53:34 +02001953struct xtest_ciph_case {
1954 uint32_t algo;
1955 uint32_t mode;
1956 uint32_t key_type;
1957 const uint8_t *key1;
1958 size_t key1_len;
1959 const uint8_t *key2;
1960 size_t key2_len;
1961 const uint8_t *iv;
1962 size_t iv_len;
1963 size_t in_incr;
1964 const uint8_t *in;
1965 size_t in_len;
1966 const uint8_t *out;
1967 size_t out_len;
1968 size_t line;
1969};
1970
1971#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
1972 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1973 NULL, 0, NULL, 0, \
1974 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
1975 __LINE__ }, \
1976 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1977 NULL, 0, NULL, 0, \
1978 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
1979
1980#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
1981 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1982 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
1983 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
1984 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1985 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
1986 (ptx), ARRAY_SIZE(ptx), __LINE__ }
1987
1988#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
1989 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
1990 ciph_data_aes_xts_ ## vect ## _key1, \
1991 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
1992 ciph_data_aes_xts_ ## vect ## _key2, \
1993 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
1994 ciph_data_aes_xts_ ## vect ## _iv, \
1995 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
1996 (in_incr), \
1997 ciph_data_aes_xts_ ## vect ## _ptx, \
1998 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
1999 ciph_data_aes_xts_ ## vect ## _ctx, \
2000 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2001 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2002 ciph_data_aes_xts_ ## vect ## _key1, \
2003 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2004 ciph_data_aes_xts_ ## vect ## _key2, \
2005 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2006 ciph_data_aes_xts_ ## vect ## _iv, \
2007 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2008 (in_incr), \
2009 ciph_data_aes_xts_ ## vect ## _ctx, \
2010 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2011 ciph_data_aes_xts_ ## vect ## _ptx, \
2012 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2013
2014#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2015 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2016 ciph_data_aes_cbc_ ## vect ## _key, \
2017 ciph_data_aes_cbc_ ## vect ## _iv, \
2018 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2019 ciph_data_aes_cbc_ ## vect ## _ctx)
2020
2021#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2022 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2023 ciph_data_aes_cts_ ## vect ## _key, \
2024 ciph_data_aes_cts_ ## vect ## _iv, \
2025 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2026 ciph_data_aes_cts_ ## vect ## _ctx)
2027
2028static const struct xtest_ciph_case ciph_cases[] = {
2029 /* AES */
2030 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2031 ciph_data_aes_key1, 11, ciph_data_in1,
2032 ciph_data_aes_ecb_nopad_out1),
2033 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2034 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2035 ciph_data_in1,
2036 ciph_data_aes_cbc_nopad_out1),
2037 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2038 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2039 ciph_data_in1,
2040 ciph_data_aes_ctr_out1),
2041 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2042 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2043 ciph_data_in3,
2044 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002045 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2046 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2047 ciph_data_in3,
2048 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002049 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2050 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2051 ciph_data_in4,
2052 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002053 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2054 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2055 ciph_data_in5,
2056 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002057
2058 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002059 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002060
2061 /* AES-CTS */
2062 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2063 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2064 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2065 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2066 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2067 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2068 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002069 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002070
2071 /* DES */
2072 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2073 ciph_data_des_key1, 14, ciph_data_in1,
2074 ciph_data_des_ecb_nopad_out1),
2075 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2076 ciph_data_des_key2, 3, ciph_data_in2,
2077 ciph_data_des_ecb_nopad_out2),
2078 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2079 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2080 ciph_data_des_cbc_nopad_out1),
2081
2082 /* DES3 */
2083 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2084 ciph_data_des3_key1, 11, ciph_data_in1,
2085 ciph_data_des3_ecb_nopad_out1),
2086 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2087 ciph_data_des3_key2, 3, ciph_data_in2,
2088 ciph_data_des_ecb_nopad_out2),
2089 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2090 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2091 ciph_data_in1,
2092 ciph_data_des3_cbc_nopad_out1),
2093
2094 /* DES2 */
2095 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2096 ciph_data_des2_key1, 11, ciph_data_in1,
2097 ciph_data_des2_ecb_nopad_out1),
2098 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2099 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2100 ciph_data_in1,
2101 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002102
Pascal Brandc639ac82015-07-02 08:53:34 +02002103 /* AES-XTS */
2104 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2105 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2106 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2107 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2108 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2109 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2110 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2111 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2112 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2113 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2114 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2115 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2116 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2117 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2118 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2119 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2120 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2121 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2122 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002123
2124 /* SM4 */
2125 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2126 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2127 ciph_data_sm4_ecb_nopad_out1),
2128 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2129 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2130 11, ciph_data_sm4_cbc_a221_in,
2131 ciph_data_sm4_cbc_a221_out),
2132 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2133 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2134 11, ciph_data_sm4_cbc_a222_in,
2135 ciph_data_sm4_cbc_a222_out),
2136 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2137 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2138 11, ciph_data_sm4_ctr_a251_in,
2139 ciph_data_sm4_ctr_a251_out),
2140 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2141 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2142 11, ciph_data_sm4_ctr_a252_in,
2143 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002144};
2145
Jerome Forissier23256842018-02-16 09:25:35 +01002146static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002147{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002148 TEEC_Session session = { };
2149 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002150 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002151 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2152 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002153 uint8_t out[2048] = { };
2154 size_t out_size = 0;
2155 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002156 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002157 uint32_t ret_orig = 0;
2158 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002159
2160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2161 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2162 &ret_orig)))
2163 return;
2164
2165 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002166 TEE_Attribute key_attr = { };
2167 size_t key_size = 0;
2168 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002169
Jerome Forissier817d99f2020-01-22 16:33:12 +01002170 switch (ciph_cases[n].algo) {
2171 case TEE_ALG_SM4_CTR:
2172 case TEE_ALG_SM4_CBC_NOPAD:
2173 case TEE_ALG_SM4_ECB_NOPAD:
2174 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2175 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2176 Do_ADBG_Log("SM4 not supported: skip subcase");
2177 continue;
2178 }
2179 break;
2180 default:
2181 break;
2182 }
2183
Pascal Brandc639ac82015-07-02 08:53:34 +02002184 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2185 (int)n, (unsigned int)ciph_cases[n].algo,
2186 (int)ciph_cases[n].line);
2187
2188 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2189 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2190 key_attr.content.ref.length = ciph_cases[n].key1_len;
2191
2192 key_size = key_attr.content.ref.length * 8;
2193 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2194 ciph_cases[n].key_type == TEE_TYPE_DES3)
2195 /* Exclude parity in bit size of key */
2196 key_size -= key_size / 8;
2197
2198 op_key_size = key_size;
2199 if (ciph_cases[n].key2 != NULL)
2200 op_key_size *= 2;
2201
2202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2203 ta_crypt_cmd_allocate_operation(c, &session, &op,
2204 ciph_cases[n].algo, ciph_cases[n].mode,
2205 op_key_size)))
2206 goto out;
2207
2208 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002209 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2210 ciph_cases[n].algo, ciph_cases[n].mode,
2211 op_key_size)))
2212 goto out;
2213
2214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002215 ta_crypt_cmd_allocate_transient_object(c, &session,
2216 ciph_cases[n].key_type, key_size,
2217 &key1_handle)))
2218 goto out;
2219
2220 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2221 ta_crypt_cmd_populate_transient_object(c, &session,
2222 key1_handle, &key_attr, 1)))
2223 goto out;
2224
2225 if (ciph_cases[n].key2 != NULL) {
2226 key_attr.content.ref.buffer =
2227 (void *)ciph_cases[n].key2;
2228 key_attr.content.ref.length = ciph_cases[n].key2_len;
2229
2230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2231 ta_crypt_cmd_allocate_transient_object(c,
2232 &session, ciph_cases[n].key_type,
2233 key_attr.content.ref.length * 8,
2234 &key2_handle)))
2235 goto out;
2236
2237 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2238 ta_crypt_cmd_populate_transient_object(c,
2239 &session, key2_handle, &key_attr, 1)))
2240 goto out;
2241
2242 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2243 ta_crypt_cmd_set_operation_key2(c, &session, op,
2244 key1_handle, key2_handle)))
2245 goto out;
2246 } else {
2247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2248 ta_crypt_cmd_set_operation_key(c, &session, op,
2249 key1_handle)))
2250 goto out;
2251 }
2252
2253 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2254 ta_crypt_cmd_free_transient_object(c, &session,
2255 key1_handle)))
2256 goto out;
2257 key1_handle = TEE_HANDLE_NULL;
2258
2259 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2260 ta_crypt_cmd_free_transient_object(c, &session,
2261 key2_handle)))
2262 goto out;
2263 key2_handle = TEE_HANDLE_NULL;
2264
2265 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2266 ta_crypt_cmd_cipher_init(c, &session, op,
2267 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2268 goto out;
2269
2270 out_offs = 0;
2271 out_size = sizeof(out);
2272 memset(out, 0, sizeof(out));
2273 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2274 ta_crypt_cmd_cipher_update(c, &session, op,
2275 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2276 &out_size)))
2277 goto out;
2278
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002279 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2280 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2281 ciph_cases[n].in_incr);
2282
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2284 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2285 goto out;
2286
Pascal Brandc639ac82015-07-02 08:53:34 +02002287 out_offs += out_size;
2288 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002289 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002290
2291 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2292 ta_crypt_cmd_cipher_do_final(c, &session, op,
2293 ciph_cases[n].in + ciph_cases[n].in_incr,
2294 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2295 out + out_offs,
2296 &out_size)))
2297 goto out;
2298
2299 out_offs += out_size;
2300
2301 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2302 ciph_cases[n].out_len, out, out_offs);
2303
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002304 /* test on the copied op2 */
2305 out_size = sizeof(out) - out_offs2;
2306
2307 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2308 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2309 ciph_cases[n].in + ciph_cases[n].in_incr,
2310 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2311 out + out_offs2,
2312 &out_size)))
2313 goto out;
2314
2315 out_offs2 += out_size;
2316
2317 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2318 out, out_offs2);
2319
Pascal Brandc639ac82015-07-02 08:53:34 +02002320 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2321 ta_crypt_cmd_free_operation(c, &session, op)))
2322 goto out;
2323
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002324 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2325 ta_crypt_cmd_free_operation(c, &session, op2)))
2326 goto out;
2327
Pascal Brandc639ac82015-07-02 08:53:34 +02002328 Do_ADBG_EndSubCase(c, NULL);
2329 }
2330out:
2331 TEEC_CloseSession(&session);
2332}
Jens Wiklander14f48872018-06-29 15:30:13 +02002333ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2334 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002335
Pascal Brandc639ac82015-07-02 08:53:34 +02002336static void xtest_tee_test_4004(ADBG_Case_t *c)
2337{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002338 TEEC_Session session = { };
2339 uint32_t ret_orig = 0;
2340 uint8_t buf1[45] = { };
2341 uint8_t buf2[45] = { };
2342 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002343
2344 Do_ADBG_BeginSubCase(c, "TEE get random");
2345 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2346 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2347 &ret_orig)))
2348 return;
2349
2350 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2351 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2352 sizeof(buf1))))
2353 goto out;
2354
2355 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2356 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2357
2358 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2359 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2360 sizeof(buf2))))
2361 goto out;
2362
2363 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2364 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2365
2366 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2367 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2368out:
2369 TEEC_CloseSession(&session);
2370 Do_ADBG_EndSubCase(c, "TEE get random");
2371}
Jens Wiklander14f48872018-06-29 15:30:13 +02002372ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2373 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002374
2375struct xtest_ae_case {
2376 uint32_t algo;
2377 uint32_t mode;
2378 uint32_t key_type;
2379 const uint8_t *key;
2380 size_t key_len;
2381 const uint8_t *nonce;
2382 size_t nonce_len;
2383 size_t aad_incr;
2384 const uint8_t *aad;
2385 size_t aad_len;
2386 size_t in_incr;
2387 const uint8_t *ptx;
2388 size_t ptx_len;
2389 const uint8_t *ctx;
2390 size_t ctx_len;
2391 const uint8_t *tag;
2392 size_t tag_len;
2393 size_t line;
2394};
2395
2396
2397#define ARRAY(a) a, ARRAY_SIZE(a)
2398#define NULL_ARRAY(a) NULL, 0
2399
2400#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2401 aad_array, ptx_array, ctx_array) \
2402 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2403 ARRAY(vect ## _nonce), (aad_incr), \
2404 aad_array(vect ## _aad), (in_incr), \
2405 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2406 ARRAY(vect ## _tag), \
2407 __LINE__ }, \
2408 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2409 ARRAY(vect ## _nonce), (aad_incr), \
2410 aad_array(vect ## _aad), (in_incr), \
2411 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2412 ARRAY(vect ## _tag), \
2413 __LINE__ }
2414
2415#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2416 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2417 in_incr, ARRAY, ARRAY, ARRAY)
2418
2419#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2420 aad_array, ptx_array, ctx_array) \
2421 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2422 in_incr, aad_array, ptx_array, ctx_array)
2423
2424
2425
2426static const struct xtest_ae_case ae_cases[] = {
2427 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2428 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2429 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2430
2431 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2432 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2433 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002434 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2435 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002436 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2437 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2438 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2439 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2440 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2441 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2442 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2443 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2444 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2445 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2446 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2447 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2448 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2449 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002450#ifdef CFG_GCM_NIST_VECTORS
2451#include "gcmDecrypt128.h"
2452#include "gcmDecrypt192.h"
2453#include "gcmDecrypt256.h"
2454#include "gcmEncryptExtIV128.h"
2455#include "gcmEncryptExtIV192.h"
2456#include "gcmEncryptExtIV256.h"
2457#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002458};
2459
2460static void xtest_tee_test_4005(ADBG_Case_t *c)
2461{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002462 TEEC_Session session = { };
2463 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002464 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002465 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002466 TEE_Attribute key_attr = { };
2467 uint8_t out[512] = { };
2468 size_t out_size = 0;
2469 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002470 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002471 uint32_t ret_orig = 0;
2472 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002473
2474 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2475 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2476 &ret_orig)))
2477 return;
2478
2479 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2480 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2481 (int)n, (unsigned int)ae_cases[n].algo,
2482 (int)ae_cases[n].line);
2483
2484 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2485 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2486 key_attr.content.ref.length = ae_cases[n].key_len;
2487
2488 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2489 ta_crypt_cmd_allocate_operation(c, &session, &op,
2490 ae_cases[n].algo, ae_cases[n].mode,
2491 key_attr.content.ref.length * 8)))
2492 goto out;
2493
2494 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002495 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2496 ae_cases[n].algo, ae_cases[n].mode,
2497 key_attr.content.ref.length * 8)))
2498 goto out;
2499
2500 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002501 ta_crypt_cmd_allocate_transient_object(c, &session,
2502 ae_cases[n].key_type,
2503 key_attr.content.ref.length * 8,
2504 &key_handle)))
2505 goto out;
2506
2507 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2508 ta_crypt_cmd_populate_transient_object(c, &session,
2509 key_handle, &key_attr, 1)))
2510 goto out;
2511
2512 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2513 ta_crypt_cmd_set_operation_key(c, &session, op,
2514 key_handle)))
2515 goto out;
2516
2517 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2518 ta_crypt_cmd_free_transient_object(c, &session,
2519 key_handle)))
2520 goto out;
2521 key_handle = TEE_HANDLE_NULL;
2522
2523 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2524 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2525 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2526 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2527 goto out;
2528
2529 if (ae_cases[n].aad != NULL) {
2530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2531 ta_crypt_cmd_ae_update_aad(c, &session, op,
2532 ae_cases[n].aad, ae_cases[n].aad_incr)))
2533 goto out;
2534
2535 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2536 ta_crypt_cmd_ae_update_aad(c, &session, op,
2537 ae_cases[n].aad + ae_cases[n].aad_incr,
2538 ae_cases [n].aad_len -
2539 ae_cases[n].aad_incr)))
2540 goto out;
2541 }
2542
2543 out_offs = 0;
2544 out_size = sizeof(out);
2545 memset(out, 0, sizeof(out));
2546 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2547 if (ae_cases[n].ptx != NULL) {
2548 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2549 ta_crypt_cmd_ae_update(c, &session, op,
2550 ae_cases[n].ptx,
2551 ae_cases[n].in_incr, out,
2552 &out_size)))
2553 goto out;
2554 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002555 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2556 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2557 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002558 }
2559 } else {
2560 if (ae_cases[n].ctx != NULL) {
2561 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2562 ta_crypt_cmd_ae_update(c, &session, op,
2563 ae_cases[n].ctx,
2564 ae_cases[n].in_incr, out,
2565 &out_size)))
2566 goto out;
2567 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002568 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2569 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2570 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002571 }
2572 }
2573
Jens Wiklander7404c072020-12-15 08:06:32 +01002574 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2575 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2576 goto out;
2577
Pascal Brandc639ac82015-07-02 08:53:34 +02002578 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002579 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002580 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2581 uint8_t out_tag[64];
2582 size_t out_tag_len = MIN(sizeof(out_tag),
2583 ae_cases[n].tag_len);
2584
2585 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2586 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2587 ae_cases[n].ptx + ae_cases[n].in_incr,
2588 ae_cases[n].ptx_len -
2589 ae_cases[n].in_incr,
2590 out + out_offs,
2591 &out_size, out_tag, &out_tag_len)))
2592 goto out;
2593
2594 (void)ADBG_EXPECT_BUFFER(c,
2595 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2596 out_tag_len);
2597
2598 out_offs += out_size;
2599
2600 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2601 ae_cases[n].ctx_len, out, out_offs);
2602 } else {
2603 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2604 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2605 ae_cases[n].ctx + ae_cases[n].in_incr,
2606 ae_cases[n].ctx_len -
2607 ae_cases[n].in_incr,
2608 out + out_offs,
2609 &out_size, ae_cases[n].tag,
2610 ae_cases[n].tag_len)))
2611 goto out;
2612
2613 out_offs += out_size;
2614
2615 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2616 ae_cases[n].ptx_len, out, out_offs);
2617 }
2618
Jens Wiklander7404c072020-12-15 08:06:32 +01002619 /* test on the copied op2 */
2620 out_size = sizeof(out) - out_offs2;
2621 memset(out + out_offs2, 0, out_size);
2622 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2623 uint8_t out_tag[64] = { 0 };
2624 size_t out_tag_len = MIN(sizeof(out_tag),
2625 ae_cases[n].tag_len);
2626
2627 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2628 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2629 ae_cases[n].ptx + ae_cases[n].in_incr,
2630 ae_cases[n].ptx_len -
2631 ae_cases[n].in_incr,
2632 out + out_offs2,
2633 &out_size, out_tag, &out_tag_len)))
2634 goto out;
2635
2636 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2637 ae_cases[n].tag_len, out_tag,
2638 out_tag_len);
2639
2640 out_offs2 += out_size;
2641
2642 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2643 ae_cases[n].ctx_len, out, out_offs2);
2644 } else {
2645 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2646 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2647 ae_cases[n].ctx + ae_cases[n].in_incr,
2648 ae_cases[n].ctx_len -
2649 ae_cases[n].in_incr,
2650 out + out_offs2,
2651 &out_size, ae_cases[n].tag,
2652 ae_cases[n].tag_len)))
2653 goto out;
2654
2655 out_offs2 += out_size;
2656
2657 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2658 ae_cases[n].ptx_len, out, out_offs2);
2659 }
2660
Pascal Brandc639ac82015-07-02 08:53:34 +02002661 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2662 ta_crypt_cmd_free_operation(c, &session, op)))
2663 goto out;
2664
Jens Wiklander7404c072020-12-15 08:06:32 +01002665 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2666 ta_crypt_cmd_free_operation(c, &session, op2)))
2667 goto out;
2668
Pascal Brandc639ac82015-07-02 08:53:34 +02002669 Do_ADBG_EndSubCase(c, NULL);
2670 }
2671out:
2672 TEEC_CloseSession(&session);
2673}
Jens Wiklander14f48872018-06-29 15:30:13 +02002674ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2675 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002676
2677struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002678 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002679 uint32_t algo;
2680 TEE_OperationMode mode;
2681
2682 union {
2683 struct {
2684 const uint8_t *modulus;
2685 size_t modulus_len;
2686
2687 const uint8_t *pub_exp;
2688 size_t pub_exp_len;
2689
2690 const uint8_t *priv_exp;
2691 size_t priv_exp_len;
2692
2693 const uint8_t *prime1; /* q */
2694 size_t prime1_len;
2695 const uint8_t *prime2; /* p */
2696 size_t prime2_len;
2697 const uint8_t *exp1; /* dp */
2698 size_t exp1_len;
2699 const uint8_t *exp2; /* dq */
2700 size_t exp2_len;
2701 const uint8_t *coeff; /* iq */
2702 size_t coeff_len;
2703
2704 int salt_len;
2705 } rsa;
2706 struct {
2707 const uint8_t *prime;
2708 size_t prime_len;
2709 const uint8_t *sub_prime;
2710 size_t sub_prime_len;
2711 const uint8_t *base;
2712 size_t base_len;
2713 const uint8_t *pub_val;
2714 size_t pub_val_len;
2715 const uint8_t *priv_val;
2716 size_t priv_val_len;
2717 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002718 struct {
2719 const uint8_t *private;
2720 size_t private_len;
2721 const uint8_t *public_x;
2722 size_t public_x_len;
2723 const uint8_t *public_y;
2724 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002725 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002726 struct {
2727 const uint8_t *private;
2728 size_t private_len;
2729 const uint8_t *public;
2730 size_t public_len;
2731 const uint8_t flag;
2732 const uint8_t *context;
2733 size_t context_len;
2734 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002735 } params;
2736
2737 const uint8_t *ptx;
2738 size_t ptx_len;
2739 const uint8_t *ctx;
2740 size_t ctx_len;
2741 size_t line;
2742};
2743
2744#define WITHOUT_SALT(x) -1
2745#define WITH_SALT(x) x
2746
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002747#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2748 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002749 ARRAY(vect ## _ptx), \
2750 ARRAY(vect ## _out), \
2751 __LINE__ }
2752
2753#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2754 { .rsa = { \
2755 ARRAY(vect ## _modulus), \
2756 ARRAY(vect ## _pub_exp), \
2757 ARRAY(vect ## _priv_exp), \
2758 opt_crt_array(vect ## _prime1), \
2759 opt_crt_array(vect ## _prime2), \
2760 opt_crt_array(vect ## _exp1), \
2761 opt_crt_array(vect ## _exp2), \
2762 opt_crt_array(vect ## _coeff), \
2763 opt_salt(vect ## _salt_len) \
2764 } }
2765
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002766#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2767 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002768 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2769
2770#define XTEST_AC_DSA_UNION(vect) \
2771 { .dsa = { \
2772 ARRAY(vect ## _prime), \
2773 ARRAY(vect ## _sub_prime), \
2774 ARRAY(vect ## _base), \
2775 ARRAY(vect ## _pub_val), \
2776 ARRAY(vect ## _priv_val), \
2777 } }
2778
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002779#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2780 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002781
Pascal Brand3e143ee2015-07-15 17:17:16 +02002782#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002783 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002784 ARRAY(vect ## _private), \
2785 ARRAY(vect ## _public_x), \
2786 ARRAY(vect ## _public_y), \
2787 } }
2788
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002789#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002790 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002791
Valerii Chubarab9863c2022-08-12 07:42:29 +00002792#define XTEST_AC_EDDSA_UNION(vect, flag) \
2793 { .eddsa = { \
2794 ARRAY(vect ## _private), \
2795 ARRAY(vect ## _public), \
2796 flag, \
2797 } }
2798
2799#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2800 { .eddsa = { \
2801 ARRAY(vect ## _private), \
2802 ARRAY(vect ## _public), \
2803 flag, \
2804 ARRAY(vect ## _context), \
2805 } }
2806
2807#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2808 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2809
2810#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2811 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2812
Pascal Brandc639ac82015-07-02 08:53:34 +02002813static const struct xtest_ac_case xtest_ac_cases[] = {
2814 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002815 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002816 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002817 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002818 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002819 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002820 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002821 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002822 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002823 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2824 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2825 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2826 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002827 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2828 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2829 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2830 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002831 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002832 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002833 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002834 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002835 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002836 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002837 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002838 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002839 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002840 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002841 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002842 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002843 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002844 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002845 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002846 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002847 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002848 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002849 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002850 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002851 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2852 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2853 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2854 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002855
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002856 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002857 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002858 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002859 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002860
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002861#ifdef CFG_CRYPTO_RSASSA_NA1
2862 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2863 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2864 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2865 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2866#endif
2867
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002868 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002869 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002870 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002871 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002872
2873 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002874 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002875 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002876 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002877
2878 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002879 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002880 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002881 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2882
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002883 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2884 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002885 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002886 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002887 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002888
2889 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2890 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002891 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002892 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2893 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002894 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002895
2896 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2897 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002898 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002899 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2900 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002901 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002902
2903 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2904 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002905 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002906 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2907 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002908 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002909
2910 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2911 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002912 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002913 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2914 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002915 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2916
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002917 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002918 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002919 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002920 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002921 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002922 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002923 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002924 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002925 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002926 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002927 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002928 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
2929
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002930 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2931 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002932 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002933 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2934 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002935 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002936 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2937 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002938 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002939 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2940 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002941 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002942 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2943 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002944 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002945 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2946 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002947 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
2948
2949 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002950 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002951 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002952 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002953 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002954 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002955 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002956 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002957 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002958 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002959 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002960 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002961 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002962 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002963 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002964 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002965 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002966 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002967 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002968 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002969 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002970 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002971 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002972 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002973 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002974 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002975 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002976 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002977 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002978 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002979 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002980 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002981 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002982 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002983 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002984 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002985 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002986 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002987 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002988 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002989 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002990 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002991 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002992 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002993 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
2994
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002995 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2996 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002997 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002998 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002999 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003000 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3001 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003002 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003003 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3004 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003005 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003006 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3007 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003008 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003009 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3010 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003011 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003012 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3013 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003014 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003015 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3016 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3019 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003020 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003021 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3022 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003023 ac_rsassa_vect15, ARRAY, WITH_SALT),
3024
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003025 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003026 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003027 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003028 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003029 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003030 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003031 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003032 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003033 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003034 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003035 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003036 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3037
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003038 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3039 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003040 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003041 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3042 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003043 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003044 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3045 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003046 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003047 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3048 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003049 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003050 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3051 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003052 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003053 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3054 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003055 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3056
3057 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003058 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003059 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3060 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003061 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3062 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3063 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3064 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3065 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3066 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3067 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3068 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3069 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3070 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3071 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3072 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3073 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3074 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3075 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3076 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3077 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3078 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3079 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3080 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3081 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3082 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3083 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3084 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3085 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3086 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3087 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3088 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003089 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3090 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3091 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3092 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3093 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3094 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003095 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3096 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003097 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3098 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3099 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3100 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3101 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3102 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3103 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3104 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3105 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3106 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3107 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3108 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3109 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3110 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3111 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3112 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3113 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3114 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3115 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3116 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3117 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3118 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3119 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3120 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3121 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3122 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3123 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3124 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003125 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003126 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3127 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3128 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3129 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3130 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3131 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3132 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3133 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3134 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3135 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3136 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3137 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3138 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3139 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3140 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3141 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3142 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3143 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3144 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3145 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3146 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3147 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3148 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3149 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3150 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3151 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3152 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3153 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3154 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3155 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003156 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3157 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3158 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3159 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003160 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3161 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003162 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3163 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3164 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3165 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3166 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3167 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3168 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3169 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3170 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3171 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3172 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3173 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3174 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3175 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3176 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3177 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3178 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3179 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3180 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3181 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3182 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3183 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3184 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3185 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3186 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3187 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3188 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3189 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003190 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003191 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3192 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003193 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3194 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3195 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3196 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3197 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3198 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3199 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3200 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3201 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3202 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3203 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3204 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3205 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3206 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3207 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3208 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3209 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3210 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3211 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3212 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3213 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3214 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3215 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3216 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3217 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3218 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3219 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3220 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003221 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3222 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3223 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3224 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3225 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003226 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3227 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3229 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3230 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3231 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3232 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3233 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3234 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3235 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003256 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3257 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003258
3259 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003260 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003261 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3262 nist_186_2_ecdsa_testvector_1),
3263 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3264 nist_186_2_ecdsa_testvector_1),
3265 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3266 nist_186_2_ecdsa_testvector_2),
3267 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3268 nist_186_2_ecdsa_testvector_2),
3269 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3270 nist_186_2_ecdsa_testvector_3),
3271 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3272 nist_186_2_ecdsa_testvector_3),
3273 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3274 nist_186_2_ecdsa_testvector_4),
3275 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3276 nist_186_2_ecdsa_testvector_4),
3277 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3278 nist_186_2_ecdsa_testvector_5),
3279 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3280 nist_186_2_ecdsa_testvector_5),
3281 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3282 nist_186_2_ecdsa_testvector_6),
3283 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3284 nist_186_2_ecdsa_testvector_6),
3285 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3286 nist_186_2_ecdsa_testvector_7),
3287 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3288 nist_186_2_ecdsa_testvector_7),
3289 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3290 nist_186_2_ecdsa_testvector_8),
3291 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3292 nist_186_2_ecdsa_testvector_8),
3293 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3294 nist_186_2_ecdsa_testvector_9),
3295 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3296 nist_186_2_ecdsa_testvector_9),
3297 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3298 nist_186_2_ecdsa_testvector_10),
3299 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3300 nist_186_2_ecdsa_testvector_10),
3301 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3302 nist_186_2_ecdsa_testvector_11),
3303 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3304 nist_186_2_ecdsa_testvector_11),
3305 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3306 nist_186_2_ecdsa_testvector_12),
3307 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3308 nist_186_2_ecdsa_testvector_12),
3309 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3310 nist_186_2_ecdsa_testvector_13),
3311 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3312 nist_186_2_ecdsa_testvector_13),
3313 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3314 nist_186_2_ecdsa_testvector_14),
3315 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3316 nist_186_2_ecdsa_testvector_14),
3317 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3318 nist_186_2_ecdsa_testvector_15),
3319 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3320 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003321 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003322 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3323 nist_186_2_ecdsa_testvector_16),
3324 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3325 nist_186_2_ecdsa_testvector_16),
3326 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3327 nist_186_2_ecdsa_testvector_17),
3328 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3329 nist_186_2_ecdsa_testvector_17),
3330 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3331 nist_186_2_ecdsa_testvector_18),
3332 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3333 nist_186_2_ecdsa_testvector_18),
3334 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3335 nist_186_2_ecdsa_testvector_19),
3336 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3337 nist_186_2_ecdsa_testvector_19),
3338 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3339 nist_186_2_ecdsa_testvector_20),
3340 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3341 nist_186_2_ecdsa_testvector_20),
3342 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3343 nist_186_2_ecdsa_testvector_21),
3344 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3345 nist_186_2_ecdsa_testvector_21),
3346 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3347 nist_186_2_ecdsa_testvector_22),
3348 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3349 nist_186_2_ecdsa_testvector_22),
3350 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3351 nist_186_2_ecdsa_testvector_23),
3352 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3353 nist_186_2_ecdsa_testvector_23),
3354 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3355 nist_186_2_ecdsa_testvector_24),
3356 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3357 nist_186_2_ecdsa_testvector_24),
3358 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3359 nist_186_2_ecdsa_testvector_25),
3360 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3361 nist_186_2_ecdsa_testvector_25),
3362 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3363 nist_186_2_ecdsa_testvector_26),
3364 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3365 nist_186_2_ecdsa_testvector_26),
3366 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3367 nist_186_2_ecdsa_testvector_27),
3368 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3369 nist_186_2_ecdsa_testvector_27),
3370 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3371 nist_186_2_ecdsa_testvector_28),
3372 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3373 nist_186_2_ecdsa_testvector_28),
3374 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3375 nist_186_2_ecdsa_testvector_29),
3376 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3377 nist_186_2_ecdsa_testvector_29),
3378 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3379 nist_186_2_ecdsa_testvector_30),
3380 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3381 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003382 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003383 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3384 nist_186_2_ecdsa_testvector_31),
3385 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3386 nist_186_2_ecdsa_testvector_31),
3387 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3388 nist_186_2_ecdsa_testvector_32),
3389 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3390 nist_186_2_ecdsa_testvector_32),
3391 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3392 nist_186_2_ecdsa_testvector_33),
3393 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3394 nist_186_2_ecdsa_testvector_33),
3395 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3396 nist_186_2_ecdsa_testvector_34),
3397 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3398 nist_186_2_ecdsa_testvector_34),
3399 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3400 nist_186_2_ecdsa_testvector_35),
3401 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3402 nist_186_2_ecdsa_testvector_35),
3403 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3404 nist_186_2_ecdsa_testvector_36),
3405 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3406 nist_186_2_ecdsa_testvector_36),
3407 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3408 nist_186_2_ecdsa_testvector_37),
3409 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3410 nist_186_2_ecdsa_testvector_37),
3411 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3412 nist_186_2_ecdsa_testvector_38),
3413 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3414 nist_186_2_ecdsa_testvector_38),
3415 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3416 nist_186_2_ecdsa_testvector_39),
3417 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3418 nist_186_2_ecdsa_testvector_39),
3419 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3420 nist_186_2_ecdsa_testvector_40),
3421 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3422 nist_186_2_ecdsa_testvector_40),
3423 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3424 nist_186_2_ecdsa_testvector_41),
3425 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3426 nist_186_2_ecdsa_testvector_41),
3427 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3428 nist_186_2_ecdsa_testvector_42),
3429 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3430 nist_186_2_ecdsa_testvector_42),
3431 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3432 nist_186_2_ecdsa_testvector_43),
3433 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3434 nist_186_2_ecdsa_testvector_43),
3435 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3436 nist_186_2_ecdsa_testvector_44),
3437 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3438 nist_186_2_ecdsa_testvector_44),
3439 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3440 nist_186_2_ecdsa_testvector_45),
3441 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3442 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003443 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003444 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3445 nist_186_2_ecdsa_testvector_46),
3446 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3447 nist_186_2_ecdsa_testvector_46),
3448 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3449 nist_186_2_ecdsa_testvector_47),
3450 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3451 nist_186_2_ecdsa_testvector_47),
3452 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3453 nist_186_2_ecdsa_testvector_48),
3454 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3455 nist_186_2_ecdsa_testvector_48),
3456 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3457 nist_186_2_ecdsa_testvector_49),
3458 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3459 nist_186_2_ecdsa_testvector_49),
3460 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3461 nist_186_2_ecdsa_testvector_50),
3462 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3463 nist_186_2_ecdsa_testvector_50),
3464 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3465 nist_186_2_ecdsa_testvector_51),
3466 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3467 nist_186_2_ecdsa_testvector_51),
3468 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3469 nist_186_2_ecdsa_testvector_52),
3470 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3471 nist_186_2_ecdsa_testvector_52),
3472 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3473 nist_186_2_ecdsa_testvector_53),
3474 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3475 nist_186_2_ecdsa_testvector_53),
3476 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3477 nist_186_2_ecdsa_testvector_54),
3478 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3479 nist_186_2_ecdsa_testvector_54),
3480 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3481 nist_186_2_ecdsa_testvector_55),
3482 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3483 nist_186_2_ecdsa_testvector_55),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3485 nist_186_2_ecdsa_testvector_56),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3487 nist_186_2_ecdsa_testvector_56),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3489 nist_186_2_ecdsa_testvector_57),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3491 nist_186_2_ecdsa_testvector_57),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3493 nist_186_2_ecdsa_testvector_58),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3495 nist_186_2_ecdsa_testvector_58),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3497 nist_186_2_ecdsa_testvector_59),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3499 nist_186_2_ecdsa_testvector_59),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3501 nist_186_2_ecdsa_testvector_60),
3502 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3503 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003504 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003505 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3506 nist_186_2_ecdsa_testvector_61),
3507 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3508 nist_186_2_ecdsa_testvector_61),
3509 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3510 nist_186_2_ecdsa_testvector_62),
3511 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3512 nist_186_2_ecdsa_testvector_62),
3513 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3514 nist_186_2_ecdsa_testvector_63),
3515 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3516 nist_186_2_ecdsa_testvector_63),
3517 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3518 nist_186_2_ecdsa_testvector_64),
3519 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3520 nist_186_2_ecdsa_testvector_64),
3521 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3522 nist_186_2_ecdsa_testvector_65),
3523 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3524 nist_186_2_ecdsa_testvector_65),
3525 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3526 nist_186_2_ecdsa_testvector_66),
3527 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3528 nist_186_2_ecdsa_testvector_66),
3529 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3530 nist_186_2_ecdsa_testvector_67),
3531 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3532 nist_186_2_ecdsa_testvector_67),
3533 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3534 nist_186_2_ecdsa_testvector_68),
3535 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3536 nist_186_2_ecdsa_testvector_68),
3537 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3538 nist_186_2_ecdsa_testvector_69),
3539 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3540 nist_186_2_ecdsa_testvector_69),
3541 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3542 nist_186_2_ecdsa_testvector_70),
3543 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3544 nist_186_2_ecdsa_testvector_70),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3546 nist_186_2_ecdsa_testvector_71),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3548 nist_186_2_ecdsa_testvector_71),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3550 nist_186_2_ecdsa_testvector_72),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3552 nist_186_2_ecdsa_testvector_72),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3554 nist_186_2_ecdsa_testvector_73),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3556 nist_186_2_ecdsa_testvector_73),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3558 nist_186_2_ecdsa_testvector_74),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3560 nist_186_2_ecdsa_testvector_74),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3562 nist_186_2_ecdsa_testvector_75),
3563 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3564 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003565 /* [K-163] - GP NOT SUPPORTED */
3566 /* [K-233] - GP NOT SUPPORTED */
3567 /* [K-283] - GP NOT SUPPORTED */
3568 /* [K-409] - GP NOT SUPPORTED */
3569 /* [K-571] - GP NOT SUPPORTED */
3570 /* [B-163] - GP NOT SUPPORTED */
3571 /* [B-233] - GP NOT SUPPORTED */
3572 /* [B-283] - GP NOT SUPPORTED */
3573 /* [B-409] - GP NOT SUPPORTED */
3574 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003575
3576 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3577 gmt_0003_part5_c2_sm2_testvector),
3578 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3579 gmt_0003_part5_c2_sm2_testvector),
3580 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3581 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003582
3583 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3584 gmt_003_part5_a2),
3585 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3586 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003587};
3588
Valerii Chubarab9863c2022-08-12 07:42:29 +00003589static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3590
3591 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3592 ed25519_rfc_8032_7_1, 0),
3593 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3594 ed25519_rfc_8032_7_1, 0),
3595
3596 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3597 ed25519ctx_rfc_8032_7_2, 0),
3598 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3599 ed25519ctx_rfc_8032_7_2, 0),
3600
3601 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3602 ed25519ph_rfc_8032_7_3, 1),
3603 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3604 ed25519ph_rfc_8032_7_3, 1),
3605};
3606
Pascal Brandc639ac82015-07-02 08:53:34 +02003607static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3608 uint32_t max_key_size, uint32_t key_type,
3609 TEE_Attribute *attrs, size_t num_attrs,
3610 TEE_ObjectHandle *handle)
3611{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003612 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003613
3614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3615 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3616 max_key_size, handle)))
3617 return false;
3618
3619 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3620 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3621 num_attrs)))
3622 return false;
3623
3624 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003625 uint8_t out[512] = { };
3626 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003627
3628 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3629 continue;
3630
Pascal Brandc639ac82015-07-02 08:53:34 +02003631 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3632 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3633 attrs[n].attributeID, out, &out_size)))
3634 return false;
3635
Pascal Brand3e143ee2015-07-15 17:17:16 +02003636 if (out_size < attrs[n].content.ref.length) {
3637 memmove(out + (attrs[n].content.ref.length - out_size),
3638 out,
3639 attrs[n].content.ref.length);
3640 memset(out, 0, attrs[n].content.ref.length - out_size);
3641 out_size = attrs[n].content.ref.length;
3642 }
3643
Pascal Brandc639ac82015-07-02 08:53:34 +02003644 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3645 attrs[n].content.ref.length, out, out_size))
3646 return false;
3647 }
3648
3649 return true;
3650}
3651
Jerome Forissier26393882022-03-09 21:22:30 +01003652#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3653
Pascal Brandc639ac82015-07-02 08:53:34 +02003654static void xtest_tee_test_4006(ADBG_Case_t *c)
3655{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003656 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003657 TEE_OperationHandle op = TEE_HANDLE_NULL;
3658 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3659 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003660 TEE_Attribute key_attrs[8] = { };
3661 TEE_Attribute algo_params[1] = { };
3662 size_t num_algo_params = 0;
3663 uint8_t out[512] = { };
3664 size_t out_size = 0;
3665 uint8_t out_enc[512] = { };
3666 size_t out_enc_size = 0;
3667 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003668 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003669 size_t max_key_size = 0;
3670 size_t num_key_attrs = 0;
3671 uint32_t ret_orig = 0;
3672 size_t n = 0;
3673 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003674 uint32_t pub_key_type = 0;
3675 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003676 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003677
3678 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3679 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3680 &ret_orig)))
3681 return;
3682
3683 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3684 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3685
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003686 if (tv->level > level)
3687 continue;
3688
Jerome Forissier4b03e282020-01-22 16:33:12 +01003689 if ((tv->algo == TEE_ALG_SM2_PKE ||
3690 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3691 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3692 TEE_ECC_CURVE_SM2)) {
3693 Do_ADBG_Log("SM2 not supported: skip subcase");
3694 continue;
3695 }
3696
Pascal Brandc639ac82015-07-02 08:53:34 +02003697 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3698 (int)n, (unsigned int)tv->algo,
3699 (int)tv->line);
3700
3701 /*
3702 * When signing or verifying we're working with the hash of
3703 * the payload.
3704 */
3705 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003706 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3707 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003708#if defined(CFG_CRYPTO_RSASSA_NA1)
3709 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3710 hash_algo = TEE_ALG_SHA256;
3711#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003712 else
3713 hash_algo = TEE_ALG_HASH_ALGO(
3714 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003715
3716 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3717 ta_crypt_cmd_allocate_operation(c, &session,
3718 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3719 goto out;
3720
3721 ptx_hash_size = sizeof(ptx_hash);
3722 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3723 ta_crypt_cmd_digest_do_final(c, & session, op,
3724 tv->ptx, tv->ptx_len, ptx_hash,
3725 &ptx_hash_size)))
3726 goto out;
3727
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003728 /*
3729 * When we use DSA algorithms, the size of the hash we
3730 * consider equals the min between the size of the
3731 * "subprime" in the key and the size of the hash
3732 */
3733 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3734 TEE_MAIN_ALGO_DSA) {
3735 if (tv->params.dsa.sub_prime_len <=
3736 ptx_hash_size)
3737 ptx_hash_size =
3738 tv->params.dsa.sub_prime_len;
3739 }
3740
Pascal Brandc639ac82015-07-02 08:53:34 +02003741 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3742 ta_crypt_cmd_free_operation(c, &session, op)))
3743 goto out;
3744 }
3745
3746 num_algo_params = 0;
3747 num_key_attrs = 0;
3748 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3749 case TEE_MAIN_ALGO_RSA:
3750 if (tv->params.rsa.salt_len > 0) {
3751 algo_params[0].attributeID =
3752 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3753 algo_params[0].content.value.a =
3754 tv->params.rsa.salt_len;
3755 algo_params[0].content.value.b = 0;
3756 num_algo_params = 1;
3757 }
3758
3759 max_key_size = tv->params.rsa.modulus_len * 8;
3760
3761 xtest_add_attr(&num_key_attrs, key_attrs,
3762 TEE_ATTR_RSA_MODULUS,
3763 tv->params.rsa.modulus,
3764 tv->params.rsa.modulus_len);
3765 xtest_add_attr(&num_key_attrs, key_attrs,
3766 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3767 tv->params.rsa.pub_exp,
3768 tv->params.rsa.pub_exp_len);
3769
3770 if (!ADBG_EXPECT_TRUE(c,
3771 create_key(c, &session,
3772 max_key_size,
3773 TEE_TYPE_RSA_PUBLIC_KEY,
3774 key_attrs,
3775 num_key_attrs,
3776 &pub_key_handle)))
3777 goto out;
3778
3779 xtest_add_attr(&num_key_attrs, key_attrs,
3780 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3781 tv->params.rsa.priv_exp,
3782 tv->params.rsa.priv_exp_len);
3783
3784 if (tv->params.rsa.prime1_len != 0) {
3785 xtest_add_attr(&num_key_attrs, key_attrs,
3786 TEE_ATTR_RSA_PRIME1,
3787 tv->params.rsa.prime1,
3788 tv->params.rsa.prime1_len);
3789 }
3790
3791 if (tv->params.rsa.prime2_len != 0) {
3792 xtest_add_attr(&num_key_attrs, key_attrs,
3793 TEE_ATTR_RSA_PRIME2,
3794 tv->params.rsa.prime2,
3795 tv->params.rsa.prime2_len);
3796 }
3797
3798 if (tv->params.rsa.exp1_len != 0) {
3799 xtest_add_attr(&num_key_attrs, key_attrs,
3800 TEE_ATTR_RSA_EXPONENT1,
3801 tv->params.rsa.exp1,
3802 tv->params.rsa.exp1_len);
3803 }
3804
3805 if (tv->params.rsa.exp2_len != 0) {
3806 xtest_add_attr(&num_key_attrs, key_attrs,
3807 TEE_ATTR_RSA_EXPONENT2,
3808 tv->params.rsa.exp2,
3809 tv->params.rsa.exp2_len);
3810 }
3811
3812 if (tv->params.rsa.coeff_len != 0) {
3813 xtest_add_attr(&num_key_attrs, key_attrs,
3814 TEE_ATTR_RSA_COEFFICIENT,
3815 tv->params.rsa.coeff,
3816 tv->params.rsa.coeff_len);
3817 }
3818
3819 if (!ADBG_EXPECT_TRUE(c,
3820 create_key(c, &session,
3821 max_key_size,
3822 TEE_TYPE_RSA_KEYPAIR,
3823 key_attrs,
3824 num_key_attrs,
3825 &priv_key_handle)))
3826 goto out;
3827 break;
3828
3829 case TEE_MAIN_ALGO_DSA:
3830 max_key_size = tv->params.dsa.prime_len * 8;
3831
3832 xtest_add_attr(&num_key_attrs, key_attrs,
3833 TEE_ATTR_DSA_PRIME,
3834 tv->params.dsa.prime,
3835 tv->params.dsa.prime_len);
3836 xtest_add_attr(&num_key_attrs, key_attrs,
3837 TEE_ATTR_DSA_SUBPRIME,
3838 tv->params.dsa.sub_prime,
3839 tv->params.dsa.sub_prime_len);
3840 xtest_add_attr(&num_key_attrs, key_attrs,
3841 TEE_ATTR_DSA_BASE,
3842 tv->params.dsa.base,
3843 tv->params.dsa.base_len);
3844 xtest_add_attr(&num_key_attrs, key_attrs,
3845 TEE_ATTR_DSA_PUBLIC_VALUE,
3846 tv->params.dsa.pub_val,
3847 tv->params.dsa.pub_val_len);
3848
3849 if (!ADBG_EXPECT_TRUE(c,
3850 create_key(c, &session, max_key_size,
3851 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3852 num_key_attrs, &pub_key_handle)))
3853 goto out;
3854
3855 xtest_add_attr(&num_key_attrs, key_attrs,
3856 TEE_ATTR_DSA_PRIVATE_VALUE,
3857 tv->params.dsa.priv_val,
3858 tv->params.dsa.priv_val_len);
3859
3860 if (!ADBG_EXPECT_TRUE(c,
3861 create_key(c, &session, max_key_size,
3862 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3863 num_key_attrs, &priv_key_handle)))
3864 goto out;
3865 break;
3866
Pascal Brand3e143ee2015-07-15 17:17:16 +02003867 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003868 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003869 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003870 switch (tv->algo) {
3871 case TEE_ALG_ECDSA_P192:
3872 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003873 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3874 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003875 break;
3876 case TEE_ALG_ECDSA_P224:
3877 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003878 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3879 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003880 break;
3881 case TEE_ALG_ECDSA_P256:
3882 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003883 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3884 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003885 break;
3886 case TEE_ALG_ECDSA_P384:
3887 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003888 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3889 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003890 break;
3891 case TEE_ALG_ECDSA_P521:
3892 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003893 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3894 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3895 break;
3896 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01003897 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003898 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3899 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003900 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003901 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01003902 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003903 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3904 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3905 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003906 default:
3907 curve = 0xFF;
3908 break;
3909 }
3910
3911 if (tv->algo == TEE_ALG_ECDSA_P521)
3912 max_key_size = 521;
3913 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003914 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003915
Jerome Forissier26393882022-03-09 21:22:30 +01003916 if (curve != XTEST_NO_CURVE)
3917 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003918 TEE_ATTR_ECC_CURVE, curve, 0);
3919 xtest_add_attr(&num_key_attrs, key_attrs,
3920 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003921 tv->params.ecc.public_x,
3922 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003923 xtest_add_attr(&num_key_attrs, key_attrs,
3924 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003925 tv->params.ecc.public_y,
3926 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003927
3928 if (!ADBG_EXPECT_TRUE(c,
3929 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003930 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003931 num_key_attrs, &pub_key_handle)))
3932 goto out;
3933
3934 xtest_add_attr(&num_key_attrs, key_attrs,
3935 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003936 tv->params.ecc.private,
3937 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003938
3939 if (!ADBG_EXPECT_TRUE(c,
3940 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003941 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003942 num_key_attrs, &priv_key_handle)))
3943 goto out;
3944 break;
3945
Pascal Brandc639ac82015-07-02 08:53:34 +02003946 default:
3947 ADBG_EXPECT_TRUE(c, false);
3948 goto out;
3949 }
3950
3951 out_size = sizeof(out);
3952 memset(out, 0, sizeof(out));
3953 switch (tv->mode) {
3954 case TEE_MODE_ENCRYPT:
3955 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3956 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003957 &op, tv->algo, TEE_MODE_ENCRYPT,
3958 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003959 goto out;
3960
3961 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3962 ta_crypt_cmd_set_operation_key(c, &session, op,
3963 pub_key_handle)))
3964 goto out;
3965
3966 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3967 ta_crypt_cmd_free_transient_object(c, &session,
3968 pub_key_handle)))
3969 goto out;
3970 pub_key_handle = TEE_HANDLE_NULL;
3971
3972 out_enc_size = sizeof(out_enc);
3973 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3974 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
3975 NULL, 0, tv->ptx, tv->ptx_len, out_enc,
3976 &out_enc_size)))
3977 goto out;
3978
3979 /*
3980 * A PS which is random is added when formatting the
3981 * message internally of the algorithm so we can't
3982 * verify against precomputed values, instead we use the
3983 * decrypt operation to see that output is correct.
3984 */
3985
3986 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3987 ta_crypt_cmd_free_operation(c, &session, op)))
3988 goto out;
3989
3990 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3991 ta_crypt_cmd_allocate_operation(c, &session,
3992 &op, tv->algo, TEE_MODE_DECRYPT,
3993 max_key_size)))
3994 goto out;
3995
3996 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3997 ta_crypt_cmd_set_operation_key(c, &session, op,
3998 priv_key_handle)))
3999 goto out;
4000
4001 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4002 ta_crypt_cmd_free_transient_object(c, &session,
4003 priv_key_handle)))
4004 goto out;
4005
4006 priv_key_handle = TEE_HANDLE_NULL;
4007
4008 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4009 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4010 NULL, 0, out_enc, out_enc_size, out,
4011 &out_size)))
4012 goto out;
4013
4014 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4015 out_size);
4016 break;
4017
4018 case TEE_MODE_DECRYPT:
4019 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4020 ta_crypt_cmd_allocate_operation(c, &session,
4021 &op, tv->algo, TEE_MODE_DECRYPT,
4022 max_key_size)))
4023 goto out;
4024
4025 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4026 ta_crypt_cmd_set_operation_key(c, &session, op,
4027 priv_key_handle)))
4028 goto out;
4029
4030 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4031 ta_crypt_cmd_free_transient_object(c, &session,
4032 priv_key_handle)))
4033 goto out;
4034
4035 priv_key_handle = TEE_HANDLE_NULL;
4036
4037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4038 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4039 NULL, 0, tv->ctx, tv->ctx_len, out,
4040 &out_size)))
4041 goto out;
4042
4043 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4044 out_size);
4045 break;
4046
4047 case TEE_MODE_VERIFY:
4048 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4049 ta_crypt_cmd_allocate_operation(c, &session,
4050 &op, tv->algo, TEE_MODE_VERIFY,
4051 max_key_size)))
4052 goto out;
4053
4054 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4055 ta_crypt_cmd_set_operation_key(c, &session, op,
4056 pub_key_handle)))
4057 goto out;
4058
4059 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4060 ta_crypt_cmd_free_transient_object(c, &session,
4061 pub_key_handle)))
4062 goto out;
4063
4064 pub_key_handle = TEE_HANDLE_NULL;
4065
4066 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4067 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4068 algo_params, num_algo_params, ptx_hash,
4069 ptx_hash_size, tv->ctx, tv->ctx_len)))
4070 goto out;
4071 break;
4072
4073 case TEE_MODE_SIGN:
4074 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4075 ta_crypt_cmd_allocate_operation(c, &session,
4076 &op, tv->algo, TEE_MODE_SIGN,
4077 max_key_size)))
4078 goto out;
4079
4080 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4081 ta_crypt_cmd_set_operation_key(c, &session, op,
4082 priv_key_handle)))
4083 goto out;
4084
4085 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4086 ta_crypt_cmd_free_transient_object(c, &session,
4087 priv_key_handle)))
4088 goto out;
4089
4090 priv_key_handle = TEE_HANDLE_NULL;
4091
4092 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4093 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4094 algo_params, num_algo_params, ptx_hash,
4095 ptx_hash_size, out, &out_size)))
4096 goto out;
4097
4098 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4099 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004100 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004101 tv->algo == TEE_ALG_DSA_SHA224 ||
4102 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004103 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004104 TEE_MAIN_ALGO_ECDSA ||
4105 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004106 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4107 ta_crypt_cmd_free_operation(c, &session,
4108 op)))
4109 goto out;
4110 /*
4111 * The salt or K is random so we can't verify
4112 * signing against precomputed values, instead
4113 * we use the verify operation to see that
4114 * output is correct.
4115 */
4116 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4117 ta_crypt_cmd_allocate_operation(c,
4118 &session, &op, tv->algo,
4119 TEE_MODE_VERIFY, max_key_size)))
4120 goto out;
4121
4122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4123 ta_crypt_cmd_set_operation_key(c,
4124 &session, op, pub_key_handle)))
4125 goto out;
4126
4127 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4128 ta_crypt_cmd_free_transient_object(c,
4129 &session, pub_key_handle)))
4130 goto out;
4131
4132 pub_key_handle = TEE_HANDLE_NULL;
4133
4134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4135 ta_crypt_cmd_asymmetric_verify(c,
4136 &session, op, algo_params,
4137 num_algo_params, ptx_hash,
4138 ptx_hash_size, out, out_size)))
4139 goto out;
4140 } else {
4141 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4142 tv->ctx_len, out,
4143 out_size);
4144 }
4145 break;
4146
4147 default:
4148 break;
4149 }
4150
4151 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4152 ta_crypt_cmd_free_operation(c, &session, op)))
4153 goto out;
4154
4155 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4156 ta_crypt_cmd_free_transient_object(c, &session,
4157 pub_key_handle)))
4158 goto out;
4159 pub_key_handle = TEE_HANDLE_NULL;
4160
4161 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4162 ta_crypt_cmd_free_transient_object(c, &session,
4163 priv_key_handle)))
4164 goto out;
4165
4166 priv_key_handle = TEE_HANDLE_NULL;
4167
4168 Do_ADBG_EndSubCase(c, NULL);
4169 }
4170out:
4171 TEEC_CloseSession(&session);
4172}
Jens Wiklander14f48872018-06-29 15:30:13 +02004173ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4174 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004175
4176#define KEY_ATTR(x, y) { #x, (x), y }
4177
4178struct key_attrs {
4179 const char *name;
4180 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004181 /*
4182 * When keysize_check != 0: size of attribute is checked
4183 * Expected value is key_size bits except for DH in which case it is
4184 * the value of keysize_check.
4185 */
4186 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004187};
4188
4189static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4190 TEE_ObjectHandle key, uint32_t key_size,
4191 struct key_attrs *attrs, size_t num_attrs)
4192{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004193 uint8_t out[2048] = { };
4194 size_t out_size = 0;
4195 size_t n = 0;
4196 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004197
4198 for (m = 0; m < num_attrs; m++) {
4199 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4200 out_size = sizeof(out);
4201 memset(out, 0, sizeof(out));
4202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4203 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4204 key, attrs[m].attr, out, &out_size)))
4205 return false;
4206
4207 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004208 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004209 key_size / 8);
4210
4211 if (out_size > 0) {
4212 /* Check that buffer isn't all zeroes */
4213 for (n = 0; n < out_size; n++)
4214 if (out[n] != 0)
4215 break;
4216 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4217 out_size))
4218 return false;
4219 }
4220 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004221 uint32_t a = 0;
4222 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004223
4224 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4225 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4226 attrs[m].attr, &a, &b)))
4227 return false;
4228 }
4229 }
4230 return true;
4231}
4232
4233static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4234 TEE_ObjectHandle key, uint32_t key_size)
4235{
4236 const struct key_attrs attrs[] = {
4237 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4238 };
4239
4240 return test_keygen_attributes(c, s, key, key_size,
4241 (struct key_attrs *)&attrs,
4242 ARRAY_SIZE(attrs));
4243}
4244
4245
4246static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4247 TEE_ObjectHandle key, uint32_t key_size)
4248{
4249 const struct key_attrs attrs[] = {
4250 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4251 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4252 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4253 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4254 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4255 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4256 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4257 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4258 };
4259
4260 return test_keygen_attributes(c, s, key, key_size,
4261 (struct key_attrs *)&attrs,
4262 ARRAY_SIZE(attrs));
4263}
4264
Pascal Brande61133f2015-07-08 15:38:37 +02004265static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4266 TEE_ObjectHandle key, uint32_t key_size)
4267{
4268 const struct key_attrs attrs[] = {
4269 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4270 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4271 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4272 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4273 };
4274
4275 return test_keygen_attributes(c, s, key, key_size,
4276 (struct key_attrs *)&attrs,
4277 ARRAY_SIZE(attrs));
4278}
4279
Pascal Brandc639ac82015-07-02 08:53:34 +02004280static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004281 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004282{
4283 const struct key_attrs attrs[] = {
4284 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4285 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4286 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4287 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4288 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4289 };
4290
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004291 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004292 (struct key_attrs *)&attrs,
4293 ARRAY_SIZE(attrs));
4294}
4295
4296static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4297 TEE_ObjectHandle key, uint32_t key_size)
4298{
4299 const struct key_attrs attrs[] = {
4300 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4301 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4302 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4303 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4304 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4305 };
4306
4307 return test_keygen_attributes(c, s, key, key_size,
4308 (struct key_attrs *)&attrs,
4309 ARRAY_SIZE(attrs));
4310}
4311
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004312static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4313 TEE_ObjectHandle key, uint32_t key_size)
4314{
4315 const struct key_attrs attrs[] = {
4316 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4317 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4318 };
4319
4320 return test_keygen_attributes(c, s, key, key_size,
4321 (struct key_attrs *)&attrs,
4322 ARRAY_SIZE(attrs));
4323}
4324
Valerii Chubarab9863c2022-08-12 07:42:29 +00004325static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4326 TEE_ObjectHandle key, uint32_t key_size)
4327{
4328 const struct key_attrs attrs[] = {
4329 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4330 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4331 };
4332
4333 return test_keygen_attributes(c, s, key, key_size,
4334 (struct key_attrs *)&attrs,
4335 ARRAY_SIZE(attrs));
4336}
4337
Pascal Brandc639ac82015-07-02 08:53:34 +02004338static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4339 uint32_t key_type, uint32_t check_keysize,
4340 uint32_t key_size,
4341 TEE_Attribute *params, size_t param_count)
4342{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004343 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004344 bool ret_val = true;
4345
4346 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4347 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4348 &key)))
4349 return false;
4350
4351 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4352 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4353 param_count)))
4354 return false;
4355
4356 switch (key_type) {
4357 case TEE_TYPE_DES:
4358 case TEE_TYPE_DES3:
4359 ret_val = ADBG_EXPECT_TRUE(c,
4360 test_secret_value(c, s, key,
4361 key_size + key_size / 7));
4362 break;
4363 case TEE_TYPE_AES:
4364 case TEE_TYPE_HMAC_MD5:
4365 case TEE_TYPE_HMAC_SHA1:
4366 case TEE_TYPE_HMAC_SHA224:
4367 case TEE_TYPE_HMAC_SHA256:
4368 case TEE_TYPE_HMAC_SHA384:
4369 case TEE_TYPE_HMAC_SHA512:
4370 case TEE_TYPE_GENERIC_SECRET:
4371 ret_val = ADBG_EXPECT_TRUE(c,
4372 test_secret_value(c, s, key, key_size));
4373 break;
4374
4375 case TEE_TYPE_RSA_KEYPAIR:
4376 ret_val = ADBG_EXPECT_TRUE(c,
4377 test_rsa_key_pair(c, s, key, key_size));
4378 break;
4379
Pascal Brande61133f2015-07-08 15:38:37 +02004380 case TEE_TYPE_ECDSA_KEYPAIR:
4381 case TEE_TYPE_ECDH_KEYPAIR:
4382 ret_val = ADBG_EXPECT_TRUE(c,
4383 test_ecc_key_pair(c, s, key, key_size));
4384 break;
4385
Pascal Brandc639ac82015-07-02 08:53:34 +02004386 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004387 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004388 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004389 break;
4390
4391 case TEE_TYPE_DSA_KEYPAIR:
4392 ret_val = ADBG_EXPECT_TRUE(c,
4393 test_dsa_key_pair(c, s, key, key_size));
4394 break;
4395
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004396 case TEE_TYPE_X25519_KEYPAIR:
4397 ret_val = ADBG_EXPECT_TRUE(c,
4398 test_x25519_key_pair(c, s, key, key_size));
4399 break;
4400
Valerii Chubarab9863c2022-08-12 07:42:29 +00004401 case TEE_TYPE_ED25519_KEYPAIR:
4402 ret_val = ADBG_EXPECT_TRUE(c,
4403 test_ed25519_key_pair(c, s, key, key_size));
4404 break;
4405
Pascal Brandc639ac82015-07-02 08:53:34 +02004406 default:
4407 ret_val = false;
4408 break;
4409 }
4410
4411 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4412 ta_crypt_cmd_free_transient_object(c, s, key)))
4413 return false;
4414
4415 return ret_val;
4416}
4417
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004418struct key_types_noparam {
4419 unsigned level;
4420 const char *name;
4421 uint32_t key_type;
4422 uint32_t quanta;
4423 uint32_t min_size;
4424 uint32_t max_size;
4425};
4426
4427static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4428 const struct key_types_noparam *key_types,
4429 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004430{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004431 size_t n = 0;
4432 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004433
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004434 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004435 uint32_t min_size = key_types[n].min_size;
4436 uint32_t max_size = key_types[n].max_size;
4437 uint32_t quanta = key_types[n].quanta;
4438
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004439 if (key_types[n].level > level)
4440 continue;
4441
Pascal Brandc639ac82015-07-02 08:53:34 +02004442 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4443
4444 for (key_size = min_size; key_size <= max_size;
4445 key_size += quanta) {
4446 if (!ADBG_EXPECT_TRUE(c,
4447 generate_and_test_key(c, session, key_types
4448 [n].key_type, 1, key_size, NULL, 0)))
4449 break;
4450 }
4451
4452 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4453 }
4454}
4455
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004456static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004457{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004458 TEEC_Session session = { };
4459 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004460 static const struct key_types_noparam key_types[] = {
4461 { 0, "AES", TEE_TYPE_AES, 64, 128,
4462 256 /* valid sizes 128, 192, 256 */ },
4463 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4464 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4465 168 /* valid sizes 112, 168 */ },
4466 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4467 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4468 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4469 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4470 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4471 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4472 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4473 };
4474
4475 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4476 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4477 &ret_orig)))
4478 return;
4479
4480 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4481
4482 TEEC_CloseSession(&session);
4483}
4484ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4485 "Test TEE Internal API Generate Symmetric key");
4486
4487static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4488{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004489 TEEC_Session session = { };
4490 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004491 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004492#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004493 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4494 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004495#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004496 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004497#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004498 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4499 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4500 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004501#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004502 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4503 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4504 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4505 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4506 };
4507
4508 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4509 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4510 &ret_orig)))
4511 return;
4512
4513 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4514
4515 TEEC_CloseSession(&session);
4516}
4517ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4518 "Test TEE Internal API Generate RSA key");
4519
4520static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4521{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004522 TEEC_Session session = { };
4523 uint32_t ret_orig = 0;
4524 size_t n = 0;
4525 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004526 /*
4527 * Note that the key size parameter is not used when creating the keys
4528 * but specifying these sizes make it possible to test the expected size
4529 * of the private value. This also means that the keysize must match the
4530 * size of p or what is specified in private_bits or the equvivalent
4531 * size of the subprime parameter.
4532 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004533 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004534
4535#define XTEST_DH_GK_DATA(vect) \
4536 ARRAY(vect ## _p), \
4537 ARRAY(vect ## _g), \
4538 &vect ## _private_bits, \
4539 0, 0
4540#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4541 ARRAY(vect ## _p), \
4542 ARRAY(vect ## _g), \
4543 &vect ## _private_bits, \
4544 ARRAY(vect ## _subprime)
4545 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004546 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004547 uint32_t key_size;
4548 const uint8_t *p;
4549 size_t p_len;
4550 const uint8_t *g;
4551 size_t g_len;
4552 const uint32_t *private_bits;
4553 const uint8_t *subprime;
4554 size_t subprime_len;
4555 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004556 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004557 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004558 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004559 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004560 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004561 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004562 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004563 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004564 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004565 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004566 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004567 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004568 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004569 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004570 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004571 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004572 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004573 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004574 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004575 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004576 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004577 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004578 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004579 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004580 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004581 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004582 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004583 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004584 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004585 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004586 };
4587
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004588 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4589 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4590 &ret_orig)))
4591 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004592
4593 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004594 if (key_types[n].level > level)
4595 continue;
4596
Pascal Brandc639ac82015-07-02 08:53:34 +02004597 Do_ADBG_BeginSubCase(c,
4598 "Generate DH key %d bits - Private bits = %d",
4599 key_types[n].key_size,
4600 *key_types[n].private_bits);
4601 param_count = 0;
4602
4603 xtest_add_attr(&param_count, params,
4604 TEE_ATTR_DH_PRIME,
4605 key_types[n].p, key_types[n].p_len);
4606
4607 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4608 key_types[n].g, key_types[n].g_len);
4609
4610 if (key_types[n].private_bits != 0) {
4611 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4612
4613 params[param_count].content.value.a =
4614 *key_types[n].private_bits;
4615
4616 params[param_count].content.value.b = 0;
4617 param_count++;
4618 }
4619
4620 if (key_types[n].subprime != 0) {
4621 xtest_add_attr(&param_count, params,
4622 TEE_ATTR_DH_SUBPRIME,
4623 key_types[n].subprime,
4624 key_types[n].subprime_len);
4625 }
4626
4627 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004628 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004629 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004630 key_types[n]. key_size, params, param_count)))
4631 break;
4632
4633 Do_ADBG_EndSubCase(c,
4634 "Generate DH key %d bits - Private bits = %d",
4635 key_types[n].key_size,
4636 *key_types[n].private_bits);
4637 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004638
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004639 TEEC_CloseSession(&session);
4640}
4641ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4642 "Test TEE Internal API Generate DH key");
4643
4644static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004645{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004646 TEEC_Session session = { };
4647 uint32_t ret_orig = 0;
4648 size_t n = 0;
4649 size_t param_count = 0;
4650 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004651
4652#define XTEST_DSA_GK_DATA(vect) \
4653 ARRAY(vect ## _p), \
4654 ARRAY(vect ## _g), \
4655 ARRAY(vect ## _q)
4656 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004657 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004658 uint32_t key_size;
4659 const uint8_t *prime;
4660 size_t prime_len;
4661 const uint8_t *base;
4662 size_t base_len;
4663 const uint8_t *sub_prime;
4664 size_t sub_prime_len;
4665 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004666 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004667 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004668 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4669 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4670 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4671 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4672 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4673 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4674 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4675 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004676 };
4677
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004678 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4679 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4680 &ret_orig)))
4681 return;
4682
Pascal Brandc639ac82015-07-02 08:53:34 +02004683 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004684 if (key_types[n].level > level)
4685 continue;
4686
Pascal Brandc639ac82015-07-02 08:53:34 +02004687 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4688 key_types[n].key_size);
4689 param_count = 0;
4690
4691
4692 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4693 key_types[n].prime, key_types[n].prime_len);
4694
4695 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4696 key_types[n].sub_prime,
4697 key_types[n].sub_prime_len);
4698
4699 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4700 key_types[n].base, key_types[n].base_len);
4701
4702 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004703 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004704 1, key_types[n]. key_size, params,
4705 param_count)))
4706 break;
4707
4708 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4709 key_types[n].key_size);
4710 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004711
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004712 TEEC_CloseSession(&session);
4713}
4714ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4715 "Test TEE Internal API Generate DSA key");
4716
4717static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004718{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004719 TEEC_Session session = { };
4720 uint32_t ret_orig = 0;
4721 size_t n = 0;
4722 size_t param_count = 0;
4723 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004724
4725 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004726 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004727 const char *name;
4728 uint32_t algo;
4729 uint32_t curve;
4730 uint32_t key_size;
4731 } key_types[] = {
4732 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004733 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4734 192 },
4735 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4736 224 },
4737 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4738 256 },
4739 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4740 384 },
4741 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4742 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004743
4744 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004745 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4746 192 },
4747 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4748 224 },
4749 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4750 256 },
4751 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4752 384 },
4753 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4754 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004755 };
4756
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004757 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4758 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4759 &ret_orig)))
4760 return;
4761
Pascal Brande61133f2015-07-08 15:38:37 +02004762 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004763 if (key_types[n].level > level)
4764 continue;
4765
Pascal Brande61133f2015-07-08 15:38:37 +02004766 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4767 param_count = 0;
4768
4769 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4770 key_types[n].curve, 0);
4771
4772 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004773 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004774 0, key_types[n].key_size, params,
4775 param_count)))
4776 break;
4777
4778 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4779 }
Pascal Brande61133f2015-07-08 15:38:37 +02004780
Pascal Brandc639ac82015-07-02 08:53:34 +02004781 TEEC_CloseSession(&session);
4782}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004783ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4784 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004785
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004786static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4787{
4788 TEEC_Session session = { };
4789 uint32_t ret_orig = 0;
4790
4791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4792 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4793 NULL, &ret_orig)))
4794 return;
4795
Jerome Forissier366179c2022-06-28 10:12:58 +02004796 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4797 TEE_ECC_CURVE_25519)) {
4798 Do_ADBG_Log("X25519 not supported: skip subcase");
4799 goto out;
4800 }
4801
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004802 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4803
4804 if (!ADBG_EXPECT_TRUE(c,
4805 generate_and_test_key(c, &session,
4806 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4807 NULL, 0)))
4808 return;
4809
4810 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004811out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004812 TEEC_CloseSession(&session);
4813}
4814ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4815 "Test TEE Internal API Generate X25519 key");
4816
Valerii Chubarab9863c2022-08-12 07:42:29 +00004817
4818static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4819{
4820 TEEC_Session session = { };
4821 uint32_t ret_orig = 0;
4822
4823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4824 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4825 NULL, &ret_orig)))
4826 return;
4827
4828 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
4829 TEE_ECC_CURVE_25519)) {
4830 Do_ADBG_Log("ED25519 not supported: skip subcase");
4831 goto out;
4832 }
4833
4834 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
4835
4836 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
4837 TEE_TYPE_ED25519_KEYPAIR,
4838 0, 256, NULL, 0));
4839
4840 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
4841out:
4842 TEEC_CloseSession(&session);
4843}
4844ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
4845 "Test TEE Internal API Generate ed25519 key");
4846
Pascal Brandc639ac82015-07-02 08:53:34 +02004847static void xtest_tee_test_4008(ADBG_Case_t *c)
4848{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004849 TEEC_Session session = { };
4850 uint32_t ret_orig = 0;
4851 TEE_OperationHandle op = TEE_HANDLE_NULL;
4852 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4853 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4854 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004855 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004856 uint8_t out[2048] = { };
4857 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004858
4859 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4860 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4861 &ret_orig)))
4862 return;
4863
4864 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4865
4866 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4867 ta_crypt_cmd_allocate_operation(c, &session, &op,
4868 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4869 derive_key_max_keysize)))
4870 goto out;
4871
4872 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4873 ta_crypt_cmd_allocate_transient_object(c, & session,
4874 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4875 &key_handle)))
4876 goto out;
4877
4878 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4879 ARRAY(derive_key_dh_prime));
4880
4881 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4882 ARRAY(derive_key_dh_base));
4883
4884 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4885 ARRAY(derive_key_dh_public_value));
4886
4887 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4888 ARRAY(derive_key_dh_private_value));
4889
4890 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4891 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4892 params, param_count)))
4893 goto out;
4894
4895 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4896 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4897 goto out;
4898
4899 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4900 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4901 goto out;
4902
4903 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4904 ta_crypt_cmd_allocate_transient_object(c, &session,
4905 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4906 &sv_handle)))
4907 goto out;
4908
Pascal Brand2b92b642015-07-16 13:29:42 +02004909 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004910 param_count = 0;
4911
4912 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4913 ARRAY(derive_key_dh_public_value_2));
4914
4915 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4916 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
4917 param_count)))
4918 goto out;
4919
4920 out_size = sizeof(out);
4921 memset(out, 0, sizeof(out));
4922 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4923 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
4924 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4925 goto out;
4926
4927 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
4928 sizeof(derive_key_dh_shared_secret), out,
4929 out_size))
4930 goto out;
4931
4932 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4933 ta_crypt_cmd_free_operation(c, &session, op)))
4934 goto out;
4935
4936 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4937 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
4938 goto out;
4939out:
4940 Do_ADBG_EndSubCase(c, "Derive DH key success");
4941 TEEC_CloseSession(&session);
4942}
Jens Wiklander14f48872018-06-29 15:30:13 +02004943ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
4944 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02004945
4946static void xtest_tee_test_4009(ADBG_Case_t *c)
4947{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004948 TEEC_Session session = { };
4949 uint32_t ret_orig = 0;
4950 TEE_OperationHandle op = TEE_HANDLE_NULL;
4951 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4952 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4953 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02004954 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004955 uint8_t out[2048] = { };
4956 size_t out_size = 0;
4957 uint32_t size_bytes = 0;
4958 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05304959 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02004960
4961 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4962 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4963 &ret_orig)))
4964 return;
4965
4966 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
4967 pt = &derive_key_ecdh[i];
4968
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02004969 if (pt->level > level)
4970 continue;
4971
Pascal Brand2b92b642015-07-16 13:29:42 +02004972 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
4973 pt->algo);
4974 size_bytes = (pt->keysize + 7) / 8;
4975 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4976 ta_crypt_cmd_allocate_operation(c, &session, &op,
4977 pt->algo,
4978 TEE_MODE_DERIVE, pt->keysize)))
4979 goto out;
4980
4981 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4982 ta_crypt_cmd_allocate_transient_object(c, & session,
4983 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
4984 &key_handle)))
4985 goto out;
4986
4987 param_count = 0;
4988 xtest_add_attr_value(&param_count, params,
4989 TEE_ATTR_ECC_CURVE, pt->curve, 0);
4990 xtest_add_attr(&param_count, params,
4991 TEE_ATTR_ECC_PRIVATE_VALUE,
4992 pt->private, size_bytes);
4993 /*
Cedric Auger719047c2019-09-11 12:08:14 +02004994 * The public value is not used, but we should provide a valid
4995 * one to avoid rejection in case TEE_PopulateTransientObject()
4996 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02004997 */
4998 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004999 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5000 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005001 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005002 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5003 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005004
5005 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5006 ta_crypt_cmd_populate_transient_object(c,
5007 &session,
5008 key_handle, params, param_count)))
5009 goto out;
5010
5011 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5012 ta_crypt_cmd_set_operation_key(c, &session, op,
5013 key_handle)))
5014 goto out;
5015
5016 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5017 ta_crypt_cmd_free_transient_object(c, & session,
5018 key_handle)))
5019 goto out;
5020
5021 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5022 ta_crypt_cmd_allocate_transient_object(c, &session,
5023 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5024 &sv_handle)))
5025 goto out;
5026
5027 /* reuse but reset params and param-count */
5028 param_count = 0;
5029
5030 xtest_add_attr(&param_count, params,
5031 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5032 pt->public_x, size_bytes);
5033 xtest_add_attr(&param_count, params,
5034 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5035 pt->public_y, size_bytes);
5036
5037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5038 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5039 params, param_count)))
5040 goto out;
5041
5042 out_size = sizeof(out);
5043 memset(out, 0, sizeof(out));
5044 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5045 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5046 sv_handle,
5047 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5048 goto out;
5049
5050 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5051 out, out_size))
5052 goto out;
5053
5054 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5055 ta_crypt_cmd_free_operation(c, &session, op)))
5056 goto out;
5057
5058 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5059 ta_crypt_cmd_free_transient_object(c, &session,
5060 sv_handle)))
5061 goto out;
5062
5063 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5064 pt->algo);
5065 }
5066
5067 goto noerror;
5068
5069out:
5070 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5071
5072noerror:
5073 TEEC_CloseSession(&session);
5074}
Jens Wiklander14f48872018-06-29 15:30:13 +02005075ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5076 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005077
5078static void xtest_tee_test_4010(ADBG_Case_t *c)
5079{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005080 TEEC_Session session = { };
5081 uint32_t ret_orig = 0;
5082 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005083 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5084 static const TEE_Attribute attr = {
5085 .attributeID = TEE_ATTR_SECRET_VALUE,
5086 .content.ref.buffer = (void *)large_key,
5087 .content.ref.length = sizeof(large_key),
5088 };
5089
5090 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5091 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5092 &ret_orig)))
5093 return;
5094
5095 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5096 ta_crypt_cmd_allocate_transient_object(c, &session,
5097 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5098 goto out;
5099
5100 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5101 ta_crypt_cmd_populate_transient_object(c, &session, o,
5102 &attr, 1));
5103
5104out:
5105 TEEC_CloseSession(&session);
5106}
Jens Wiklander14f48872018-06-29 15:30:13 +02005107ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5108 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005109
5110static void xtest_tee_test_4011(ADBG_Case_t *c)
5111{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005112 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005113 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005114 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5115 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5116 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5117 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5118 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5119 uint32_t ret_orig = 0;
5120 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5121 uint8_t out[1024] = { };
5122 uint8_t tmp[1024] = { };
5123 size_t out_size = 0;
5124 size_t tmp_size = 0;
5125 size_t n = 0;
5126 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005127 size_t i = 0;
5128
5129 /* Setup session, initialize message to sign, create a keypair */
5130 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5131 &crypt_user_ta_uuid, NULL, &ret_orig)))
5132 return;
5133 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5134 &s, in, sizeof(in))))
5135 goto out;
5136 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5137 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5138 goto out;
5139 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5140 key, key_size, NULL, 0)))
5141 goto out;
5142
5143 /* Allocate operations for sign, verify, encrypt and decrypt */
5144 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5145 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5146 key_size)))
5147 goto out;
5148 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5149 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5150 key_size)))
5151 goto out;
5152 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5153 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5154 goto out;
5155 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5156 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5157 goto out;
5158
5159 /* Assign the keypair to all operations */
5160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5161 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5162 goto out;
5163 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5164 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5165 goto out;
5166 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5167 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5168 goto out;
5169 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5170 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5171 goto out;
5172
5173 /*
5174 * The core of the test case is inspired by the one in libtomcrypt:
5175 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5176 *
5177 * Testcase for Bleichenbacher attack
5178 *
5179 * (1) Create a valid signature
5180 * (2) Check that it can be verified
5181 * (3) Transform the package to fetch plain text (using the encrypt
5182 * operation in GP TEE Internal API)
5183 * (4) Forge the structure of PKCS#1-EMSA encoded data
5184 * (4.1) Search for start and end of the padding string
5185 * (4.2) Move the signature to the front of the padding string
5186 * (4.3) Zero the message until the end
5187 * (5) Transform the package back (using the decrypt operation in
5188 * GP TEE Internal API)
5189 * (6) The result should not be valid if the implementation is robust.
5190 */
5191
5192
5193 for (i = 0; i < 9; i++) {
5194 Do_ADBG_Log("Iteration %zu", i);
5195
5196 /* 1 */
5197 out_size = sizeof(out);
5198 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5199 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5200 in, sizeof(in), out, &out_size)))
5201 goto out;
5202
5203 /* 2 */
5204 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5205 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5206 in, sizeof(in), out, out_size)))
5207 goto out;
5208
5209 /* 3 */
5210 tmp_size = sizeof(tmp);
5211 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5212 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5213 out, out_size, tmp, &tmp_size)))
5214 goto out;
5215
Etienne Carriere0953bf02018-12-21 15:36:25 +01005216 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5217 goto out;
5218
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005219 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005220 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005221 if (tmp[n] == 0xff)
5222 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005223
5224 /* Shall find at least a padding start before buffer end */
5225 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5226 goto out;
5227
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005228 for (m = n + 1; m < tmp_size; m++)
5229 if (tmp[m] != 0xff)
5230 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005231
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005232 /* 4.2 */
5233 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005234
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005235 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005236 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005237
5238 /* Prevent overrun when zeroing buffer end */
5239 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5240 goto out;
5241
Etienne Carriere0953bf02018-12-21 15:36:25 +01005242 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005243
5244 /* 5 */
5245 out_size = sizeof(out);
5246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5247 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5248 tmp, tmp_size, out, &out_size)))
5249 goto out;
5250
5251 /* 6 */
5252 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5253 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5254 in, sizeof(in), out, out_size)))
5255 goto out;
5256 }
5257
5258out:
5259 TEEC_CloseSession(&s);
5260}
Jens Wiklander14f48872018-06-29 15:30:13 +02005261ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5262 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005263
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005264static void xtest_tee_test_4012(ADBG_Case_t *c)
5265{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005266 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005267 TEEC_Session session = { };
5268 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005269 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5270 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005271 uint8_t pool_input[32] = { };
5272 time_t t = 0;
5273 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005274
5275 t = time(NULL);
5276 tm_local = *localtime(&t);
5277
5278 memcpy((void *)pool_input, (void *)&tm_local,
5279 sizeof(pool_input) < sizeof(tm_local) ?
5280 sizeof(pool_input) : sizeof(tm_local));
5281
5282
5283 op.params[0].tmpref.buffer = pool_input;
5284 op.params[0].tmpref.size = sizeof(pool_input);
5285 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5286 TEEC_NONE,
5287 TEEC_NONE,
5288 TEEC_NONE);
5289 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5290 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5291 &ret_orig)))
5292 return;
5293
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005294 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5295 &op, &ret_orig);
5296 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5297 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5298 TEEC_ORIGIN_TRUSTED_APP))
5299 Do_ADBG_Log("System PTA not available, skipping test 4012");
5300 else
5301 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5302
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005303 TEEC_CloseSession(&session);
5304}
Jens Wiklander14f48872018-06-29 15:30:13 +02005305ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5306 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005307
5308static void xtest_tee_test_4013(ADBG_Case_t *c)
5309{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005310 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005311 TEEC_Session session = { };
5312 uint32_t ret_orig = 0;
5313 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5314 uint8_t key[32] = { };
5315 uint8_t extra_data[32] = { };
5316
5317 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5318 TEEC_NONE,
5319 TEEC_NONE,
5320 TEEC_NONE);
5321 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5322 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5323 NULL, &ret_orig)))
5324 return;
5325
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005326 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5327 &op, &ret_orig);
5328 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5329 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5330 TEEC_ORIGIN_TRUSTED_APP)) {
5331 Do_ADBG_Log("System PTA not available, skipping test 4013");
5332 goto out;
5333 }
5334 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005335
5336 /* Negative test using non-secure memory */
5337 memset(&op, 0, sizeof(op));
5338 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5339 TEEC_MEMREF_TEMP_OUTPUT,
5340 TEEC_NONE,
5341 TEEC_NONE);
5342
5343 op.params[0].tmpref.buffer = extra_data;
5344 op.params[0].tmpref.size = sizeof(extra_data);
5345 op.params[1].tmpref.buffer = key;
5346 op.params[1].tmpref.size = sizeof(key);
5347 (void)ADBG_EXPECT_TEEC_RESULT(c,
5348 TEEC_ERROR_SECURITY,
5349 TEEC_InvokeCommand(&session,
5350 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5351 &op,
5352 &ret_orig));
5353
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005354out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005355 TEEC_CloseSession(&session);
5356}
5357ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5358 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005359
5360static void xtest_tee_test_4014(ADBG_Case_t *c)
5361{
5362 TEEC_Session session = { };
5363 uint32_t ret_orig = 0;
5364 TEE_OperationHandle op = TEE_HANDLE_NULL;
5365 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5366 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5367 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5368 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5369 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5370 TEE_Attribute params[9] = { };
5371 size_t param_count = 0;
5372 uint8_t out[128] = { };
5373 size_t out_size = 0;
5374 uint8_t conf_A[32] = { };
5375 uint8_t conf_B[32] = { };
5376
5377 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5378 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5379 &ret_orig)))
5380 return;
5381
5382 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5383 TEE_ECC_CURVE_SM2)) {
5384 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5385 goto out;
5386 }
5387
5388 Do_ADBG_BeginSubCase(c, "Initiator side");
5389
5390 /*
5391 * Key exchange protocol running on user A's side. A is initiator.
5392 */
5393
5394 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5395 ta_crypt_cmd_allocate_operation(c, &session, &op,
5396 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5397 goto out;
5398
5399 /* Allocate and initialize keypair of user A */
5400
5401 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5402 ta_crypt_cmd_allocate_transient_object(c, &session,
5403 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5404 goto out;
5405
5406 param_count = 0;
5407
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005408 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5409 ARRAY(gmt_003_part5_b2_public_xA));
5410
5411 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5412 ARRAY(gmt_003_part5_b2_public_yA));
5413
5414 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5415 ARRAY(gmt_003_part5_b2_private_A));
5416
5417 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5418 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5419 params, param_count)))
5420 goto out;
5421
5422 /*
5423 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5424 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5425 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5426 * user B.
5427 */
5428
5429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5430 ta_crypt_cmd_allocate_transient_object(c, &session,
5431 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5432 goto out;
5433
5434 param_count = 0;
5435
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005436 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5437 ARRAY(gmt_003_part5_b2_eph_public_xA));
5438
5439 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5440 ARRAY(gmt_003_part5_b2_eph_public_yA));
5441
5442 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5443 ARRAY(gmt_003_part5_b2_eph_private_A));
5444
5445 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5446 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5447 params, param_count)))
5448 goto out;
5449
5450 /* Associate user A keys with operation */
5451
5452 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5453 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5454 eph_keyA)))
5455 goto out;
5456
5457 /* Keys have been set, free key objects */
5458
5459 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5460 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5461 goto out;
5462
5463 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5464 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5465 goto out;
5466
5467 /* Allocate output object */
5468
5469 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5470 ta_crypt_cmd_allocate_transient_object(c, &session,
5471 TEE_TYPE_GENERIC_SECRET,
5472 sizeof(gmt_003_part5_b2_shared_secret),
5473 &sv_handle)))
5474 goto out;
5475
5476 /* Set key derivation parameters: user A role, user B information */
5477
5478 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5479 params[0].content.value.a = 0; /* Initiator role */
5480 params[0].content.value.b = 0; /* Not used */
5481 param_count = 1;
5482
5483 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5484 ARRAY(gmt_003_part5_b2_public_xB));
5485
5486 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5487 ARRAY(gmt_003_part5_b2_public_yB));
5488
5489 xtest_add_attr(&param_count, params,
5490 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5491 ARRAY(gmt_003_part5_b2_eph_public_xB));
5492
5493 xtest_add_attr(&param_count, params,
5494 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5495 ARRAY(gmt_003_part5_b2_eph_public_yB));
5496
5497 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5498 ARRAY(gmt_003_part5_b2_id_A));
5499
5500 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5501 ARRAY(gmt_003_part5_b2_id_B));
5502
5503 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5504 ARRAY(gmt_003_part5_b2_conf_B));
5505
5506 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5507 ARRAY(conf_A));
5508
5509 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5510 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5511 param_count)))
5512 goto out;
5513
5514 out_size = sizeof(out);
5515 memset(out, 0, sizeof(out));
5516 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5517 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5518 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5519 goto out;
5520
5521 /* Check derived key */
5522 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5523 sizeof(gmt_003_part5_b2_shared_secret), out,
5524 out_size))
5525 goto out;
5526
5527 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5528 ta_crypt_cmd_free_operation(c, &session, op)))
5529 goto out;
5530
5531 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5532 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5533 goto out;
5534
5535 Do_ADBG_EndSubCase(c, "Initiator side");
5536
5537 Do_ADBG_BeginSubCase(c, "Responder side");
5538
5539 /*
5540 * Key derivation on user B's side
5541 */
5542
5543 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5544 ta_crypt_cmd_allocate_operation(c, &session, &op,
5545 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5546 goto out;
5547
5548 /* Allocate and initialize keypair of user B */
5549
5550 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5551 ta_crypt_cmd_allocate_transient_object(c, &session,
5552 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5553 goto out;
5554
5555 param_count = 0;
5556
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005557 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5558 ARRAY(gmt_003_part5_b2_public_xB));
5559
5560 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5561 ARRAY(gmt_003_part5_b2_public_yB));
5562
5563 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5564 ARRAY(gmt_003_part5_b2_private_B));
5565
5566 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5567 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5568 params, param_count)))
5569 goto out;
5570
5571 /* Allocate and set ephemeral key of user B */
5572
5573 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5574 ta_crypt_cmd_allocate_transient_object(c, &session,
5575 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5576 goto out;
5577
5578 param_count = 0;
5579
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005580 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5581 ARRAY(gmt_003_part5_b2_eph_public_xB));
5582
5583 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5584 ARRAY(gmt_003_part5_b2_eph_public_yB));
5585
5586 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5587 ARRAY(gmt_003_part5_b2_eph_private_B));
5588
5589 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5590 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5591 params, param_count)))
5592 goto out;
5593
5594 /* Associate user B keys with operation */
5595
5596 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5597 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5598 eph_keyB)))
5599 goto out;
5600
5601 /* Keys have been set, free key objects */
5602
5603 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5604 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5605 goto out;
5606
5607 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5608 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5609 goto out;
5610
5611 /* Allocate output object */
5612
5613 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5614 ta_crypt_cmd_allocate_transient_object(c, &session,
5615 TEE_TYPE_GENERIC_SECRET,
5616 sizeof(gmt_003_part5_b2_shared_secret),
5617 &sv_handle)))
5618 goto out;
5619
5620 /* Set key derivation parameters: user B role, user A information */
5621
5622 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5623 params[0].content.value.a = 1; /* Responder role */
5624 params[0].content.value.b = 0; /* Not used */
5625 param_count = 1;
5626
5627 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5628 ARRAY(gmt_003_part5_b2_public_xA));
5629
5630 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5631 ARRAY(gmt_003_part5_b2_public_yA));
5632
5633 xtest_add_attr(&param_count, params,
5634 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5635 ARRAY(gmt_003_part5_b2_eph_public_xA));
5636
5637 xtest_add_attr(&param_count, params,
5638 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5639 ARRAY(gmt_003_part5_b2_eph_public_yA));
5640
5641 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5642 ARRAY(gmt_003_part5_b2_id_A));
5643
5644 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5645 ARRAY(gmt_003_part5_b2_id_B));
5646
5647 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5648 ARRAY(gmt_003_part5_b2_conf_A));
5649
5650 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5651 ARRAY(conf_B));
5652
5653 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5654 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5655 param_count)))
5656 goto out;
5657
5658 out_size = sizeof(out);
5659 memset(out, 0, sizeof(out));
5660 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5661 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5662 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5663 goto out;
5664
5665 /* Check derived key */
5666 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5667 sizeof(gmt_003_part5_b2_shared_secret), out,
5668 out_size))
5669 goto out;
5670
5671 Do_ADBG_EndSubCase(c, "Responder side");
5672
5673out:
5674 TEEC_CloseSession(&session);
5675}
5676ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5677 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005678
5679static void xtest_tee_test_4015(ADBG_Case_t *c)
5680{
5681 TEEC_Session session = { };
5682 uint32_t ret_orig = 0;
5683 TEE_OperationHandle op = TEE_HANDLE_NULL;
5684 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5685 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5686 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5687 TEE_Attribute params[2] = { };
5688 size_t param_count = 0;
5689 uint8_t out[32] = { };
5690 size_t out_size = 0;
5691 char case_str[40] = "Alice side computes shared secret";
5692
5693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5694 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5695 &ret_orig)))
5696 return;
5697
5698 Do_ADBG_BeginSubCase(c, "%s", case_str);
5699
5700 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5701 TEE_ECC_CURVE_25519)) {
5702 Do_ADBG_Log("X25519 not supported: skip subcase");
5703 goto out;
5704 }
5705
5706 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5707 ta_crypt_cmd_allocate_operation(c, &session, &op,
5708 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5709 goto out;
5710
5711 /* Allocate and initialize keypair of Alice */
5712 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5713 ta_crypt_cmd_allocate_transient_object(c, &session,
5714 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5715 goto out;
5716
5717 param_count = 0;
5718
5719 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5720 ARRAY(x25519_alice_public));
5721
5722 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5723 ARRAY(x25519_alice_private));
5724
5725 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5726 ta_crypt_cmd_populate_transient_object(c, &session,
5727 key_alice, params, param_count)))
5728 goto out;
5729
5730 /* Associate Alices's keys with operation */
5731 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5732 ta_crypt_cmd_set_operation_key(c, &session, op,
5733 key_alice)))
5734 goto out;
5735
5736 /* Keys have been set, free key objects */
5737 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5738 ta_crypt_cmd_free_transient_object(c, &session,
5739 key_alice)))
5740 goto out;
5741
5742 /* Allocate shared secret output object */
5743 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5744 ta_crypt_cmd_allocate_transient_object(c, &session,
5745 TEE_TYPE_GENERIC_SECRET,
5746 sizeof(x25519_shared_secret), &sv_handle)))
5747 goto out;
5748
5749 /* Reset params */
5750 param_count = 0;
5751
5752 /* Set Bob's public key for Alice side */
5753 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5754 ARRAY(x25519_bob_public));
5755
5756 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5757 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5758 params, param_count)))
5759 goto out;
5760
5761 out_size = sizeof(out);
5762 memset(out, 0, sizeof(out));
5763 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5764 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5765 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5766 &out_size)))
5767 goto out;
5768
5769 /* Check derived key */
5770 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5771 sizeof(x25519_shared_secret), out,
5772 out_size))
5773 goto out;
5774
5775 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5776 ta_crypt_cmd_free_operation(c, &session, op)))
5777 goto out;
5778
5779 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5780 ta_crypt_cmd_free_transient_object(c, &session,
5781 sv_handle)))
5782 goto out;
5783
5784 Do_ADBG_EndSubCase(c, "%s", case_str);
5785
5786 strncpy(case_str, "Bob side computes shared secret",
5787 sizeof(case_str) - 1);
5788
5789 Do_ADBG_BeginSubCase(c, "%s", case_str);
5790
5791 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5792 ta_crypt_cmd_allocate_operation(c, &session, &op,
5793 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5794 goto out;
5795
5796 /* Allocate and initialize keypair of Bob */
5797 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5798 ta_crypt_cmd_allocate_transient_object(c, &session,
5799 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5800 goto out;
5801
5802 /* Reset params */
5803 param_count = 0;
5804
5805 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5806 ARRAY(x25519_bob_public));
5807
5808 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5809 ARRAY(x25519_bob_private));
5810
5811 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5812 ta_crypt_cmd_populate_transient_object(c, &session,
5813 key_bob, params, param_count)))
5814 goto out;
5815
5816 /* Associate Bob's keys with operation */
5817 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5818 ta_crypt_cmd_set_operation_key(c, &session, op,
5819 key_bob)))
5820 goto out;
5821
5822 /* Keys have been set, free key objects */
5823 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5824 ta_crypt_cmd_free_transient_object(c, &session,
5825 key_bob)))
5826 goto out;
5827
5828 /* Allocate shared secret output object */
5829 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5830 ta_crypt_cmd_allocate_transient_object(c, &session,
5831 TEE_TYPE_GENERIC_SECRET,
5832 sizeof(x25519_shared_secret), &sv_handle)))
5833 goto out;
5834
5835 /* Reset params */
5836 param_count = 0;
5837
5838 /* Set Alice's public key for Bob side */
5839 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5840 ARRAY(x25519_alice_public));
5841
5842 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5843 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5844 params, param_count)))
5845 goto out;
5846
5847 out_size = sizeof(out);
5848 memset(out, 0, sizeof(out));
5849 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5850 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5851 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5852 &out_size)))
5853 goto out;
5854
5855 /* Check derived key */
5856 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5857 sizeof(x25519_shared_secret), out,
5858 out_size))
5859 goto out;
5860
5861 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5862 ta_crypt_cmd_free_operation(c, &session, op)))
5863 goto out;
5864
5865 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5866 ta_crypt_cmd_free_transient_object(c, &session,
5867 sv_handle)))
5868 goto out;
5869
5870out:
5871 Do_ADBG_EndSubCase(c, "%s", case_str);
5872 TEEC_CloseSession(&session);
5873}
5874ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
5875 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00005876
5877static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
5878{
5879 TEEC_Session session = { };
5880 TEE_OperationHandle op = TEE_HANDLE_NULL;
5881 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5882 TEE_Attribute key_attrs[2] = { };
5883 size_t num_key_attrs = 0;
5884 TEE_Attribute attrs[2] = { };
5885 size_t num_attrs = 0;
5886 uint8_t out[64] = { };
5887 size_t out_size = sizeof(out);
5888 size_t n = 0;
5889 uint32_t ret_orig = 0;
5890 size_t max_key_size = 0;
5891
5892 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5893 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5894 NULL, &ret_orig)))
5895 return;
5896
5897 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5898 TEE_ECC_CURVE_25519)) {
5899 Do_ADBG_Log("ED25519 not supported: skip subcase");
5900 goto out;
5901 }
5902
5903 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
5904 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
5905
5906 if (tv->algo != TEE_ALG_ED25519)
5907 continue;
5908
5909 num_attrs = 0;
5910 num_key_attrs = 0;
5911 max_key_size = tv->params.eddsa.private_len * 8;
5912
5913 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5914 ta_crypt_cmd_allocate_operation(c, &session, &op,
5915 TEE_ALG_ED25519, tv->mode, max_key_size)))
5916 goto out;
5917
5918 xtest_add_attr(&num_key_attrs, key_attrs,
5919 TEE_ATTR_ED25519_PUBLIC_VALUE,
5920 tv->params.eddsa.public,
5921 tv->params.eddsa.public_len);
5922
5923 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01005924 xtest_add_attr_value(&num_attrs, attrs,
5925 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00005926
5927 if (tv->params.eddsa.context_len > 0)
5928 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
5929 tv->params.eddsa.context,
5930 tv->params.eddsa.context_len);
5931
5932 switch (tv->mode) {
5933 case TEE_MODE_SIGN:
5934 xtest_add_attr(&num_key_attrs, key_attrs,
5935 TEE_ATTR_ED25519_PRIVATE_VALUE,
5936 tv->params.eddsa.private,
5937 tv->params.eddsa.private_len);
5938
5939 if (!ADBG_EXPECT_TRUE(c,
5940 create_key(c, &session, max_key_size,
5941 TEE_TYPE_ED25519_KEYPAIR,
5942 key_attrs, num_key_attrs,
5943 &key_handle)))
5944 goto out;
5945
5946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5947 ta_crypt_cmd_set_operation_key(c,
5948 &session, op, key_handle)))
5949 goto out;
5950
5951 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5952 ta_crypt_cmd_asymmetric_sign(c,
5953 &session, op,
5954 attrs, num_attrs, tv->ptx,
5955 tv->ptx_len, out, &out_size)))
5956 goto out;
5957
5958 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
5959
5960 break;
5961
5962 case TEE_MODE_VERIFY:
5963 if (!ADBG_EXPECT_TRUE(c,
5964 create_key(c, &session, max_key_size,
5965 TEE_TYPE_ED25519_PUBLIC_KEY,
5966 key_attrs, num_key_attrs,
5967 &key_handle)))
5968 goto out;
5969
5970 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5971 ta_crypt_cmd_set_operation_key(c,
5972 &session, op, key_handle)))
5973 goto out;
5974
5975 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5976 ta_crypt_cmd_asymmetric_verify(c, &session, op,
5977 attrs, num_attrs,
5978 tv->ptx,
5979 tv->ptx_len,
5980 tv->ctx,
5981 tv->ctx_len)))
5982 goto out;
5983 break;
5984
5985 default:
5986 break;
5987 }
5988
5989 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5990 ta_crypt_cmd_free_operation(c, &session, op)))
5991 goto out;
5992 }
5993out:
5994 TEEC_CloseSession(&session);
5995}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01005996ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00005997 "Test TEE Internal API ED25519 sign/verify");