blob: f3924f3744f439393a1f2baff22c1515837152cc [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.
Pascal Brandc639ac82015-07-02 08:53:34 +02004 */
5
6#include <stdio.h>
7#include <string.h>
8#include <inttypes.h>
9#include <malloc.h>
Igor Opaniuk7ddaa782018-05-25 15:14:05 +030010#include <time.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020011
12#include "xtest_test.h"
13#include "xtest_helpers.h"
14
15#include <tee_api_types.h>
Gabor Szekely2ad190f2018-09-14 14:05:06 +000016#include <tee_api_defines_extensions.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020017#include <ta_crypt.h>
18#include <utee_defines.h>
19#include <util.h>
20
Jerome Forissier213ca8a2017-03-31 11:27:56 +020021#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020022#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020023
24#include <assert.h>
25
Pascal Brandc639ac82015-07-02 08:53:34 +020026static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
27 TEE_OperationHandle oph)
28{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010029 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020030 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010031 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020032
33 assert((uintptr_t)oph <= UINT32_MAX);
34 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
35 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
36 TEEC_NONE);
37 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
38 &ret_orig);
39 if (res != TEEC_SUCCESS) {
40 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
41 ret_orig);
42 }
43 return res;
44}
45
46static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
47 TEEC_Session *s,
48 TEE_OperationHandle dst_oph,
49 TEE_OperationHandle src_oph)
50{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010051 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020052 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010053 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020054
55 assert((uintptr_t)dst_oph <= UINT32_MAX);
56 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
57
58 assert((uintptr_t)src_oph <= UINT32_MAX);
59 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
60 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
61 TEEC_NONE);
62
63 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
64 &ret_orig);
65
66 if (res != TEEC_SUCCESS) {
67 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
68 ret_orig);
69 }
70 return res;
71}
72
73static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
74 TEE_OperationHandle oph,
75 const void *chunk,
76 size_t chunk_size)
77{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010078 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020079 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010080 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020081
82 assert((uintptr_t)oph <= UINT32_MAX);
83 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
84 op.params[1].tmpref.buffer = (void *)chunk;
85 op.params[1].tmpref.size = chunk_size;
86
87 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
88 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
89 TEEC_NONE);
90
91 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
92
93 if (res != TEEC_SUCCESS) {
94 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
95 ret_orig);
96 }
97
98 return res;
99}
100
101static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
102 TEE_OperationHandle oph,
103 const void *chunk,
104 size_t chunk_len, void *hash,
105 size_t *hash_len)
106{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100107 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200108 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100109 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200110
111 assert((uintptr_t)oph <= UINT32_MAX);
112 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
113
114 op.params[1].tmpref.buffer = (void *)chunk;
115 op.params[1].tmpref.size = chunk_len;
116
117 op.params[2].tmpref.buffer = (void *)hash;
118 op.params[2].tmpref.size = *hash_len;
119
120 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
121 TEEC_MEMREF_TEMP_INPUT,
122 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
123
124 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
125 &ret_orig);
126
127 if (res != TEEC_SUCCESS) {
128 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
129 ret_orig);
130 }
131
132 if (res == TEEC_SUCCESS)
133 *hash_len = op.params[2].tmpref.size;
134
135 return res;
136}
137
138static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
139 TEEC_Session *s,
140 TEE_OperationHandle oph,
141 TEE_ObjectHandle key1,
142 TEE_ObjectHandle key2)
143{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100144 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200145 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100146 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200147
148 assert((uintptr_t)oph <= UINT32_MAX);
149 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
150
151 assert((uintptr_t)key1 <= UINT32_MAX);
152 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
153
154 assert((uintptr_t)key2 <= UINT32_MAX);
155 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
156 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
157 TEEC_NONE, TEEC_NONE);
158
159 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
160 &ret_orig);
161
162 if (res != TEEC_SUCCESS) {
163 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
164 ret_orig);
165 }
166
167 return res;
168}
169
170static TEEC_Result ta_crypt_cmd_mac_init(ADBG_Case_t *c, TEEC_Session *s,
171 TEE_OperationHandle oph,
172 const void *iv, size_t iv_len)
173{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100174 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200175 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100176 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200177
178 assert((uintptr_t)oph <= UINT32_MAX);
179 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
180
181 if (iv != NULL) {
182 op.params[1].tmpref.buffer = (void *)iv;
183 op.params[1].tmpref.size = iv_len;
184 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
185 TEEC_MEMREF_TEMP_INPUT,
186 TEEC_NONE, TEEC_NONE);
187 } else {
188 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
189 TEEC_NONE, TEEC_NONE);
190 }
191
192 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &ret_orig);
193
194 if (res != TEEC_SUCCESS) {
195 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
196 ret_orig);
197 }
198
199 return res;
200}
201
202static TEEC_Result ta_crypt_cmd_mac_update(ADBG_Case_t *c, TEEC_Session *s,
203 TEE_OperationHandle oph,
204 const void *chunk, size_t chunk_size)
205{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100206 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200207 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100208 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200209
210 assert((uintptr_t)oph <= UINT32_MAX);
211 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
212
213 op.params[1].tmpref.buffer = (void *)chunk;
214 op.params[1].tmpref.size = chunk_size;
215
216 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
217 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
218 TEEC_NONE);
219
220 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
221
222 if (res != TEEC_SUCCESS) {
223 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
224 ret_orig);
225 }
226
227 return res;
228}
229
230static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
231 TEEC_Session *s,
232 TEE_OperationHandle oph,
233 const void *chunk,
234 size_t chunk_len,
235 void *hash,
236 size_t *hash_len)
237{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100238 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200239 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100240 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200241
242 assert((uintptr_t)oph <= UINT32_MAX);
243 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
244
245 op.params[1].tmpref.buffer = (void *)chunk;
246 op.params[1].tmpref.size = chunk_len;
247
248 op.params[2].tmpref.buffer = (void *)hash;
249 op.params[2].tmpref.size = *hash_len;
250
251 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
252 TEEC_MEMREF_TEMP_INPUT,
253 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
254
255 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
256 &ret_orig);
257
258 if (res != TEEC_SUCCESS) {
259 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
260 ret_orig);
261 }
262
263 if (res == TEEC_SUCCESS)
264 *hash_len = op.params[2].tmpref.size;
265
266 return res;
267}
268
269static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
270 TEE_OperationHandle oph,
271 const void *iv, size_t iv_len)
272{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100273 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200274 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100275 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200276
277 assert((uintptr_t)oph <= UINT32_MAX);
278 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
279
280 if (iv != NULL) {
281 op.params[1].tmpref.buffer = (void *)iv;
282 op.params[1].tmpref.size = iv_len;
283
284 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
285 TEEC_MEMREF_TEMP_INPUT,
286 TEEC_NONE, TEEC_NONE);
287 } else {
288 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
289 TEEC_NONE, TEEC_NONE);
290 }
291
292 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &op, &ret_orig);
293
294 if (res != TEEC_SUCCESS) {
295 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
296 ret_orig);
297 }
298
299 return res;
300}
301
302static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
303 TEE_OperationHandle oph,
304 const void *src, size_t src_len,
305 void *dst, size_t *dst_len)
306{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100307 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200308 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100309 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200310
311 assert((uintptr_t)oph <= UINT32_MAX);
312 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
313
314 op.params[1].tmpref.buffer = (void *)src;
315 op.params[1].tmpref.size = src_len;
316
317 op.params[2].tmpref.buffer = dst;
318 op.params[2].tmpref.size = *dst_len;
319
320 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
321 TEEC_MEMREF_TEMP_INPUT,
322 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
323
324 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &op, &ret_orig);
325
326 if (res != TEEC_SUCCESS) {
327 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
328 ret_orig);
329 }
330
331 if (res == TEEC_SUCCESS)
332 *dst_len = op.params[2].tmpref.size;
333
334 return res;
335}
336
337static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
338 TEEC_Session *s,
339 TEE_OperationHandle oph,
340 const void *src,
341 size_t src_len,
342 void *dst,
343 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 = (void *)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_DO_FINAL, &op,
363 &ret_orig);
364
365 if (res != TEEC_SUCCESS) {
366 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
367 ret_orig);
368 }
369
370 if (res == TEEC_SUCCESS)
371 *dst_len = op.params[2].tmpref.size;
372
373 return res;
374}
375
376static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
377 TEEC_Session *s,
378 void *buf,
379 size_t blen)
380{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100381 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200382 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100383 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200384
385 op.params[0].tmpref.buffer = buf;
386 op.params[0].tmpref.size = blen;
387
388 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
389 TEEC_NONE, TEEC_NONE);
390
Joakim Bech81f97e32020-05-27 12:14:23 +0200391 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENERATE, &op,
Pascal Brandc639ac82015-07-02 08:53:34 +0200392 &ret_orig);
393
394 if (res != TEEC_SUCCESS) {
395 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
396 ret_orig);
397 }
398
399 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
400 op.params[0].tmpref.size);
401 return res;
402}
403
404static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
405 TEE_OperationHandle oph,
406 const void *nonce, size_t nonce_len,
407 size_t tag_len, size_t aad_len,
408 size_t payload_len)
409{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100410 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200411 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100412 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200413
414 assert((uintptr_t)oph <= UINT32_MAX);
415 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
416 op.params[0].value.b = tag_len;
417
418 op.params[1].tmpref.buffer = (void *)nonce;
419 op.params[1].tmpref.size = nonce_len;
420
421 op.params[2].value.a = aad_len;
422 op.params[2].value.b = payload_len;
423
424 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
425 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200426 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200427
428 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
429
430 if (res != TEEC_SUCCESS) {
431 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
432 ret_orig);
433 }
434 return res;
435}
436
437static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
438 TEE_OperationHandle oph,
439 const void *aad, size_t aad_len)
440{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100441 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200442 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100443 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200444
445 assert((uintptr_t)oph <= UINT32_MAX);
446 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
447
448 op.params[1].tmpref.buffer = (void *)aad;
449 op.params[1].tmpref.size = aad_len;
450
451 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
452 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
453 TEEC_NONE);
454
455 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
456
457 if (res != TEEC_SUCCESS) {
458 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
459 ret_orig);
460 }
461
462 return res;
463}
464
465static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
466 TEEC_Session *s,
467 TEE_OperationHandle oph,
468 const void *src,
469 size_t src_len,
470 void *dst,
471 size_t *dst_len)
472{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100473 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200474 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100475 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200476
477 assert((uintptr_t)oph <= UINT32_MAX);
478 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
479
480 op.params[1].tmpref.buffer = (void *)src;
481 op.params[1].tmpref.size = src_len;
482
483 op.params[2].tmpref.buffer = (void *)dst;
484 op.params[2].tmpref.size = *dst_len;
485
486 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
487 TEEC_MEMREF_TEMP_INPUT,
488 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
489
490 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
491
492 if (res != TEEC_SUCCESS) {
493 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
494 ret_orig);
495 }
496
497 if (res == TEEC_SUCCESS)
498 *dst_len = op.params[2].tmpref.size;
499
500 return res;
501}
502
503static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
504 TEEC_Session *s,
505 TEE_OperationHandle oph,
506 const void *src,
507 size_t src_len, void *dst,
508 size_t *dst_len, void *tag,
509 size_t *tag_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.params[3].tmpref.buffer = (void *)tag;
525 op.params[3].tmpref.size = *tag_len;
526
527 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
528 TEEC_MEMREF_TEMP_INPUT,
529 TEEC_MEMREF_TEMP_OUTPUT,
530 TEEC_MEMREF_TEMP_OUTPUT);
531
532 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
533 &ret_orig);
534
535 if (res != TEEC_SUCCESS) {
536 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
537 ret_orig);
538 }
539
540 if (res == TEEC_SUCCESS) {
541 *dst_len = op.params[2].tmpref.size;
542 *tag_len = op.params[3].tmpref.size;
543 }
544
545 return res;
546}
547
548static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
549 TEEC_Session *s,
550 TEE_OperationHandle oph,
551 const void *src, size_t src_len,
552 void *dst, size_t *dst_len,
553 const void *tag, size_t tag_len)
554{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100555 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200556 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100557 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200558
559 assert((uintptr_t)oph <= UINT32_MAX);
560 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
561
562 op.params[1].tmpref.buffer = (void *)src;
563 op.params[1].tmpref.size = src_len;
564
565 op.params[2].tmpref.buffer = dst;
566 op.params[2].tmpref.size = *dst_len;
567
568 op.params[3].tmpref.buffer = (void *)tag;
569 op.params[3].tmpref.size = tag_len;
570
571 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
572 TEEC_MEMREF_TEMP_INPUT,
573 TEEC_MEMREF_TEMP_OUTPUT,
574 TEEC_MEMREF_TEMP_INPUT);
575
576 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
577 &ret_orig);
578
579 if (res != TEEC_SUCCESS) {
580 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
581 ret_orig);
582 }
583
584 if (res == TEEC_SUCCESS)
585 *dst_len = op.params[2].tmpref.size;
586
587 return res;
588}
589
590static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
591 TEEC_Session *s,
592 TEE_OperationHandle oph,
593 uint32_t cmd,
594 const TEE_Attribute *params,
595 uint32_t paramCount,
596 const void *src,
597 size_t src_len,
598 void *dst,
599 size_t *dst_len)
600{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100601 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200602 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100603 uint32_t ret_orig = 0;
604 uint8_t *buf = NULL;
605 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200606
607 res = pack_attrs(params, paramCount, &buf, &blen);
608 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
609 return res;
610
611 assert((uintptr_t)oph <= UINT32_MAX);
612 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
613
614 op.params[1].tmpref.buffer = buf;
615 op.params[1].tmpref.size = blen;
616
617 op.params[2].tmpref.buffer = (void *)src;
618 op.params[2].tmpref.size = src_len;
619
620 op.params[3].tmpref.buffer = dst;
621 op.params[3].tmpref.size = *dst_len;
622
623 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
624 TEEC_MEMREF_TEMP_INPUT,
625 TEEC_MEMREF_TEMP_INPUT,
626 TEEC_MEMREF_TEMP_OUTPUT);
627
628 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
629
630 if (res != TEEC_SUCCESS) {
631 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
632 ret_orig);
633 }
634
635 if (res == TEEC_SUCCESS)
636 *dst_len = op.params[3].tmpref.size;
637
638 free(buf);
639 return res;
640}
641
642static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
643 TEEC_Session *s,
644 TEE_OperationHandle oph,
645 const TEE_Attribute *params,
646 uint32_t paramCount,
647 const void *src,
648 size_t src_len,
649 void *dst,
650 size_t *dst_len)
651{
652 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
653 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
654 params, paramCount,
655 src, src_len, dst, dst_len);
656}
657
658static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
659 TEEC_Session *s,
660 TEE_OperationHandle oph,
661 const TEE_Attribute *params,
662 uint32_t paramCount,
663 const void *src,
664 size_t src_len,
665 void *dst,
666 size_t *dst_len)
667{
668 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
669 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
670 params, paramCount,
671 src, src_len, dst, dst_len);
672}
673
674static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
675 TEEC_Session *s,
676 TEE_OperationHandle oph,
677 const TEE_Attribute *params,
678 uint32_t paramCount,
679 const void *digest,
680 size_t digest_len,
681 void *signature,
682 size_t *signature_len)
683{
684 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
685 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
686 digest, digest_len, signature, signature_len);
687}
688
689static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
690 TEEC_Session *s,
691 TEE_OperationHandle oph,
692 const TEE_Attribute *params,
693 uint32_t paramCount,
694 const void *digest,
695 size_t digest_len,
696 const void *signature,
697 size_t signature_len)
698{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100699 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200700 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100701 uint32_t ret_orig = 0;
702 uint8_t *buf = NULL;
703 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200704
705 res = pack_attrs(params, paramCount, &buf, &blen);
706 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
707 return res;
708
709 assert((uintptr_t)oph <= UINT32_MAX);
710 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
711
712 op.params[1].tmpref.buffer = buf;
713 op.params[1].tmpref.size = blen;
714
715 op.params[2].tmpref.buffer = (void *)digest;
716 op.params[2].tmpref.size = digest_len;
717
718 op.params[3].tmpref.buffer = (void *)signature;
719 op.params[3].tmpref.size = signature_len;
720
721 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
722 TEEC_MEMREF_TEMP_INPUT,
723 TEEC_MEMREF_TEMP_INPUT,
724 TEEC_MEMREF_TEMP_INPUT);
725
726 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
727 &op, &ret_orig);
728
729 if (res != TEEC_SUCCESS) {
730 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
731 ret_orig);
732 }
733
734 free(buf);
735 return res;
736}
737
738static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
739 TEEC_Session *s,
740 TEE_ObjectHandle o,
741 uint32_t attr_id,
742 uint32_t *valuea,
743 uint32_t *valueb)
744{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100745 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200746 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100747 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200748
749 assert((uintptr_t)o <= UINT32_MAX);
750 op.params[0].value.a = (uint32_t)(uintptr_t)o;
751 op.params[0].value.b = attr_id;
752 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
753 TEEC_NONE, TEEC_NONE);
754
755 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
756 &op, &ret_orig);
757
758 if (res != TEEC_SUCCESS) {
759 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
760 ret_orig);
761 }
762
763 if (res == TEEC_SUCCESS) {
764 *valuea = op.params[1].value.a;
765 *valueb = op.params[1].value.b;
766 }
767
768 return res;
769}
770
771static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
772 TEEC_Session *s,
773 TEE_ObjectHandle o,
774 uint32_t key_size,
775 const TEE_Attribute *params,
776 uint32_t paramCount)
777{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100778 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200779 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100780 uint32_t ret_orig = 0;
781 uint8_t *buf = NULL;
782 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200783
784 res = pack_attrs(params, paramCount, &buf, &blen);
785 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
786 return res;
787
788 assert((uintptr_t)o <= UINT32_MAX);
789 op.params[0].value.a = (uint32_t)(uintptr_t)o;
790 op.params[0].value.b = key_size;
791
792 op.params[1].tmpref.buffer = buf;
793 op.params[1].tmpref.size = blen;
794
795 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
796 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
797 TEEC_NONE);
798
799 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
800
801 if (res != TEEC_SUCCESS) {
802 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
803 ret_orig);
804 }
805
806 free(buf);
807 return res;
808}
809
810static const uint8_t hash_data_md5_in1[] = {
811 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
812};
813
814static const uint8_t hash_data_md5_out1[] = {
815 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
816 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
817};
818
819static const uint8_t hash_data_sha1_in1[] = {
820 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
821};
822
823static const uint8_t hash_data_sha1_out1[] = {
824 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
825 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
826 0xc1, 0x5e, 0x7c, 0x9c
827};
828
829static const uint8_t hash_data_sha224_in1[] = {
830 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
831};
832
833static const uint8_t hash_data_sha224_out1[] = {
834 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
835 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
836 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
837 0x92, 0x49, 0xd8, 0x44
838};
839
840static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
841
842static const uint8_t hash_data_sha256_out1[] = {
843 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
844 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
845 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
846 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
847};
848
849static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
850
851static const uint8_t hash_data_sha256_out2[] = {
852 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
853 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
854 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
855 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
856};
857
858
859static const uint8_t hash_data_sha384_in1[] = {
860 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
861};
862
863static const uint8_t hash_data_sha384_out1[] = {
864 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
865 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
866 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
867 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
868 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
869 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
870};
871
872static const uint8_t hash_data_sha512_in1[] = {
873 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
874};
875
876static const uint8_t hash_data_sha512_out1[] = {
877 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
878 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
879 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
880 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
881 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
882 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
883 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
884 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
885};
886
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100887/*
888 * SM3
889 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100890 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100891 */
892static const uint8_t hash_data_sm3_a1_in[3] = "abc";
893
894static const uint8_t hash_data_sm3_a1_out[] = {
895 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
896 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
897 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
898 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
899};
900
901/*
902 * SM3
903 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100904 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100905 */
906static const uint8_t hash_data_sm3_a2_in[] = {
907 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
908 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
909 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
910 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
911 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
912 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
913 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
914 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
915};
916
917static const uint8_t hash_data_sm3_a2_out[] = {
918 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
919 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
920 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
921 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
922};
923
Pascal Brandc639ac82015-07-02 08:53:34 +0200924struct xtest_hash_case {
925 uint32_t algo;
926 size_t in_incr;
927 const uint8_t *in;
928 size_t in_len;
929 const uint8_t *out;
930 size_t out_len;
931};
932
933#define XTEST_HASH_CASE(algo, in_incr, in, out) \
934 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
935
936static const struct xtest_hash_case hash_cases[] = {
937 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
938 hash_data_md5_out1),
939 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
940 hash_data_sha1_out1),
941 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
942 hash_data_sha224_out1),
943 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
944 hash_data_sha256_out1),
945 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
946 hash_data_sha256_out2),
947 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
948 hash_data_sha384_out1),
949 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
950 hash_data_sha512_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100951 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
952 hash_data_sm3_a1_out),
953 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
954 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +0200955};
956
957static void xtest_tee_test_4001(ADBG_Case_t *c)
958{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100959 TEEC_Session session = { };
960 uint32_t ret_orig = 0;
961 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200962
963 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
964 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
965 &ret_orig)))
966 return;
967
968
969 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100970 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
971 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
972 uint8_t out[64] = { };
973 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200974
Jerome Forissier87b00c02020-01-22 16:33:12 +0100975 if (hash_cases[n].algo == TEE_ALG_SM3 &&
976 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
977 TEE_CRYPTO_ELEMENT_NONE)) {
978 Do_ADBG_Log("SM3 not supported: skip subcase");
979 continue;
980 }
981
Pascal Brandc639ac82015-07-02 08:53:34 +0200982 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
983 (int)n, (unsigned int)hash_cases[n].algo);
984
985 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
986 ta_crypt_cmd_allocate_operation(c, &session, &op1,
987 hash_cases[n].algo,
988 TEE_MODE_DIGEST, 0)))
989 goto out;
990
991 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
992 ta_crypt_cmd_allocate_operation(c, &session, &op2,
993 hash_cases[n].algo,
994 TEE_MODE_DIGEST, 0)))
995 goto out;
996
997 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
998 ta_crypt_cmd_digest_update(c, &session, op1,
999 hash_cases[n].in,
1000 hash_cases[n].in_incr)))
1001 goto out;
1002
1003 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1004 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1005 goto out;
1006
1007 out_size = sizeof(out);
1008 memset(out, 0, sizeof(out));
1009 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1010 ta_crypt_cmd_digest_do_final(c, &session, op2,
1011 hash_cases[n].in + hash_cases[n].in_incr,
1012 hash_cases[n].in_len - hash_cases[n].in_incr,
1013 out, &out_size)))
1014 goto out;
1015
1016 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1017 hash_cases[n].out_len, out, out_size);
1018
1019 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1020 ta_crypt_cmd_reset_operation(c, &session, op1)))
1021 goto out;
1022
1023 out_size = sizeof(out);
1024 memset(out, 0, sizeof(out));
1025 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1026 ta_crypt_cmd_digest_do_final(c, &session, op1,
1027 hash_cases[n].in,
1028 hash_cases[n].in_len, out,
1029 &out_size)))
1030 goto out;
1031
1032 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1033 hash_cases[n].out_len, out, out_size);
1034
Jerome Forissier1e05e262015-07-29 16:09:07 +02001035 /*
1036 * Invoke TEE_DigestDoFinal() a second time to check that state
1037 * was properly reset
1038 */
1039 out_size = sizeof(out);
1040 memset(out, 0, sizeof(out));
1041 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1042 ta_crypt_cmd_digest_do_final(c, &session, op1,
1043 hash_cases[n].in,
1044 hash_cases[n].in_len, out,
1045 &out_size)))
1046 goto out;
1047
1048 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1049 hash_cases[n].out_len, out, out_size);
1050
Pascal Brandc639ac82015-07-02 08:53:34 +02001051 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1052 ta_crypt_cmd_free_operation(c, &session, op1)))
1053 goto out;
1054
1055 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1056 ta_crypt_cmd_free_operation(c, &session, op2)))
1057 goto out;
1058
1059 Do_ADBG_EndSubCase(c, NULL);
1060 }
1061
1062out:
1063 TEEC_CloseSession(&session);
1064}
Jens Wiklander14f48872018-06-29 15:30:13 +02001065ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1066 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001067
Pascal Brandc639ac82015-07-02 08:53:34 +02001068struct xtest_mac_case {
1069 uint32_t algo;
1070 uint32_t key_type;
1071 const uint8_t *key;
1072 size_t key_len;
1073 size_t in_incr;
1074 const uint8_t *in;
1075 size_t in_len;
1076 const uint8_t *out;
1077 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001078 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001079};
1080
Jerome Forissier3dec7442019-01-30 17:50:05 +01001081#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001082 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001083 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1084
1085#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1086 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1087 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1088
1089#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1090 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1091 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001092
1093#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1094 XTEST_MAC_CASE((algo), (key_type), \
1095 mac_cbc_ ## vect ## _key, (in_incr), \
1096 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1097
1098#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1099 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1100 mac_cmac_ ## vect ## _key, (in_incr), \
1101 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1102
1103static const struct xtest_mac_case mac_cases[] = {
1104 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1105 mac_data_md5_key1,
1106 4, mac_data_md5_in1, mac_data_md5_out1),
1107 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1108 mac_data_sha1_key1,
1109 5, mac_data_sha1_in1, mac_data_sha1_out1),
1110 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1111 mac_data_sha224_key1,
1112 8, mac_data_sha224_in1, mac_data_sha224_out1),
1113 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1114 mac_data_sha256_key1,
1115 1, mac_data_sha256_in1, mac_data_sha256_out1),
1116 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1117 mac_data_sha256_key2,
1118 7, mac_data_sha256_in2, mac_data_sha256_out2),
1119 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1120 mac_data_sha384_key1,
1121 11, mac_data_sha384_in1, mac_data_sha384_out1),
1122 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1123 mac_data_sha512_key1,
1124 13, mac_data_sha512_in1, mac_data_sha512_out1),
1125
1126 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1127 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1128 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1129 17),
1130 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1131 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1132 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1133 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1134 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1135 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1136 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001137 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001138
1139 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1140 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1141 ARRAY_SIZE(mac_cmac_vect1_out) },
1142 XTEST_MAC_CMAC_CASE(vect2, 9),
1143 XTEST_MAC_CMAC_CASE(vect3, 9),
1144 XTEST_MAC_CMAC_CASE(vect4, 9),
1145 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1146 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1147 ARRAY_SIZE(mac_cmac_vect5_out) },
1148 XTEST_MAC_CMAC_CASE(vect6, 9),
1149 XTEST_MAC_CMAC_CASE(vect7, 9),
1150 XTEST_MAC_CMAC_CASE(vect8, 9),
1151 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1152 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1153 ARRAY_SIZE(mac_cmac_vect9_out) },
1154 XTEST_MAC_CMAC_CASE(vect10, 9),
1155 XTEST_MAC_CMAC_CASE(vect11, 9),
1156 XTEST_MAC_CMAC_CASE(vect12, 9),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001157
1158 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1159 mac_data_sm3_d31_key,
1160 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1161 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1162 mac_data_sm3_d32_key,
1163 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001164};
1165
1166static void xtest_tee_test_4002(ADBG_Case_t *c)
1167{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001168 TEEC_Session session = { };
1169 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1170 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1171 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1172 uint8_t out[64] = { };
1173 size_t out_size = 0;
1174 uint32_t ret_orig = 0;
1175 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001176
1177 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1178 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1179 &ret_orig)))
1180 return;
1181
1182 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001183 TEE_Attribute key_attr = { };
1184 size_t key_size = 0;
1185 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001186
1187 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1188 (int)n, (unsigned int)mac_cases[n].algo);
1189
1190 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1191 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1192 key_attr.content.ref.length = mac_cases[n].key_len;
1193
1194 key_size = key_attr.content.ref.length * 8;
1195 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1196 mac_cases[n].key_type == TEE_TYPE_DES3)
1197 /* Exclude parity in bit size of key */
1198 key_size -= key_size / 8;
1199
1200 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1201 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1202 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1203 goto out;
1204
1205 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1206 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1207 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1208 goto out;
1209
1210 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1211 ta_crypt_cmd_allocate_transient_object(c, &session,
1212 mac_cases[n].key_type, key_size, &key_handle)))
1213 goto out;
1214
1215 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1216 ta_crypt_cmd_populate_transient_object(c, &session,
1217 key_handle, &key_attr, 1)))
1218 goto out;
1219
1220 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1221 ta_crypt_cmd_set_operation_key(c, &session, op1,
1222 key_handle)))
1223 goto out;
1224
1225 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1226 ta_crypt_cmd_free_transient_object(c, &session,
1227 key_handle)))
1228 goto out;
1229
1230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1231 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1232 goto out;
1233
Jerome Forissier3dec7442019-01-30 17:50:05 +01001234 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001235 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001236 while (offs + mac_cases[n].in_incr <
1237 mac_cases[n].in_len) {
1238 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1239 ta_crypt_cmd_mac_update(c, &session,
1240 op1, mac_cases[n].in + offs,
1241 mac_cases[n].in_incr)))
1242 goto out;
1243 offs += mac_cases[n].in_incr;
1244 if (!mac_cases[n].multiple_incr)
1245 break;
1246 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001247 }
1248
1249 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1250 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1251 goto out;
1252
1253 out_size = sizeof(out);
1254 memset(out, 0, sizeof(out));
1255 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1256 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001257 mac_cases[n].in + offs,
1258 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001259 out, &out_size)))
1260 goto out;
1261
1262 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1263 mac_cases[n].out_len, out, out_size);
1264
1265 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1266 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1267 goto out;
1268
1269 out_size = sizeof(out);
1270 memset(out, 0, sizeof(out));
1271 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1272 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1273 mac_cases[n].in, mac_cases[n].in_len, out,
1274 &out_size)))
1275 goto out;
1276
1277 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1278 mac_cases[n].out_len, out, out_size);
1279
1280 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1281 ta_crypt_cmd_free_operation(c, &session, op1)))
1282 goto out;
1283
1284 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1285 ta_crypt_cmd_free_operation(c, &session, op2)))
1286 goto out;
1287
1288 Do_ADBG_EndSubCase(c, NULL);
1289 }
1290out:
1291 TEEC_CloseSession(&session);
1292}
Jens Wiklander14f48872018-06-29 15:30:13 +02001293ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1294 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001295
Pascal Brandc639ac82015-07-02 08:53:34 +02001296static const uint8_t ciph_data_aes_key1[] = {
1297 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1298 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1299};
1300
Jerome Forissier0780ad42018-06-05 15:02:37 +02001301static const uint8_t ciph_data_aes_key2[] = {
1302 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1303 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1304};
1305
Pascal Brandc639ac82015-07-02 08:53:34 +02001306static const uint8_t ciph_data_des_key1[] = {
1307 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1308};
1309
1310static const uint8_t ciph_data_des_key2[] = {
1311 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1312};
1313
1314
1315static const uint8_t ciph_data_des3_key1[] = {
1316 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1317 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1318 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1319};
1320
1321static const uint8_t ciph_data_des3_key2[] = {
1322 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1323 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1324 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1325};
1326
1327static const uint8_t ciph_data_des2_key1[] = {
1328 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1329 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1330};
1331
1332static const uint8_t ciph_data_in1[] = {
1333 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1334 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1335 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1336 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1337 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1338 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1339};
1340
1341static const uint8_t ciph_data_in3[] = {
1342 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1343 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1344 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1345 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1346 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1347 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1348};
1349
Jerome Forissier45218eb2018-04-11 13:03:26 +02001350static const uint8_t ciph_data_in4[] = {
1351 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1352 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1353 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1354 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1355 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1356 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1357 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1358 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1359};
1360
Jerome Forissier0780ad42018-06-05 15:02:37 +02001361static const uint8_t ciph_data_in5[] = {
1362 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1363 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1364 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1365 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1366 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1367 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1368 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1369 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001370 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1371 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001372 0x01, 0x01, 0x01
1373};
1374
Pascal Brandc639ac82015-07-02 08:53:34 +02001375static const uint8_t ciph_data_128_iv1[] = {
1376 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1377 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1378};
1379
Jerome Forissier0780ad42018-06-05 15:02:37 +02001380static const uint8_t ciph_data_128_iv2[] = {
1381 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1382 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1383};
1384
Pascal Brandc639ac82015-07-02 08:53:34 +02001385static const uint8_t ciph_data_64_iv1[] = {
1386 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1387};
1388
1389static const uint8_t ciph_data_in2[] = {
1390 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1391};
1392
1393static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1394 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1395 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1396 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1397 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1398 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1399 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1400};
1401
1402static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1403 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1404 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1405 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1406 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1407 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1408 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1409};
1410
1411static const uint8_t ciph_data_aes_ctr_out1[] = {
1412 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1413 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1414 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1415 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1416 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1417 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1418};
1419
1420static const uint8_t ciph_data_aes_ctr_out2[] = {
1421 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1422 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1423 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1424 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1425 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1426 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1427};
1428
Jerome Forissier45218eb2018-04-11 13:03:26 +02001429static const uint8_t ciph_data_aes_ctr_out4[] = {
1430 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1431 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1432 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1433 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1434 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1435 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1436 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1437 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1438};
1439
Jerome Forissier0780ad42018-06-05 15:02:37 +02001440static const uint8_t ciph_data_aes_ctr_out5[] = {
1441 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1442 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1443 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1444 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1445 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1446 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1447 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1448 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001449 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1450 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1451 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001452};
1453
Pascal Brandc639ac82015-07-02 08:53:34 +02001454static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1455 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1456 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1457};
1458
1459static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1462};
1463
1464static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1465 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1466 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1467 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1468 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1469 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1470 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1471 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1472 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1473 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1474 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1475 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1476 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1477 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1478 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1479 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1480 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1481 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1482 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1483 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1484 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1485};
1486
1487static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
1488 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
1489 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
1490 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
1491 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
1492 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
1493 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
1494 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
1495 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
1496 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
1497 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
1498 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
1499 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
1500 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
1501 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
1502 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
1503 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
1504 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
1505 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
1506 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1507 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1508};
1509
1510/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
1511 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
1512static const uint8_t ciph_data_aes_cts_vect1_key[] = {
1513 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
1514 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
1515};
1516
1517static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
1518 0x00
1519};
1520
1521static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
1522 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1523 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1524 0x20
1525};
1526
1527static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
1528 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
1529 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
1530 0x97
1531};
1532
1533#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
1534#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
1535static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
1536 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1537 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1538 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1539 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
1540};
1541
1542static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
1543 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
1544 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
1545 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1546 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
1547};
1548
1549#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
1550#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
1551static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
1552 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1553 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1554 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1555 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1556};
1557
1558static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
1559 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1560 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1561 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1562 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1563};
1564
1565#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
1566#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
1567static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
1568 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1569 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1570 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1571 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1572 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1573 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
1574};
1575
1576static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
1577 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1578 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1579 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
1580 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
1581 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1582 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
1583};
1584
1585#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
1586#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
1587static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
1588 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1589 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1590 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1591 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1592 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1593 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1594};
1595
1596static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
1597 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1598 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1599 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1600 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1601 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1602 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1603};
1604
1605#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
1606#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
1607static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
1608 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
1609 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
1610 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
1611 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
1612 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
1613 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
1614 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
1615 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
1616};
1617
1618static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
1619 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
1620 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
1621 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
1622 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
1623 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
1624 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
1625 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
1626 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
1627};
1628
Jerome Forissiered00e162017-01-20 09:22:52 +01001629/*
1630 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
1631 * 80 bytes of data, processed in two steps (32 + 48).
1632 */
1633
1634#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
1635
1636static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
1637 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
1638 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
1639};
1640
1641static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
1642 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
1643 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
1644 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
1645 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
1646 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
1647 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
1648 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
1649 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
1650 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
1651 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
1652};
1653
1654/*
1655 * Ciphertext was generated by an online tool for AES CBC.
1656 * Since the input size is a multiple of the block size, and the ciphertext
1657 * format is CS3, the output is the same as plain AES CBC with the last
1658 * two blocks swapped.
1659 */
1660static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
1661 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
1662 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
1663 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
1664 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
1665 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
1666 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
1667 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
1668 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
1669 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
1670 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
1671};
1672
Pascal Brandc639ac82015-07-02 08:53:34 +02001673static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
1674 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
1675 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
1676 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
1677 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
1678 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
1679 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
1680};
1681
1682static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
1683 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
1684};
1685
1686static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
1687 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
1688 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
1689 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
1690 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
1691 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
1692 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
1693};
1694
1695static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
1696 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
1697 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
1698 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
1699 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
1700 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
1701 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
1702};
1703
1704static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
1705 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
1706 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
1707 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
1708 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
1709 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
1710 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
1711};
1712
1713static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
1714 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
1715 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
1716 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
1717 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
1718 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
1719 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
1720};
1721
1722static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
1723 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
1724 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
1725 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
1726 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
1727 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
1728 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
1729};
1730
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01001731/* SM4 ECB */
1732
1733static const uint8_t ciph_data_sm4_key1[] = {
1734 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1735 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1736};
1737
1738static const uint8_t ciph_data_sm4_in1[] = {
1739 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1740 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1741};
1742
1743static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
1744 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
1745 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
1746};
1747
1748/*
1749 * SM4 CBC
1750 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
1751 */
1752static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
1753 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1754 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1755};
1756
1757static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
1758 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1759 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1760};
1761
1762static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
1763 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1764 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1765 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1766 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1767};
1768
1769static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
1770 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
1771 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
1772 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
1773 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
1774};
1775
1776/*
1777 * SM4 CBC
1778 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
1779 */
1780static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
1781 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1782 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1783};
1784
1785static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
1786 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1787 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1788};
1789
1790static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
1791 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1792 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
1793 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
1794 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
1795};
1796
1797static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
1798 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
1799 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
1800 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
1801 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
1802};
1803
1804/*
1805 * SM4 CTR
1806 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
1807 */
1808static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
1809 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1810 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1811};
1812
1813static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
1814 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1815 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1816};
1817
1818static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
1819 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1820 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1821 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1822 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1823 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1824 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1825 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1826 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1827};
1828
1829static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
1830 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
1831 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
1832 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
1833 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
1834 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
1835 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
1836 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
1837 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
1838};
1839
1840/*
1841 * SM4 CTR
1842 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
1843 */
1844static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
1845 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
1846 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
1847};
1848
1849static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
1850 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
1851 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
1852};
1853
1854static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
1855 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1856 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1857 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1858 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
1859 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
1860 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1861 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
1862 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
1863};
1864
1865static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
1866 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
1867 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
1868 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
1869 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
1870 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
1871 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
1872 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
1873 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
1874};
1875
Pascal Brandc639ac82015-07-02 08:53:34 +02001876struct xtest_ciph_case {
1877 uint32_t algo;
1878 uint32_t mode;
1879 uint32_t key_type;
1880 const uint8_t *key1;
1881 size_t key1_len;
1882 const uint8_t *key2;
1883 size_t key2_len;
1884 const uint8_t *iv;
1885 size_t iv_len;
1886 size_t in_incr;
1887 const uint8_t *in;
1888 size_t in_len;
1889 const uint8_t *out;
1890 size_t out_len;
1891 size_t line;
1892};
1893
1894#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
1895 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1896 NULL, 0, NULL, 0, \
1897 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
1898 __LINE__ }, \
1899 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1900 NULL, 0, NULL, 0, \
1901 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
1902
1903#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
1904 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
1905 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
1906 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
1907 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
1908 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
1909 (ptx), ARRAY_SIZE(ptx), __LINE__ }
1910
1911#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
1912 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
1913 ciph_data_aes_xts_ ## vect ## _key1, \
1914 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
1915 ciph_data_aes_xts_ ## vect ## _key2, \
1916 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
1917 ciph_data_aes_xts_ ## vect ## _iv, \
1918 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
1919 (in_incr), \
1920 ciph_data_aes_xts_ ## vect ## _ptx, \
1921 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
1922 ciph_data_aes_xts_ ## vect ## _ctx, \
1923 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
1924 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
1925 ciph_data_aes_xts_ ## vect ## _key1, \
1926 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
1927 ciph_data_aes_xts_ ## vect ## _key2, \
1928 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
1929 ciph_data_aes_xts_ ## vect ## _iv, \
1930 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
1931 (in_incr), \
1932 ciph_data_aes_xts_ ## vect ## _ctx, \
1933 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
1934 ciph_data_aes_xts_ ## vect ## _ptx, \
1935 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
1936
1937#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
1938 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
1939 ciph_data_aes_cbc_ ## vect ## _key, \
1940 ciph_data_aes_cbc_ ## vect ## _iv, \
1941 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
1942 ciph_data_aes_cbc_ ## vect ## _ctx)
1943
1944#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
1945 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
1946 ciph_data_aes_cts_ ## vect ## _key, \
1947 ciph_data_aes_cts_ ## vect ## _iv, \
1948 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
1949 ciph_data_aes_cts_ ## vect ## _ctx)
1950
1951static const struct xtest_ciph_case ciph_cases[] = {
1952 /* AES */
1953 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
1954 ciph_data_aes_key1, 11, ciph_data_in1,
1955 ciph_data_aes_ecb_nopad_out1),
1956 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
1957 ciph_data_aes_key1, ciph_data_128_iv1, 11,
1958 ciph_data_in1,
1959 ciph_data_aes_cbc_nopad_out1),
1960 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
1961 ciph_data_aes_key1, ciph_data_128_iv1, 13,
1962 ciph_data_in1,
1963 ciph_data_aes_ctr_out1),
1964 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
1965 ciph_data_aes_key1, ciph_data_128_iv1, 13,
1966 ciph_data_in3,
1967 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01001968 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
1969 ciph_data_aes_key1, ciph_data_128_iv1, 16,
1970 ciph_data_in3,
1971 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02001972 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
1973 ciph_data_aes_key1, ciph_data_128_iv1, 16,
1974 ciph_data_in4,
1975 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02001976 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
1977 ciph_data_aes_key2, ciph_data_128_iv2, 11,
1978 ciph_data_in5,
1979 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02001980
1981 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02001982 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02001983
1984 /* AES-CTS */
1985 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
1986 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
1987 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
1988 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
1989 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
1990 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
1991 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01001992 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02001993
1994 /* DES */
1995 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
1996 ciph_data_des_key1, 14, ciph_data_in1,
1997 ciph_data_des_ecb_nopad_out1),
1998 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
1999 ciph_data_des_key2, 3, ciph_data_in2,
2000 ciph_data_des_ecb_nopad_out2),
2001 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2002 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2003 ciph_data_des_cbc_nopad_out1),
2004
2005 /* DES3 */
2006 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2007 ciph_data_des3_key1, 11, ciph_data_in1,
2008 ciph_data_des3_ecb_nopad_out1),
2009 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2010 ciph_data_des3_key2, 3, ciph_data_in2,
2011 ciph_data_des_ecb_nopad_out2),
2012 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2013 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2014 ciph_data_in1,
2015 ciph_data_des3_cbc_nopad_out1),
2016
2017 /* DES2 */
2018 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2019 ciph_data_des2_key1, 11, ciph_data_in1,
2020 ciph_data_des2_ecb_nopad_out1),
2021 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2022 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2023 ciph_data_in1,
2024 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002025
Pascal Brandc639ac82015-07-02 08:53:34 +02002026 /* AES-XTS */
2027 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2028 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2029 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2030 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2031 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2032 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2033 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2034 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2035 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2036 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2037 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2038 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2039 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2040 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2041 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2042 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2043 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2044 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2045 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002046
2047 /* SM4 */
2048 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2049 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2050 ciph_data_sm4_ecb_nopad_out1),
2051 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2052 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2053 11, ciph_data_sm4_cbc_a221_in,
2054 ciph_data_sm4_cbc_a221_out),
2055 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2056 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2057 11, ciph_data_sm4_cbc_a222_in,
2058 ciph_data_sm4_cbc_a222_out),
2059 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2060 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2061 11, ciph_data_sm4_ctr_a251_in,
2062 ciph_data_sm4_ctr_a251_out),
2063 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2064 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2065 11, ciph_data_sm4_ctr_a252_in,
2066 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002067};
2068
Jerome Forissier23256842018-02-16 09:25:35 +01002069static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002070{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002071 TEEC_Session session = { };
2072 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002073 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002074 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2075 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002076 uint8_t out[2048] = { };
2077 size_t out_size = 0;
2078 size_t out_offs = 0;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002079 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002080 uint32_t ret_orig = 0;
2081 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002082
2083 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2084 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2085 &ret_orig)))
2086 return;
2087
2088 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002089 TEE_Attribute key_attr = { };
2090 size_t key_size = 0;
2091 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002092
Jerome Forissier817d99f2020-01-22 16:33:12 +01002093 switch (ciph_cases[n].algo) {
2094 case TEE_ALG_SM4_CTR:
2095 case TEE_ALG_SM4_CBC_NOPAD:
2096 case TEE_ALG_SM4_ECB_NOPAD:
2097 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2098 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2099 Do_ADBG_Log("SM4 not supported: skip subcase");
2100 continue;
2101 }
2102 break;
2103 default:
2104 break;
2105 }
2106
Pascal Brandc639ac82015-07-02 08:53:34 +02002107 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2108 (int)n, (unsigned int)ciph_cases[n].algo,
2109 (int)ciph_cases[n].line);
2110
2111 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2112 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2113 key_attr.content.ref.length = ciph_cases[n].key1_len;
2114
2115 key_size = key_attr.content.ref.length * 8;
2116 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2117 ciph_cases[n].key_type == TEE_TYPE_DES3)
2118 /* Exclude parity in bit size of key */
2119 key_size -= key_size / 8;
2120
2121 op_key_size = key_size;
2122 if (ciph_cases[n].key2 != NULL)
2123 op_key_size *= 2;
2124
2125 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2126 ta_crypt_cmd_allocate_operation(c, &session, &op,
2127 ciph_cases[n].algo, ciph_cases[n].mode,
2128 op_key_size)))
2129 goto out;
2130
2131 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002132 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2133 ciph_cases[n].algo, ciph_cases[n].mode,
2134 op_key_size)))
2135 goto out;
2136
2137 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002138 ta_crypt_cmd_allocate_transient_object(c, &session,
2139 ciph_cases[n].key_type, key_size,
2140 &key1_handle)))
2141 goto out;
2142
2143 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2144 ta_crypt_cmd_populate_transient_object(c, &session,
2145 key1_handle, &key_attr, 1)))
2146 goto out;
2147
2148 if (ciph_cases[n].key2 != NULL) {
2149 key_attr.content.ref.buffer =
2150 (void *)ciph_cases[n].key2;
2151 key_attr.content.ref.length = ciph_cases[n].key2_len;
2152
2153 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2154 ta_crypt_cmd_allocate_transient_object(c,
2155 &session, ciph_cases[n].key_type,
2156 key_attr.content.ref.length * 8,
2157 &key2_handle)))
2158 goto out;
2159
2160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2161 ta_crypt_cmd_populate_transient_object(c,
2162 &session, key2_handle, &key_attr, 1)))
2163 goto out;
2164
2165 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2166 ta_crypt_cmd_set_operation_key2(c, &session, op,
2167 key1_handle, key2_handle)))
2168 goto out;
2169 } else {
2170 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2171 ta_crypt_cmd_set_operation_key(c, &session, op,
2172 key1_handle)))
2173 goto out;
2174 }
2175
2176 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2177 ta_crypt_cmd_free_transient_object(c, &session,
2178 key1_handle)))
2179 goto out;
2180 key1_handle = TEE_HANDLE_NULL;
2181
2182 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2183 ta_crypt_cmd_free_transient_object(c, &session,
2184 key2_handle)))
2185 goto out;
2186 key2_handle = TEE_HANDLE_NULL;
2187
2188 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2189 ta_crypt_cmd_cipher_init(c, &session, op,
2190 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2191 goto out;
2192
2193 out_offs = 0;
2194 out_size = sizeof(out);
2195 memset(out, 0, sizeof(out));
2196 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2197 ta_crypt_cmd_cipher_update(c, &session, op,
2198 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2199 &out_size)))
2200 goto out;
2201
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002202 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2203 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2204 ciph_cases[n].in_incr);
2205
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002206 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2207 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2208 goto out;
2209
Pascal Brandc639ac82015-07-02 08:53:34 +02002210 out_offs += out_size;
2211 out_size = sizeof(out) - out_offs;
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002212 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002213
2214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2215 ta_crypt_cmd_cipher_do_final(c, &session, op,
2216 ciph_cases[n].in + ciph_cases[n].in_incr,
2217 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2218 out + out_offs,
2219 &out_size)))
2220 goto out;
2221
2222 out_offs += out_size;
2223
2224 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2225 ciph_cases[n].out_len, out, out_offs);
2226
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002227 /* test on the copied op2 */
2228 out_size = sizeof(out) - out_offs2;
2229
2230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2231 ta_crypt_cmd_cipher_do_final(c, &session, op2,
2232 ciph_cases[n].in + ciph_cases[n].in_incr,
2233 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2234 out + out_offs2,
2235 &out_size)))
2236 goto out;
2237
2238 out_offs2 += out_size;
2239
2240 ADBG_EXPECT_BUFFER(c, ciph_cases[n].out, ciph_cases[n].out_len,
2241 out, out_offs2);
2242
Pascal Brandc639ac82015-07-02 08:53:34 +02002243 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2244 ta_crypt_cmd_free_operation(c, &session, op)))
2245 goto out;
2246
Jens Wiklander93ff0a52020-12-14 12:45:02 +01002247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2248 ta_crypt_cmd_free_operation(c, &session, op2)))
2249 goto out;
2250
Pascal Brandc639ac82015-07-02 08:53:34 +02002251 Do_ADBG_EndSubCase(c, NULL);
2252 }
2253out:
2254 TEEC_CloseSession(&session);
2255}
Jens Wiklander14f48872018-06-29 15:30:13 +02002256ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2257 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002258
Pascal Brandc639ac82015-07-02 08:53:34 +02002259static void xtest_tee_test_4004(ADBG_Case_t *c)
2260{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002261 TEEC_Session session = { };
2262 uint32_t ret_orig = 0;
2263 uint8_t buf1[45] = { };
2264 uint8_t buf2[45] = { };
2265 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002266
2267 Do_ADBG_BeginSubCase(c, "TEE get random");
2268 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2269 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2270 &ret_orig)))
2271 return;
2272
2273 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2274 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2275 sizeof(buf1))))
2276 goto out;
2277
2278 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2279 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2280
2281 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2282 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2283 sizeof(buf2))))
2284 goto out;
2285
2286 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2287 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2288
2289 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2290 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2291out:
2292 TEEC_CloseSession(&session);
2293 Do_ADBG_EndSubCase(c, "TEE get random");
2294}
Jens Wiklander14f48872018-06-29 15:30:13 +02002295ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2296 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002297
2298struct xtest_ae_case {
2299 uint32_t algo;
2300 uint32_t mode;
2301 uint32_t key_type;
2302 const uint8_t *key;
2303 size_t key_len;
2304 const uint8_t *nonce;
2305 size_t nonce_len;
2306 size_t aad_incr;
2307 const uint8_t *aad;
2308 size_t aad_len;
2309 size_t in_incr;
2310 const uint8_t *ptx;
2311 size_t ptx_len;
2312 const uint8_t *ctx;
2313 size_t ctx_len;
2314 const uint8_t *tag;
2315 size_t tag_len;
2316 size_t line;
2317};
2318
2319
2320#define ARRAY(a) a, ARRAY_SIZE(a)
2321#define NULL_ARRAY(a) NULL, 0
2322
2323#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2324 aad_array, ptx_array, ctx_array) \
2325 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2326 ARRAY(vect ## _nonce), (aad_incr), \
2327 aad_array(vect ## _aad), (in_incr), \
2328 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2329 ARRAY(vect ## _tag), \
2330 __LINE__ }, \
2331 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2332 ARRAY(vect ## _nonce), (aad_incr), \
2333 aad_array(vect ## _aad), (in_incr), \
2334 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2335 ARRAY(vect ## _tag), \
2336 __LINE__ }
2337
2338#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2339 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2340 in_incr, ARRAY, ARRAY, ARRAY)
2341
2342#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2343 aad_array, ptx_array, ctx_array) \
2344 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2345 in_incr, aad_array, ptx_array, ctx_array)
2346
2347
2348
2349static const struct xtest_ae_case ae_cases[] = {
2350 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2351 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2352 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2353
2354 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2355 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2356 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002357 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2358 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002359 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2360 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2361 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2362 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2363 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2364 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2365 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2366 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2367 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2368 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2369 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2370 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2371 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2372 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002373#ifdef CFG_GCM_NIST_VECTORS
2374#include "gcmDecrypt128.h"
2375#include "gcmDecrypt192.h"
2376#include "gcmDecrypt256.h"
2377#include "gcmEncryptExtIV128.h"
2378#include "gcmEncryptExtIV192.h"
2379#include "gcmEncryptExtIV256.h"
2380#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002381};
2382
2383static void xtest_tee_test_4005(ADBG_Case_t *c)
2384{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002385 TEEC_Session session = { };
2386 TEE_OperationHandle op = TEE_HANDLE_NULL;
Jens Wiklander7404c072020-12-15 08:06:32 +01002387 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002388 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002389 TEE_Attribute key_attr = { };
2390 uint8_t out[512] = { };
2391 size_t out_size = 0;
2392 size_t out_offs = 0;
Jens Wiklander7404c072020-12-15 08:06:32 +01002393 size_t out_offs2 = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002394 uint32_t ret_orig = 0;
2395 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002396
2397 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2398 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2399 &ret_orig)))
2400 return;
2401
2402 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2403 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2404 (int)n, (unsigned int)ae_cases[n].algo,
2405 (int)ae_cases[n].line);
2406
2407 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2408 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2409 key_attr.content.ref.length = ae_cases[n].key_len;
2410
2411 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2412 ta_crypt_cmd_allocate_operation(c, &session, &op,
2413 ae_cases[n].algo, ae_cases[n].mode,
2414 key_attr.content.ref.length * 8)))
2415 goto out;
2416
2417 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Jens Wiklander7404c072020-12-15 08:06:32 +01002418 ta_crypt_cmd_allocate_operation(c, &session, &op2,
2419 ae_cases[n].algo, ae_cases[n].mode,
2420 key_attr.content.ref.length * 8)))
2421 goto out;
2422
2423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
Pascal Brandc639ac82015-07-02 08:53:34 +02002424 ta_crypt_cmd_allocate_transient_object(c, &session,
2425 ae_cases[n].key_type,
2426 key_attr.content.ref.length * 8,
2427 &key_handle)))
2428 goto out;
2429
2430 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2431 ta_crypt_cmd_populate_transient_object(c, &session,
2432 key_handle, &key_attr, 1)))
2433 goto out;
2434
2435 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2436 ta_crypt_cmd_set_operation_key(c, &session, op,
2437 key_handle)))
2438 goto out;
2439
2440 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2441 ta_crypt_cmd_free_transient_object(c, &session,
2442 key_handle)))
2443 goto out;
2444 key_handle = TEE_HANDLE_NULL;
2445
2446 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2447 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2448 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2449 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2450 goto out;
2451
2452 if (ae_cases[n].aad != NULL) {
2453 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2454 ta_crypt_cmd_ae_update_aad(c, &session, op,
2455 ae_cases[n].aad, ae_cases[n].aad_incr)))
2456 goto out;
2457
2458 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2459 ta_crypt_cmd_ae_update_aad(c, &session, op,
2460 ae_cases[n].aad + ae_cases[n].aad_incr,
2461 ae_cases [n].aad_len -
2462 ae_cases[n].aad_incr)))
2463 goto out;
2464 }
2465
2466 out_offs = 0;
2467 out_size = sizeof(out);
2468 memset(out, 0, sizeof(out));
2469 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2470 if (ae_cases[n].ptx != NULL) {
2471 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2472 ta_crypt_cmd_ae_update(c, &session, op,
2473 ae_cases[n].ptx,
2474 ae_cases[n].in_incr, out,
2475 &out_size)))
2476 goto out;
2477 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002478 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2479 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2480 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002481 }
2482 } else {
2483 if (ae_cases[n].ctx != NULL) {
2484 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2485 ta_crypt_cmd_ae_update(c, &session, op,
2486 ae_cases[n].ctx,
2487 ae_cases[n].in_incr, out,
2488 &out_size)))
2489 goto out;
2490 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002491 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2492 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2493 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002494 }
2495 }
2496
Jens Wiklander7404c072020-12-15 08:06:32 +01002497 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2498 ta_crypt_cmd_copy_operation(c, &session, op2, op)))
2499 goto out;
2500
Pascal Brandc639ac82015-07-02 08:53:34 +02002501 out_size = sizeof(out) - out_offs;
Jens Wiklander7404c072020-12-15 08:06:32 +01002502 out_offs2 = out_offs;
Pascal Brandc639ac82015-07-02 08:53:34 +02002503 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2504 uint8_t out_tag[64];
2505 size_t out_tag_len = MIN(sizeof(out_tag),
2506 ae_cases[n].tag_len);
2507
2508 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2509 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2510 ae_cases[n].ptx + ae_cases[n].in_incr,
2511 ae_cases[n].ptx_len -
2512 ae_cases[n].in_incr,
2513 out + out_offs,
2514 &out_size, out_tag, &out_tag_len)))
2515 goto out;
2516
2517 (void)ADBG_EXPECT_BUFFER(c,
2518 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2519 out_tag_len);
2520
2521 out_offs += out_size;
2522
2523 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2524 ae_cases[n].ctx_len, out, out_offs);
2525 } else {
2526 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2527 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2528 ae_cases[n].ctx + ae_cases[n].in_incr,
2529 ae_cases[n].ctx_len -
2530 ae_cases[n].in_incr,
2531 out + out_offs,
2532 &out_size, ae_cases[n].tag,
2533 ae_cases[n].tag_len)))
2534 goto out;
2535
2536 out_offs += out_size;
2537
2538 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2539 ae_cases[n].ptx_len, out, out_offs);
2540 }
2541
Jens Wiklander7404c072020-12-15 08:06:32 +01002542 /* test on the copied op2 */
2543 out_size = sizeof(out) - out_offs2;
2544 memset(out + out_offs2, 0, out_size);
2545 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2546 uint8_t out_tag[64] = { 0 };
2547 size_t out_tag_len = MIN(sizeof(out_tag),
2548 ae_cases[n].tag_len);
2549
2550 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2551 ta_crypt_cmd_ae_encrypt_final(c, &session, op2,
2552 ae_cases[n].ptx + ae_cases[n].in_incr,
2553 ae_cases[n].ptx_len -
2554 ae_cases[n].in_incr,
2555 out + out_offs2,
2556 &out_size, out_tag, &out_tag_len)))
2557 goto out;
2558
2559 ADBG_EXPECT_BUFFER(c, ae_cases[n].tag,
2560 ae_cases[n].tag_len, out_tag,
2561 out_tag_len);
2562
2563 out_offs2 += out_size;
2564
2565 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2566 ae_cases[n].ctx_len, out, out_offs2);
2567 } else {
2568 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2569 ta_crypt_cmd_ae_decrypt_final(c, &session, op2,
2570 ae_cases[n].ctx + ae_cases[n].in_incr,
2571 ae_cases[n].ctx_len -
2572 ae_cases[n].in_incr,
2573 out + out_offs2,
2574 &out_size, ae_cases[n].tag,
2575 ae_cases[n].tag_len)))
2576 goto out;
2577
2578 out_offs2 += out_size;
2579
2580 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2581 ae_cases[n].ptx_len, out, out_offs2);
2582 }
2583
Pascal Brandc639ac82015-07-02 08:53:34 +02002584 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2585 ta_crypt_cmd_free_operation(c, &session, op)))
2586 goto out;
2587
Jens Wiklander7404c072020-12-15 08:06:32 +01002588 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2589 ta_crypt_cmd_free_operation(c, &session, op2)))
2590 goto out;
2591
Pascal Brandc639ac82015-07-02 08:53:34 +02002592 Do_ADBG_EndSubCase(c, NULL);
2593 }
2594out:
2595 TEEC_CloseSession(&session);
2596}
Jens Wiklander14f48872018-06-29 15:30:13 +02002597ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2598 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002599
2600struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002601 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002602 uint32_t algo;
2603 TEE_OperationMode mode;
2604
2605 union {
2606 struct {
2607 const uint8_t *modulus;
2608 size_t modulus_len;
2609
2610 const uint8_t *pub_exp;
2611 size_t pub_exp_len;
2612
2613 const uint8_t *priv_exp;
2614 size_t priv_exp_len;
2615
2616 const uint8_t *prime1; /* q */
2617 size_t prime1_len;
2618 const uint8_t *prime2; /* p */
2619 size_t prime2_len;
2620 const uint8_t *exp1; /* dp */
2621 size_t exp1_len;
2622 const uint8_t *exp2; /* dq */
2623 size_t exp2_len;
2624 const uint8_t *coeff; /* iq */
2625 size_t coeff_len;
2626
2627 int salt_len;
2628 } rsa;
2629 struct {
2630 const uint8_t *prime;
2631 size_t prime_len;
2632 const uint8_t *sub_prime;
2633 size_t sub_prime_len;
2634 const uint8_t *base;
2635 size_t base_len;
2636 const uint8_t *pub_val;
2637 size_t pub_val_len;
2638 const uint8_t *priv_val;
2639 size_t priv_val_len;
2640 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002641 struct {
2642 const uint8_t *private;
2643 size_t private_len;
2644 const uint8_t *public_x;
2645 size_t public_x_len;
2646 const uint8_t *public_y;
2647 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002648 } ecc;
Pascal Brandc639ac82015-07-02 08:53:34 +02002649 } params;
2650
2651 const uint8_t *ptx;
2652 size_t ptx_len;
2653 const uint8_t *ctx;
2654 size_t ctx_len;
2655 size_t line;
2656};
2657
2658#define WITHOUT_SALT(x) -1
2659#define WITH_SALT(x) x
2660
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002661#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2662 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002663 ARRAY(vect ## _ptx), \
2664 ARRAY(vect ## _out), \
2665 __LINE__ }
2666
2667#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2668 { .rsa = { \
2669 ARRAY(vect ## _modulus), \
2670 ARRAY(vect ## _pub_exp), \
2671 ARRAY(vect ## _priv_exp), \
2672 opt_crt_array(vect ## _prime1), \
2673 opt_crt_array(vect ## _prime2), \
2674 opt_crt_array(vect ## _exp1), \
2675 opt_crt_array(vect ## _exp2), \
2676 opt_crt_array(vect ## _coeff), \
2677 opt_salt(vect ## _salt_len) \
2678 } }
2679
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002680#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2681 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002682 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2683
2684#define XTEST_AC_DSA_UNION(vect) \
2685 { .dsa = { \
2686 ARRAY(vect ## _prime), \
2687 ARRAY(vect ## _sub_prime), \
2688 ARRAY(vect ## _base), \
2689 ARRAY(vect ## _pub_val), \
2690 ARRAY(vect ## _priv_val), \
2691 } }
2692
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002693#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2694 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002695
Pascal Brand3e143ee2015-07-15 17:17:16 +02002696#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002697 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002698 ARRAY(vect ## _private), \
2699 ARRAY(vect ## _public_x), \
2700 ARRAY(vect ## _public_y), \
2701 } }
2702
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002703#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002704 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002705
Pascal Brandc639ac82015-07-02 08:53:34 +02002706static const struct xtest_ac_case xtest_ac_cases[] = {
2707 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002708 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002709 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002710 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002711 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002712 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002713 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002714 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002715 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002716 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2717 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2718 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2719 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002720 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2721 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2722 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2723 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002724 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002725 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002726 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002727 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002728 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002729 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002730 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002731 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002732 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002733 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002734 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002735 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002736 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002737 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002738 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002739 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002740 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002741 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002742 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002743 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002744 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2745 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2746 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2747 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002748
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002749 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002750 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002751 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002752 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002753
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002754#ifdef CFG_CRYPTO_RSASSA_NA1
2755 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2756 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2757 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2758 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2759#endif
2760
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002761 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002762 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002763 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002764 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002765
2766 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002767 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002768 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002769 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002770
2771 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002772 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002773 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002774 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2775
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002776 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2777 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002778 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002779 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002780 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002781
2782 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2783 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002784 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002785 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2786 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002787 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002788
2789 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2790 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002791 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002792 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2793 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002794 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002795
2796 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2797 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002798 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002799 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2800 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002801 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002802
2803 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2804 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002805 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002806 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2807 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002808 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2809
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002810 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002811 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002812 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002813 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002814 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002815 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002816 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002817 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002818 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002819 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002820 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002821 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
2822
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002823 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2824 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002825 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002826 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2827 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002828 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002829 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2830 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002831 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002832 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2833 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002834 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002835 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2836 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002837 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002838 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2839 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002840 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
2841
2842 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002843 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002844 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002845 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002846 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002847 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002848 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002849 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002850 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002851 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002852 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002853 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002854 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002855 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002856 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002857 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002858 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002859 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002860 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002861 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002862 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002863 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002864 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002865 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002866 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002867 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002868 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002869 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002870 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002871 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002872 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002873 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002874 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002875 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002876 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002877 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002878 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002879 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002880 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002881 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002882 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002883 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002884 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002885 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002886 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
2887
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002888 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2889 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002890 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002891 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002892 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002893 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2894 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002895 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002896 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2897 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002898 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002899 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2900 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002901 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002902 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2903 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002904 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002905 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2906 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002907 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002908 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2909 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002910 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002911 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2912 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002913 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002914 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2915 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002916 ac_rsassa_vect15, ARRAY, WITH_SALT),
2917
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002918 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002919 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002920 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002921 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002922 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002923 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002924 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002925 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002926 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002927 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002928 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002929 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
2930
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002931 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2932 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002933 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002934 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2935 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002936 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002937 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2938 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002939 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002940 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2941 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002942 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002943 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2944 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002945 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002946 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2947 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002948 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
2949
2950 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002951 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002952 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
2953 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002954 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
2955 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
2956 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
2957 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
2958 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
2959 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
2960 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
2961 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
2962 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
2963 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
2964 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
2965 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
2966 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
2967 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
2968 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
2969 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
2970 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
2971 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
2972 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
2973 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
2974 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
2975 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
2976 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
2977 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
2978 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
2979 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
2980 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
2981 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002982 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
2983 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
2984 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
2985 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
2986 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
2987 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002988 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
2989 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002990 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
2991 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
2992 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
2993 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
2994 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
2995 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
2996 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
2997 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
2998 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
2999 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3000 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3001 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3002 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3003 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3004 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3005 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3006 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3007 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3008 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3009 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3010 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3011 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3012 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3013 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3014 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3015 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3016 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3017 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003018 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003019 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3020 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3021 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3022 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3023 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3024 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3025 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3026 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3027 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3028 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3029 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3030 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3031 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3032 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3033 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3034 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3035 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3036 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3037 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3038 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3039 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3040 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3041 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3042 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3043 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3044 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3045 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3046 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3047 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3048 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003049 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3050 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3051 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3052 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003053 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3054 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003055 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3056 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3057 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3058 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3059 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3060 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3061 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3062 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3063 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3064 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3065 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3066 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3067 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3068 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3069 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3070 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3071 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3072 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3073 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3074 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3075 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3076 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3077 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3078 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3079 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3080 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3081 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3082 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003083 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003084 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3085 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003086 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3087 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3088 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3089 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3090 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3091 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3092 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3093 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3094 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3095 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3096 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3097 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3098 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3099 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3100 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3101 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3102 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3103 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3104 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3105 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3106 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3107 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3108 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3109 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3110 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3111 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3112 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3113 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003114 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3115 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3116 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3117 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3118 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003119 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3120 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003121 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3122 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3123 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3124 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3125 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3126 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3127 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3128 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3129 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3130 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3131 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3132 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3133 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3134 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3135 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3136 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3137 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3138 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3139 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3140 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3141 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3142 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3143 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3144 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3145 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3146 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3147 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3148 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003149 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3150 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003151
3152 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003153 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003154 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3155 nist_186_2_ecdsa_testvector_1),
3156 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3157 nist_186_2_ecdsa_testvector_1),
3158 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3159 nist_186_2_ecdsa_testvector_2),
3160 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3161 nist_186_2_ecdsa_testvector_2),
3162 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3163 nist_186_2_ecdsa_testvector_3),
3164 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3165 nist_186_2_ecdsa_testvector_3),
3166 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3167 nist_186_2_ecdsa_testvector_4),
3168 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3169 nist_186_2_ecdsa_testvector_4),
3170 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3171 nist_186_2_ecdsa_testvector_5),
3172 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3173 nist_186_2_ecdsa_testvector_5),
3174 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3175 nist_186_2_ecdsa_testvector_6),
3176 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3177 nist_186_2_ecdsa_testvector_6),
3178 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3179 nist_186_2_ecdsa_testvector_7),
3180 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3181 nist_186_2_ecdsa_testvector_7),
3182 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3183 nist_186_2_ecdsa_testvector_8),
3184 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3185 nist_186_2_ecdsa_testvector_8),
3186 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3187 nist_186_2_ecdsa_testvector_9),
3188 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3189 nist_186_2_ecdsa_testvector_9),
3190 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3191 nist_186_2_ecdsa_testvector_10),
3192 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3193 nist_186_2_ecdsa_testvector_10),
3194 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3195 nist_186_2_ecdsa_testvector_11),
3196 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3197 nist_186_2_ecdsa_testvector_11),
3198 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3199 nist_186_2_ecdsa_testvector_12),
3200 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3201 nist_186_2_ecdsa_testvector_12),
3202 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3203 nist_186_2_ecdsa_testvector_13),
3204 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3205 nist_186_2_ecdsa_testvector_13),
3206 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3207 nist_186_2_ecdsa_testvector_14),
3208 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3209 nist_186_2_ecdsa_testvector_14),
3210 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3211 nist_186_2_ecdsa_testvector_15),
3212 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3213 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003214 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003215 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3216 nist_186_2_ecdsa_testvector_16),
3217 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3218 nist_186_2_ecdsa_testvector_16),
3219 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3220 nist_186_2_ecdsa_testvector_17),
3221 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3222 nist_186_2_ecdsa_testvector_17),
3223 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3224 nist_186_2_ecdsa_testvector_18),
3225 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3226 nist_186_2_ecdsa_testvector_18),
3227 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3228 nist_186_2_ecdsa_testvector_19),
3229 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3230 nist_186_2_ecdsa_testvector_19),
3231 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3232 nist_186_2_ecdsa_testvector_20),
3233 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3234 nist_186_2_ecdsa_testvector_20),
3235 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3236 nist_186_2_ecdsa_testvector_21),
3237 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3238 nist_186_2_ecdsa_testvector_21),
3239 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3240 nist_186_2_ecdsa_testvector_22),
3241 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3242 nist_186_2_ecdsa_testvector_22),
3243 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3244 nist_186_2_ecdsa_testvector_23),
3245 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3246 nist_186_2_ecdsa_testvector_23),
3247 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3248 nist_186_2_ecdsa_testvector_24),
3249 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3250 nist_186_2_ecdsa_testvector_24),
3251 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3252 nist_186_2_ecdsa_testvector_25),
3253 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3254 nist_186_2_ecdsa_testvector_25),
3255 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3256 nist_186_2_ecdsa_testvector_26),
3257 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3258 nist_186_2_ecdsa_testvector_26),
3259 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3260 nist_186_2_ecdsa_testvector_27),
3261 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3262 nist_186_2_ecdsa_testvector_27),
3263 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3264 nist_186_2_ecdsa_testvector_28),
3265 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3266 nist_186_2_ecdsa_testvector_28),
3267 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3268 nist_186_2_ecdsa_testvector_29),
3269 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3270 nist_186_2_ecdsa_testvector_29),
3271 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3272 nist_186_2_ecdsa_testvector_30),
3273 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3274 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003275 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003276 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3277 nist_186_2_ecdsa_testvector_31),
3278 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3279 nist_186_2_ecdsa_testvector_31),
3280 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3281 nist_186_2_ecdsa_testvector_32),
3282 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3283 nist_186_2_ecdsa_testvector_32),
3284 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3285 nist_186_2_ecdsa_testvector_33),
3286 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3287 nist_186_2_ecdsa_testvector_33),
3288 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3289 nist_186_2_ecdsa_testvector_34),
3290 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3291 nist_186_2_ecdsa_testvector_34),
3292 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3293 nist_186_2_ecdsa_testvector_35),
3294 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3295 nist_186_2_ecdsa_testvector_35),
3296 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3297 nist_186_2_ecdsa_testvector_36),
3298 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3299 nist_186_2_ecdsa_testvector_36),
3300 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3301 nist_186_2_ecdsa_testvector_37),
3302 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3303 nist_186_2_ecdsa_testvector_37),
3304 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3305 nist_186_2_ecdsa_testvector_38),
3306 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3307 nist_186_2_ecdsa_testvector_38),
3308 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3309 nist_186_2_ecdsa_testvector_39),
3310 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3311 nist_186_2_ecdsa_testvector_39),
3312 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3313 nist_186_2_ecdsa_testvector_40),
3314 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3315 nist_186_2_ecdsa_testvector_40),
3316 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3317 nist_186_2_ecdsa_testvector_41),
3318 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3319 nist_186_2_ecdsa_testvector_41),
3320 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3321 nist_186_2_ecdsa_testvector_42),
3322 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3323 nist_186_2_ecdsa_testvector_42),
3324 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3325 nist_186_2_ecdsa_testvector_43),
3326 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3327 nist_186_2_ecdsa_testvector_43),
3328 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3329 nist_186_2_ecdsa_testvector_44),
3330 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3331 nist_186_2_ecdsa_testvector_44),
3332 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3333 nist_186_2_ecdsa_testvector_45),
3334 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3335 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003336 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003337 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3338 nist_186_2_ecdsa_testvector_46),
3339 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3340 nist_186_2_ecdsa_testvector_46),
3341 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3342 nist_186_2_ecdsa_testvector_47),
3343 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3344 nist_186_2_ecdsa_testvector_47),
3345 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3346 nist_186_2_ecdsa_testvector_48),
3347 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3348 nist_186_2_ecdsa_testvector_48),
3349 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3350 nist_186_2_ecdsa_testvector_49),
3351 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3352 nist_186_2_ecdsa_testvector_49),
3353 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3354 nist_186_2_ecdsa_testvector_50),
3355 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3356 nist_186_2_ecdsa_testvector_50),
3357 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3358 nist_186_2_ecdsa_testvector_51),
3359 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3360 nist_186_2_ecdsa_testvector_51),
3361 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3362 nist_186_2_ecdsa_testvector_52),
3363 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3364 nist_186_2_ecdsa_testvector_52),
3365 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3366 nist_186_2_ecdsa_testvector_53),
3367 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3368 nist_186_2_ecdsa_testvector_53),
3369 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3370 nist_186_2_ecdsa_testvector_54),
3371 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3372 nist_186_2_ecdsa_testvector_54),
3373 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3374 nist_186_2_ecdsa_testvector_55),
3375 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3376 nist_186_2_ecdsa_testvector_55),
3377 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3378 nist_186_2_ecdsa_testvector_56),
3379 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3380 nist_186_2_ecdsa_testvector_56),
3381 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3382 nist_186_2_ecdsa_testvector_57),
3383 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3384 nist_186_2_ecdsa_testvector_57),
3385 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3386 nist_186_2_ecdsa_testvector_58),
3387 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3388 nist_186_2_ecdsa_testvector_58),
3389 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3390 nist_186_2_ecdsa_testvector_59),
3391 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3392 nist_186_2_ecdsa_testvector_59),
3393 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3394 nist_186_2_ecdsa_testvector_60),
3395 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3396 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003397 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003398 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3399 nist_186_2_ecdsa_testvector_61),
3400 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3401 nist_186_2_ecdsa_testvector_61),
3402 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3403 nist_186_2_ecdsa_testvector_62),
3404 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3405 nist_186_2_ecdsa_testvector_62),
3406 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3407 nist_186_2_ecdsa_testvector_63),
3408 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3409 nist_186_2_ecdsa_testvector_63),
3410 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3411 nist_186_2_ecdsa_testvector_64),
3412 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3413 nist_186_2_ecdsa_testvector_64),
3414 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3415 nist_186_2_ecdsa_testvector_65),
3416 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3417 nist_186_2_ecdsa_testvector_65),
3418 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3419 nist_186_2_ecdsa_testvector_66),
3420 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3421 nist_186_2_ecdsa_testvector_66),
3422 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3423 nist_186_2_ecdsa_testvector_67),
3424 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3425 nist_186_2_ecdsa_testvector_67),
3426 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3427 nist_186_2_ecdsa_testvector_68),
3428 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3429 nist_186_2_ecdsa_testvector_68),
3430 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3431 nist_186_2_ecdsa_testvector_69),
3432 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3433 nist_186_2_ecdsa_testvector_69),
3434 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3435 nist_186_2_ecdsa_testvector_70),
3436 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3437 nist_186_2_ecdsa_testvector_70),
3438 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3439 nist_186_2_ecdsa_testvector_71),
3440 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3441 nist_186_2_ecdsa_testvector_71),
3442 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3443 nist_186_2_ecdsa_testvector_72),
3444 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3445 nist_186_2_ecdsa_testvector_72),
3446 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3447 nist_186_2_ecdsa_testvector_73),
3448 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3449 nist_186_2_ecdsa_testvector_73),
3450 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3451 nist_186_2_ecdsa_testvector_74),
3452 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3453 nist_186_2_ecdsa_testvector_74),
3454 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3455 nist_186_2_ecdsa_testvector_75),
3456 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3457 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003458 /* [K-163] - GP NOT SUPPORTED */
3459 /* [K-233] - GP NOT SUPPORTED */
3460 /* [K-283] - GP NOT SUPPORTED */
3461 /* [K-409] - GP NOT SUPPORTED */
3462 /* [K-571] - GP NOT SUPPORTED */
3463 /* [B-163] - GP NOT SUPPORTED */
3464 /* [B-233] - GP NOT SUPPORTED */
3465 /* [B-283] - GP NOT SUPPORTED */
3466 /* [B-409] - GP NOT SUPPORTED */
3467 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003468
3469 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3470 gmt_0003_part5_c2_sm2_testvector),
3471 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3472 gmt_0003_part5_c2_sm2_testvector),
3473 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3474 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003475
3476 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3477 gmt_003_part5_a2),
3478 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3479 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003480};
3481
3482static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3483 uint32_t max_key_size, uint32_t key_type,
3484 TEE_Attribute *attrs, size_t num_attrs,
3485 TEE_ObjectHandle *handle)
3486{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003487 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003488
3489 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3490 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3491 max_key_size, handle)))
3492 return false;
3493
3494 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3495 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3496 num_attrs)))
3497 return false;
3498
3499 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003500 uint8_t out[512] = { };
3501 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003502
3503 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3504 continue;
3505
Pascal Brandc639ac82015-07-02 08:53:34 +02003506 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3507 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3508 attrs[n].attributeID, out, &out_size)))
3509 return false;
3510
Pascal Brand3e143ee2015-07-15 17:17:16 +02003511 if (out_size < attrs[n].content.ref.length) {
3512 memmove(out + (attrs[n].content.ref.length - out_size),
3513 out,
3514 attrs[n].content.ref.length);
3515 memset(out, 0, attrs[n].content.ref.length - out_size);
3516 out_size = attrs[n].content.ref.length;
3517 }
3518
Pascal Brandc639ac82015-07-02 08:53:34 +02003519 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3520 attrs[n].content.ref.length, out, out_size))
3521 return false;
3522 }
3523
3524 return true;
3525}
3526
3527static void xtest_tee_test_4006(ADBG_Case_t *c)
3528{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003529 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003530 TEE_OperationHandle op = TEE_HANDLE_NULL;
3531 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3532 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003533 TEE_Attribute key_attrs[8] = { };
3534 TEE_Attribute algo_params[1] = { };
3535 size_t num_algo_params = 0;
3536 uint8_t out[512] = { };
3537 size_t out_size = 0;
3538 uint8_t out_enc[512] = { };
3539 size_t out_enc_size = 0;
3540 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003541 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003542 size_t max_key_size = 0;
3543 size_t num_key_attrs = 0;
3544 uint32_t ret_orig = 0;
3545 size_t n = 0;
3546 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003547 uint32_t pub_key_type = 0;
3548 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003549 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003550
3551 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3552 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3553 &ret_orig)))
3554 return;
3555
3556 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3557 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3558
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003559 if (tv->level > level)
3560 continue;
3561
Jerome Forissier4b03e282020-01-22 16:33:12 +01003562 if ((tv->algo == TEE_ALG_SM2_PKE ||
3563 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3564 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3565 TEE_ECC_CURVE_SM2)) {
3566 Do_ADBG_Log("SM2 not supported: skip subcase");
3567 continue;
3568 }
3569
Pascal Brandc639ac82015-07-02 08:53:34 +02003570 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3571 (int)n, (unsigned int)tv->algo,
3572 (int)tv->line);
3573
3574 /*
3575 * When signing or verifying we're working with the hash of
3576 * the payload.
3577 */
3578 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003579 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3580 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003581#if defined(CFG_CRYPTO_RSASSA_NA1)
3582 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3583 hash_algo = TEE_ALG_SHA256;
3584#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003585 else
3586 hash_algo = TEE_ALG_HASH_ALGO(
3587 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003588
3589 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3590 ta_crypt_cmd_allocate_operation(c, &session,
3591 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3592 goto out;
3593
3594 ptx_hash_size = sizeof(ptx_hash);
3595 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3596 ta_crypt_cmd_digest_do_final(c, & session, op,
3597 tv->ptx, tv->ptx_len, ptx_hash,
3598 &ptx_hash_size)))
3599 goto out;
3600
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003601 /*
3602 * When we use DSA algorithms, the size of the hash we
3603 * consider equals the min between the size of the
3604 * "subprime" in the key and the size of the hash
3605 */
3606 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3607 TEE_MAIN_ALGO_DSA) {
3608 if (tv->params.dsa.sub_prime_len <=
3609 ptx_hash_size)
3610 ptx_hash_size =
3611 tv->params.dsa.sub_prime_len;
3612 }
3613
Pascal Brandc639ac82015-07-02 08:53:34 +02003614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3615 ta_crypt_cmd_free_operation(c, &session, op)))
3616 goto out;
3617 }
3618
3619 num_algo_params = 0;
3620 num_key_attrs = 0;
3621 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3622 case TEE_MAIN_ALGO_RSA:
3623 if (tv->params.rsa.salt_len > 0) {
3624 algo_params[0].attributeID =
3625 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3626 algo_params[0].content.value.a =
3627 tv->params.rsa.salt_len;
3628 algo_params[0].content.value.b = 0;
3629 num_algo_params = 1;
3630 }
3631
3632 max_key_size = tv->params.rsa.modulus_len * 8;
3633
3634 xtest_add_attr(&num_key_attrs, key_attrs,
3635 TEE_ATTR_RSA_MODULUS,
3636 tv->params.rsa.modulus,
3637 tv->params.rsa.modulus_len);
3638 xtest_add_attr(&num_key_attrs, key_attrs,
3639 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3640 tv->params.rsa.pub_exp,
3641 tv->params.rsa.pub_exp_len);
3642
3643 if (!ADBG_EXPECT_TRUE(c,
3644 create_key(c, &session,
3645 max_key_size,
3646 TEE_TYPE_RSA_PUBLIC_KEY,
3647 key_attrs,
3648 num_key_attrs,
3649 &pub_key_handle)))
3650 goto out;
3651
3652 xtest_add_attr(&num_key_attrs, key_attrs,
3653 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3654 tv->params.rsa.priv_exp,
3655 tv->params.rsa.priv_exp_len);
3656
3657 if (tv->params.rsa.prime1_len != 0) {
3658 xtest_add_attr(&num_key_attrs, key_attrs,
3659 TEE_ATTR_RSA_PRIME1,
3660 tv->params.rsa.prime1,
3661 tv->params.rsa.prime1_len);
3662 }
3663
3664 if (tv->params.rsa.prime2_len != 0) {
3665 xtest_add_attr(&num_key_attrs, key_attrs,
3666 TEE_ATTR_RSA_PRIME2,
3667 tv->params.rsa.prime2,
3668 tv->params.rsa.prime2_len);
3669 }
3670
3671 if (tv->params.rsa.exp1_len != 0) {
3672 xtest_add_attr(&num_key_attrs, key_attrs,
3673 TEE_ATTR_RSA_EXPONENT1,
3674 tv->params.rsa.exp1,
3675 tv->params.rsa.exp1_len);
3676 }
3677
3678 if (tv->params.rsa.exp2_len != 0) {
3679 xtest_add_attr(&num_key_attrs, key_attrs,
3680 TEE_ATTR_RSA_EXPONENT2,
3681 tv->params.rsa.exp2,
3682 tv->params.rsa.exp2_len);
3683 }
3684
3685 if (tv->params.rsa.coeff_len != 0) {
3686 xtest_add_attr(&num_key_attrs, key_attrs,
3687 TEE_ATTR_RSA_COEFFICIENT,
3688 tv->params.rsa.coeff,
3689 tv->params.rsa.coeff_len);
3690 }
3691
3692 if (!ADBG_EXPECT_TRUE(c,
3693 create_key(c, &session,
3694 max_key_size,
3695 TEE_TYPE_RSA_KEYPAIR,
3696 key_attrs,
3697 num_key_attrs,
3698 &priv_key_handle)))
3699 goto out;
3700 break;
3701
3702 case TEE_MAIN_ALGO_DSA:
3703 max_key_size = tv->params.dsa.prime_len * 8;
3704
3705 xtest_add_attr(&num_key_attrs, key_attrs,
3706 TEE_ATTR_DSA_PRIME,
3707 tv->params.dsa.prime,
3708 tv->params.dsa.prime_len);
3709 xtest_add_attr(&num_key_attrs, key_attrs,
3710 TEE_ATTR_DSA_SUBPRIME,
3711 tv->params.dsa.sub_prime,
3712 tv->params.dsa.sub_prime_len);
3713 xtest_add_attr(&num_key_attrs, key_attrs,
3714 TEE_ATTR_DSA_BASE,
3715 tv->params.dsa.base,
3716 tv->params.dsa.base_len);
3717 xtest_add_attr(&num_key_attrs, key_attrs,
3718 TEE_ATTR_DSA_PUBLIC_VALUE,
3719 tv->params.dsa.pub_val,
3720 tv->params.dsa.pub_val_len);
3721
3722 if (!ADBG_EXPECT_TRUE(c,
3723 create_key(c, &session, max_key_size,
3724 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3725 num_key_attrs, &pub_key_handle)))
3726 goto out;
3727
3728 xtest_add_attr(&num_key_attrs, key_attrs,
3729 TEE_ATTR_DSA_PRIVATE_VALUE,
3730 tv->params.dsa.priv_val,
3731 tv->params.dsa.priv_val_len);
3732
3733 if (!ADBG_EXPECT_TRUE(c,
3734 create_key(c, &session, max_key_size,
3735 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3736 num_key_attrs, &priv_key_handle)))
3737 goto out;
3738 break;
3739
Pascal Brand3e143ee2015-07-15 17:17:16 +02003740 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003741 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003742 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003743 switch (tv->algo) {
3744 case TEE_ALG_ECDSA_P192:
3745 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003746 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3747 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003748 break;
3749 case TEE_ALG_ECDSA_P224:
3750 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003751 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3752 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003753 break;
3754 case TEE_ALG_ECDSA_P256:
3755 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003756 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3757 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003758 break;
3759 case TEE_ALG_ECDSA_P384:
3760 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003761 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3762 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003763 break;
3764 case TEE_ALG_ECDSA_P521:
3765 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003766 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3767 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3768 break;
3769 case TEE_ALG_SM2_PKE:
3770 curve = TEE_ECC_CURVE_SM2;
3771 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3772 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003773 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003774 case TEE_ALG_SM2_DSA_SM3:
3775 curve = TEE_ECC_CURVE_SM2;
3776 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3777 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3778 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003779 default:
3780 curve = 0xFF;
3781 break;
3782 }
3783
3784 if (tv->algo == TEE_ALG_ECDSA_P521)
3785 max_key_size = 521;
3786 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003787 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003788
3789 xtest_add_attr_value(&num_key_attrs, key_attrs,
3790 TEE_ATTR_ECC_CURVE, curve, 0);
3791 xtest_add_attr(&num_key_attrs, key_attrs,
3792 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003793 tv->params.ecc.public_x,
3794 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003795 xtest_add_attr(&num_key_attrs, key_attrs,
3796 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003797 tv->params.ecc.public_y,
3798 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003799
3800 if (!ADBG_EXPECT_TRUE(c,
3801 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003802 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003803 num_key_attrs, &pub_key_handle)))
3804 goto out;
3805
3806 xtest_add_attr(&num_key_attrs, key_attrs,
3807 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003808 tv->params.ecc.private,
3809 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003810
3811 if (!ADBG_EXPECT_TRUE(c,
3812 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003813 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003814 num_key_attrs, &priv_key_handle)))
3815 goto out;
3816 break;
3817
Pascal Brandc639ac82015-07-02 08:53:34 +02003818 default:
3819 ADBG_EXPECT_TRUE(c, false);
3820 goto out;
3821 }
3822
3823 out_size = sizeof(out);
3824 memset(out, 0, sizeof(out));
3825 switch (tv->mode) {
3826 case TEE_MODE_ENCRYPT:
3827 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3828 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003829 &op, tv->algo, TEE_MODE_ENCRYPT,
3830 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003831 goto out;
3832
3833 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3834 ta_crypt_cmd_set_operation_key(c, &session, op,
3835 pub_key_handle)))
3836 goto out;
3837
3838 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3839 ta_crypt_cmd_free_transient_object(c, &session,
3840 pub_key_handle)))
3841 goto out;
3842 pub_key_handle = TEE_HANDLE_NULL;
3843
3844 out_enc_size = sizeof(out_enc);
3845 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3846 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
3847 NULL, 0, tv->ptx, tv->ptx_len, out_enc,
3848 &out_enc_size)))
3849 goto out;
3850
3851 /*
3852 * A PS which is random is added when formatting the
3853 * message internally of the algorithm so we can't
3854 * verify against precomputed values, instead we use the
3855 * decrypt operation to see that output is correct.
3856 */
3857
3858 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3859 ta_crypt_cmd_free_operation(c, &session, op)))
3860 goto out;
3861
3862 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3863 ta_crypt_cmd_allocate_operation(c, &session,
3864 &op, tv->algo, TEE_MODE_DECRYPT,
3865 max_key_size)))
3866 goto out;
3867
3868 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3869 ta_crypt_cmd_set_operation_key(c, &session, op,
3870 priv_key_handle)))
3871 goto out;
3872
3873 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3874 ta_crypt_cmd_free_transient_object(c, &session,
3875 priv_key_handle)))
3876 goto out;
3877
3878 priv_key_handle = TEE_HANDLE_NULL;
3879
3880 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3881 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
3882 NULL, 0, out_enc, out_enc_size, out,
3883 &out_size)))
3884 goto out;
3885
3886 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
3887 out_size);
3888 break;
3889
3890 case TEE_MODE_DECRYPT:
3891 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3892 ta_crypt_cmd_allocate_operation(c, &session,
3893 &op, tv->algo, TEE_MODE_DECRYPT,
3894 max_key_size)))
3895 goto out;
3896
3897 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3898 ta_crypt_cmd_set_operation_key(c, &session, op,
3899 priv_key_handle)))
3900 goto out;
3901
3902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3903 ta_crypt_cmd_free_transient_object(c, &session,
3904 priv_key_handle)))
3905 goto out;
3906
3907 priv_key_handle = TEE_HANDLE_NULL;
3908
3909 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3910 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
3911 NULL, 0, tv->ctx, tv->ctx_len, out,
3912 &out_size)))
3913 goto out;
3914
3915 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
3916 out_size);
3917 break;
3918
3919 case TEE_MODE_VERIFY:
3920 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3921 ta_crypt_cmd_allocate_operation(c, &session,
3922 &op, tv->algo, TEE_MODE_VERIFY,
3923 max_key_size)))
3924 goto out;
3925
3926 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3927 ta_crypt_cmd_set_operation_key(c, &session, op,
3928 pub_key_handle)))
3929 goto out;
3930
3931 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3932 ta_crypt_cmd_free_transient_object(c, &session,
3933 pub_key_handle)))
3934 goto out;
3935
3936 pub_key_handle = TEE_HANDLE_NULL;
3937
3938 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3939 ta_crypt_cmd_asymmetric_verify(c, &session, op,
3940 algo_params, num_algo_params, ptx_hash,
3941 ptx_hash_size, tv->ctx, tv->ctx_len)))
3942 goto out;
3943 break;
3944
3945 case TEE_MODE_SIGN:
3946 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3947 ta_crypt_cmd_allocate_operation(c, &session,
3948 &op, tv->algo, TEE_MODE_SIGN,
3949 max_key_size)))
3950 goto out;
3951
3952 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3953 ta_crypt_cmd_set_operation_key(c, &session, op,
3954 priv_key_handle)))
3955 goto out;
3956
3957 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3958 ta_crypt_cmd_free_transient_object(c, &session,
3959 priv_key_handle)))
3960 goto out;
3961
3962 priv_key_handle = TEE_HANDLE_NULL;
3963
3964 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3965 ta_crypt_cmd_asymmetric_sign(c, &session, op,
3966 algo_params, num_algo_params, ptx_hash,
3967 ptx_hash_size, out, &out_size)))
3968 goto out;
3969
3970 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
3971 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02003972 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003973 tv->algo == TEE_ALG_DSA_SHA224 ||
3974 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02003975 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01003976 TEE_MAIN_ALGO_ECDSA ||
3977 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02003978 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3979 ta_crypt_cmd_free_operation(c, &session,
3980 op)))
3981 goto out;
3982 /*
3983 * The salt or K is random so we can't verify
3984 * signing against precomputed values, instead
3985 * we use the verify operation to see that
3986 * output is correct.
3987 */
3988 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3989 ta_crypt_cmd_allocate_operation(c,
3990 &session, &op, tv->algo,
3991 TEE_MODE_VERIFY, max_key_size)))
3992 goto out;
3993
3994 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3995 ta_crypt_cmd_set_operation_key(c,
3996 &session, op, pub_key_handle)))
3997 goto out;
3998
3999 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4000 ta_crypt_cmd_free_transient_object(c,
4001 &session, pub_key_handle)))
4002 goto out;
4003
4004 pub_key_handle = TEE_HANDLE_NULL;
4005
4006 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4007 ta_crypt_cmd_asymmetric_verify(c,
4008 &session, op, algo_params,
4009 num_algo_params, ptx_hash,
4010 ptx_hash_size, out, out_size)))
4011 goto out;
4012 } else {
4013 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4014 tv->ctx_len, out,
4015 out_size);
4016 }
4017 break;
4018
4019 default:
4020 break;
4021 }
4022
4023 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4024 ta_crypt_cmd_free_operation(c, &session, op)))
4025 goto out;
4026
4027 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4028 ta_crypt_cmd_free_transient_object(c, &session,
4029 pub_key_handle)))
4030 goto out;
4031 pub_key_handle = TEE_HANDLE_NULL;
4032
4033 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4034 ta_crypt_cmd_free_transient_object(c, &session,
4035 priv_key_handle)))
4036 goto out;
4037
4038 priv_key_handle = TEE_HANDLE_NULL;
4039
4040 Do_ADBG_EndSubCase(c, NULL);
4041 }
4042out:
4043 TEEC_CloseSession(&session);
4044}
Jens Wiklander14f48872018-06-29 15:30:13 +02004045ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4046 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004047
4048#define KEY_ATTR(x, y) { #x, (x), y }
4049
4050struct key_attrs {
4051 const char *name;
4052 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004053 /*
4054 * When keysize_check != 0: size of attribute is checked
4055 * Expected value is key_size bits except for DH in which case it is
4056 * the value of keysize_check.
4057 */
4058 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004059};
4060
4061static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4062 TEE_ObjectHandle key, uint32_t key_size,
4063 struct key_attrs *attrs, size_t num_attrs)
4064{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004065 uint8_t out[2048] = { };
4066 size_t out_size = 0;
4067 size_t n = 0;
4068 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004069
4070 for (m = 0; m < num_attrs; m++) {
4071 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4072 out_size = sizeof(out);
4073 memset(out, 0, sizeof(out));
4074 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4075 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4076 key, attrs[m].attr, out, &out_size)))
4077 return false;
4078
4079 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004080 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004081 key_size / 8);
4082
4083 if (out_size > 0) {
4084 /* Check that buffer isn't all zeroes */
4085 for (n = 0; n < out_size; n++)
4086 if (out[n] != 0)
4087 break;
4088 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4089 out_size))
4090 return false;
4091 }
4092 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004093 uint32_t a = 0;
4094 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004095
4096 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4097 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4098 attrs[m].attr, &a, &b)))
4099 return false;
4100 }
4101 }
4102 return true;
4103}
4104
4105static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4106 TEE_ObjectHandle key, uint32_t key_size)
4107{
4108 const struct key_attrs attrs[] = {
4109 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4110 };
4111
4112 return test_keygen_attributes(c, s, key, key_size,
4113 (struct key_attrs *)&attrs,
4114 ARRAY_SIZE(attrs));
4115}
4116
4117
4118static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4119 TEE_ObjectHandle key, uint32_t key_size)
4120{
4121 const struct key_attrs attrs[] = {
4122 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4123 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4124 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4125 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4126 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4127 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4128 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4129 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4130 };
4131
4132 return test_keygen_attributes(c, s, key, key_size,
4133 (struct key_attrs *)&attrs,
4134 ARRAY_SIZE(attrs));
4135}
4136
Pascal Brande61133f2015-07-08 15:38:37 +02004137static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4138 TEE_ObjectHandle key, uint32_t key_size)
4139{
4140 const struct key_attrs attrs[] = {
4141 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4142 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4143 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4144 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4145 };
4146
4147 return test_keygen_attributes(c, s, key, key_size,
4148 (struct key_attrs *)&attrs,
4149 ARRAY_SIZE(attrs));
4150}
4151
Pascal Brandc639ac82015-07-02 08:53:34 +02004152static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004153 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004154{
4155 const struct key_attrs attrs[] = {
4156 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4157 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4158 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4159 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4160 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4161 };
4162
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004163 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004164 (struct key_attrs *)&attrs,
4165 ARRAY_SIZE(attrs));
4166}
4167
4168static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4169 TEE_ObjectHandle key, uint32_t key_size)
4170{
4171 const struct key_attrs attrs[] = {
4172 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4173 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4174 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4175 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4176 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4177 };
4178
4179 return test_keygen_attributes(c, s, key, key_size,
4180 (struct key_attrs *)&attrs,
4181 ARRAY_SIZE(attrs));
4182}
4183
4184static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4185 uint32_t key_type, uint32_t check_keysize,
4186 uint32_t key_size,
4187 TEE_Attribute *params, size_t param_count)
4188{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004189 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004190 bool ret_val = true;
4191
4192 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4193 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4194 &key)))
4195 return false;
4196
4197 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4198 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4199 param_count)))
4200 return false;
4201
4202 switch (key_type) {
4203 case TEE_TYPE_DES:
4204 case TEE_TYPE_DES3:
4205 ret_val = ADBG_EXPECT_TRUE(c,
4206 test_secret_value(c, s, key,
4207 key_size + key_size / 7));
4208 break;
4209 case TEE_TYPE_AES:
4210 case TEE_TYPE_HMAC_MD5:
4211 case TEE_TYPE_HMAC_SHA1:
4212 case TEE_TYPE_HMAC_SHA224:
4213 case TEE_TYPE_HMAC_SHA256:
4214 case TEE_TYPE_HMAC_SHA384:
4215 case TEE_TYPE_HMAC_SHA512:
4216 case TEE_TYPE_GENERIC_SECRET:
4217 ret_val = ADBG_EXPECT_TRUE(c,
4218 test_secret_value(c, s, key, key_size));
4219 break;
4220
4221 case TEE_TYPE_RSA_KEYPAIR:
4222 ret_val = ADBG_EXPECT_TRUE(c,
4223 test_rsa_key_pair(c, s, key, key_size));
4224 break;
4225
Pascal Brande61133f2015-07-08 15:38:37 +02004226 case TEE_TYPE_ECDSA_KEYPAIR:
4227 case TEE_TYPE_ECDH_KEYPAIR:
4228 ret_val = ADBG_EXPECT_TRUE(c,
4229 test_ecc_key_pair(c, s, key, key_size));
4230 break;
4231
Pascal Brandc639ac82015-07-02 08:53:34 +02004232 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004233 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004234 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004235 break;
4236
4237 case TEE_TYPE_DSA_KEYPAIR:
4238 ret_val = ADBG_EXPECT_TRUE(c,
4239 test_dsa_key_pair(c, s, key, key_size));
4240 break;
4241
4242 default:
4243 ret_val = false;
4244 break;
4245 }
4246
4247 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4248 ta_crypt_cmd_free_transient_object(c, s, key)))
4249 return false;
4250
4251 return ret_val;
4252}
4253
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004254struct key_types_noparam {
4255 unsigned level;
4256 const char *name;
4257 uint32_t key_type;
4258 uint32_t quanta;
4259 uint32_t min_size;
4260 uint32_t max_size;
4261};
4262
4263static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4264 const struct key_types_noparam *key_types,
4265 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004266{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004267 size_t n = 0;
4268 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004269
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004270 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004271 uint32_t min_size = key_types[n].min_size;
4272 uint32_t max_size = key_types[n].max_size;
4273 uint32_t quanta = key_types[n].quanta;
4274
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004275 if (key_types[n].level > level)
4276 continue;
4277
Pascal Brandc639ac82015-07-02 08:53:34 +02004278 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4279
4280 for (key_size = min_size; key_size <= max_size;
4281 key_size += quanta) {
4282 if (!ADBG_EXPECT_TRUE(c,
4283 generate_and_test_key(c, session, key_types
4284 [n].key_type, 1, key_size, NULL, 0)))
4285 break;
4286 }
4287
4288 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4289 }
4290}
4291
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004292static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004293{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004294 TEEC_Session session = { };
4295 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004296 static const struct key_types_noparam key_types[] = {
4297 { 0, "AES", TEE_TYPE_AES, 64, 128,
4298 256 /* valid sizes 128, 192, 256 */ },
4299 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4300 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4301 168 /* valid sizes 112, 168 */ },
4302 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4303 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4304 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4305 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4306 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4307 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4308 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4309 };
4310
4311 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4312 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4313 &ret_orig)))
4314 return;
4315
4316 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4317
4318 TEEC_CloseSession(&session);
4319}
4320ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4321 "Test TEE Internal API Generate Symmetric key");
4322
4323static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4324{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004325 TEEC_Session session = { };
4326 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004327 static const struct key_types_noparam key_types[] = {
4328 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4329 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
4330 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
4331 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4332 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4333 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
4334 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4335 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4336 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4337 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4338 };
4339
4340 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4341 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4342 &ret_orig)))
4343 return;
4344
4345 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4346
4347 TEEC_CloseSession(&session);
4348}
4349ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4350 "Test TEE Internal API Generate RSA key");
4351
4352static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4353{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004354 TEEC_Session session = { };
4355 uint32_t ret_orig = 0;
4356 size_t n = 0;
4357 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004358 /*
4359 * Note that the key size parameter is not used when creating the keys
4360 * but specifying these sizes make it possible to test the expected size
4361 * of the private value. This also means that the keysize must match the
4362 * size of p or what is specified in private_bits or the equvivalent
4363 * size of the subprime parameter.
4364 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004365 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004366
4367#define XTEST_DH_GK_DATA(vect) \
4368 ARRAY(vect ## _p), \
4369 ARRAY(vect ## _g), \
4370 &vect ## _private_bits, \
4371 0, 0
4372#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4373 ARRAY(vect ## _p), \
4374 ARRAY(vect ## _g), \
4375 &vect ## _private_bits, \
4376 ARRAY(vect ## _subprime)
4377 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004378 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004379 uint32_t key_size;
4380 const uint8_t *p;
4381 size_t p_len;
4382 const uint8_t *g;
4383 size_t g_len;
4384 const uint32_t *private_bits;
4385 const uint8_t *subprime;
4386 size_t subprime_len;
4387 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004388 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004389 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004390 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004391 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004392 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004393 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004394 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004395 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004396 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004397 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004398 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004399 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004400 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004401 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004402 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004403 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004404 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004405 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004406 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004407 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004408 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004409 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004410 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004411 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004412 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004413 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004414 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004415 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004416 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004417 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004418 };
4419
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004420 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4421 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4422 &ret_orig)))
4423 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004424
4425 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004426 if (key_types[n].level > level)
4427 continue;
4428
Pascal Brandc639ac82015-07-02 08:53:34 +02004429 Do_ADBG_BeginSubCase(c,
4430 "Generate DH key %d bits - Private bits = %d",
4431 key_types[n].key_size,
4432 *key_types[n].private_bits);
4433 param_count = 0;
4434
4435 xtest_add_attr(&param_count, params,
4436 TEE_ATTR_DH_PRIME,
4437 key_types[n].p, key_types[n].p_len);
4438
4439 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4440 key_types[n].g, key_types[n].g_len);
4441
4442 if (key_types[n].private_bits != 0) {
4443 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4444
4445 params[param_count].content.value.a =
4446 *key_types[n].private_bits;
4447
4448 params[param_count].content.value.b = 0;
4449 param_count++;
4450 }
4451
4452 if (key_types[n].subprime != 0) {
4453 xtest_add_attr(&param_count, params,
4454 TEE_ATTR_DH_SUBPRIME,
4455 key_types[n].subprime,
4456 key_types[n].subprime_len);
4457 }
4458
4459 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004460 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004461 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004462 key_types[n]. key_size, params, param_count)))
4463 break;
4464
4465 Do_ADBG_EndSubCase(c,
4466 "Generate DH key %d bits - Private bits = %d",
4467 key_types[n].key_size,
4468 *key_types[n].private_bits);
4469 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004470
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004471 TEEC_CloseSession(&session);
4472}
4473ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4474 "Test TEE Internal API Generate DH key");
4475
4476static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004477{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004478 TEEC_Session session = { };
4479 uint32_t ret_orig = 0;
4480 size_t n = 0;
4481 size_t param_count = 0;
4482 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004483
4484#define XTEST_DSA_GK_DATA(vect) \
4485 ARRAY(vect ## _p), \
4486 ARRAY(vect ## _g), \
4487 ARRAY(vect ## _q)
4488 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004489 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004490 uint32_t key_size;
4491 const uint8_t *prime;
4492 size_t prime_len;
4493 const uint8_t *base;
4494 size_t base_len;
4495 const uint8_t *sub_prime;
4496 size_t sub_prime_len;
4497 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004498 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004499 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004500 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4501 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4502 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4503 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4504 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4505 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4506 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4507 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004508 };
4509
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004510 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4511 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4512 &ret_orig)))
4513 return;
4514
Pascal Brandc639ac82015-07-02 08:53:34 +02004515 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004516 if (key_types[n].level > level)
4517 continue;
4518
Pascal Brandc639ac82015-07-02 08:53:34 +02004519 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4520 key_types[n].key_size);
4521 param_count = 0;
4522
4523
4524 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4525 key_types[n].prime, key_types[n].prime_len);
4526
4527 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4528 key_types[n].sub_prime,
4529 key_types[n].sub_prime_len);
4530
4531 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4532 key_types[n].base, key_types[n].base_len);
4533
4534 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004535 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004536 1, key_types[n]. key_size, params,
4537 param_count)))
4538 break;
4539
4540 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4541 key_types[n].key_size);
4542 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004543
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004544 TEEC_CloseSession(&session);
4545}
4546ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4547 "Test TEE Internal API Generate DSA key");
4548
4549static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004550{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004551 TEEC_Session session = { };
4552 uint32_t ret_orig = 0;
4553 size_t n = 0;
4554 size_t param_count = 0;
4555 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004556
4557 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004558 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004559 const char *name;
4560 uint32_t algo;
4561 uint32_t curve;
4562 uint32_t key_size;
4563 } key_types[] = {
4564 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004565 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4566 192 },
4567 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4568 224 },
4569 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4570 256 },
4571 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4572 384 },
4573 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4574 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004575
4576 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004577 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4578 192 },
4579 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4580 224 },
4581 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4582 256 },
4583 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4584 384 },
4585 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4586 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004587 };
4588
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004589 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4590 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4591 &ret_orig)))
4592 return;
4593
Pascal Brande61133f2015-07-08 15:38:37 +02004594 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004595 if (key_types[n].level > level)
4596 continue;
4597
Pascal Brande61133f2015-07-08 15:38:37 +02004598 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4599 param_count = 0;
4600
4601 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4602 key_types[n].curve, 0);
4603
4604 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004605 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004606 0, key_types[n].key_size, params,
4607 param_count)))
4608 break;
4609
4610 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4611 }
Pascal Brande61133f2015-07-08 15:38:37 +02004612
Pascal Brandc639ac82015-07-02 08:53:34 +02004613 TEEC_CloseSession(&session);
4614}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004615ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4616 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004617
4618static void xtest_tee_test_4008(ADBG_Case_t *c)
4619{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004620 TEEC_Session session = { };
4621 uint32_t ret_orig = 0;
4622 TEE_OperationHandle op = TEE_HANDLE_NULL;
4623 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4624 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4625 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004626 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004627 uint8_t out[2048] = { };
4628 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004629
4630 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4631 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4632 &ret_orig)))
4633 return;
4634
4635 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4636
4637 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4638 ta_crypt_cmd_allocate_operation(c, &session, &op,
4639 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4640 derive_key_max_keysize)))
4641 goto out;
4642
4643 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4644 ta_crypt_cmd_allocate_transient_object(c, & session,
4645 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4646 &key_handle)))
4647 goto out;
4648
4649 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4650 ARRAY(derive_key_dh_prime));
4651
4652 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4653 ARRAY(derive_key_dh_base));
4654
4655 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4656 ARRAY(derive_key_dh_public_value));
4657
4658 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4659 ARRAY(derive_key_dh_private_value));
4660
4661 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4662 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4663 params, param_count)))
4664 goto out;
4665
4666 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4667 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4668 goto out;
4669
4670 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4671 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4672 goto out;
4673
4674 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4675 ta_crypt_cmd_allocate_transient_object(c, &session,
4676 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4677 &sv_handle)))
4678 goto out;
4679
Pascal Brand2b92b642015-07-16 13:29:42 +02004680 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004681 param_count = 0;
4682
4683 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4684 ARRAY(derive_key_dh_public_value_2));
4685
4686 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4687 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
4688 param_count)))
4689 goto out;
4690
4691 out_size = sizeof(out);
4692 memset(out, 0, sizeof(out));
4693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4694 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
4695 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4696 goto out;
4697
4698 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
4699 sizeof(derive_key_dh_shared_secret), out,
4700 out_size))
4701 goto out;
4702
4703 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4704 ta_crypt_cmd_free_operation(c, &session, op)))
4705 goto out;
4706
4707 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4708 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
4709 goto out;
4710out:
4711 Do_ADBG_EndSubCase(c, "Derive DH key success");
4712 TEEC_CloseSession(&session);
4713}
Jens Wiklander14f48872018-06-29 15:30:13 +02004714ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
4715 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02004716
4717static void xtest_tee_test_4009(ADBG_Case_t *c)
4718{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004719 TEEC_Session session = { };
4720 uint32_t ret_orig = 0;
4721 TEE_OperationHandle op = TEE_HANDLE_NULL;
4722 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4723 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4724 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02004725 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004726 uint8_t out[2048] = { };
4727 size_t out_size = 0;
4728 uint32_t size_bytes = 0;
4729 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05304730 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02004731
4732 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4733 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4734 &ret_orig)))
4735 return;
4736
4737 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
4738 pt = &derive_key_ecdh[i];
4739
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02004740 if (pt->level > level)
4741 continue;
4742
Pascal Brand2b92b642015-07-16 13:29:42 +02004743 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
4744 pt->algo);
4745 size_bytes = (pt->keysize + 7) / 8;
4746 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4747 ta_crypt_cmd_allocate_operation(c, &session, &op,
4748 pt->algo,
4749 TEE_MODE_DERIVE, pt->keysize)))
4750 goto out;
4751
4752 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4753 ta_crypt_cmd_allocate_transient_object(c, & session,
4754 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
4755 &key_handle)))
4756 goto out;
4757
4758 param_count = 0;
4759 xtest_add_attr_value(&param_count, params,
4760 TEE_ATTR_ECC_CURVE, pt->curve, 0);
4761 xtest_add_attr(&param_count, params,
4762 TEE_ATTR_ECC_PRIVATE_VALUE,
4763 pt->private, size_bytes);
4764 /*
Cedric Auger719047c2019-09-11 12:08:14 +02004765 * The public value is not used, but we should provide a valid
4766 * one to avoid rejection in case TEE_PopulateTransientObject()
4767 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02004768 */
4769 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004770 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4771 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02004772 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004773 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
4774 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02004775
4776 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4777 ta_crypt_cmd_populate_transient_object(c,
4778 &session,
4779 key_handle, params, param_count)))
4780 goto out;
4781
4782 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4783 ta_crypt_cmd_set_operation_key(c, &session, op,
4784 key_handle)))
4785 goto out;
4786
4787 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4788 ta_crypt_cmd_free_transient_object(c, & session,
4789 key_handle)))
4790 goto out;
4791
4792 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4793 ta_crypt_cmd_allocate_transient_object(c, &session,
4794 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
4795 &sv_handle)))
4796 goto out;
4797
4798 /* reuse but reset params and param-count */
4799 param_count = 0;
4800
4801 xtest_add_attr(&param_count, params,
4802 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4803 pt->public_x, size_bytes);
4804 xtest_add_attr(&param_count, params,
4805 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
4806 pt->public_y, size_bytes);
4807
4808 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4809 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
4810 params, param_count)))
4811 goto out;
4812
4813 out_size = sizeof(out);
4814 memset(out, 0, sizeof(out));
4815 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4816 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
4817 sv_handle,
4818 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4819 goto out;
4820
4821 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
4822 out, out_size))
4823 goto out;
4824
4825 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4826 ta_crypt_cmd_free_operation(c, &session, op)))
4827 goto out;
4828
4829 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4830 ta_crypt_cmd_free_transient_object(c, &session,
4831 sv_handle)))
4832 goto out;
4833
4834 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
4835 pt->algo);
4836 }
4837
4838 goto noerror;
4839
4840out:
4841 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
4842
4843noerror:
4844 TEEC_CloseSession(&session);
4845}
Jens Wiklander14f48872018-06-29 15:30:13 +02004846ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
4847 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02004848
4849static void xtest_tee_test_4010(ADBG_Case_t *c)
4850{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004851 TEEC_Session session = { };
4852 uint32_t ret_orig = 0;
4853 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02004854 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
4855 static const TEE_Attribute attr = {
4856 .attributeID = TEE_ATTR_SECRET_VALUE,
4857 .content.ref.buffer = (void *)large_key,
4858 .content.ref.length = sizeof(large_key),
4859 };
4860
4861 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4862 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4863 &ret_orig)))
4864 return;
4865
4866 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4867 ta_crypt_cmd_allocate_transient_object(c, &session,
4868 TEE_TYPE_HMAC_SHA256, 1024, &o)))
4869 goto out;
4870
4871 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
4872 ta_crypt_cmd_populate_transient_object(c, &session, o,
4873 &attr, 1));
4874
4875out:
4876 TEEC_CloseSession(&session);
4877}
Jens Wiklander14f48872018-06-29 15:30:13 +02004878ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
4879 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004880
4881static void xtest_tee_test_4011(ADBG_Case_t *c)
4882{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004883 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004884 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004885 TEE_ObjectHandle key = TEE_HANDLE_NULL;
4886 TEE_OperationHandle ops = TEE_HANDLE_NULL;
4887 TEE_OperationHandle opv = TEE_HANDLE_NULL;
4888 TEE_OperationHandle ope = TEE_HANDLE_NULL;
4889 TEE_OperationHandle opd = TEE_HANDLE_NULL;
4890 uint32_t ret_orig = 0;
4891 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
4892 uint8_t out[1024] = { };
4893 uint8_t tmp[1024] = { };
4894 size_t out_size = 0;
4895 size_t tmp_size = 0;
4896 size_t n = 0;
4897 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004898 size_t i = 0;
4899
4900 /* Setup session, initialize message to sign, create a keypair */
4901 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
4902 &crypt_user_ta_uuid, NULL, &ret_orig)))
4903 return;
4904 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
4905 &s, in, sizeof(in))))
4906 goto out;
4907 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
4908 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
4909 goto out;
4910 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
4911 key, key_size, NULL, 0)))
4912 goto out;
4913
4914 /* Allocate operations for sign, verify, encrypt and decrypt */
4915 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4916 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
4917 key_size)))
4918 goto out;
4919 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4920 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
4921 key_size)))
4922 goto out;
4923 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4924 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
4925 goto out;
4926 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4927 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
4928 goto out;
4929
4930 /* Assign the keypair to all operations */
4931 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4932 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
4933 goto out;
4934 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4935 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
4936 goto out;
4937 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4938 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
4939 goto out;
4940 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4941 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
4942 goto out;
4943
4944 /*
4945 * The core of the test case is inspired by the one in libtomcrypt:
4946 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
4947 *
4948 * Testcase for Bleichenbacher attack
4949 *
4950 * (1) Create a valid signature
4951 * (2) Check that it can be verified
4952 * (3) Transform the package to fetch plain text (using the encrypt
4953 * operation in GP TEE Internal API)
4954 * (4) Forge the structure of PKCS#1-EMSA encoded data
4955 * (4.1) Search for start and end of the padding string
4956 * (4.2) Move the signature to the front of the padding string
4957 * (4.3) Zero the message until the end
4958 * (5) Transform the package back (using the decrypt operation in
4959 * GP TEE Internal API)
4960 * (6) The result should not be valid if the implementation is robust.
4961 */
4962
4963
4964 for (i = 0; i < 9; i++) {
4965 Do_ADBG_Log("Iteration %zu", i);
4966
4967 /* 1 */
4968 out_size = sizeof(out);
4969 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4970 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
4971 in, sizeof(in), out, &out_size)))
4972 goto out;
4973
4974 /* 2 */
4975 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4976 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
4977 in, sizeof(in), out, out_size)))
4978 goto out;
4979
4980 /* 3 */
4981 tmp_size = sizeof(tmp);
4982 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4983 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
4984 out, out_size, tmp, &tmp_size)))
4985 goto out;
4986
Etienne Carriere0953bf02018-12-21 15:36:25 +01004987 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
4988 goto out;
4989
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004990 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01004991 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004992 if (tmp[n] == 0xff)
4993 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01004994
4995 /* Shall find at least a padding start before buffer end */
4996 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
4997 goto out;
4998
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004999 for (m = n + 1; m < tmp_size; m++)
5000 if (tmp[m] != 0xff)
5001 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005002
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005003 /* 4.2 */
5004 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005005
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005006 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005007 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02005008
5009 /* Prevent overrun when zeroing buffer end */
5010 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
5011 goto out;
5012
Etienne Carriere0953bf02018-12-21 15:36:25 +01005013 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005014
5015 /* 5 */
5016 out_size = sizeof(out);
5017 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5018 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5019 tmp, tmp_size, out, &out_size)))
5020 goto out;
5021
5022 /* 6 */
5023 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5024 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5025 in, sizeof(in), out, out_size)))
5026 goto out;
5027 }
5028
5029out:
5030 TEEC_CloseSession(&s);
5031}
Jens Wiklander14f48872018-06-29 15:30:13 +02005032ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5033 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005034
5035#ifdef CFG_SYSTEM_PTA
5036static void xtest_tee_test_4012(ADBG_Case_t *c)
5037{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005038 TEEC_Session session = { };
5039 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005040 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5041 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005042 uint8_t pool_input[32] = { };
5043 time_t t = 0;
5044 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005045
5046 t = time(NULL);
5047 tm_local = *localtime(&t);
5048
5049 memcpy((void *)pool_input, (void *)&tm_local,
5050 sizeof(pool_input) < sizeof(tm_local) ?
5051 sizeof(pool_input) : sizeof(tm_local));
5052
5053
5054 op.params[0].tmpref.buffer = pool_input;
5055 op.params[0].tmpref.size = sizeof(pool_input);
5056 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5057 TEEC_NONE,
5058 TEEC_NONE,
5059 TEEC_NONE);
5060 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5061 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5062 &ret_orig)))
5063 return;
5064
5065 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5066 TEEC_InvokeCommand(&session,
5067 TA_CRYPT_CMD_SEED_RNG_POOL,
5068 &op,
5069 &ret_orig));
5070 TEEC_CloseSession(&session);
5071}
Jens Wiklander14f48872018-06-29 15:30:13 +02005072ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5073 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005074
5075static void xtest_tee_test_4013(ADBG_Case_t *c)
5076{
5077 TEEC_Session session = { };
5078 uint32_t ret_orig = 0;
5079 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5080 uint8_t key[32] = { };
5081 uint8_t extra_data[32] = { };
5082
5083 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5084 TEEC_NONE,
5085 TEEC_NONE,
5086 TEEC_NONE);
5087 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5088 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5089 NULL, &ret_orig)))
5090 return;
5091
5092 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5093 TEEC_InvokeCommand(&session,
5094 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5095 &op,
5096 &ret_orig));
5097
5098 /* Negative test using non-secure memory */
5099 memset(&op, 0, sizeof(op));
5100 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5101 TEEC_MEMREF_TEMP_OUTPUT,
5102 TEEC_NONE,
5103 TEEC_NONE);
5104
5105 op.params[0].tmpref.buffer = extra_data;
5106 op.params[0].tmpref.size = sizeof(extra_data);
5107 op.params[1].tmpref.buffer = key;
5108 op.params[1].tmpref.size = sizeof(key);
5109 (void)ADBG_EXPECT_TEEC_RESULT(c,
5110 TEEC_ERROR_SECURITY,
5111 TEEC_InvokeCommand(&session,
5112 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5113 &op,
5114 &ret_orig));
5115
5116 TEEC_CloseSession(&session);
5117}
5118ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5119 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005120
5121static void xtest_tee_test_4014(ADBG_Case_t *c)
5122{
5123 TEEC_Session session = { };
5124 uint32_t ret_orig = 0;
5125 TEE_OperationHandle op = TEE_HANDLE_NULL;
5126 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5127 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5128 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5129 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5130 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5131 TEE_Attribute params[9] = { };
5132 size_t param_count = 0;
5133 uint8_t out[128] = { };
5134 size_t out_size = 0;
5135 uint8_t conf_A[32] = { };
5136 uint8_t conf_B[32] = { };
5137
5138 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5139 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5140 &ret_orig)))
5141 return;
5142
5143 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5144 TEE_ECC_CURVE_SM2)) {
5145 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5146 goto out;
5147 }
5148
5149 Do_ADBG_BeginSubCase(c, "Initiator side");
5150
5151 /*
5152 * Key exchange protocol running on user A's side. A is initiator.
5153 */
5154
5155 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5156 ta_crypt_cmd_allocate_operation(c, &session, &op,
5157 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5158 goto out;
5159
5160 /* Allocate and initialize keypair of user A */
5161
5162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5163 ta_crypt_cmd_allocate_transient_object(c, &session,
5164 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5165 goto out;
5166
5167 param_count = 0;
5168
5169 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5170 TEE_ECC_CURVE_SM2, 0);
5171
5172 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5173 ARRAY(gmt_003_part5_b2_public_xA));
5174
5175 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5176 ARRAY(gmt_003_part5_b2_public_yA));
5177
5178 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5179 ARRAY(gmt_003_part5_b2_private_A));
5180
5181 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5182 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5183 params, param_count)))
5184 goto out;
5185
5186 /*
5187 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5188 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5189 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5190 * user B.
5191 */
5192
5193 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5194 ta_crypt_cmd_allocate_transient_object(c, &session,
5195 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5196 goto out;
5197
5198 param_count = 0;
5199
5200 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5201 TEE_ECC_CURVE_SM2, 0);
5202
5203 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5204 ARRAY(gmt_003_part5_b2_eph_public_xA));
5205
5206 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5207 ARRAY(gmt_003_part5_b2_eph_public_yA));
5208
5209 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5210 ARRAY(gmt_003_part5_b2_eph_private_A));
5211
5212 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5213 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5214 params, param_count)))
5215 goto out;
5216
5217 /* Associate user A keys with operation */
5218
5219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5220 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5221 eph_keyA)))
5222 goto out;
5223
5224 /* Keys have been set, free key objects */
5225
5226 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5227 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5228 goto out;
5229
5230 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5231 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5232 goto out;
5233
5234 /* Allocate output object */
5235
5236 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5237 ta_crypt_cmd_allocate_transient_object(c, &session,
5238 TEE_TYPE_GENERIC_SECRET,
5239 sizeof(gmt_003_part5_b2_shared_secret),
5240 &sv_handle)))
5241 goto out;
5242
5243 /* Set key derivation parameters: user A role, user B information */
5244
5245 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5246 params[0].content.value.a = 0; /* Initiator role */
5247 params[0].content.value.b = 0; /* Not used */
5248 param_count = 1;
5249
5250 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5251 ARRAY(gmt_003_part5_b2_public_xB));
5252
5253 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5254 ARRAY(gmt_003_part5_b2_public_yB));
5255
5256 xtest_add_attr(&param_count, params,
5257 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5258 ARRAY(gmt_003_part5_b2_eph_public_xB));
5259
5260 xtest_add_attr(&param_count, params,
5261 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5262 ARRAY(gmt_003_part5_b2_eph_public_yB));
5263
5264 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5265 ARRAY(gmt_003_part5_b2_id_A));
5266
5267 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5268 ARRAY(gmt_003_part5_b2_id_B));
5269
5270 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5271 ARRAY(gmt_003_part5_b2_conf_B));
5272
5273 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5274 ARRAY(conf_A));
5275
5276 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5277 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5278 param_count)))
5279 goto out;
5280
5281 out_size = sizeof(out);
5282 memset(out, 0, sizeof(out));
5283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5284 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5285 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5286 goto out;
5287
5288 /* Check derived key */
5289 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5290 sizeof(gmt_003_part5_b2_shared_secret), out,
5291 out_size))
5292 goto out;
5293
5294 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5295 ta_crypt_cmd_free_operation(c, &session, op)))
5296 goto out;
5297
5298 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5299 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5300 goto out;
5301
5302 Do_ADBG_EndSubCase(c, "Initiator side");
5303
5304 Do_ADBG_BeginSubCase(c, "Responder side");
5305
5306 /*
5307 * Key derivation on user B's side
5308 */
5309
5310 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5311 ta_crypt_cmd_allocate_operation(c, &session, &op,
5312 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5313 goto out;
5314
5315 /* Allocate and initialize keypair of user B */
5316
5317 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5318 ta_crypt_cmd_allocate_transient_object(c, &session,
5319 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5320 goto out;
5321
5322 param_count = 0;
5323
5324 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5325 TEE_ECC_CURVE_SM2, 0);
5326
5327 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5328 ARRAY(gmt_003_part5_b2_public_xB));
5329
5330 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5331 ARRAY(gmt_003_part5_b2_public_yB));
5332
5333 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5334 ARRAY(gmt_003_part5_b2_private_B));
5335
5336 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5337 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5338 params, param_count)))
5339 goto out;
5340
5341 /* Allocate and set ephemeral key of user B */
5342
5343 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5344 ta_crypt_cmd_allocate_transient_object(c, &session,
5345 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5346 goto out;
5347
5348 param_count = 0;
5349
5350 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5351 TEE_ECC_CURVE_SM2, 0);
5352
5353 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5354 ARRAY(gmt_003_part5_b2_eph_public_xB));
5355
5356 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5357 ARRAY(gmt_003_part5_b2_eph_public_yB));
5358
5359 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5360 ARRAY(gmt_003_part5_b2_eph_private_B));
5361
5362 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5363 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5364 params, param_count)))
5365 goto out;
5366
5367 /* Associate user B keys with operation */
5368
5369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5370 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5371 eph_keyB)))
5372 goto out;
5373
5374 /* Keys have been set, free key objects */
5375
5376 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5377 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5378 goto out;
5379
5380 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5381 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5382 goto out;
5383
5384 /* Allocate output object */
5385
5386 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5387 ta_crypt_cmd_allocate_transient_object(c, &session,
5388 TEE_TYPE_GENERIC_SECRET,
5389 sizeof(gmt_003_part5_b2_shared_secret),
5390 &sv_handle)))
5391 goto out;
5392
5393 /* Set key derivation parameters: user B role, user A information */
5394
5395 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5396 params[0].content.value.a = 1; /* Responder role */
5397 params[0].content.value.b = 0; /* Not used */
5398 param_count = 1;
5399
5400 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5401 ARRAY(gmt_003_part5_b2_public_xA));
5402
5403 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5404 ARRAY(gmt_003_part5_b2_public_yA));
5405
5406 xtest_add_attr(&param_count, params,
5407 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5408 ARRAY(gmt_003_part5_b2_eph_public_xA));
5409
5410 xtest_add_attr(&param_count, params,
5411 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5412 ARRAY(gmt_003_part5_b2_eph_public_yA));
5413
5414 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5415 ARRAY(gmt_003_part5_b2_id_A));
5416
5417 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5418 ARRAY(gmt_003_part5_b2_id_B));
5419
5420 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5421 ARRAY(gmt_003_part5_b2_conf_A));
5422
5423 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5424 ARRAY(conf_B));
5425
5426 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5427 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5428 param_count)))
5429 goto out;
5430
5431 out_size = sizeof(out);
5432 memset(out, 0, sizeof(out));
5433 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5434 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5435 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5436 goto out;
5437
5438 /* Check derived key */
5439 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5440 sizeof(gmt_003_part5_b2_shared_secret), out,
5441 out_size))
5442 goto out;
5443
5444 Do_ADBG_EndSubCase(c, "Responder side");
5445
5446out:
5447 TEEC_CloseSession(&session);
5448}
5449ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5450 "Test SM2 KEP (key derivation)");
Jens Wiklander14f48872018-06-29 15:30:13 +02005451#endif /*CFG_SYSTEM_PTA*/