blob: d4a7d0afdc0763d6bf9786781a722b049428f381 [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
Jens Wiklander72967ae2022-12-07 08:07:43 +0100925/* SHA-3 vectors from https://www.di-mgt.com.au/sha_testvectors.html */
926#define hash_data_sha3_in1 hash_data_sha256_in1
927
928static const uint8_t hash_data_sha3_224_out1[] = {
929 0xe6, 0x42, 0x82, 0x4c, 0x3f, 0x8c, 0xf2, 0x4a,
930 0xd0, 0x92, 0x34, 0xee, 0x7d, 0x3c, 0x76, 0x6f,
931 0xc9, 0xa3, 0xa5, 0x16, 0x8d, 0x0c, 0x94, 0xad,
932 0x73, 0xb4, 0x6f, 0xdf
933};
934
935static const uint8_t hash_data_sha3_256_out1[] = {
936 0x3a, 0x98, 0x5d, 0xa7, 0x4f, 0xe2, 0x25, 0xb2,
937 0x04, 0x5c, 0x17, 0x2d, 0x6b, 0xd3, 0x90, 0xbd,
938 0x85, 0x5f, 0x08, 0x6e, 0x3e, 0x9d, 0x52, 0x5b,
939 0x46, 0xbf, 0xe2, 0x45, 0x11, 0x43, 0x15, 0x32
940};
941
942static const uint8_t hash_data_sha3_384_out1[] = {
943 0xec, 0x01, 0x49, 0x82, 0x88, 0x51, 0x6f, 0xc9,
944 0x26, 0x45, 0x9f, 0x58, 0xe2, 0xc6, 0xad, 0x8d,
945 0xf9, 0xb4, 0x73, 0xcb, 0x0f, 0xc0, 0x8c, 0x25,
946 0x96, 0xda, 0x7c, 0xf0, 0xe4, 0x9b, 0xe4, 0xb2,
947 0x98, 0xd8, 0x8c, 0xea, 0x92, 0x7a, 0xc7, 0xf5,
948 0x39, 0xf1, 0xed, 0xf2, 0x28, 0x37, 0x6d, 0x25
949};
950
951static const uint8_t hash_data_sha3_512_out1[] = {
952 0xb7, 0x51, 0x85, 0x0b, 0x1a, 0x57, 0x16, 0x8a,
953 0x56, 0x93, 0xcd, 0x92, 0x4b, 0x6b, 0x09, 0x6e,
954 0x08, 0xf6, 0x21, 0x82, 0x74, 0x44, 0xf7, 0x0d,
955 0x88, 0x4f, 0x5d, 0x02, 0x40, 0xd2, 0x71, 0x2e,
956 0x10, 0xe1, 0x16, 0xe9, 0x19, 0x2a, 0xf3, 0xc9,
957 0x1a, 0x7e, 0xc5, 0x76, 0x47, 0xe3, 0x93, 0x40,
958 0x57, 0x34, 0x0b, 0x4c, 0xf4, 0x08, 0xd5, 0xa5,
959 0x65, 0x92, 0xf8, 0x27, 0x4e, 0xec, 0x53, 0xf0
960};
961
962/*
963 * SHAKE output generated with:
964 * https://asecuritysite.com/hash/shake?m=abc&l=54
965 */
966static const uint8_t hash_data_shake128_out1[] = {
967 0x58, 0x81, 0x09, 0x2d, 0xd8, 0x18, 0xbf, 0x5c,
968 0xf8, 0xa3, 0xdd, 0xb7, 0x93, 0xfb, 0xcb, 0xa7,
969 0x40, 0x97, 0xd5, 0xc5, 0x26, 0xa6, 0xd3, 0x5f,
970 0x97, 0xb8, 0x33, 0x51, 0x94, 0x0f, 0x2c, 0xc8,
971 0x44, 0xc5, 0x0a, 0xf3, 0x2a, 0xcd, 0x3f, 0x2c,
972 0xdd, 0x06, 0x65, 0x68, 0x70, 0x6f, 0x50, 0x9b,
973 0xc1, 0xbd, 0xde, 0x58, 0x29, 0x5d
974};
975
976static const uint8_t hash_data_shake256_out1[] = {
977 0x48, 0x33, 0x66, 0x60, 0x13, 0x60, 0xa8, 0x77,
978 0x1c, 0x68, 0x63, 0x08, 0x0c, 0xc4, 0x11, 0x4d,
979 0x8d, 0xb4, 0x45, 0x30, 0xf8, 0xf1, 0xe1, 0xee,
980 0x4f, 0x94, 0xea, 0x37, 0xe7, 0x8b, 0x57, 0x39,
981 0xd5, 0xa1, 0x5b, 0xef, 0x18, 0x6a, 0x53, 0x86,
982 0xc7, 0x57, 0x44, 0xc0, 0x52, 0x7e, 0x1f, 0xaa,
983 0x9f, 0x87, 0x26, 0xe4, 0x62, 0xa1
984};
985
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100986/*
987 * SM3
988 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100989 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100990 */
991static const uint8_t hash_data_sm3_a1_in[3] = "abc";
992
993static const uint8_t hash_data_sm3_a1_out[] = {
994 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
995 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
996 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
997 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
998};
999
1000/*
1001 * SM3
1002 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +01001003 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001004 */
1005static const uint8_t hash_data_sm3_a2_in[] = {
1006 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1007 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1008 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1009 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1010 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1011 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1012 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
1013 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
1014};
1015
1016static const uint8_t hash_data_sm3_a2_out[] = {
1017 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
1018 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
1019 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
1020 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
1021};
1022
Pascal Brandc639ac82015-07-02 08:53:34 +02001023struct xtest_hash_case {
1024 uint32_t algo;
1025 size_t in_incr;
1026 const uint8_t *in;
1027 size_t in_len;
1028 const uint8_t *out;
1029 size_t out_len;
1030};
1031
1032#define XTEST_HASH_CASE(algo, in_incr, in, out) \
1033 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
1034
1035static const struct xtest_hash_case hash_cases[] = {
1036 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
1037 hash_data_md5_out1),
1038 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
1039 hash_data_sha1_out1),
1040 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
1041 hash_data_sha224_out1),
1042 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
1043 hash_data_sha256_out1),
1044 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
1045 hash_data_sha256_out2),
1046 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
1047 hash_data_sha384_out1),
1048 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
1049 hash_data_sha512_out1),
Jens Wiklander72967ae2022-12-07 08:07:43 +01001050 XTEST_HASH_CASE(TEE_ALG_SHA3_224, 1, hash_data_sha3_in1,
1051 hash_data_sha3_224_out1),
1052 XTEST_HASH_CASE(TEE_ALG_SHA3_256, 1, hash_data_sha3_in1,
1053 hash_data_sha3_256_out1),
1054 XTEST_HASH_CASE(TEE_ALG_SHA3_384, 1, hash_data_sha3_in1,
1055 hash_data_sha3_384_out1),
1056 XTEST_HASH_CASE(TEE_ALG_SHA3_512, 1, hash_data_sha3_in1,
1057 hash_data_sha3_512_out1),
1058 XTEST_HASH_CASE(TEE_ALG_SHAKE128, 1, hash_data_sha3_in1,
1059 hash_data_shake128_out1),
1060 XTEST_HASH_CASE(TEE_ALG_SHAKE256, 1, hash_data_sha3_in1,
1061 hash_data_shake256_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +01001062 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
1063 hash_data_sm3_a1_out),
1064 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
1065 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001066};
1067
1068static void xtest_tee_test_4001(ADBG_Case_t *c)
1069{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001070 TEEC_Session session = { };
1071 uint32_t ret_orig = 0;
1072 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001073
1074 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1075 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1076 &ret_orig)))
1077 return;
1078
1079
1080 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001081 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1082 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1083 uint8_t out[64] = { };
1084 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001085
Jerome Forissier87b00c02020-01-22 16:33:12 +01001086 if (hash_cases[n].algo == TEE_ALG_SM3 &&
1087 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
1088 TEE_CRYPTO_ELEMENT_NONE)) {
1089 Do_ADBG_Log("SM3 not supported: skip subcase");
1090 continue;
1091 }
1092
Pascal Brandc639ac82015-07-02 08:53:34 +02001093 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
1094 (int)n, (unsigned int)hash_cases[n].algo);
1095
1096 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1097 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1098 hash_cases[n].algo,
1099 TEE_MODE_DIGEST, 0)))
1100 goto out;
1101
1102 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1103 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1104 hash_cases[n].algo,
1105 TEE_MODE_DIGEST, 0)))
1106 goto out;
1107
1108 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1109 ta_crypt_cmd_digest_update(c, &session, op1,
1110 hash_cases[n].in,
1111 hash_cases[n].in_incr)))
1112 goto out;
1113
1114 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1115 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1116 goto out;
1117
Jens Wiklander72967ae2022-12-07 08:07:43 +01001118 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001119 memset(out, 0, sizeof(out));
1120 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1121 ta_crypt_cmd_digest_do_final(c, &session, op2,
1122 hash_cases[n].in + hash_cases[n].in_incr,
1123 hash_cases[n].in_len - hash_cases[n].in_incr,
1124 out, &out_size)))
1125 goto out;
1126
1127 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1128 hash_cases[n].out_len, out, out_size);
1129
1130 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1131 ta_crypt_cmd_reset_operation(c, &session, op1)))
1132 goto out;
1133
Jens Wiklander72967ae2022-12-07 08:07:43 +01001134 out_size = hash_cases[n].out_len;
Pascal Brandc639ac82015-07-02 08:53:34 +02001135 memset(out, 0, sizeof(out));
1136 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1137 ta_crypt_cmd_digest_do_final(c, &session, op1,
1138 hash_cases[n].in,
1139 hash_cases[n].in_len, out,
1140 &out_size)))
1141 goto out;
1142
1143 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1144 hash_cases[n].out_len, out, out_size);
1145
Jerome Forissier1e05e262015-07-29 16:09:07 +02001146 /*
1147 * Invoke TEE_DigestDoFinal() a second time to check that state
1148 * was properly reset
1149 */
Jens Wiklander72967ae2022-12-07 08:07:43 +01001150 out_size = hash_cases[n].out_len;
Jerome Forissier1e05e262015-07-29 16:09:07 +02001151 memset(out, 0, sizeof(out));
1152 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1153 ta_crypt_cmd_digest_do_final(c, &session, op1,
1154 hash_cases[n].in,
1155 hash_cases[n].in_len, out,
1156 &out_size)))
1157 goto out;
1158
1159 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1160 hash_cases[n].out_len, out, out_size);
1161
Pascal Brandc639ac82015-07-02 08:53:34 +02001162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1163 ta_crypt_cmd_free_operation(c, &session, op1)))
1164 goto out;
1165
1166 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1167 ta_crypt_cmd_free_operation(c, &session, op2)))
1168 goto out;
1169
1170 Do_ADBG_EndSubCase(c, NULL);
1171 }
1172
1173out:
1174 TEEC_CloseSession(&session);
1175}
Jens Wiklander14f48872018-06-29 15:30:13 +02001176ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1177 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001178
Pascal Brandc639ac82015-07-02 08:53:34 +02001179struct xtest_mac_case {
1180 uint32_t algo;
1181 uint32_t key_type;
1182 const uint8_t *key;
1183 size_t key_len;
1184 size_t in_incr;
1185 const uint8_t *in;
1186 size_t in_len;
1187 const uint8_t *out;
1188 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001189 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001190};
1191
Jerome Forissier3dec7442019-01-30 17:50:05 +01001192#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001193 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001194 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1195
1196#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1197 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1198 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1199
1200#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1201 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1202 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001203
1204#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1205 XTEST_MAC_CASE((algo), (key_type), \
1206 mac_cbc_ ## vect ## _key, (in_incr), \
1207 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1208
1209#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1210 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1211 mac_cmac_ ## vect ## _key, (in_incr), \
1212 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1213
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001214#define XTEST_MAC_DES3_CMAC_CASE(vect, in_incr) \
1215 XTEST_MAC_CASE(TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, \
1216 mac_des3_cmac_ ## vect ## _key, (in_incr), \
1217 mac_des3_cmac_ ## vect ## _data, mac_des3_cmac_ ## vect ## _out)
1218
Pascal Brandc639ac82015-07-02 08:53:34 +02001219static const struct xtest_mac_case mac_cases[] = {
1220 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1221 mac_data_md5_key1,
1222 4, mac_data_md5_in1, mac_data_md5_out1),
1223 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1224 mac_data_sha1_key1,
1225 5, mac_data_sha1_in1, mac_data_sha1_out1),
1226 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1227 mac_data_sha224_key1,
1228 8, mac_data_sha224_in1, mac_data_sha224_out1),
1229 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1230 mac_data_sha256_key1,
1231 1, mac_data_sha256_in1, mac_data_sha256_out1),
1232 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1233 mac_data_sha256_key2,
1234 7, mac_data_sha256_in2, mac_data_sha256_out2),
1235 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1236 mac_data_sha384_key1,
1237 11, mac_data_sha384_in1, mac_data_sha384_out1),
1238 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1239 mac_data_sha512_key1,
1240 13, mac_data_sha512_in1, mac_data_sha512_out1),
1241
1242 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1243 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1244 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1245 17),
1246 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1247 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1248 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1249 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1250 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1251 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1252 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001253 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001254
1255 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1256 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1257 ARRAY_SIZE(mac_cmac_vect1_out) },
1258 XTEST_MAC_CMAC_CASE(vect2, 9),
1259 XTEST_MAC_CMAC_CASE(vect3, 9),
1260 XTEST_MAC_CMAC_CASE(vect4, 9),
1261 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1262 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1263 ARRAY_SIZE(mac_cmac_vect5_out) },
1264 XTEST_MAC_CMAC_CASE(vect6, 9),
1265 XTEST_MAC_CMAC_CASE(vect7, 9),
1266 XTEST_MAC_CMAC_CASE(vect8, 9),
1267 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1268 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1269 ARRAY_SIZE(mac_cmac_vect9_out) },
1270 XTEST_MAC_CMAC_CASE(vect10, 9),
1271 XTEST_MAC_CMAC_CASE(vect11, 9),
1272 XTEST_MAC_CMAC_CASE(vect12, 9),
Clement Faure21b347a2021-04-29 13:06:55 +02001273 XTEST_MAC_CMAC_CASE(vect12, 16),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001274
Alexander Zakharov0afe00c2021-02-10 19:06:48 +01001275 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect1_key,
1276 ARRAY_SIZE(mac_des3_cmac_vect1_key), 0, NULL, 0, mac_des3_cmac_vect1_out,
1277 ARRAY_SIZE(mac_des3_cmac_vect1_out) },
1278 XTEST_MAC_DES3_CMAC_CASE(vect2, 3),
1279 XTEST_MAC_DES3_CMAC_CASE(vect3, 9),
1280 XTEST_MAC_DES3_CMAC_CASE(vect4, 9),
1281 { TEE_ALG_DES3_CMAC, TEE_TYPE_DES3, mac_des3_cmac_vect5_key,
1282 ARRAY_SIZE(mac_des3_cmac_vect5_key), 0, NULL, 0, mac_des3_cmac_vect5_out,
1283 ARRAY_SIZE(mac_des3_cmac_vect5_out) },
1284 XTEST_MAC_DES3_CMAC_CASE(vect6, 3),
1285 XTEST_MAC_DES3_CMAC_CASE(vect7, 5),
1286 XTEST_MAC_DES3_CMAC_CASE(vect8, 9),
1287
Jerome Forissier9f17e262019-12-13 14:12:41 +01001288 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1289 mac_data_sm3_d31_key,
1290 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1291 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1292 mac_data_sm3_d32_key,
1293 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001294};
1295
1296static void xtest_tee_test_4002(ADBG_Case_t *c)
1297{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001298 TEEC_Session session = { };
1299 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1300 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Jerome Forissier4f419512021-07-07 14:56:10 +02001301 TEE_OperationHandle op3 = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001302 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1303 uint8_t out[64] = { };
1304 size_t out_size = 0;
1305 uint32_t ret_orig = 0;
1306 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001307
1308 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1309 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1310 &ret_orig)))
1311 return;
1312
1313 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001314 TEE_Attribute key_attr = { };
1315 size_t key_size = 0;
1316 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001317
1318 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1319 (int)n, (unsigned int)mac_cases[n].algo);
1320
1321 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1322 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1323 key_attr.content.ref.length = mac_cases[n].key_len;
1324
1325 key_size = key_attr.content.ref.length * 8;
1326 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1327 mac_cases[n].key_type == TEE_TYPE_DES3)
1328 /* Exclude parity in bit size of key */
1329 key_size -= key_size / 8;
1330
1331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1332 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1333 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1334 goto out;
1335
1336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1337 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1338 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1339 goto out;
1340
1341 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001342 ta_crypt_cmd_allocate_operation(c, &session, &op3,
1343 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1344 goto out;
1345
1346 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001347 ta_crypt_cmd_allocate_transient_object(c, &session,
1348 mac_cases[n].key_type, key_size, &key_handle)))
1349 goto out;
1350
1351 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1352 ta_crypt_cmd_populate_transient_object(c, &session,
1353 key_handle, &key_attr, 1)))
1354 goto out;
1355
1356 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1357 ta_crypt_cmd_set_operation_key(c, &session, op1,
1358 key_handle)))
1359 goto out;
1360
1361 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1362 ta_crypt_cmd_free_transient_object(c, &session,
1363 key_handle)))
1364 goto out;
1365
1366 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1367 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1368 goto out;
1369
Jerome Forissier4f419512021-07-07 14:56:10 +02001370 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1371 ta_crypt_cmd_copy_operation(c, &session, op3, op1)))
1372 goto out;
1373
Jerome Forissier3dec7442019-01-30 17:50:05 +01001374 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001375 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001376 while (offs + mac_cases[n].in_incr <
1377 mac_cases[n].in_len) {
1378 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1379 ta_crypt_cmd_mac_update(c, &session,
1380 op1, mac_cases[n].in + offs,
1381 mac_cases[n].in_incr)))
1382 goto out;
1383 offs += mac_cases[n].in_incr;
1384 if (!mac_cases[n].multiple_incr)
1385 break;
1386 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001387 }
1388
1389 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1390 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1391 goto out;
1392
1393 out_size = sizeof(out);
1394 memset(out, 0, sizeof(out));
1395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1396 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001397 mac_cases[n].in + offs,
1398 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001399 out, &out_size)))
1400 goto out;
1401
1402 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1403 mac_cases[n].out_len, out, out_size);
1404
1405 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1406 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1407 goto out;
1408
1409 out_size = sizeof(out);
1410 memset(out, 0, sizeof(out));
1411 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1412 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1413 mac_cases[n].in, mac_cases[n].in_len, out,
1414 &out_size)))
1415 goto out;
1416
1417 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1418 mac_cases[n].out_len, out, out_size);
1419
1420 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jerome Forissier4f419512021-07-07 14:56:10 +02001421 ta_crypt_cmd_mac_final_compare(c, &session, op3,
1422 mac_cases[n].in, mac_cases[n].in_len,
1423 mac_cases[n].out, mac_cases[n].out_len)))
1424 goto out;
1425
1426 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02001427 ta_crypt_cmd_free_operation(c, &session, op1)))
1428 goto out;
1429
1430 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1431 ta_crypt_cmd_free_operation(c, &session, op2)))
1432 goto out;
1433
Jerome Forissier4f419512021-07-07 14:56:10 +02001434 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1435 ta_crypt_cmd_free_operation(c, &session, op3)))
1436 goto out;
1437
Pascal Brandc639ac82015-07-02 08:53:34 +02001438 Do_ADBG_EndSubCase(c, NULL);
1439 }
1440out:
1441 TEEC_CloseSession(&session);
1442}
Jens Wiklander14f48872018-06-29 15:30:13 +02001443ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1444 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001445
Pascal Brandc639ac82015-07-02 08:53:34 +02001446static const uint8_t ciph_data_aes_key1[] = {
1447 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1448 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1449};
1450
Jerome Forissier0780ad42018-06-05 15:02:37 +02001451static const uint8_t ciph_data_aes_key2[] = {
1452 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1453 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1454};
1455
Pascal Brandc639ac82015-07-02 08:53:34 +02001456static const uint8_t ciph_data_des_key1[] = {
1457 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1458};
1459
1460static const uint8_t ciph_data_des_key2[] = {
1461 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1462};
1463
1464
1465static const uint8_t ciph_data_des3_key1[] = {
1466 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1467 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1468 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1469};
1470
1471static const uint8_t ciph_data_des3_key2[] = {
1472 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1473 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1474 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1475};
1476
1477static const uint8_t ciph_data_des2_key1[] = {
1478 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1479 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1480};
1481
1482static const uint8_t ciph_data_in1[] = {
1483 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1484 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1485 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1486 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1487 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1488 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1489};
1490
1491static const uint8_t ciph_data_in3[] = {
1492 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1493 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1494 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1495 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1496 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1497 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1498};
1499
Jerome Forissier45218eb2018-04-11 13:03:26 +02001500static const uint8_t ciph_data_in4[] = {
1501 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1502 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1503 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1504 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1505 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1506 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1507 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1508 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1509};
1510
Jerome Forissier0780ad42018-06-05 15:02:37 +02001511static const uint8_t ciph_data_in5[] = {
1512 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1513 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1514 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1515 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1516 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1517 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1518 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1519 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001520 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1521 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001522 0x01, 0x01, 0x01
1523};
1524
Pascal Brandc639ac82015-07-02 08:53:34 +02001525static const uint8_t ciph_data_128_iv1[] = {
1526 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1527 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1528};
1529
Jerome Forissier0780ad42018-06-05 15:02:37 +02001530static const uint8_t ciph_data_128_iv2[] = {
1531 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1532 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1533};
1534
Pascal Brandc639ac82015-07-02 08:53:34 +02001535static const uint8_t ciph_data_64_iv1[] = {
1536 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1537};
1538
1539static const uint8_t ciph_data_in2[] = {
1540 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1541};
1542
1543static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1544 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1545 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1546 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1547 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1548 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1549 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1550};
1551
1552static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1553 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1554 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1555 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1556 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1557 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1558 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1559};
1560
1561static const uint8_t ciph_data_aes_ctr_out1[] = {
1562 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1563 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1564 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1565 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1566 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1567 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1568};
1569
1570static const uint8_t ciph_data_aes_ctr_out2[] = {
1571 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1572 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1573 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1574 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1575 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1576 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1577};
1578
Jerome Forissier45218eb2018-04-11 13:03:26 +02001579static const uint8_t ciph_data_aes_ctr_out4[] = {
1580 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1581 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1582 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1583 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1584 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1585 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1586 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1587 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1588};
1589
Jerome Forissier0780ad42018-06-05 15:02:37 +02001590static const uint8_t ciph_data_aes_ctr_out5[] = {
1591 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1592 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1593 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1594 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1595 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1596 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1597 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1598 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001599 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1600 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1601 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001602};
1603
Pascal Brandc639ac82015-07-02 08:53:34 +02001604static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1605 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1606 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1607};
1608
1609static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1610 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1611 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1612};
1613
1614static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1615 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1616 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1617 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1618 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1619 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1620 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1621 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1622 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1623 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1624 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1625 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1626 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1627 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1628 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1629 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1630 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1631 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1632 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1633 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1634 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1635};
1636
1637static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1638 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1639 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1640 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1641 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1642 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1643 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1644 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1645 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1646 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1647 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1648 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1649 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1650 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1651 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1652 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1653 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1654 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1655 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1656 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1657 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1658};
1659
1660/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1661 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1662static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1663 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1664 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1665};
1666
1667static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1668 0x00
1669};
1670
1671static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1672 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1673 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1674 0x20
1675};
1676
1677static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1678 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1679 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1680 0x97
1681};
1682
1683#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1684#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1685static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1686 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1687 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1688 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1689 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1690};
1691
1692static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1693 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1694 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1695 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1696 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1697};
1698
1699#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1700#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1701static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1702 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1703 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1704 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1705 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1706};
1707
1708static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1709 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1710 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1711 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1712 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1713};
1714
1715#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1716#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1717static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1718 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1719 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1720 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1721 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1722 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1723 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1724};
1725
1726static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1727 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1728 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1729 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1730 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1731 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1732 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1733};
1734
1735#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1736#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1737static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1738 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1739 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1740 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1741 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1742 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1743 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1744};
1745
1746static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1747 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1748 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1749 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1750 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1751 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1752 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1753};
1754
1755#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1756#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1757static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1758 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1759 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1760 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1761 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1762 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1763 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1764 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1765 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1766};
1767
1768static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1769 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1770 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1771 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1772 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1773 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1774 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1775 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1776 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1777};
1778
Jerome Forissiered00e162017-01-20 09:22:52 +01001779/*
1780 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1781 * 80 bytes of data, processed in two steps (32 + 48).
1782 */
1783
1784#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1785
1786static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1787 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1788 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1789};
1790
1791static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1792 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1793 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1794 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1795 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1796 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1797 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1798 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1799 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1800 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1801 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1802};
1803
1804/*
1805 * Ciphertext was generated by an online tool for AES CBC.
1806 * Since the input size is a multiple of the block size, and the ciphertext
1807 * format is CS3, the output is the same as plain AES CBC with the last
1808 * two blocks swapped.
1809 */
1810static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1811 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1812 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1813 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1814 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1815 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1816 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1817 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1818 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1819 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1820 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1821};
1822
Pascal Brandc639ac82015-07-02 08:53:34 +02001823static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1824 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1825 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1826 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1827 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1828 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1829 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1830};
1831
1832static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1833 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1834};
1835
1836static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1837 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1838 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1839 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1840 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1841 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1842 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1843};
1844
1845static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1846 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1847 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1848 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1849 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1850 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1851 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1852};
1853
1854static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1855 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1856 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1857 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1858 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1859 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1860 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1861};
1862
1863static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1864 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1865 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1866 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1867 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1868 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1869 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1870};
1871
1872static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1873 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1874 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1875 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1876 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1877 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1878 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1879};
1880
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001881/* SM4 ECB */
1882
1883static const uint8_t ciph_data_sm4_key1[] = {
1884 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1885 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1886};
1887
1888static const uint8_t ciph_data_sm4_in1[] = {
1889 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1890 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1891};
1892
1893static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1894 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1895 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1896};
1897
1898/*
1899 * SM4 CBC
1900 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1901 */
1902static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1903 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1904 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1905};
1906
1907static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1908 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1909 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1910};
1911
1912static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1913 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1914 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1915 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1916 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1917};
1918
1919static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
1920 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
1921 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
1922 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
1923 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
1924};
1925
1926/*
1927 * SM4 CBC
1928 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
1929 */
1930static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
1931 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1932 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1933};
1934
1935static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
1936 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1937 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1938};
1939
1940static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
1941 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1942 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1943 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1944 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1945};
1946
1947static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
1948 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
1949 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
1950 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
1951 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
1952};
1953
1954/*
1955 * SM4 CTR
1956 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
1957 */
1958static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
1959 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1960 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1961};
1962
1963static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
1964 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1965 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1966};
1967
1968static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
1969 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1970 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1971 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1972 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1973 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1974 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1975 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1976 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1977};
1978
1979static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
1980 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
1981 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
1982 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
1983 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
1984 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
1985 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
1986 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
1987 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
1988};
1989
1990/*
1991 * SM4 CTR
1992 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
1993 */
1994static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
1995 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1996 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1997};
1998
1999static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
2000 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2001 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2002};
2003
2004static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
2005 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2006 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2007 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2008 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2009 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2010 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2011 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2012 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2013};
2014
2015static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
2016 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
2017 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
2018 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
2019 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
2020 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
2021 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
2022 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
2023 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
2024};
2025
Pascal Brandc639ac82015-07-02 08:53:34 +02002026struct xtest_ciph_case {
2027 uint32_t algo;
2028 uint32_t mode;
2029 uint32_t key_type;
2030 const uint8_t *key1;
2031 size_t key1_len;
2032 const uint8_t *key2;
2033 size_t key2_len;
2034 const uint8_t *iv;
2035 size_t iv_len;
2036 size_t in_incr;
2037 const uint8_t *in;
2038 size_t in_len;
2039 const uint8_t *out;
2040 size_t out_len;
2041 size_t line;
2042};
2043
2044#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
2045 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2046 NULL, 0, NULL, 0, \
2047 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
2048 __LINE__ }, \
2049 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2050 NULL, 0, NULL, 0, \
2051 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
2052
2053#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
2054 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2055 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
2056 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
2057 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2058 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
2059 (ptx), ARRAY_SIZE(ptx), __LINE__ }
2060
2061#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
2062 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
2063 ciph_data_aes_xts_ ## vect ## _key1, \
2064 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2065 ciph_data_aes_xts_ ## vect ## _key2, \
2066 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2067 ciph_data_aes_xts_ ## vect ## _iv, \
2068 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2069 (in_incr), \
2070 ciph_data_aes_xts_ ## vect ## _ptx, \
2071 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
2072 ciph_data_aes_xts_ ## vect ## _ctx, \
2073 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2074 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2075 ciph_data_aes_xts_ ## vect ## _key1, \
2076 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2077 ciph_data_aes_xts_ ## vect ## _key2, \
2078 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2079 ciph_data_aes_xts_ ## vect ## _iv, \
2080 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2081 (in_incr), \
2082 ciph_data_aes_xts_ ## vect ## _ctx, \
2083 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2084 ciph_data_aes_xts_ ## vect ## _ptx, \
2085 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2086
2087#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2088 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2089 ciph_data_aes_cbc_ ## vect ## _key, \
2090 ciph_data_aes_cbc_ ## vect ## _iv, \
2091 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2092 ciph_data_aes_cbc_ ## vect ## _ctx)
2093
2094#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2095 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2096 ciph_data_aes_cts_ ## vect ## _key, \
2097 ciph_data_aes_cts_ ## vect ## _iv, \
2098 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2099 ciph_data_aes_cts_ ## vect ## _ctx)
2100
2101static const struct xtest_ciph_case ciph_cases[] = {
2102 /* AES */
2103 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2104 ciph_data_aes_key1, 11, ciph_data_in1,
2105 ciph_data_aes_ecb_nopad_out1),
2106 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2107 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2108 ciph_data_in1,
2109 ciph_data_aes_cbc_nopad_out1),
2110 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2111 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2112 ciph_data_in1,
2113 ciph_data_aes_ctr_out1),
2114 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2115 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2116 ciph_data_in3,
2117 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002118 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2119 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2120 ciph_data_in3,
2121 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002122 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2123 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2124 ciph_data_in4,
2125 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002126 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2127 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2128 ciph_data_in5,
2129 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002130
2131 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002132 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002133
2134 /* AES-CTS */
2135 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2136 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2137 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2138 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2139 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2140 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2141 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002142 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002143
2144 /* DES */
2145 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2146 ciph_data_des_key1, 14, ciph_data_in1,
2147 ciph_data_des_ecb_nopad_out1),
2148 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2149 ciph_data_des_key2, 3, ciph_data_in2,
2150 ciph_data_des_ecb_nopad_out2),
2151 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2152 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2153 ciph_data_des_cbc_nopad_out1),
2154
2155 /* DES3 */
2156 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2157 ciph_data_des3_key1, 11, ciph_data_in1,
2158 ciph_data_des3_ecb_nopad_out1),
2159 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2160 ciph_data_des3_key2, 3, ciph_data_in2,
2161 ciph_data_des_ecb_nopad_out2),
2162 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2163 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2164 ciph_data_in1,
2165 ciph_data_des3_cbc_nopad_out1),
2166
2167 /* DES2 */
2168 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2169 ciph_data_des2_key1, 11, ciph_data_in1,
2170 ciph_data_des2_ecb_nopad_out1),
2171 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2172 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2173 ciph_data_in1,
2174 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002175
Pascal Brandc639ac82015-07-02 08:53:34 +02002176 /* AES-XTS */
2177 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2178 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2179 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2180 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2181 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2182 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2183 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2184 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2185 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2186 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2187 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2188 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2189 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2190 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2191 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2192 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2193 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2194 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2195 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002196
2197 /* SM4 */
2198 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2199 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2200 ciph_data_sm4_ecb_nopad_out1),
2201 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2202 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2203 11, ciph_data_sm4_cbc_a221_in,
2204 ciph_data_sm4_cbc_a221_out),
2205 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2206 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2207 11, ciph_data_sm4_cbc_a222_in,
2208 ciph_data_sm4_cbc_a222_out),
2209 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2210 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2211 11, ciph_data_sm4_ctr_a251_in,
2212 ciph_data_sm4_ctr_a251_out),
2213 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2214 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2215 11, ciph_data_sm4_ctr_a252_in,
2216 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002217};
2218
Jerome Forissier23256842018-02-16 09:25:35 +01002219static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002220{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002221 TEEC_Session session = { };
2222 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002223 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002224 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2225 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002226 uint8_t out[2048] = { };
2227 size_t out_size = 0;
2228 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002229 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002230 uint32_t ret_orig = 0;
2231 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002232
2233 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2234 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2235 &ret_orig)))
2236 return;
2237
2238 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002239 TEE_Attribute key_attr = { };
2240 size_t key_size = 0;
2241 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002242
Jerome Forissier817d99f2020-01-22 16:33:12 +01002243 switch (ciph_cases[n].algo) {
2244 case TEE_ALG_SM4_CTR:
2245 case TEE_ALG_SM4_CBC_NOPAD:
2246 case TEE_ALG_SM4_ECB_NOPAD:
2247 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2248 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2249 Do_ADBG_Log("SM4 not supported: skip subcase");
2250 continue;
2251 }
2252 break;
2253 default:
2254 break;
2255 }
2256
Pascal Brandc639ac82015-07-02 08:53:34 +02002257 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2258 (int)n, (unsigned int)ciph_cases[n].algo,
2259 (int)ciph_cases[n].line);
2260
2261 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2262 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2263 key_attr.content.ref.length = ciph_cases[n].key1_len;
2264
2265 key_size = key_attr.content.ref.length * 8;
2266 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2267 ciph_cases[n].key_type == TEE_TYPE_DES3)
2268 /* Exclude parity in bit size of key */
2269 key_size -= key_size / 8;
2270
2271 op_key_size = key_size;
2272 if (ciph_cases[n].key2 != NULL)
2273 op_key_size *= 2;
2274
2275 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2276 ta_crypt_cmd_allocate_operation(c, &session, &op,
2277 ciph_cases[n].algo, ciph_cases[n].mode,
2278 op_key_size)))
2279 goto out;
2280
2281 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002282 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2283 ciph_cases[n].algo, ciph_cases[n].mode,
2284 op_key_size)))
2285 goto out;
2286
2287 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002288 ta_crypt_cmd_allocate_transient_object(c, &session,
2289 ciph_cases[n].key_type, key_size,
2290 &key1_handle)))
2291 goto out;
2292
2293 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2294 ta_crypt_cmd_populate_transient_object(c, &session,
2295 key1_handle, &key_attr, 1)))
2296 goto out;
2297
2298 if (ciph_cases[n].key2 != NULL) {
2299 key_attr.content.ref.buffer =
2300 (void *)ciph_cases[n].key2;
2301 key_attr.content.ref.length = ciph_cases[n].key2_len;
2302
2303 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2304 ta_crypt_cmd_allocate_transient_object(c,
2305 &session, ciph_cases[n].key_type,
2306 key_attr.content.ref.length * 8,
2307 &key2_handle)))
2308 goto out;
2309
2310 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2311 ta_crypt_cmd_populate_transient_object(c,
2312 &session, key2_handle, &key_attr, 1)))
2313 goto out;
2314
2315 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2316 ta_crypt_cmd_set_operation_key2(c, &session, op,
2317 key1_handle, key2_handle)))
2318 goto out;
2319 } else {
2320 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2321 ta_crypt_cmd_set_operation_key(c, &session, op,
2322 key1_handle)))
2323 goto out;
2324 }
2325
2326 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2327 ta_crypt_cmd_free_transient_object(c, &session,
2328 key1_handle)))
2329 goto out;
2330 key1_handle = TEE_HANDLE_NULL;
2331
2332 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2333 ta_crypt_cmd_free_transient_object(c, &session,
2334 key2_handle)))
2335 goto out;
2336 key2_handle = TEE_HANDLE_NULL;
2337
2338 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2339 ta_crypt_cmd_cipher_init(c, &session, op,
2340 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2341 goto out;
2342
2343 out_offs = 0;
2344 out_size = sizeof(out);
2345 memset(out, 0, sizeof(out));
2346 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2347 ta_crypt_cmd_cipher_update(c, &session, op,
2348 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2349 &out_size)))
2350 goto out;
2351
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002352 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2353 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2354 ciph_cases[n].in_incr);
2355
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002356 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2357 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2358 goto out;
2359
Pascal Brandc639ac82015-07-02 08:53:34 +02002360 out_offs += out_size;
2361 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002362 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002363
2364 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2365 ta_crypt_cmd_cipher_do_final(c, &session, op,
2366 ciph_cases[n].in + ciph_cases[n].in_incr,
2367 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2368 out + out_offs,
2369 &out_size)))
2370 goto out;
2371
2372 out_offs += out_size;
2373
2374 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2375 ciph_cases[n].out_len, out, out_offs);
2376
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002377 /* test on the copied op2 */
2378 out_size = sizeof(out) - out_offs2;
2379
2380 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2381 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2382 ciph_cases[n].in + ciph_cases[n].in_incr,
2383 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2384 out + out_offs2,
2385 &out_size)))
2386 goto out;
2387
2388 out_offs2 += out_size;
2389
2390 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2391 out, out_offs2);
2392
Pascal Brandc639ac82015-07-02 08:53:34 +02002393 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2394 ta_crypt_cmd_free_operation(c, &session, op)))
2395 goto out;
2396
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002397 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2398 ta_crypt_cmd_free_operation(c, &session, op2)))
2399 goto out;
2400
Pascal Brandc639ac82015-07-02 08:53:34 +02002401 Do_ADBG_EndSubCase(c, NULL);
2402 }
2403out:
2404 TEEC_CloseSession(&session);
2405}
Jens Wiklander14f48872018-06-29 15:30:13 +02002406ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2407 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002408
Pascal Brandc639ac82015-07-02 08:53:34 +02002409static void xtest_tee_test_4004(ADBG_Case_t *c)
2410{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002411 TEEC_Session session = { };
2412 uint32_t ret_orig = 0;
2413 uint8_t buf1[45] = { };
2414 uint8_t buf2[45] = { };
2415 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002416
2417 Do_ADBG_BeginSubCase(c, "TEE get random");
2418 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2419 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2420 &ret_orig)))
2421 return;
2422
2423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2424 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2425 sizeof(buf1))))
2426 goto out;
2427
2428 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2429 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2430
2431 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2432 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2433 sizeof(buf2))))
2434 goto out;
2435
2436 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2437 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2438
2439 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2440 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2441out:
2442 TEEC_CloseSession(&session);
2443 Do_ADBG_EndSubCase(c, "TEE get random");
2444}
Jens Wiklander14f48872018-06-29 15:30:13 +02002445ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2446 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002447
2448struct xtest_ae_case {
2449 uint32_t algo;
2450 uint32_t mode;
2451 uint32_t key_type;
2452 const uint8_t *key;
2453 size_t key_len;
2454 const uint8_t *nonce;
2455 size_t nonce_len;
2456 size_t aad_incr;
2457 const uint8_t *aad;
2458 size_t aad_len;
2459 size_t in_incr;
2460 const uint8_t *ptx;
2461 size_t ptx_len;
2462 const uint8_t *ctx;
2463 size_t ctx_len;
2464 const uint8_t *tag;
2465 size_t tag_len;
2466 size_t line;
2467};
2468
2469
2470#define ARRAY(a) a, ARRAY_SIZE(a)
2471#define NULL_ARRAY(a) NULL, 0
2472
2473#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2474 aad_array, ptx_array, ctx_array) \
2475 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2476 ARRAY(vect ## _nonce), (aad_incr), \
2477 aad_array(vect ## _aad), (in_incr), \
2478 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2479 ARRAY(vect ## _tag), \
2480 __LINE__ }, \
2481 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2482 ARRAY(vect ## _nonce), (aad_incr), \
2483 aad_array(vect ## _aad), (in_incr), \
2484 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2485 ARRAY(vect ## _tag), \
2486 __LINE__ }
2487
2488#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2489 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2490 in_incr, ARRAY, ARRAY, ARRAY)
2491
2492#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2493 aad_array, ptx_array, ctx_array) \
2494 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2495 in_incr, aad_array, ptx_array, ctx_array)
2496
2497
2498
2499static const struct xtest_ae_case ae_cases[] = {
2500 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2501 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2502 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2503
2504 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2505 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2506 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002507 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2508 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002509 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2510 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2511 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2512 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2513 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2514 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2515 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2516 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2517 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2518 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2519 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2520 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2521 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2522 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002523#ifdef CFG_GCM_NIST_VECTORS
2524#include "gcmDecrypt128.h"
2525#include "gcmDecrypt192.h"
2526#include "gcmDecrypt256.h"
2527#include "gcmEncryptExtIV128.h"
2528#include "gcmEncryptExtIV192.h"
2529#include "gcmEncryptExtIV256.h"
2530#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002531};
2532
2533static void xtest_tee_test_4005(ADBG_Case_t *c)
2534{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002535 TEEC_Session session = { };
2536 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002537 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002538 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002539 TEE_Attribute key_attr = { };
2540 uint8_t out[512] = { };
2541 size_t out_size = 0;
2542 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002543 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002544 uint32_t ret_orig = 0;
2545 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002546
2547 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2548 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2549 &ret_orig)))
2550 return;
2551
2552 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2553 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2554 (int)n, (unsigned int)ae_cases[n].algo,
2555 (int)ae_cases[n].line);
2556
2557 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2558 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2559 key_attr.content.ref.length = ae_cases[n].key_len;
2560
2561 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2562 ta_crypt_cmd_allocate_operation(c, &session, &op,
2563 ae_cases[n].algo, ae_cases[n].mode,
2564 key_attr.content.ref.length * 8)))
2565 goto out;
2566
2567 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002568 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2569 ae_cases[n].algo, ae_cases[n].mode,
2570 key_attr.content.ref.length * 8)))
2571 goto out;
2572
2573 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002574 ta_crypt_cmd_allocate_transient_object(c, &session,
2575 ae_cases[n].key_type,
2576 key_attr.content.ref.length * 8,
2577 &key_handle)))
2578 goto out;
2579
2580 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2581 ta_crypt_cmd_populate_transient_object(c, &session,
2582 key_handle, &key_attr, 1)))
2583 goto out;
2584
2585 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2586 ta_crypt_cmd_set_operation_key(c, &session, op,
2587 key_handle)))
2588 goto out;
2589
2590 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2591 ta_crypt_cmd_free_transient_object(c, &session,
2592 key_handle)))
2593 goto out;
2594 key_handle = TEE_HANDLE_NULL;
2595
2596 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2597 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2598 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2599 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2600 goto out;
2601
2602 if (ae_cases[n].aad != NULL) {
2603 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2604 ta_crypt_cmd_ae_update_aad(c, &session, op,
2605 ae_cases[n].aad, ae_cases[n].aad_incr)))
2606 goto out;
2607
2608 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2609 ta_crypt_cmd_ae_update_aad(c, &session, op,
2610 ae_cases[n].aad + ae_cases[n].aad_incr,
2611 ae_cases [n].aad_len -
2612 ae_cases[n].aad_incr)))
2613 goto out;
2614 }
2615
2616 out_offs = 0;
2617 out_size = sizeof(out);
2618 memset(out, 0, sizeof(out));
2619 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2620 if (ae_cases[n].ptx != NULL) {
2621 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2622 ta_crypt_cmd_ae_update(c, &session, op,
2623 ae_cases[n].ptx,
2624 ae_cases[n].in_incr, out,
2625 &out_size)))
2626 goto out;
2627 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002628 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2629 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2630 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002631 }
2632 } else {
2633 if (ae_cases[n].ctx != NULL) {
2634 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2635 ta_crypt_cmd_ae_update(c, &session, op,
2636 ae_cases[n].ctx,
2637 ae_cases[n].in_incr, out,
2638 &out_size)))
2639 goto out;
2640 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002641 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2642 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2643 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002644 }
2645 }
2646
Jens Wiklander7404c072020-12-15 08:06:32 +01002647 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2648 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2649 goto out;
2650
Pascal Brandc639ac82015-07-02 08:53:34 +02002651 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002652 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002653 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2654 uint8_t out_tag[64];
2655 size_t out_tag_len = MIN(sizeof(out_tag),
2656 ae_cases[n].tag_len);
2657
2658 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2659 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2660 ae_cases[n].ptx + ae_cases[n].in_incr,
2661 ae_cases[n].ptx_len -
2662 ae_cases[n].in_incr,
2663 out + out_offs,
2664 &out_size, out_tag, &out_tag_len)))
2665 goto out;
2666
2667 (void)ADBG_EXPECT_BUFFER(c,
2668 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2669 out_tag_len);
2670
2671 out_offs += out_size;
2672
2673 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2674 ae_cases[n].ctx_len, out, out_offs);
2675 } else {
2676 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2677 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2678 ae_cases[n].ctx + ae_cases[n].in_incr,
2679 ae_cases[n].ctx_len -
2680 ae_cases[n].in_incr,
2681 out + out_offs,
2682 &out_size, ae_cases[n].tag,
2683 ae_cases[n].tag_len)))
2684 goto out;
2685
2686 out_offs += out_size;
2687
2688 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2689 ae_cases[n].ptx_len, out, out_offs);
2690 }
2691
Jens Wiklander7404c072020-12-15 08:06:32 +01002692 /* test on the copied op2 */
2693 out_size = sizeof(out) - out_offs2;
2694 memset(out + out_offs2, 0, out_size);
2695 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2696 uint8_t out_tag[64] = { 0 };
2697 size_t out_tag_len = MIN(sizeof(out_tag),
2698 ae_cases[n].tag_len);
2699
2700 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2701 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2702 ae_cases[n].ptx + ae_cases[n].in_incr,
2703 ae_cases[n].ptx_len -
2704 ae_cases[n].in_incr,
2705 out + out_offs2,
2706 &out_size, out_tag, &out_tag_len)))
2707 goto out;
2708
2709 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2710 ae_cases[n].tag_len, out_tag,
2711 out_tag_len);
2712
2713 out_offs2 += out_size;
2714
2715 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2716 ae_cases[n].ctx_len, out, out_offs2);
2717 } else {
2718 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2719 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2720 ae_cases[n].ctx + ae_cases[n].in_incr,
2721 ae_cases[n].ctx_len -
2722 ae_cases[n].in_incr,
2723 out + out_offs2,
2724 &out_size, ae_cases[n].tag,
2725 ae_cases[n].tag_len)))
2726 goto out;
2727
2728 out_offs2 += out_size;
2729
2730 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2731 ae_cases[n].ptx_len, out, out_offs2);
2732 }
2733
Pascal Brandc639ac82015-07-02 08:53:34 +02002734 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2735 ta_crypt_cmd_free_operation(c, &session, op)))
2736 goto out;
2737
Jens Wiklander7404c072020-12-15 08:06:32 +01002738 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2739 ta_crypt_cmd_free_operation(c, &session, op2)))
2740 goto out;
2741
Pascal Brandc639ac82015-07-02 08:53:34 +02002742 Do_ADBG_EndSubCase(c, NULL);
2743 }
2744out:
2745 TEEC_CloseSession(&session);
2746}
Jens Wiklander14f48872018-06-29 15:30:13 +02002747ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2748 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002749
2750struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002751 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002752 uint32_t algo;
2753 TEE_OperationMode mode;
2754
2755 union {
2756 struct {
2757 const uint8_t *modulus;
2758 size_t modulus_len;
2759
2760 const uint8_t *pub_exp;
2761 size_t pub_exp_len;
2762
2763 const uint8_t *priv_exp;
2764 size_t priv_exp_len;
2765
2766 const uint8_t *prime1; /* q */
2767 size_t prime1_len;
2768 const uint8_t *prime2; /* p */
2769 size_t prime2_len;
2770 const uint8_t *exp1; /* dp */
2771 size_t exp1_len;
2772 const uint8_t *exp2; /* dq */
2773 size_t exp2_len;
2774 const uint8_t *coeff; /* iq */
2775 size_t coeff_len;
2776
2777 int salt_len;
2778 } rsa;
2779 struct {
2780 const uint8_t *prime;
2781 size_t prime_len;
2782 const uint8_t *sub_prime;
2783 size_t sub_prime_len;
2784 const uint8_t *base;
2785 size_t base_len;
2786 const uint8_t *pub_val;
2787 size_t pub_val_len;
2788 const uint8_t *priv_val;
2789 size_t priv_val_len;
2790 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002791 struct {
2792 const uint8_t *private;
2793 size_t private_len;
2794 const uint8_t *public_x;
2795 size_t public_x_len;
2796 const uint8_t *public_y;
2797 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002798 } ecc;
Valerii Chubarab9863c2022-08-12 07:42:29 +00002799 struct {
2800 const uint8_t *private;
2801 size_t private_len;
2802 const uint8_t *public;
2803 size_t public_len;
2804 const uint8_t flag;
2805 const uint8_t *context;
2806 size_t context_len;
2807 } eddsa;
Pascal Brandc639ac82015-07-02 08:53:34 +02002808 } params;
2809
2810 const uint8_t *ptx;
2811 size_t ptx_len;
2812 const uint8_t *ctx;
2813 size_t ctx_len;
2814 size_t line;
2815};
2816
2817#define WITHOUT_SALT(x) -1
2818#define WITH_SALT(x) x
2819
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002820#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2821 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002822 ARRAY(vect ## _ptx), \
2823 ARRAY(vect ## _out), \
2824 __LINE__ }
2825
2826#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2827 { .rsa = { \
2828 ARRAY(vect ## _modulus), \
2829 ARRAY(vect ## _pub_exp), \
2830 ARRAY(vect ## _priv_exp), \
2831 opt_crt_array(vect ## _prime1), \
2832 opt_crt_array(vect ## _prime2), \
2833 opt_crt_array(vect ## _exp1), \
2834 opt_crt_array(vect ## _exp2), \
2835 opt_crt_array(vect ## _coeff), \
2836 opt_salt(vect ## _salt_len) \
2837 } }
2838
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002839#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2840 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002841 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2842
2843#define XTEST_AC_DSA_UNION(vect) \
2844 { .dsa = { \
2845 ARRAY(vect ## _prime), \
2846 ARRAY(vect ## _sub_prime), \
2847 ARRAY(vect ## _base), \
2848 ARRAY(vect ## _pub_val), \
2849 ARRAY(vect ## _priv_val), \
2850 } }
2851
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002852#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2853 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002854
Pascal Brand3e143ee2015-07-15 17:17:16 +02002855#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002856 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002857 ARRAY(vect ## _private), \
2858 ARRAY(vect ## _public_x), \
2859 ARRAY(vect ## _public_y), \
2860 } }
2861
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002862#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002863 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002864
Valerii Chubarab9863c2022-08-12 07:42:29 +00002865#define XTEST_AC_EDDSA_UNION(vect, flag) \
2866 { .eddsa = { \
2867 ARRAY(vect ## _private), \
2868 ARRAY(vect ## _public), \
2869 flag, \
2870 } }
2871
2872#define XTEST_AC_EDDSA_CTX_UNION(vect, flag) \
2873 { .eddsa = { \
2874 ARRAY(vect ## _private), \
2875 ARRAY(vect ## _public), \
2876 flag, \
2877 ARRAY(vect ## _context), \
2878 } }
2879
2880#define XTEST_AC_EDDSA_CASE(level, algo, mode, vect, flag) \
2881 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_UNION(vect, flag))
2882
2883#define XTEST_AC_EDDSA_CTX_CASE(level, algo, mode, vect, flag) \
2884 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_EDDSA_CTX_UNION(vect, flag))
2885
Pascal Brandc639ac82015-07-02 08:53:34 +02002886static const struct xtest_ac_case xtest_ac_cases[] = {
2887 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002888 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002889 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002890 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002891 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002892 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002893 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002894 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002895 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002896 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2897 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2898 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2899 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002900 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2901 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2902 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2903 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002904 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002905 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002906 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002907 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002908 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002909 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002910 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002911 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002912 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002913 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002914 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002915 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002916 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002917 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002918 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002919 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002920 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002921 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002922 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002923 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002924 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2925 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2926 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2927 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002928
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002929 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002930 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002931 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002932 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002933
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002934#ifdef CFG_CRYPTO_RSASSA_NA1
2935 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2936 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2937 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2938 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2939#endif
2940
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002941 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002942 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002943 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002944 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002945
2946 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002947 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002948 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002949 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002950
2951 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002952 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002953 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002954 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2955
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002956 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2957 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002958 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002959 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002960 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002961
2962 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2963 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002964 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002965 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2966 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002967 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002968
2969 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2970 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002971 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002972 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2973 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002974 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002975
2976 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2977 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002978 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002979 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2980 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002981 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002982
2983 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2984 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002985 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002986 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2987 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002988 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2989
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002990 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002991 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002992 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002993 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002994 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002995 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002996 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002997 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002998 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002999 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003000 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003001 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3002
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003003 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3004 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003005 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003006 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3007 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003008 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003009 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3010 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003011 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003012 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3013 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003014 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003015 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3016 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003017 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003018 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3019 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003020 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
3021
3022 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003023 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003024 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003025 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003026 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003027 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003028 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003029 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003030 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003031 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003032 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003033 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003034 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003035 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003036 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003037 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003038 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003039 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003040 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003041 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003042 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003043 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003044 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003045 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003046 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003047 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003048 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003049 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003050 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003051 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003052 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003053 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003054 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003055 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003056 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003057 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003058 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003059 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003060 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003061 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003062 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003063 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003064 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003065 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003066 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3067
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003068 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3069 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003070 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003071 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003072 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003073 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3074 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003075 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003076 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3077 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003078 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003079 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3080 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003081 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003082 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3083 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003084 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003085 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3086 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003087 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003088 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3089 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003090 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003091 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3092 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003093 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003094 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3095 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003096 ac_rsassa_vect15, ARRAY, WITH_SALT),
3097
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003098 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003099 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003100 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003101 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003102 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003103 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003104 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003105 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003106 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003107 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003108 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003109 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3110
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003111 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3112 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003113 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003114 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3115 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003116 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003117 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3118 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003119 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003120 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3121 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003122 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003123 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3124 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003125 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003126 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3127 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003128 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3129
3130 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003131 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003132 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3133 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003134 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3135 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3136 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3137 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3138 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3139 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3140 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3141 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3142 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3143 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3144 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3145 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3146 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3147 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3148 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3149 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3150 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3151 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3152 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3153 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3154 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3155 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3156 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3157 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3158 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3159 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3160 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3161 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003162 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3163 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3164 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3165 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3166 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3167 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003168 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3169 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003170 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3171 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3172 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3173 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3174 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3175 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3176 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3177 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3178 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3179 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3180 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3181 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3182 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3183 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3184 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3185 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3186 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3187 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3188 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3189 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3190 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3191 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3192 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3193 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3194 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3195 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3196 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3197 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003198 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003199 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3200 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3201 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3202 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3203 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3204 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3205 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3206 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3207 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3208 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3209 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3210 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3211 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3212 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3213 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3214 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3215 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3216 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3217 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3218 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3219 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3220 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3221 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3222 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3223 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3224 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3225 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3226 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3227 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3228 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003229 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3230 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3231 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3232 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003233 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3234 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003235 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3236 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3237 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3238 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3239 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3240 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3241 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3242 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3243 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3244 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3245 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3246 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3247 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3248 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3249 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3250 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3251 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3252 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3253 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3254 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3255 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3256 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3257 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3258 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3259 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3260 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3261 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3262 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003263 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003264 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3265 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003266 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3267 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3268 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3269 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3270 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3271 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3272 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3273 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3274 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3275 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3276 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3277 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3278 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3279 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3280 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3281 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3282 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3283 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3284 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3285 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3286 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3287 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3288 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3289 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3290 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3291 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3292 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3293 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003294 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3295 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3296 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3297 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3298 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003299 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3300 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003301 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3302 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3303 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3304 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3305 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3306 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3307 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3308 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3309 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3310 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3311 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3312 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3313 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3314 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3315 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3316 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3317 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3318 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3319 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3320 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3321 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3322 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3323 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3324 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3325 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3326 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3327 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3328 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003329 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3330 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003331
3332 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003333 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003334 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3335 nist_186_2_ecdsa_testvector_1),
3336 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3337 nist_186_2_ecdsa_testvector_1),
3338 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3339 nist_186_2_ecdsa_testvector_2),
3340 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3341 nist_186_2_ecdsa_testvector_2),
3342 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3343 nist_186_2_ecdsa_testvector_3),
3344 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3345 nist_186_2_ecdsa_testvector_3),
3346 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3347 nist_186_2_ecdsa_testvector_4),
3348 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3349 nist_186_2_ecdsa_testvector_4),
3350 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3351 nist_186_2_ecdsa_testvector_5),
3352 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3353 nist_186_2_ecdsa_testvector_5),
3354 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3355 nist_186_2_ecdsa_testvector_6),
3356 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3357 nist_186_2_ecdsa_testvector_6),
3358 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3359 nist_186_2_ecdsa_testvector_7),
3360 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3361 nist_186_2_ecdsa_testvector_7),
3362 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3363 nist_186_2_ecdsa_testvector_8),
3364 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3365 nist_186_2_ecdsa_testvector_8),
3366 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3367 nist_186_2_ecdsa_testvector_9),
3368 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3369 nist_186_2_ecdsa_testvector_9),
3370 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3371 nist_186_2_ecdsa_testvector_10),
3372 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3373 nist_186_2_ecdsa_testvector_10),
3374 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3375 nist_186_2_ecdsa_testvector_11),
3376 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3377 nist_186_2_ecdsa_testvector_11),
3378 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3379 nist_186_2_ecdsa_testvector_12),
3380 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3381 nist_186_2_ecdsa_testvector_12),
3382 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3383 nist_186_2_ecdsa_testvector_13),
3384 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3385 nist_186_2_ecdsa_testvector_13),
3386 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3387 nist_186_2_ecdsa_testvector_14),
3388 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3389 nist_186_2_ecdsa_testvector_14),
3390 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3391 nist_186_2_ecdsa_testvector_15),
3392 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3393 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003394 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003395 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3396 nist_186_2_ecdsa_testvector_16),
3397 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3398 nist_186_2_ecdsa_testvector_16),
3399 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3400 nist_186_2_ecdsa_testvector_17),
3401 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3402 nist_186_2_ecdsa_testvector_17),
3403 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3404 nist_186_2_ecdsa_testvector_18),
3405 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3406 nist_186_2_ecdsa_testvector_18),
3407 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3408 nist_186_2_ecdsa_testvector_19),
3409 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3410 nist_186_2_ecdsa_testvector_19),
3411 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3412 nist_186_2_ecdsa_testvector_20),
3413 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3414 nist_186_2_ecdsa_testvector_20),
3415 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3416 nist_186_2_ecdsa_testvector_21),
3417 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3418 nist_186_2_ecdsa_testvector_21),
3419 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3420 nist_186_2_ecdsa_testvector_22),
3421 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3422 nist_186_2_ecdsa_testvector_22),
3423 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3424 nist_186_2_ecdsa_testvector_23),
3425 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3426 nist_186_2_ecdsa_testvector_23),
3427 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3428 nist_186_2_ecdsa_testvector_24),
3429 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3430 nist_186_2_ecdsa_testvector_24),
3431 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3432 nist_186_2_ecdsa_testvector_25),
3433 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3434 nist_186_2_ecdsa_testvector_25),
3435 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3436 nist_186_2_ecdsa_testvector_26),
3437 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3438 nist_186_2_ecdsa_testvector_26),
3439 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3440 nist_186_2_ecdsa_testvector_27),
3441 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3442 nist_186_2_ecdsa_testvector_27),
3443 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3444 nist_186_2_ecdsa_testvector_28),
3445 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3446 nist_186_2_ecdsa_testvector_28),
3447 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3448 nist_186_2_ecdsa_testvector_29),
3449 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3450 nist_186_2_ecdsa_testvector_29),
3451 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3452 nist_186_2_ecdsa_testvector_30),
3453 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3454 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003455 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003456 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3457 nist_186_2_ecdsa_testvector_31),
3458 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3459 nist_186_2_ecdsa_testvector_31),
3460 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3461 nist_186_2_ecdsa_testvector_32),
3462 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3463 nist_186_2_ecdsa_testvector_32),
3464 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3465 nist_186_2_ecdsa_testvector_33),
3466 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3467 nist_186_2_ecdsa_testvector_33),
3468 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3469 nist_186_2_ecdsa_testvector_34),
3470 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3471 nist_186_2_ecdsa_testvector_34),
3472 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3473 nist_186_2_ecdsa_testvector_35),
3474 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3475 nist_186_2_ecdsa_testvector_35),
3476 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3477 nist_186_2_ecdsa_testvector_36),
3478 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3479 nist_186_2_ecdsa_testvector_36),
3480 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3481 nist_186_2_ecdsa_testvector_37),
3482 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3483 nist_186_2_ecdsa_testvector_37),
3484 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3485 nist_186_2_ecdsa_testvector_38),
3486 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3487 nist_186_2_ecdsa_testvector_38),
3488 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3489 nist_186_2_ecdsa_testvector_39),
3490 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3491 nist_186_2_ecdsa_testvector_39),
3492 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3493 nist_186_2_ecdsa_testvector_40),
3494 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3495 nist_186_2_ecdsa_testvector_40),
3496 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3497 nist_186_2_ecdsa_testvector_41),
3498 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3499 nist_186_2_ecdsa_testvector_41),
3500 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3501 nist_186_2_ecdsa_testvector_42),
3502 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3503 nist_186_2_ecdsa_testvector_42),
3504 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3505 nist_186_2_ecdsa_testvector_43),
3506 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3507 nist_186_2_ecdsa_testvector_43),
3508 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3509 nist_186_2_ecdsa_testvector_44),
3510 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3511 nist_186_2_ecdsa_testvector_44),
3512 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3513 nist_186_2_ecdsa_testvector_45),
3514 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3515 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003516 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003517 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3518 nist_186_2_ecdsa_testvector_46),
3519 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3520 nist_186_2_ecdsa_testvector_46),
3521 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3522 nist_186_2_ecdsa_testvector_47),
3523 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3524 nist_186_2_ecdsa_testvector_47),
3525 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3526 nist_186_2_ecdsa_testvector_48),
3527 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3528 nist_186_2_ecdsa_testvector_48),
3529 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3530 nist_186_2_ecdsa_testvector_49),
3531 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3532 nist_186_2_ecdsa_testvector_49),
3533 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3534 nist_186_2_ecdsa_testvector_50),
3535 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3536 nist_186_2_ecdsa_testvector_50),
3537 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3538 nist_186_2_ecdsa_testvector_51),
3539 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3540 nist_186_2_ecdsa_testvector_51),
3541 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3542 nist_186_2_ecdsa_testvector_52),
3543 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3544 nist_186_2_ecdsa_testvector_52),
3545 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3546 nist_186_2_ecdsa_testvector_53),
3547 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3548 nist_186_2_ecdsa_testvector_53),
3549 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3550 nist_186_2_ecdsa_testvector_54),
3551 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3552 nist_186_2_ecdsa_testvector_54),
3553 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3554 nist_186_2_ecdsa_testvector_55),
3555 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3556 nist_186_2_ecdsa_testvector_55),
3557 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3558 nist_186_2_ecdsa_testvector_56),
3559 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3560 nist_186_2_ecdsa_testvector_56),
3561 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3562 nist_186_2_ecdsa_testvector_57),
3563 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3564 nist_186_2_ecdsa_testvector_57),
3565 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3566 nist_186_2_ecdsa_testvector_58),
3567 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3568 nist_186_2_ecdsa_testvector_58),
3569 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3570 nist_186_2_ecdsa_testvector_59),
3571 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3572 nist_186_2_ecdsa_testvector_59),
3573 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3574 nist_186_2_ecdsa_testvector_60),
3575 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3576 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003577 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003578 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3579 nist_186_2_ecdsa_testvector_61),
3580 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3581 nist_186_2_ecdsa_testvector_61),
3582 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3583 nist_186_2_ecdsa_testvector_62),
3584 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3585 nist_186_2_ecdsa_testvector_62),
3586 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3587 nist_186_2_ecdsa_testvector_63),
3588 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3589 nist_186_2_ecdsa_testvector_63),
3590 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3591 nist_186_2_ecdsa_testvector_64),
3592 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3593 nist_186_2_ecdsa_testvector_64),
3594 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3595 nist_186_2_ecdsa_testvector_65),
3596 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3597 nist_186_2_ecdsa_testvector_65),
3598 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3599 nist_186_2_ecdsa_testvector_66),
3600 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3601 nist_186_2_ecdsa_testvector_66),
3602 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3603 nist_186_2_ecdsa_testvector_67),
3604 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3605 nist_186_2_ecdsa_testvector_67),
3606 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3607 nist_186_2_ecdsa_testvector_68),
3608 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3609 nist_186_2_ecdsa_testvector_68),
3610 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3611 nist_186_2_ecdsa_testvector_69),
3612 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3613 nist_186_2_ecdsa_testvector_69),
3614 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3615 nist_186_2_ecdsa_testvector_70),
3616 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3617 nist_186_2_ecdsa_testvector_70),
3618 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3619 nist_186_2_ecdsa_testvector_71),
3620 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3621 nist_186_2_ecdsa_testvector_71),
3622 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3623 nist_186_2_ecdsa_testvector_72),
3624 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3625 nist_186_2_ecdsa_testvector_72),
3626 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3627 nist_186_2_ecdsa_testvector_73),
3628 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3629 nist_186_2_ecdsa_testvector_73),
3630 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3631 nist_186_2_ecdsa_testvector_74),
3632 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3633 nist_186_2_ecdsa_testvector_74),
3634 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3635 nist_186_2_ecdsa_testvector_75),
3636 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3637 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003638 /* [K-163] - GP NOT SUPPORTED */
3639 /* [K-233] - GP NOT SUPPORTED */
3640 /* [K-283] - GP NOT SUPPORTED */
3641 /* [K-409] - GP NOT SUPPORTED */
3642 /* [K-571] - GP NOT SUPPORTED */
3643 /* [B-163] - GP NOT SUPPORTED */
3644 /* [B-233] - GP NOT SUPPORTED */
3645 /* [B-283] - GP NOT SUPPORTED */
3646 /* [B-409] - GP NOT SUPPORTED */
3647 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003648
3649 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3650 gmt_0003_part5_c2_sm2_testvector),
3651 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3652 gmt_0003_part5_c2_sm2_testvector),
3653 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3654 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003655
3656 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3657 gmt_003_part5_a2),
3658 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3659 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003660};
3661
Valerii Chubarab9863c2022-08-12 07:42:29 +00003662static const struct xtest_ac_case xtest_ac_eddsa_cases[] = {
3663
3664 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3665 ed25519_rfc_8032_7_1, 0),
3666 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3667 ed25519_rfc_8032_7_1, 0),
3668
3669 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3670 ed25519ctx_rfc_8032_7_2, 0),
3671 XTEST_AC_EDDSA_CTX_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3672 ed25519ctx_rfc_8032_7_2, 0),
3673
3674 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_SIGN,
3675 ed25519ph_rfc_8032_7_3, 1),
3676 XTEST_AC_EDDSA_CASE(0, TEE_ALG_ED25519, TEE_MODE_VERIFY,
3677 ed25519ph_rfc_8032_7_3, 1),
3678};
3679
Pascal Brandc639ac82015-07-02 08:53:34 +02003680static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3681 uint32_t max_key_size, uint32_t key_type,
3682 TEE_Attribute *attrs, size_t num_attrs,
3683 TEE_ObjectHandle *handle)
3684{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003685 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003686
3687 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3688 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3689 max_key_size, handle)))
3690 return false;
3691
3692 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3693 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3694 num_attrs)))
3695 return false;
3696
3697 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003698 uint8_t out[512] = { };
3699 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003700
3701 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3702 continue;
3703
Pascal Brandc639ac82015-07-02 08:53:34 +02003704 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3705 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3706 attrs[n].attributeID, out, &out_size)))
3707 return false;
3708
Pascal Brand3e143ee2015-07-15 17:17:16 +02003709 if (out_size < attrs[n].content.ref.length) {
3710 memmove(out + (attrs[n].content.ref.length - out_size),
3711 out,
3712 attrs[n].content.ref.length);
3713 memset(out, 0, attrs[n].content.ref.length - out_size);
3714 out_size = attrs[n].content.ref.length;
3715 }
3716
Pascal Brandc639ac82015-07-02 08:53:34 +02003717 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3718 attrs[n].content.ref.length, out, out_size))
3719 return false;
3720 }
3721
3722 return true;
3723}
3724
Jerome Forissier26393882022-03-09 21:22:30 +01003725#define XTEST_NO_CURVE 0xFFFFFFFF /* implementation-defined as per GP spec */
3726
Pascal Brandc639ac82015-07-02 08:53:34 +02003727static void xtest_tee_test_4006(ADBG_Case_t *c)
3728{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003729 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003730 TEE_OperationHandle op = TEE_HANDLE_NULL;
3731 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3732 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003733 TEE_Attribute key_attrs[8] = { };
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01003734 TEE_Attribute algo_params[2] = { };
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003735 size_t num_algo_params = 0;
3736 uint8_t out[512] = { };
3737 size_t out_size = 0;
3738 uint8_t out_enc[512] = { };
3739 size_t out_enc_size = 0;
3740 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003741 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003742 size_t max_key_size = 0;
3743 size_t num_key_attrs = 0;
3744 uint32_t ret_orig = 0;
3745 size_t n = 0;
3746 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003747 uint32_t pub_key_type = 0;
3748 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003749 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003750
3751 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3752 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3753 &ret_orig)))
3754 return;
3755
3756 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3757 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3758
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003759 if (tv->level > level)
3760 continue;
3761
Jerome Forissier4b03e282020-01-22 16:33:12 +01003762 if ((tv->algo == TEE_ALG_SM2_PKE ||
3763 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3764 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3765 TEE_ECC_CURVE_SM2)) {
3766 Do_ADBG_Log("SM2 not supported: skip subcase");
3767 continue;
3768 }
3769
Pascal Brandc639ac82015-07-02 08:53:34 +02003770 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3771 (int)n, (unsigned int)tv->algo,
3772 (int)tv->line);
3773
3774 /*
3775 * When signing or verifying we're working with the hash of
3776 * the payload.
3777 */
3778 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003779 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3780 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003781#if defined(CFG_CRYPTO_RSASSA_NA1)
3782 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3783 hash_algo = TEE_ALG_SHA256;
3784#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003785 else
3786 hash_algo = TEE_ALG_HASH_ALGO(
3787 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003788
3789 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3790 ta_crypt_cmd_allocate_operation(c, &session,
3791 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3792 goto out;
3793
3794 ptx_hash_size = sizeof(ptx_hash);
3795 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3796 ta_crypt_cmd_digest_do_final(c, & session, op,
3797 tv->ptx, tv->ptx_len, ptx_hash,
3798 &ptx_hash_size)))
3799 goto out;
3800
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003801 /*
3802 * When we use DSA algorithms, the size of the hash we
3803 * consider equals the min between the size of the
3804 * "subprime" in the key and the size of the hash
3805 */
3806 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3807 TEE_MAIN_ALGO_DSA) {
3808 if (tv->params.dsa.sub_prime_len <=
3809 ptx_hash_size)
3810 ptx_hash_size =
3811 tv->params.dsa.sub_prime_len;
3812 }
3813
Pascal Brandc639ac82015-07-02 08:53:34 +02003814 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3815 ta_crypt_cmd_free_operation(c, &session, op)))
3816 goto out;
3817 }
3818
3819 num_algo_params = 0;
3820 num_key_attrs = 0;
3821 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3822 case TEE_MAIN_ALGO_RSA:
3823 if (tv->params.rsa.salt_len > 0) {
3824 algo_params[0].attributeID =
3825 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3826 algo_params[0].content.value.a =
3827 tv->params.rsa.salt_len;
3828 algo_params[0].content.value.b = 0;
3829 num_algo_params = 1;
3830 }
3831
3832 max_key_size = tv->params.rsa.modulus_len * 8;
3833
3834 xtest_add_attr(&num_key_attrs, key_attrs,
3835 TEE_ATTR_RSA_MODULUS,
3836 tv->params.rsa.modulus,
3837 tv->params.rsa.modulus_len);
3838 xtest_add_attr(&num_key_attrs, key_attrs,
3839 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3840 tv->params.rsa.pub_exp,
3841 tv->params.rsa.pub_exp_len);
3842
3843 if (!ADBG_EXPECT_TRUE(c,
3844 create_key(c, &session,
3845 max_key_size,
3846 TEE_TYPE_RSA_PUBLIC_KEY,
3847 key_attrs,
3848 num_key_attrs,
3849 &pub_key_handle)))
3850 goto out;
3851
3852 xtest_add_attr(&num_key_attrs, key_attrs,
3853 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3854 tv->params.rsa.priv_exp,
3855 tv->params.rsa.priv_exp_len);
3856
3857 if (tv->params.rsa.prime1_len != 0) {
3858 xtest_add_attr(&num_key_attrs, key_attrs,
3859 TEE_ATTR_RSA_PRIME1,
3860 tv->params.rsa.prime1,
3861 tv->params.rsa.prime1_len);
3862 }
3863
3864 if (tv->params.rsa.prime2_len != 0) {
3865 xtest_add_attr(&num_key_attrs, key_attrs,
3866 TEE_ATTR_RSA_PRIME2,
3867 tv->params.rsa.prime2,
3868 tv->params.rsa.prime2_len);
3869 }
3870
3871 if (tv->params.rsa.exp1_len != 0) {
3872 xtest_add_attr(&num_key_attrs, key_attrs,
3873 TEE_ATTR_RSA_EXPONENT1,
3874 tv->params.rsa.exp1,
3875 tv->params.rsa.exp1_len);
3876 }
3877
3878 if (tv->params.rsa.exp2_len != 0) {
3879 xtest_add_attr(&num_key_attrs, key_attrs,
3880 TEE_ATTR_RSA_EXPONENT2,
3881 tv->params.rsa.exp2,
3882 tv->params.rsa.exp2_len);
3883 }
3884
3885 if (tv->params.rsa.coeff_len != 0) {
3886 xtest_add_attr(&num_key_attrs, key_attrs,
3887 TEE_ATTR_RSA_COEFFICIENT,
3888 tv->params.rsa.coeff,
3889 tv->params.rsa.coeff_len);
3890 }
3891
3892 if (!ADBG_EXPECT_TRUE(c,
3893 create_key(c, &session,
3894 max_key_size,
3895 TEE_TYPE_RSA_KEYPAIR,
3896 key_attrs,
3897 num_key_attrs,
3898 &priv_key_handle)))
3899 goto out;
3900 break;
3901
3902 case TEE_MAIN_ALGO_DSA:
3903 max_key_size = tv->params.dsa.prime_len * 8;
3904
3905 xtest_add_attr(&num_key_attrs, key_attrs,
3906 TEE_ATTR_DSA_PRIME,
3907 tv->params.dsa.prime,
3908 tv->params.dsa.prime_len);
3909 xtest_add_attr(&num_key_attrs, key_attrs,
3910 TEE_ATTR_DSA_SUBPRIME,
3911 tv->params.dsa.sub_prime,
3912 tv->params.dsa.sub_prime_len);
3913 xtest_add_attr(&num_key_attrs, key_attrs,
3914 TEE_ATTR_DSA_BASE,
3915 tv->params.dsa.base,
3916 tv->params.dsa.base_len);
3917 xtest_add_attr(&num_key_attrs, key_attrs,
3918 TEE_ATTR_DSA_PUBLIC_VALUE,
3919 tv->params.dsa.pub_val,
3920 tv->params.dsa.pub_val_len);
3921
3922 if (!ADBG_EXPECT_TRUE(c,
3923 create_key(c, &session, max_key_size,
3924 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3925 num_key_attrs, &pub_key_handle)))
3926 goto out;
3927
3928 xtest_add_attr(&num_key_attrs, key_attrs,
3929 TEE_ATTR_DSA_PRIVATE_VALUE,
3930 tv->params.dsa.priv_val,
3931 tv->params.dsa.priv_val_len);
3932
3933 if (!ADBG_EXPECT_TRUE(c,
3934 create_key(c, &session, max_key_size,
3935 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3936 num_key_attrs, &priv_key_handle)))
3937 goto out;
3938 break;
3939
Pascal Brand3e143ee2015-07-15 17:17:16 +02003940 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003941 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003942 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003943 switch (tv->algo) {
3944 case TEE_ALG_ECDSA_P192:
3945 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003946 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3947 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003948 break;
3949 case TEE_ALG_ECDSA_P224:
3950 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003951 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3952 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003953 break;
3954 case TEE_ALG_ECDSA_P256:
3955 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003956 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3957 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003958 break;
3959 case TEE_ALG_ECDSA_P384:
3960 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003961 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3962 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003963 break;
3964 case TEE_ALG_ECDSA_P521:
3965 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003966 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3967 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3968 break;
3969 case TEE_ALG_SM2_PKE:
Jerome Forissier26393882022-03-09 21:22:30 +01003970 curve = XTEST_NO_CURVE;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003971 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3972 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003973 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003974 case TEE_ALG_SM2_DSA_SM3:
Jerome Forissier26393882022-03-09 21:22:30 +01003975 curve = XTEST_NO_CURVE;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003976 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3977 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3978 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003979 default:
3980 curve = 0xFF;
3981 break;
3982 }
3983
3984 if (tv->algo == TEE_ALG_ECDSA_P521)
3985 max_key_size = 521;
3986 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003987 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003988
Jerome Forissier26393882022-03-09 21:22:30 +01003989 if (curve != XTEST_NO_CURVE)
3990 xtest_add_attr_value(&num_key_attrs, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003991 TEE_ATTR_ECC_CURVE, curve, 0);
3992 xtest_add_attr(&num_key_attrs, key_attrs,
3993 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003994 tv->params.ecc.public_x,
3995 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003996 xtest_add_attr(&num_key_attrs, key_attrs,
3997 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003998 tv->params.ecc.public_y,
3999 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004000
4001 if (!ADBG_EXPECT_TRUE(c,
4002 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004003 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004004 num_key_attrs, &pub_key_handle)))
4005 goto out;
4006
4007 xtest_add_attr(&num_key_attrs, key_attrs,
4008 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004009 tv->params.ecc.private,
4010 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004011
4012 if (!ADBG_EXPECT_TRUE(c,
4013 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004014 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004015 num_key_attrs, &priv_key_handle)))
4016 goto out;
4017 break;
4018
Pascal Brandc639ac82015-07-02 08:53:34 +02004019 default:
4020 ADBG_EXPECT_TRUE(c, false);
4021 goto out;
4022 }
4023
4024 out_size = sizeof(out);
4025 memset(out, 0, sizeof(out));
4026 switch (tv->mode) {
4027 case TEE_MODE_ENCRYPT:
4028 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4029 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004030 &op, tv->algo, TEE_MODE_ENCRYPT,
4031 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004032 goto out;
4033
4034 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4035 ta_crypt_cmd_set_operation_key(c, &session, op,
4036 pub_key_handle)))
4037 goto out;
4038
4039 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4040 ta_crypt_cmd_free_transient_object(c, &session,
4041 pub_key_handle)))
4042 goto out;
4043 pub_key_handle = TEE_HANDLE_NULL;
4044
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004045 num_algo_params = 0;
4046 if (tv->algo == TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1) {
4047 algo_params[0].attributeID =
4048 TEE_ATTR_RSA_OAEP_MGF_HASH;
4049 algo_params[0].content.ref.length =
4050 sizeof(uint32_t);
4051 algo_params[0].content.ref.buffer =
4052 &(uint32_t){TEE_ALG_SHA1};
4053 num_algo_params = 1;
4054 }
4055
4056
Pascal Brandc639ac82015-07-02 08:53:34 +02004057 out_enc_size = sizeof(out_enc);
4058 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4059 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
Jens Wiklander1f06b7d2022-12-02 21:49:57 +01004060 algo_params, num_algo_params, tv->ptx,
4061 tv->ptx_len, out_enc, &out_enc_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004062 goto out;
4063
4064 /*
4065 * A PS which is random is added when formatting the
4066 * message internally of the algorithm so we can't
4067 * verify against precomputed values, instead we use the
4068 * decrypt operation to see that output is correct.
4069 */
4070
4071 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4072 ta_crypt_cmd_free_operation(c, &session, op)))
4073 goto out;
4074
4075 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4076 ta_crypt_cmd_allocate_operation(c, &session,
4077 &op, tv->algo, TEE_MODE_DECRYPT,
4078 max_key_size)))
4079 goto out;
4080
4081 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4082 ta_crypt_cmd_set_operation_key(c, &session, op,
4083 priv_key_handle)))
4084 goto out;
4085
4086 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4087 ta_crypt_cmd_free_transient_object(c, &session,
4088 priv_key_handle)))
4089 goto out;
4090
4091 priv_key_handle = TEE_HANDLE_NULL;
4092
4093 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4094 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4095 NULL, 0, out_enc, out_enc_size, out,
4096 &out_size)))
4097 goto out;
4098
4099 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4100 out_size);
4101 break;
4102
4103 case TEE_MODE_DECRYPT:
4104 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4105 ta_crypt_cmd_allocate_operation(c, &session,
4106 &op, tv->algo, TEE_MODE_DECRYPT,
4107 max_key_size)))
4108 goto out;
4109
4110 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4111 ta_crypt_cmd_set_operation_key(c, &session, op,
4112 priv_key_handle)))
4113 goto out;
4114
4115 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4116 ta_crypt_cmd_free_transient_object(c, &session,
4117 priv_key_handle)))
4118 goto out;
4119
4120 priv_key_handle = TEE_HANDLE_NULL;
4121
4122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4123 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4124 NULL, 0, tv->ctx, tv->ctx_len, out,
4125 &out_size)))
4126 goto out;
4127
4128 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4129 out_size);
4130 break;
4131
4132 case TEE_MODE_VERIFY:
4133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4134 ta_crypt_cmd_allocate_operation(c, &session,
4135 &op, tv->algo, TEE_MODE_VERIFY,
4136 max_key_size)))
4137 goto out;
4138
4139 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4140 ta_crypt_cmd_set_operation_key(c, &session, op,
4141 pub_key_handle)))
4142 goto out;
4143
4144 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4145 ta_crypt_cmd_free_transient_object(c, &session,
4146 pub_key_handle)))
4147 goto out;
4148
4149 pub_key_handle = TEE_HANDLE_NULL;
4150
4151 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4152 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4153 algo_params, num_algo_params, ptx_hash,
4154 ptx_hash_size, tv->ctx, tv->ctx_len)))
4155 goto out;
4156 break;
4157
4158 case TEE_MODE_SIGN:
4159 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4160 ta_crypt_cmd_allocate_operation(c, &session,
4161 &op, tv->algo, TEE_MODE_SIGN,
4162 max_key_size)))
4163 goto out;
4164
4165 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4166 ta_crypt_cmd_set_operation_key(c, &session, op,
4167 priv_key_handle)))
4168 goto out;
4169
4170 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4171 ta_crypt_cmd_free_transient_object(c, &session,
4172 priv_key_handle)))
4173 goto out;
4174
4175 priv_key_handle = TEE_HANDLE_NULL;
4176
4177 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4178 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4179 algo_params, num_algo_params, ptx_hash,
4180 ptx_hash_size, out, &out_size)))
4181 goto out;
4182
4183 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4184 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004185 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004186 tv->algo == TEE_ALG_DSA_SHA224 ||
4187 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004188 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004189 TEE_MAIN_ALGO_ECDSA ||
4190 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004191 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4192 ta_crypt_cmd_free_operation(c, &session,
4193 op)))
4194 goto out;
4195 /*
4196 * The salt or K is random so we can't verify
4197 * signing against precomputed values, instead
4198 * we use the verify operation to see that
4199 * output is correct.
4200 */
4201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4202 ta_crypt_cmd_allocate_operation(c,
4203 &session, &op, tv->algo,
4204 TEE_MODE_VERIFY, max_key_size)))
4205 goto out;
4206
4207 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4208 ta_crypt_cmd_set_operation_key(c,
4209 &session, op, pub_key_handle)))
4210 goto out;
4211
4212 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4213 ta_crypt_cmd_free_transient_object(c,
4214 &session, pub_key_handle)))
4215 goto out;
4216
4217 pub_key_handle = TEE_HANDLE_NULL;
4218
4219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4220 ta_crypt_cmd_asymmetric_verify(c,
4221 &session, op, algo_params,
4222 num_algo_params, ptx_hash,
4223 ptx_hash_size, out, out_size)))
4224 goto out;
4225 } else {
4226 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4227 tv->ctx_len, out,
4228 out_size);
4229 }
4230 break;
4231
4232 default:
4233 break;
4234 }
4235
4236 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4237 ta_crypt_cmd_free_operation(c, &session, op)))
4238 goto out;
4239
4240 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4241 ta_crypt_cmd_free_transient_object(c, &session,
4242 pub_key_handle)))
4243 goto out;
4244 pub_key_handle = TEE_HANDLE_NULL;
4245
4246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4247 ta_crypt_cmd_free_transient_object(c, &session,
4248 priv_key_handle)))
4249 goto out;
4250
4251 priv_key_handle = TEE_HANDLE_NULL;
4252
4253 Do_ADBG_EndSubCase(c, NULL);
4254 }
4255out:
4256 TEEC_CloseSession(&session);
4257}
Jens Wiklander14f48872018-06-29 15:30:13 +02004258ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4259 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004260
4261#define KEY_ATTR(x, y) { #x, (x), y }
4262
4263struct key_attrs {
4264 const char *name;
4265 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004266 /*
4267 * When keysize_check != 0: size of attribute is checked
4268 * Expected value is key_size bits except for DH in which case it is
4269 * the value of keysize_check.
4270 */
4271 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004272};
4273
4274static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4275 TEE_ObjectHandle key, uint32_t key_size,
4276 struct key_attrs *attrs, size_t num_attrs)
4277{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004278 uint8_t out[2048] = { };
4279 size_t out_size = 0;
4280 size_t n = 0;
4281 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004282
4283 for (m = 0; m < num_attrs; m++) {
4284 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4285 out_size = sizeof(out);
4286 memset(out, 0, sizeof(out));
4287 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4288 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4289 key, attrs[m].attr, out, &out_size)))
4290 return false;
4291
4292 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004293 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004294 key_size / 8);
4295
4296 if (out_size > 0) {
4297 /* Check that buffer isn't all zeroes */
4298 for (n = 0; n < out_size; n++)
4299 if (out[n] != 0)
4300 break;
4301 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4302 out_size))
4303 return false;
4304 }
4305 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004306 uint32_t a = 0;
4307 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004308
4309 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4310 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4311 attrs[m].attr, &a, &b)))
4312 return false;
4313 }
4314 }
4315 return true;
4316}
4317
4318static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4319 TEE_ObjectHandle key, uint32_t key_size)
4320{
4321 const struct key_attrs attrs[] = {
4322 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4323 };
4324
4325 return test_keygen_attributes(c, s, key, key_size,
4326 (struct key_attrs *)&attrs,
4327 ARRAY_SIZE(attrs));
4328}
4329
4330
4331static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4332 TEE_ObjectHandle key, uint32_t key_size)
4333{
4334 const struct key_attrs attrs[] = {
4335 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4336 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4337 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4338 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4339 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4340 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4341 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4342 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4343 };
4344
4345 return test_keygen_attributes(c, s, key, key_size,
4346 (struct key_attrs *)&attrs,
4347 ARRAY_SIZE(attrs));
4348}
4349
Pascal Brande61133f2015-07-08 15:38:37 +02004350static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4351 TEE_ObjectHandle key, uint32_t key_size)
4352{
4353 const struct key_attrs attrs[] = {
4354 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4355 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4356 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4357 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4358 };
4359
4360 return test_keygen_attributes(c, s, key, key_size,
4361 (struct key_attrs *)&attrs,
4362 ARRAY_SIZE(attrs));
4363}
4364
Pascal Brandc639ac82015-07-02 08:53:34 +02004365static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004366 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004367{
4368 const struct key_attrs attrs[] = {
4369 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4370 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4371 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4372 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4373 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4374 };
4375
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004376 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004377 (struct key_attrs *)&attrs,
4378 ARRAY_SIZE(attrs));
4379}
4380
4381static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4382 TEE_ObjectHandle key, uint32_t key_size)
4383{
4384 const struct key_attrs attrs[] = {
4385 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4386 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4387 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4388 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4389 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4390 };
4391
4392 return test_keygen_attributes(c, s, key, key_size,
4393 (struct key_attrs *)&attrs,
4394 ARRAY_SIZE(attrs));
4395}
4396
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004397static bool test_x25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4398 TEE_ObjectHandle key, uint32_t key_size)
4399{
4400 const struct key_attrs attrs[] = {
4401 KEY_ATTR(TEE_ATTR_X25519_PRIVATE_VALUE, false),
4402 KEY_ATTR(TEE_ATTR_X25519_PUBLIC_VALUE, false),
4403 };
4404
4405 return test_keygen_attributes(c, s, key, key_size,
4406 (struct key_attrs *)&attrs,
4407 ARRAY_SIZE(attrs));
4408}
4409
Valerii Chubarab9863c2022-08-12 07:42:29 +00004410static bool test_ed25519_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4411 TEE_ObjectHandle key, uint32_t key_size)
4412{
4413 const struct key_attrs attrs[] = {
4414 KEY_ATTR(TEE_ATTR_ED25519_PRIVATE_VALUE, false),
4415 KEY_ATTR(TEE_ATTR_ED25519_PUBLIC_VALUE, false),
4416 };
4417
4418 return test_keygen_attributes(c, s, key, key_size,
4419 (struct key_attrs *)&attrs,
4420 ARRAY_SIZE(attrs));
4421}
4422
Pascal Brandc639ac82015-07-02 08:53:34 +02004423static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4424 uint32_t key_type, uint32_t check_keysize,
4425 uint32_t key_size,
4426 TEE_Attribute *params, size_t param_count)
4427{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004428 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004429 bool ret_val = true;
4430
4431 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4432 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4433 &key)))
4434 return false;
4435
4436 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4437 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4438 param_count)))
4439 return false;
4440
4441 switch (key_type) {
4442 case TEE_TYPE_DES:
4443 case TEE_TYPE_DES3:
4444 ret_val = ADBG_EXPECT_TRUE(c,
4445 test_secret_value(c, s, key,
4446 key_size + key_size / 7));
4447 break;
4448 case TEE_TYPE_AES:
4449 case TEE_TYPE_HMAC_MD5:
4450 case TEE_TYPE_HMAC_SHA1:
4451 case TEE_TYPE_HMAC_SHA224:
4452 case TEE_TYPE_HMAC_SHA256:
4453 case TEE_TYPE_HMAC_SHA384:
4454 case TEE_TYPE_HMAC_SHA512:
4455 case TEE_TYPE_GENERIC_SECRET:
4456 ret_val = ADBG_EXPECT_TRUE(c,
4457 test_secret_value(c, s, key, key_size));
4458 break;
4459
4460 case TEE_TYPE_RSA_KEYPAIR:
4461 ret_val = ADBG_EXPECT_TRUE(c,
4462 test_rsa_key_pair(c, s, key, key_size));
4463 break;
4464
Pascal Brande61133f2015-07-08 15:38:37 +02004465 case TEE_TYPE_ECDSA_KEYPAIR:
4466 case TEE_TYPE_ECDH_KEYPAIR:
4467 ret_val = ADBG_EXPECT_TRUE(c,
4468 test_ecc_key_pair(c, s, key, key_size));
4469 break;
4470
Pascal Brandc639ac82015-07-02 08:53:34 +02004471 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004472 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004473 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004474 break;
4475
4476 case TEE_TYPE_DSA_KEYPAIR:
4477 ret_val = ADBG_EXPECT_TRUE(c,
4478 test_dsa_key_pair(c, s, key, key_size));
4479 break;
4480
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004481 case TEE_TYPE_X25519_KEYPAIR:
4482 ret_val = ADBG_EXPECT_TRUE(c,
4483 test_x25519_key_pair(c, s, key, key_size));
4484 break;
4485
Valerii Chubarab9863c2022-08-12 07:42:29 +00004486 case TEE_TYPE_ED25519_KEYPAIR:
4487 ret_val = ADBG_EXPECT_TRUE(c,
4488 test_ed25519_key_pair(c, s, key, key_size));
4489 break;
4490
Pascal Brandc639ac82015-07-02 08:53:34 +02004491 default:
4492 ret_val = false;
4493 break;
4494 }
4495
4496 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4497 ta_crypt_cmd_free_transient_object(c, s, key)))
4498 return false;
4499
4500 return ret_val;
4501}
4502
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004503struct key_types_noparam {
4504 unsigned level;
4505 const char *name;
4506 uint32_t key_type;
4507 uint32_t quanta;
4508 uint32_t min_size;
4509 uint32_t max_size;
4510};
4511
4512static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4513 const struct key_types_noparam *key_types,
4514 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004515{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004516 size_t n = 0;
4517 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004518
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004519 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004520 uint32_t min_size = key_types[n].min_size;
4521 uint32_t max_size = key_types[n].max_size;
4522 uint32_t quanta = key_types[n].quanta;
4523
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004524 if (key_types[n].level > level)
4525 continue;
4526
Pascal Brandc639ac82015-07-02 08:53:34 +02004527 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4528
4529 for (key_size = min_size; key_size <= max_size;
4530 key_size += quanta) {
4531 if (!ADBG_EXPECT_TRUE(c,
4532 generate_and_test_key(c, session, key_types
4533 [n].key_type, 1, key_size, NULL, 0)))
4534 break;
4535 }
4536
4537 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4538 }
4539}
4540
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004541static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004542{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004543 TEEC_Session session = { };
4544 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004545 static const struct key_types_noparam key_types[] = {
4546 { 0, "AES", TEE_TYPE_AES, 64, 128,
4547 256 /* valid sizes 128, 192, 256 */ },
4548 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4549 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4550 168 /* valid sizes 112, 168 */ },
4551 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4552 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4553 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4554 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4555 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4556 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4557 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4558 };
4559
4560 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4561 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4562 &ret_orig)))
4563 return;
4564
4565 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4566
4567 TEEC_CloseSession(&session);
4568}
4569ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4570 "Test TEE Internal API Generate Symmetric key");
4571
4572static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4573{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004574 TEEC_Session session = { };
4575 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004576 static const struct key_types_noparam key_types[] = {
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004577#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004578 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4579 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004580#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004581 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004582#ifndef CFG_CRYPTO_SE05X
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004583 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4584 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4585 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
Jorge Ramirez-Ortizb657ea42022-02-17 10:15:25 +01004586#endif
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004587 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4588 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4589 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4590 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4591 };
4592
4593 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4594 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4595 &ret_orig)))
4596 return;
4597
4598 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4599
4600 TEEC_CloseSession(&session);
4601}
4602ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4603 "Test TEE Internal API Generate RSA key");
4604
4605static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4606{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004607 TEEC_Session session = { };
4608 uint32_t ret_orig = 0;
4609 size_t n = 0;
4610 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004611 /*
4612 * Note that the key size parameter is not used when creating the keys
4613 * but specifying these sizes make it possible to test the expected size
4614 * of the private value. This also means that the keysize must match the
4615 * size of p or what is specified in private_bits or the equvivalent
4616 * size of the subprime parameter.
4617 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004618 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004619
4620#define XTEST_DH_GK_DATA(vect) \
4621 ARRAY(vect ## _p), \
4622 ARRAY(vect ## _g), \
4623 &vect ## _private_bits, \
4624 0, 0
4625#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4626 ARRAY(vect ## _p), \
4627 ARRAY(vect ## _g), \
4628 &vect ## _private_bits, \
4629 ARRAY(vect ## _subprime)
4630 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004631 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004632 uint32_t key_size;
4633 const uint8_t *p;
4634 size_t p_len;
4635 const uint8_t *g;
4636 size_t g_len;
4637 const uint32_t *private_bits;
4638 const uint8_t *subprime;
4639 size_t subprime_len;
4640 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004641 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004642 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004643 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004644 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004645 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004646 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004647 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004648 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004649 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004650 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004651 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004652 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004653 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004654 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004655 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004656 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004657 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004658 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004659 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004660 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004661 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004662 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004663 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004664 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004665 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004666 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004667 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004668 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004669 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004670 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004671 };
4672
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004673 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4674 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4675 &ret_orig)))
4676 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004677
4678 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004679 if (key_types[n].level > level)
4680 continue;
4681
Pascal Brandc639ac82015-07-02 08:53:34 +02004682 Do_ADBG_BeginSubCase(c,
4683 "Generate DH key %d bits - Private bits = %d",
4684 key_types[n].key_size,
4685 *key_types[n].private_bits);
4686 param_count = 0;
4687
4688 xtest_add_attr(&param_count, params,
4689 TEE_ATTR_DH_PRIME,
4690 key_types[n].p, key_types[n].p_len);
4691
4692 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4693 key_types[n].g, key_types[n].g_len);
4694
4695 if (key_types[n].private_bits != 0) {
4696 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4697
4698 params[param_count].content.value.a =
4699 *key_types[n].private_bits;
4700
4701 params[param_count].content.value.b = 0;
4702 param_count++;
4703 }
4704
4705 if (key_types[n].subprime != 0) {
4706 xtest_add_attr(&param_count, params,
4707 TEE_ATTR_DH_SUBPRIME,
4708 key_types[n].subprime,
4709 key_types[n].subprime_len);
4710 }
4711
4712 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004713 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004714 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004715 key_types[n]. key_size, params, param_count)))
4716 break;
4717
4718 Do_ADBG_EndSubCase(c,
4719 "Generate DH key %d bits - Private bits = %d",
4720 key_types[n].key_size,
4721 *key_types[n].private_bits);
4722 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004723
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004724 TEEC_CloseSession(&session);
4725}
4726ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4727 "Test TEE Internal API Generate DH key");
4728
4729static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004730{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004731 TEEC_Session session = { };
4732 uint32_t ret_orig = 0;
4733 size_t n = 0;
4734 size_t param_count = 0;
4735 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004736
4737#define XTEST_DSA_GK_DATA(vect) \
4738 ARRAY(vect ## _p), \
4739 ARRAY(vect ## _g), \
4740 ARRAY(vect ## _q)
4741 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004742 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004743 uint32_t key_size;
4744 const uint8_t *prime;
4745 size_t prime_len;
4746 const uint8_t *base;
4747 size_t base_len;
4748 const uint8_t *sub_prime;
4749 size_t sub_prime_len;
4750 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004751 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004752 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004753 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4754 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4755 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4756 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4757 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4758 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4759 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4760 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004761 };
4762
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004763 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4764 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4765 &ret_orig)))
4766 return;
4767
Pascal Brandc639ac82015-07-02 08:53:34 +02004768 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004769 if (key_types[n].level > level)
4770 continue;
4771
Pascal Brandc639ac82015-07-02 08:53:34 +02004772 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4773 key_types[n].key_size);
4774 param_count = 0;
4775
4776
4777 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4778 key_types[n].prime, key_types[n].prime_len);
4779
4780 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4781 key_types[n].sub_prime,
4782 key_types[n].sub_prime_len);
4783
4784 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4785 key_types[n].base, key_types[n].base_len);
4786
4787 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004788 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004789 1, key_types[n]. key_size, params,
4790 param_count)))
4791 break;
4792
4793 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4794 key_types[n].key_size);
4795 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004796
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004797 TEEC_CloseSession(&session);
4798}
4799ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4800 "Test TEE Internal API Generate DSA key");
4801
4802static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004803{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004804 TEEC_Session session = { };
4805 uint32_t ret_orig = 0;
4806 size_t n = 0;
4807 size_t param_count = 0;
4808 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004809
4810 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004811 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004812 const char *name;
4813 uint32_t algo;
4814 uint32_t curve;
4815 uint32_t key_size;
4816 } key_types[] = {
4817 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004818 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4819 192 },
4820 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4821 224 },
4822 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4823 256 },
4824 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4825 384 },
4826 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4827 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004828
4829 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004830 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4831 192 },
4832 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4833 224 },
4834 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4835 256 },
4836 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4837 384 },
4838 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4839 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004840 };
4841
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004842 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4843 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4844 &ret_orig)))
4845 return;
4846
Pascal Brande61133f2015-07-08 15:38:37 +02004847 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004848 if (key_types[n].level > level)
4849 continue;
4850
Pascal Brande61133f2015-07-08 15:38:37 +02004851 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4852 param_count = 0;
4853
4854 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4855 key_types[n].curve, 0);
4856
4857 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004858 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004859 0, key_types[n].key_size, params,
4860 param_count)))
4861 break;
4862
4863 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4864 }
Pascal Brande61133f2015-07-08 15:38:37 +02004865
Pascal Brandc639ac82015-07-02 08:53:34 +02004866 TEEC_CloseSession(&session);
4867}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004868ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4869 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004870
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004871static void xtest_tee_test_4007_x25519(ADBG_Case_t *c)
4872{
4873 TEEC_Session session = { };
4874 uint32_t ret_orig = 0;
4875
4876 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4877 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4878 NULL, &ret_orig)))
4879 return;
4880
Jerome Forissier366179c2022-06-28 10:12:58 +02004881 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
4882 TEE_ECC_CURVE_25519)) {
4883 Do_ADBG_Log("X25519 not supported: skip subcase");
4884 goto out;
4885 }
4886
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004887 Do_ADBG_BeginSubCase(c, "Generate X25519 key");
4888
4889 if (!ADBG_EXPECT_TRUE(c,
4890 generate_and_test_key(c, &session,
4891 TEE_TYPE_X25519_KEYPAIR, 0, 256,
4892 NULL, 0)))
4893 return;
4894
4895 Do_ADBG_EndSubCase(c, "Generate X25519 key");
Jerome Forissier366179c2022-06-28 10:12:58 +02004896out:
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03004897 TEEC_CloseSession(&session);
4898}
4899ADBG_CASE_DEFINE(regression, 4007_x25519, xtest_tee_test_4007_x25519,
4900 "Test TEE Internal API Generate X25519 key");
4901
Valerii Chubarab9863c2022-08-12 07:42:29 +00004902
4903static void xtest_tee_test_4007_ed25519(ADBG_Case_t *c)
4904{
4905 TEEC_Session session = { };
4906 uint32_t ret_orig = 0;
4907
4908 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4909 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4910 NULL, &ret_orig)))
4911 return;
4912
4913 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
4914 TEE_ECC_CURVE_25519)) {
4915 Do_ADBG_Log("ED25519 not supported: skip subcase");
4916 goto out;
4917 }
4918
4919 Do_ADBG_BeginSubCase(c, "Generate Ed25519 key");
4920
4921 ADBG_EXPECT_TRUE(c, generate_and_test_key(c, &session,
4922 TEE_TYPE_ED25519_KEYPAIR,
4923 0, 256, NULL, 0));
4924
4925 Do_ADBG_EndSubCase(c, "Generate Ed25519 key");
4926out:
4927 TEEC_CloseSession(&session);
4928}
4929ADBG_CASE_DEFINE(regression, 4007_ed25519, xtest_tee_test_4007_ed25519,
4930 "Test TEE Internal API Generate ed25519 key");
4931
Pascal Brandc639ac82015-07-02 08:53:34 +02004932static void xtest_tee_test_4008(ADBG_Case_t *c)
4933{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004934 TEEC_Session session = { };
4935 uint32_t ret_orig = 0;
4936 TEE_OperationHandle op = TEE_HANDLE_NULL;
4937 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4938 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4939 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004940 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004941 uint8_t out[2048] = { };
4942 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004943
4944 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4945 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4946 &ret_orig)))
4947 return;
4948
4949 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4950
4951 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4952 ta_crypt_cmd_allocate_operation(c, &session, &op,
4953 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4954 derive_key_max_keysize)))
4955 goto out;
4956
4957 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4958 ta_crypt_cmd_allocate_transient_object(c, & session,
4959 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4960 &key_handle)))
4961 goto out;
4962
4963 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4964 ARRAY(derive_key_dh_prime));
4965
4966 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4967 ARRAY(derive_key_dh_base));
4968
4969 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4970 ARRAY(derive_key_dh_public_value));
4971
4972 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4973 ARRAY(derive_key_dh_private_value));
4974
4975 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4976 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4977 params, param_count)))
4978 goto out;
4979
4980 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4981 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4982 goto out;
4983
4984 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4985 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4986 goto out;
4987
4988 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4989 ta_crypt_cmd_allocate_transient_object(c, &session,
4990 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4991 &sv_handle)))
4992 goto out;
4993
Pascal Brand2b92b642015-07-16 13:29:42 +02004994 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004995 param_count = 0;
4996
4997 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4998 ARRAY(derive_key_dh_public_value_2));
4999
5000 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5001 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5002 param_count)))
5003 goto out;
5004
5005 out_size = sizeof(out);
5006 memset(out, 0, sizeof(out));
5007 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5008 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5009 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5010 goto out;
5011
5012 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5013 sizeof(derive_key_dh_shared_secret), out,
5014 out_size))
5015 goto out;
5016
5017 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5018 ta_crypt_cmd_free_operation(c, &session, op)))
5019 goto out;
5020
5021 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5022 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5023 goto out;
5024out:
5025 Do_ADBG_EndSubCase(c, "Derive DH key success");
5026 TEEC_CloseSession(&session);
5027}
Jens Wiklander14f48872018-06-29 15:30:13 +02005028ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5029 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005030
5031static void xtest_tee_test_4009(ADBG_Case_t *c)
5032{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005033 TEEC_Session session = { };
5034 uint32_t ret_orig = 0;
5035 TEE_OperationHandle op = TEE_HANDLE_NULL;
5036 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5037 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5038 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005039 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005040 uint8_t out[2048] = { };
5041 size_t out_size = 0;
5042 uint32_t size_bytes = 0;
5043 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05305044 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005045
5046 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5047 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5048 &ret_orig)))
5049 return;
5050
5051 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5052 pt = &derive_key_ecdh[i];
5053
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005054 if (pt->level > level)
5055 continue;
5056
Pascal Brand2b92b642015-07-16 13:29:42 +02005057 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5058 pt->algo);
5059 size_bytes = (pt->keysize + 7) / 8;
5060 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5061 ta_crypt_cmd_allocate_operation(c, &session, &op,
5062 pt->algo,
5063 TEE_MODE_DERIVE, pt->keysize)))
5064 goto out;
5065
5066 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5067 ta_crypt_cmd_allocate_transient_object(c, & session,
5068 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5069 &key_handle)))
5070 goto out;
5071
5072 param_count = 0;
5073 xtest_add_attr_value(&param_count, params,
5074 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5075 xtest_add_attr(&param_count, params,
5076 TEE_ATTR_ECC_PRIVATE_VALUE,
5077 pt->private, size_bytes);
5078 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005079 * The public value is not used, but we should provide a valid
5080 * one to avoid rejection in case TEE_PopulateTransientObject()
5081 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005082 */
5083 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005084 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5085 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005086 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005087 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5088 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005089
5090 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5091 ta_crypt_cmd_populate_transient_object(c,
5092 &session,
5093 key_handle, params, param_count)))
5094 goto out;
5095
5096 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5097 ta_crypt_cmd_set_operation_key(c, &session, op,
5098 key_handle)))
5099 goto out;
5100
5101 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5102 ta_crypt_cmd_free_transient_object(c, & session,
5103 key_handle)))
5104 goto out;
5105
5106 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5107 ta_crypt_cmd_allocate_transient_object(c, &session,
5108 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5109 &sv_handle)))
5110 goto out;
5111
5112 /* reuse but reset params and param-count */
5113 param_count = 0;
5114
5115 xtest_add_attr(&param_count, params,
5116 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5117 pt->public_x, size_bytes);
5118 xtest_add_attr(&param_count, params,
5119 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5120 pt->public_y, size_bytes);
5121
5122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5123 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5124 params, param_count)))
5125 goto out;
5126
5127 out_size = sizeof(out);
5128 memset(out, 0, sizeof(out));
5129 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5130 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5131 sv_handle,
5132 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5133 goto out;
5134
5135 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5136 out, out_size))
5137 goto out;
5138
5139 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5140 ta_crypt_cmd_free_operation(c, &session, op)))
5141 goto out;
5142
5143 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5144 ta_crypt_cmd_free_transient_object(c, &session,
5145 sv_handle)))
5146 goto out;
5147
5148 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5149 pt->algo);
5150 }
5151
5152 goto noerror;
5153
5154out:
5155 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5156
5157noerror:
5158 TEEC_CloseSession(&session);
5159}
Jens Wiklander14f48872018-06-29 15:30:13 +02005160ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5161 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005162
5163static void xtest_tee_test_4010(ADBG_Case_t *c)
5164{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005165 TEEC_Session session = { };
5166 uint32_t ret_orig = 0;
5167 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005168 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5169 static const TEE_Attribute attr = {
5170 .attributeID = TEE_ATTR_SECRET_VALUE,
5171 .content.ref.buffer = (void *)large_key,
5172 .content.ref.length = sizeof(large_key),
5173 };
5174
5175 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5176 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5177 &ret_orig)))
5178 return;
5179
5180 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5181 ta_crypt_cmd_allocate_transient_object(c, &session,
5182 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5183 goto out;
5184
5185 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5186 ta_crypt_cmd_populate_transient_object(c, &session, o,
5187 &attr, 1));
5188
5189out:
5190 TEEC_CloseSession(&session);
5191}
Jens Wiklander14f48872018-06-29 15:30:13 +02005192ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5193 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005194
5195static void xtest_tee_test_4011(ADBG_Case_t *c)
5196{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005197 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005198 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005199 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5200 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5201 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5202 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5203 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5204 uint32_t ret_orig = 0;
5205 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5206 uint8_t out[1024] = { };
5207 uint8_t tmp[1024] = { };
5208 size_t out_size = 0;
5209 size_t tmp_size = 0;
5210 size_t n = 0;
5211 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005212 size_t i = 0;
5213
5214 /* Setup session, initialize message to sign, create a keypair */
5215 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5216 &crypt_user_ta_uuid, NULL, &ret_orig)))
5217 return;
5218 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5219 &s, in, sizeof(in))))
5220 goto out;
5221 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5222 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5223 goto out;
5224 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5225 key, key_size, NULL, 0)))
5226 goto out;
5227
5228 /* Allocate operations for sign, verify, encrypt and decrypt */
5229 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5230 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5231 key_size)))
5232 goto out;
5233 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5234 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5235 key_size)))
5236 goto out;
5237 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5238 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5239 goto out;
5240 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5241 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5242 goto out;
5243
5244 /* Assign the keypair to all operations */
5245 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5246 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5247 goto out;
5248 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5249 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5250 goto out;
5251 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5252 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5253 goto out;
5254 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5255 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5256 goto out;
5257
5258 /*
5259 * The core of the test case is inspired by the one in libtomcrypt:
5260 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5261 *
5262 * Testcase for Bleichenbacher attack
5263 *
5264 * (1) Create a valid signature
5265 * (2) Check that it can be verified
5266 * (3) Transform the package to fetch plain text (using the encrypt
5267 * operation in GP TEE Internal API)
5268 * (4) Forge the structure of PKCS#1-EMSA encoded data
5269 * (4.1) Search for start and end of the padding string
5270 * (4.2) Move the signature to the front of the padding string
5271 * (4.3) Zero the message until the end
5272 * (5) Transform the package back (using the decrypt operation in
5273 * GP TEE Internal API)
5274 * (6) The result should not be valid if the implementation is robust.
5275 */
5276
5277
5278 for (i = 0; i < 9; i++) {
5279 Do_ADBG_Log("Iteration %zu", i);
5280
5281 /* 1 */
5282 out_size = sizeof(out);
5283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5284 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5285 in, sizeof(in), out, &out_size)))
5286 goto out;
5287
5288 /* 2 */
5289 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5290 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5291 in, sizeof(in), out, out_size)))
5292 goto out;
5293
5294 /* 3 */
5295 tmp_size = sizeof(tmp);
5296 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5297 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5298 out, out_size, tmp, &tmp_size)))
5299 goto out;
5300
Etienne Carriere0953bf02018-12-21 15:36:25 +01005301 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5302 goto out;
5303
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005304 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005305 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005306 if (tmp[n] == 0xff)
5307 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005308
5309 /* Shall find at least a padding start before buffer end */
5310 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5311 goto out;
5312
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005313 for (m = n + 1; m < tmp_size; m++)
5314 if (tmp[m] != 0xff)
5315 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005316
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005317 /* 4.2 */
5318 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005319
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005320 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005321 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005322
5323 /* Prevent overrun when zeroing buffer end */
5324 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5325 goto out;
5326
Etienne Carriere0953bf02018-12-21 15:36:25 +01005327 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005328
5329 /* 5 */
5330 out_size = sizeof(out);
5331 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5332 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5333 tmp, tmp_size, out, &out_size)))
5334 goto out;
5335
5336 /* 6 */
5337 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5338 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5339 in, sizeof(in), out, out_size)))
5340 goto out;
5341 }
5342
5343out:
5344 TEEC_CloseSession(&s);
5345}
Jens Wiklander14f48872018-06-29 15:30:13 +02005346ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5347 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005348
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005349static void xtest_tee_test_4012(ADBG_Case_t *c)
5350{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005351 TEEC_Result res = TEEC_SUCCESS;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005352 TEEC_Session session = { };
5353 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005354 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5355 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005356 uint8_t pool_input[32] = { };
5357 time_t t = 0;
5358 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005359
5360 t = time(NULL);
5361 tm_local = *localtime(&t);
5362
5363 memcpy((void *)pool_input, (void *)&tm_local,
5364 sizeof(pool_input) < sizeof(tm_local) ?
5365 sizeof(pool_input) : sizeof(tm_local));
5366
5367
5368 op.params[0].tmpref.buffer = pool_input;
5369 op.params[0].tmpref.size = sizeof(pool_input);
5370 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5371 TEEC_NONE,
5372 TEEC_NONE,
5373 TEEC_NONE);
5374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5375 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5376 &ret_orig)))
5377 return;
5378
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005379 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_SEED_RNG_POOL,
5380 &op, &ret_orig);
5381 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5382 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5383 TEEC_ORIGIN_TRUSTED_APP))
5384 Do_ADBG_Log("System PTA not available, skipping test 4012");
5385 else
5386 ADBG_EXPECT_TEEC_SUCCESS(c, res);
5387
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005388 TEEC_CloseSession(&session);
5389}
Jens Wiklander14f48872018-06-29 15:30:13 +02005390ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5391 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005392
5393static void xtest_tee_test_4013(ADBG_Case_t *c)
5394{
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005395 TEEC_Result res = TEEC_SUCCESS;
Joakim Bech83a30ca2019-05-29 11:22:27 +02005396 TEEC_Session session = { };
5397 uint32_t ret_orig = 0;
5398 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5399 uint8_t key[32] = { };
5400 uint8_t extra_data[32] = { };
5401
5402 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5403 TEEC_NONE,
5404 TEEC_NONE,
5405 TEEC_NONE);
5406 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5407 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5408 NULL, &ret_orig)))
5409 return;
5410
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005411 res = TEEC_InvokeCommand(&session, TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5412 &op, &ret_orig);
5413 if (res == TEEC_ERROR_ITEM_NOT_FOUND &&
5414 ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, ret_orig,
5415 TEEC_ORIGIN_TRUSTED_APP)) {
5416 Do_ADBG_Log("System PTA not available, skipping test 4013");
5417 goto out;
5418 }
5419 ADBG_EXPECT_TEEC_SUCCESS(c, res);
Joakim Bech83a30ca2019-05-29 11:22:27 +02005420
5421 /* Negative test using non-secure memory */
5422 memset(&op, 0, sizeof(op));
5423 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5424 TEEC_MEMREF_TEMP_OUTPUT,
5425 TEEC_NONE,
5426 TEEC_NONE);
5427
5428 op.params[0].tmpref.buffer = extra_data;
5429 op.params[0].tmpref.size = sizeof(extra_data);
5430 op.params[1].tmpref.buffer = key;
5431 op.params[1].tmpref.size = sizeof(key);
5432 (void)ADBG_EXPECT_TEEC_RESULT(c,
5433 TEEC_ERROR_SECURITY,
5434 TEEC_InvokeCommand(&session,
5435 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5436 &op,
5437 &ret_orig));
5438
Jens Wiklanderc44350d2022-12-02 20:56:49 +01005439out:
Joakim Bech83a30ca2019-05-29 11:22:27 +02005440 TEEC_CloseSession(&session);
5441}
5442ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5443 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005444
5445static void xtest_tee_test_4014(ADBG_Case_t *c)
5446{
5447 TEEC_Session session = { };
5448 uint32_t ret_orig = 0;
5449 TEE_OperationHandle op = TEE_HANDLE_NULL;
5450 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5451 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5452 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5453 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5454 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5455 TEE_Attribute params[9] = { };
5456 size_t param_count = 0;
5457 uint8_t out[128] = { };
5458 size_t out_size = 0;
5459 uint8_t conf_A[32] = { };
5460 uint8_t conf_B[32] = { };
5461
5462 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5463 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5464 &ret_orig)))
5465 return;
5466
5467 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5468 TEE_ECC_CURVE_SM2)) {
5469 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5470 goto out;
5471 }
5472
5473 Do_ADBG_BeginSubCase(c, "Initiator side");
5474
5475 /*
5476 * Key exchange protocol running on user A's side. A is initiator.
5477 */
5478
5479 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5480 ta_crypt_cmd_allocate_operation(c, &session, &op,
5481 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5482 goto out;
5483
5484 /* Allocate and initialize keypair of user A */
5485
5486 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5487 ta_crypt_cmd_allocate_transient_object(c, &session,
5488 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5489 goto out;
5490
5491 param_count = 0;
5492
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005493 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5494 ARRAY(gmt_003_part5_b2_public_xA));
5495
5496 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5497 ARRAY(gmt_003_part5_b2_public_yA));
5498
5499 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5500 ARRAY(gmt_003_part5_b2_private_A));
5501
5502 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5503 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5504 params, param_count)))
5505 goto out;
5506
5507 /*
5508 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5509 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5510 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5511 * user B.
5512 */
5513
5514 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5515 ta_crypt_cmd_allocate_transient_object(c, &session,
5516 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5517 goto out;
5518
5519 param_count = 0;
5520
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005521 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5522 ARRAY(gmt_003_part5_b2_eph_public_xA));
5523
5524 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5525 ARRAY(gmt_003_part5_b2_eph_public_yA));
5526
5527 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5528 ARRAY(gmt_003_part5_b2_eph_private_A));
5529
5530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5531 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5532 params, param_count)))
5533 goto out;
5534
5535 /* Associate user A keys with operation */
5536
5537 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5538 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5539 eph_keyA)))
5540 goto out;
5541
5542 /* Keys have been set, free key objects */
5543
5544 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5545 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5546 goto out;
5547
5548 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5549 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5550 goto out;
5551
5552 /* Allocate output object */
5553
5554 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5555 ta_crypt_cmd_allocate_transient_object(c, &session,
5556 TEE_TYPE_GENERIC_SECRET,
5557 sizeof(gmt_003_part5_b2_shared_secret),
5558 &sv_handle)))
5559 goto out;
5560
5561 /* Set key derivation parameters: user A role, user B information */
5562
5563 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5564 params[0].content.value.a = 0; /* Initiator role */
5565 params[0].content.value.b = 0; /* Not used */
5566 param_count = 1;
5567
5568 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5569 ARRAY(gmt_003_part5_b2_public_xB));
5570
5571 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5572 ARRAY(gmt_003_part5_b2_public_yB));
5573
5574 xtest_add_attr(&param_count, params,
5575 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5576 ARRAY(gmt_003_part5_b2_eph_public_xB));
5577
5578 xtest_add_attr(&param_count, params,
5579 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5580 ARRAY(gmt_003_part5_b2_eph_public_yB));
5581
5582 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5583 ARRAY(gmt_003_part5_b2_id_A));
5584
5585 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5586 ARRAY(gmt_003_part5_b2_id_B));
5587
5588 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5589 ARRAY(gmt_003_part5_b2_conf_B));
5590
5591 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5592 ARRAY(conf_A));
5593
5594 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5595 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5596 param_count)))
5597 goto out;
5598
5599 out_size = sizeof(out);
5600 memset(out, 0, sizeof(out));
5601 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5602 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5603 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5604 goto out;
5605
5606 /* Check derived key */
5607 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5608 sizeof(gmt_003_part5_b2_shared_secret), out,
5609 out_size))
5610 goto out;
5611
5612 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5613 ta_crypt_cmd_free_operation(c, &session, op)))
5614 goto out;
5615
5616 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5617 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5618 goto out;
5619
5620 Do_ADBG_EndSubCase(c, "Initiator side");
5621
5622 Do_ADBG_BeginSubCase(c, "Responder side");
5623
5624 /*
5625 * Key derivation on user B's side
5626 */
5627
5628 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5629 ta_crypt_cmd_allocate_operation(c, &session, &op,
5630 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5631 goto out;
5632
5633 /* Allocate and initialize keypair of user B */
5634
5635 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5636 ta_crypt_cmd_allocate_transient_object(c, &session,
5637 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5638 goto out;
5639
5640 param_count = 0;
5641
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005642 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5643 ARRAY(gmt_003_part5_b2_public_xB));
5644
5645 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5646 ARRAY(gmt_003_part5_b2_public_yB));
5647
5648 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5649 ARRAY(gmt_003_part5_b2_private_B));
5650
5651 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5652 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5653 params, param_count)))
5654 goto out;
5655
5656 /* Allocate and set ephemeral key of user B */
5657
5658 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5659 ta_crypt_cmd_allocate_transient_object(c, &session,
5660 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5661 goto out;
5662
5663 param_count = 0;
5664
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005665 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5666 ARRAY(gmt_003_part5_b2_eph_public_xB));
5667
5668 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5669 ARRAY(gmt_003_part5_b2_eph_public_yB));
5670
5671 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5672 ARRAY(gmt_003_part5_b2_eph_private_B));
5673
5674 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5675 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5676 params, param_count)))
5677 goto out;
5678
5679 /* Associate user B keys with operation */
5680
5681 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5682 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5683 eph_keyB)))
5684 goto out;
5685
5686 /* Keys have been set, free key objects */
5687
5688 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5689 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5690 goto out;
5691
5692 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5693 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5694 goto out;
5695
5696 /* Allocate output object */
5697
5698 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5699 ta_crypt_cmd_allocate_transient_object(c, &session,
5700 TEE_TYPE_GENERIC_SECRET,
5701 sizeof(gmt_003_part5_b2_shared_secret),
5702 &sv_handle)))
5703 goto out;
5704
5705 /* Set key derivation parameters: user B role, user A information */
5706
5707 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5708 params[0].content.value.a = 1; /* Responder role */
5709 params[0].content.value.b = 0; /* Not used */
5710 param_count = 1;
5711
5712 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5713 ARRAY(gmt_003_part5_b2_public_xA));
5714
5715 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5716 ARRAY(gmt_003_part5_b2_public_yA));
5717
5718 xtest_add_attr(&param_count, params,
5719 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5720 ARRAY(gmt_003_part5_b2_eph_public_xA));
5721
5722 xtest_add_attr(&param_count, params,
5723 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5724 ARRAY(gmt_003_part5_b2_eph_public_yA));
5725
5726 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5727 ARRAY(gmt_003_part5_b2_id_A));
5728
5729 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5730 ARRAY(gmt_003_part5_b2_id_B));
5731
5732 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5733 ARRAY(gmt_003_part5_b2_conf_A));
5734
5735 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5736 ARRAY(conf_B));
5737
5738 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5739 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5740 param_count)))
5741 goto out;
5742
5743 out_size = sizeof(out);
5744 memset(out, 0, sizeof(out));
5745 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5746 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5747 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5748 goto out;
5749
5750 /* Check derived key */
5751 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5752 sizeof(gmt_003_part5_b2_shared_secret), out,
5753 out_size))
5754 goto out;
5755
5756 Do_ADBG_EndSubCase(c, "Responder side");
5757
5758out:
5759 TEEC_CloseSession(&session);
5760}
5761ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5762 "Test SM2 KEP (key derivation)");
Sohaib ul Hassan00b3f2c2022-04-11 08:45:08 +03005763
5764static void xtest_tee_test_4015(ADBG_Case_t *c)
5765{
5766 TEEC_Session session = { };
5767 uint32_t ret_orig = 0;
5768 TEE_OperationHandle op = TEE_HANDLE_NULL;
5769 TEE_ObjectHandle key_alice = TEE_HANDLE_NULL;
5770 TEE_ObjectHandle key_bob = TEE_HANDLE_NULL;
5771 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5772 TEE_Attribute params[2] = { };
5773 size_t param_count = 0;
5774 uint8_t out[32] = { };
5775 size_t out_size = 0;
5776 char case_str[40] = "Alice side computes shared secret";
5777
5778 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5779 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5780 &ret_orig)))
5781 return;
5782
5783 Do_ADBG_BeginSubCase(c, "%s", case_str);
5784
5785 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_X25519,
5786 TEE_ECC_CURVE_25519)) {
5787 Do_ADBG_Log("X25519 not supported: skip subcase");
5788 goto out;
5789 }
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 Alice */
5797 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5798 ta_crypt_cmd_allocate_transient_object(c, &session,
5799 TEE_TYPE_X25519_KEYPAIR, 256, &key_alice)))
5800 goto out;
5801
5802 param_count = 0;
5803
5804 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5805 ARRAY(x25519_alice_public));
5806
5807 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5808 ARRAY(x25519_alice_private));
5809
5810 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5811 ta_crypt_cmd_populate_transient_object(c, &session,
5812 key_alice, params, param_count)))
5813 goto out;
5814
5815 /* Associate Alices's keys with operation */
5816 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5817 ta_crypt_cmd_set_operation_key(c, &session, op,
5818 key_alice)))
5819 goto out;
5820
5821 /* Keys have been set, free key objects */
5822 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5823 ta_crypt_cmd_free_transient_object(c, &session,
5824 key_alice)))
5825 goto out;
5826
5827 /* Allocate shared secret output object */
5828 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5829 ta_crypt_cmd_allocate_transient_object(c, &session,
5830 TEE_TYPE_GENERIC_SECRET,
5831 sizeof(x25519_shared_secret), &sv_handle)))
5832 goto out;
5833
5834 /* Reset params */
5835 param_count = 0;
5836
5837 /* Set Bob's public key for Alice side */
5838 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5839 ARRAY(x25519_bob_public));
5840
5841 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5842 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5843 params, param_count)))
5844 goto out;
5845
5846 out_size = sizeof(out);
5847 memset(out, 0, sizeof(out));
5848 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5849 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5850 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5851 &out_size)))
5852 goto out;
5853
5854 /* Check derived key */
5855 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5856 sizeof(x25519_shared_secret), out,
5857 out_size))
5858 goto out;
5859
5860 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5861 ta_crypt_cmd_free_operation(c, &session, op)))
5862 goto out;
5863
5864 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5865 ta_crypt_cmd_free_transient_object(c, &session,
5866 sv_handle)))
5867 goto out;
5868
5869 Do_ADBG_EndSubCase(c, "%s", case_str);
5870
5871 strncpy(case_str, "Bob side computes shared secret",
5872 sizeof(case_str) - 1);
5873
5874 Do_ADBG_BeginSubCase(c, "%s", case_str);
5875
5876 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5877 ta_crypt_cmd_allocate_operation(c, &session, &op,
5878 TEE_ALG_X25519, TEE_MODE_DERIVE, 256)))
5879 goto out;
5880
5881 /* Allocate and initialize keypair of Bob */
5882 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5883 ta_crypt_cmd_allocate_transient_object(c, &session,
5884 TEE_TYPE_X25519_KEYPAIR, 256, &key_bob)))
5885 goto out;
5886
5887 /* Reset params */
5888 param_count = 0;
5889
5890 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5891 ARRAY(x25519_bob_public));
5892
5893 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PRIVATE_VALUE,
5894 ARRAY(x25519_bob_private));
5895
5896 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5897 ta_crypt_cmd_populate_transient_object(c, &session,
5898 key_bob, params, param_count)))
5899 goto out;
5900
5901 /* Associate Bob's keys with operation */
5902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5903 ta_crypt_cmd_set_operation_key(c, &session, op,
5904 key_bob)))
5905 goto out;
5906
5907 /* Keys have been set, free key objects */
5908 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5909 ta_crypt_cmd_free_transient_object(c, &session,
5910 key_bob)))
5911 goto out;
5912
5913 /* Allocate shared secret output object */
5914 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5915 ta_crypt_cmd_allocate_transient_object(c, &session,
5916 TEE_TYPE_GENERIC_SECRET,
5917 sizeof(x25519_shared_secret), &sv_handle)))
5918 goto out;
5919
5920 /* Reset params */
5921 param_count = 0;
5922
5923 /* Set Alice's public key for Bob side */
5924 xtest_add_attr(&param_count, params, TEE_ATTR_X25519_PUBLIC_VALUE,
5925 ARRAY(x25519_alice_public));
5926
5927 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5928 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5929 params, param_count)))
5930 goto out;
5931
5932 out_size = sizeof(out);
5933 memset(out, 0, sizeof(out));
5934 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5935 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5936 sv_handle, TEE_ATTR_SECRET_VALUE, out,
5937 &out_size)))
5938 goto out;
5939
5940 /* Check derived key */
5941 if (!ADBG_EXPECT_BUFFER(c, x25519_shared_secret,
5942 sizeof(x25519_shared_secret), out,
5943 out_size))
5944 goto out;
5945
5946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5947 ta_crypt_cmd_free_operation(c, &session, op)))
5948 goto out;
5949
5950 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5951 ta_crypt_cmd_free_transient_object(c, &session,
5952 sv_handle)))
5953 goto out;
5954
5955out:
5956 Do_ADBG_EndSubCase(c, "%s", case_str);
5957 TEEC_CloseSession(&session);
5958}
5959ADBG_CASE_DEFINE(regression, 4015, xtest_tee_test_4015,
5960 "Test TEE Internal API Derive key X25519");
Valerii Chubarab9863c2022-08-12 07:42:29 +00005961
5962static void xtest_tee_test_4016_ed25519(ADBG_Case_t *c)
5963{
5964 TEEC_Session session = { };
5965 TEE_OperationHandle op = TEE_HANDLE_NULL;
5966 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5967 TEE_Attribute key_attrs[2] = { };
5968 size_t num_key_attrs = 0;
5969 TEE_Attribute attrs[2] = { };
5970 size_t num_attrs = 0;
5971 uint8_t out[64] = { };
5972 size_t out_size = sizeof(out);
5973 size_t n = 0;
5974 uint32_t ret_orig = 0;
5975 size_t max_key_size = 0;
5976
5977 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5978 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5979 NULL, &ret_orig)))
5980 return;
5981
5982 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_ED25519,
5983 TEE_ECC_CURVE_25519)) {
5984 Do_ADBG_Log("ED25519 not supported: skip subcase");
5985 goto out;
5986 }
5987
5988 for (n = 0; n < ARRAY_SIZE(xtest_ac_eddsa_cases); n++) {
5989 const struct xtest_ac_case *tv = xtest_ac_eddsa_cases + n;
5990
5991 if (tv->algo != TEE_ALG_ED25519)
5992 continue;
5993
5994 num_attrs = 0;
5995 num_key_attrs = 0;
5996 max_key_size = tv->params.eddsa.private_len * 8;
5997
5998 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5999 ta_crypt_cmd_allocate_operation(c, &session, &op,
6000 TEE_ALG_ED25519, tv->mode, max_key_size)))
6001 goto out;
6002
6003 xtest_add_attr(&num_key_attrs, key_attrs,
6004 TEE_ATTR_ED25519_PUBLIC_VALUE,
6005 tv->params.eddsa.public,
6006 tv->params.eddsa.public_len);
6007
6008 if (tv->params.eddsa.flag == 1)
Jens Wiklander7596bd32022-12-02 15:43:37 +01006009 xtest_add_attr_value(&num_attrs, attrs,
6010 TEE_ATTR_EDDSA_PREHASH, 1, 0);
Valerii Chubarab9863c2022-08-12 07:42:29 +00006011
6012 if (tv->params.eddsa.context_len > 0)
6013 xtest_add_attr(&num_attrs, attrs, TEE_ATTR_EDDSA_CTX,
6014 tv->params.eddsa.context,
6015 tv->params.eddsa.context_len);
6016
6017 switch (tv->mode) {
6018 case TEE_MODE_SIGN:
6019 xtest_add_attr(&num_key_attrs, key_attrs,
6020 TEE_ATTR_ED25519_PRIVATE_VALUE,
6021 tv->params.eddsa.private,
6022 tv->params.eddsa.private_len);
6023
6024 if (!ADBG_EXPECT_TRUE(c,
6025 create_key(c, &session, max_key_size,
6026 TEE_TYPE_ED25519_KEYPAIR,
6027 key_attrs, num_key_attrs,
6028 &key_handle)))
6029 goto out;
6030
6031 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6032 ta_crypt_cmd_set_operation_key(c,
6033 &session, op, key_handle)))
6034 goto out;
6035
6036 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6037 ta_crypt_cmd_asymmetric_sign(c,
6038 &session, op,
6039 attrs, num_attrs, tv->ptx,
6040 tv->ptx_len, out, &out_size)))
6041 goto out;
6042
6043 ADBG_EXPECT_BUFFER(c, tv->ctx, tv->ctx_len, out, out_size);
6044
6045 break;
6046
6047 case TEE_MODE_VERIFY:
6048 if (!ADBG_EXPECT_TRUE(c,
6049 create_key(c, &session, max_key_size,
6050 TEE_TYPE_ED25519_PUBLIC_KEY,
6051 key_attrs, num_key_attrs,
6052 &key_handle)))
6053 goto out;
6054
6055 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6056 ta_crypt_cmd_set_operation_key(c,
6057 &session, op, key_handle)))
6058 goto out;
6059
6060 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6061 ta_crypt_cmd_asymmetric_verify(c, &session, op,
6062 attrs, num_attrs,
6063 tv->ptx,
6064 tv->ptx_len,
6065 tv->ctx,
6066 tv->ctx_len)))
6067 goto out;
6068 break;
6069
6070 default:
6071 break;
6072 }
6073
6074 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
6075 ta_crypt_cmd_free_operation(c, &session, op)))
6076 goto out;
6077 }
6078out:
6079 TEEC_CloseSession(&session);
6080}
Jens Wiklander7b70ff82022-12-02 20:59:32 +01006081ADBG_CASE_DEFINE(regression, 4016, xtest_tee_test_4016_ed25519,
Valerii Chubarab9863c2022-08-12 07:42:29 +00006082 "Test TEE Internal API ED25519 sign/verify");