blob: be7e76fccbd64ecee10dd4ed51de786c227c34a5 [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;
Pascal Brandc639ac82015-07-02 08:53:34 +02002387 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002388 TEE_Attribute key_attr = { };
2389 uint8_t out[512] = { };
2390 size_t out_size = 0;
2391 size_t out_offs = 0;
2392 uint32_t ret_orig = 0;
2393 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002394
2395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2396 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2397 &ret_orig)))
2398 return;
2399
2400 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2401 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2402 (int)n, (unsigned int)ae_cases[n].algo,
2403 (int)ae_cases[n].line);
2404
2405 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2406 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2407 key_attr.content.ref.length = ae_cases[n].key_len;
2408
2409 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2410 ta_crypt_cmd_allocate_operation(c, &session, &op,
2411 ae_cases[n].algo, ae_cases[n].mode,
2412 key_attr.content.ref.length * 8)))
2413 goto out;
2414
2415 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2416 ta_crypt_cmd_allocate_transient_object(c, &session,
2417 ae_cases[n].key_type,
2418 key_attr.content.ref.length * 8,
2419 &key_handle)))
2420 goto out;
2421
2422 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2423 ta_crypt_cmd_populate_transient_object(c, &session,
2424 key_handle, &key_attr, 1)))
2425 goto out;
2426
2427 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2428 ta_crypt_cmd_set_operation_key(c, &session, op,
2429 key_handle)))
2430 goto out;
2431
2432 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2433 ta_crypt_cmd_free_transient_object(c, &session,
2434 key_handle)))
2435 goto out;
2436 key_handle = TEE_HANDLE_NULL;
2437
2438 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2439 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2440 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2441 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2442 goto out;
2443
2444 if (ae_cases[n].aad != NULL) {
2445 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2446 ta_crypt_cmd_ae_update_aad(c, &session, op,
2447 ae_cases[n].aad, ae_cases[n].aad_incr)))
2448 goto out;
2449
2450 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2451 ta_crypt_cmd_ae_update_aad(c, &session, op,
2452 ae_cases[n].aad + ae_cases[n].aad_incr,
2453 ae_cases [n].aad_len -
2454 ae_cases[n].aad_incr)))
2455 goto out;
2456 }
2457
2458 out_offs = 0;
2459 out_size = sizeof(out);
2460 memset(out, 0, sizeof(out));
2461 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2462 if (ae_cases[n].ptx != NULL) {
2463 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2464 ta_crypt_cmd_ae_update(c, &session, op,
2465 ae_cases[n].ptx,
2466 ae_cases[n].in_incr, out,
2467 &out_size)))
2468 goto out;
2469 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002470 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2471 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2472 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002473 }
2474 } else {
2475 if (ae_cases[n].ctx != NULL) {
2476 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2477 ta_crypt_cmd_ae_update(c, &session, op,
2478 ae_cases[n].ctx,
2479 ae_cases[n].in_incr, out,
2480 &out_size)))
2481 goto out;
2482 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002483 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2484 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2485 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002486 }
2487 }
2488
2489 out_size = sizeof(out) - out_offs;
2490 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2491 uint8_t out_tag[64];
2492 size_t out_tag_len = MIN(sizeof(out_tag),
2493 ae_cases[n].tag_len);
2494
2495 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2496 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2497 ae_cases[n].ptx + ae_cases[n].in_incr,
2498 ae_cases[n].ptx_len -
2499 ae_cases[n].in_incr,
2500 out + out_offs,
2501 &out_size, out_tag, &out_tag_len)))
2502 goto out;
2503
2504 (void)ADBG_EXPECT_BUFFER(c,
2505 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2506 out_tag_len);
2507
2508 out_offs += out_size;
2509
2510 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2511 ae_cases[n].ctx_len, out, out_offs);
2512 } else {
2513 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2514 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2515 ae_cases[n].ctx + ae_cases[n].in_incr,
2516 ae_cases[n].ctx_len -
2517 ae_cases[n].in_incr,
2518 out + out_offs,
2519 &out_size, ae_cases[n].tag,
2520 ae_cases[n].tag_len)))
2521 goto out;
2522
2523 out_offs += out_size;
2524
2525 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2526 ae_cases[n].ptx_len, out, out_offs);
2527 }
2528
2529 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2530 ta_crypt_cmd_free_operation(c, &session, op)))
2531 goto out;
2532
2533 Do_ADBG_EndSubCase(c, NULL);
2534 }
2535out:
2536 TEEC_CloseSession(&session);
2537}
Jens Wiklander14f48872018-06-29 15:30:13 +02002538ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2539 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002540
2541struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002542 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002543 uint32_t algo;
2544 TEE_OperationMode mode;
2545
2546 union {
2547 struct {
2548 const uint8_t *modulus;
2549 size_t modulus_len;
2550
2551 const uint8_t *pub_exp;
2552 size_t pub_exp_len;
2553
2554 const uint8_t *priv_exp;
2555 size_t priv_exp_len;
2556
2557 const uint8_t *prime1; /* q */
2558 size_t prime1_len;
2559 const uint8_t *prime2; /* p */
2560 size_t prime2_len;
2561 const uint8_t *exp1; /* dp */
2562 size_t exp1_len;
2563 const uint8_t *exp2; /* dq */
2564 size_t exp2_len;
2565 const uint8_t *coeff; /* iq */
2566 size_t coeff_len;
2567
2568 int salt_len;
2569 } rsa;
2570 struct {
2571 const uint8_t *prime;
2572 size_t prime_len;
2573 const uint8_t *sub_prime;
2574 size_t sub_prime_len;
2575 const uint8_t *base;
2576 size_t base_len;
2577 const uint8_t *pub_val;
2578 size_t pub_val_len;
2579 const uint8_t *priv_val;
2580 size_t priv_val_len;
2581 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002582 struct {
2583 const uint8_t *private;
2584 size_t private_len;
2585 const uint8_t *public_x;
2586 size_t public_x_len;
2587 const uint8_t *public_y;
2588 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002589 } ecc;
Pascal Brandc639ac82015-07-02 08:53:34 +02002590 } params;
2591
2592 const uint8_t *ptx;
2593 size_t ptx_len;
2594 const uint8_t *ctx;
2595 size_t ctx_len;
2596 size_t line;
2597};
2598
2599#define WITHOUT_SALT(x) -1
2600#define WITH_SALT(x) x
2601
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002602#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2603 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002604 ARRAY(vect ## _ptx), \
2605 ARRAY(vect ## _out), \
2606 __LINE__ }
2607
2608#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2609 { .rsa = { \
2610 ARRAY(vect ## _modulus), \
2611 ARRAY(vect ## _pub_exp), \
2612 ARRAY(vect ## _priv_exp), \
2613 opt_crt_array(vect ## _prime1), \
2614 opt_crt_array(vect ## _prime2), \
2615 opt_crt_array(vect ## _exp1), \
2616 opt_crt_array(vect ## _exp2), \
2617 opt_crt_array(vect ## _coeff), \
2618 opt_salt(vect ## _salt_len) \
2619 } }
2620
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002621#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2622 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002623 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2624
2625#define XTEST_AC_DSA_UNION(vect) \
2626 { .dsa = { \
2627 ARRAY(vect ## _prime), \
2628 ARRAY(vect ## _sub_prime), \
2629 ARRAY(vect ## _base), \
2630 ARRAY(vect ## _pub_val), \
2631 ARRAY(vect ## _priv_val), \
2632 } }
2633
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002634#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2635 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002636
Pascal Brand3e143ee2015-07-15 17:17:16 +02002637#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002638 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002639 ARRAY(vect ## _private), \
2640 ARRAY(vect ## _public_x), \
2641 ARRAY(vect ## _public_y), \
2642 } }
2643
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002644#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002645 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002646
Pascal Brandc639ac82015-07-02 08:53:34 +02002647static const struct xtest_ac_case xtest_ac_cases[] = {
2648 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002649 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002650 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002651 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002652 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002653 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002654 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002655 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002656 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002657 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2658 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2659 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2660 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002661 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2662 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2663 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2664 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002665 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002666 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002667 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002668 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002669 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002670 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002671 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002672 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002673 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002674 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002675 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002676 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002677 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002678 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002679 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002680 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002681 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002682 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002683 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002684 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002685 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2686 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2687 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2688 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002689
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002690 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002691 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002692 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002693 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002694
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002695#ifdef CFG_CRYPTO_RSASSA_NA1
2696 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2697 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2698 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2699 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2700#endif
2701
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002702 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002703 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002704 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002705 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002706
2707 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002708 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002709 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002710 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002711
2712 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002713 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002714 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002715 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2716
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002717 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2718 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002719 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002720 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002721 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002722
2723 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2724 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002725 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002726 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2727 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002728 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002729
2730 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2731 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002732 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002733 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2734 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002735 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002736
2737 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2738 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002739 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002740 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2741 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002742 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002743
2744 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2745 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002746 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002747 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2748 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002749 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2750
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002751 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002752 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002753 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002754 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002755 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002756 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002757 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002758 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002759 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002760 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002761 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002762 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
2763
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002764 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2765 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002766 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002767 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2768 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002769 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002770 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2771 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002772 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002773 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2774 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002775 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002776 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2777 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002778 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002779 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2780 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002781 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
2782
2783 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002784 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002785 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002786 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002787 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002788 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002789 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002790 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002791 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002792 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002793 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002794 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002795 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002796 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002797 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002798 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002799 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002800 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002801 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002802 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002803 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002804 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002805 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002806 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002807 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002808 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002809 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002810 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002811 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002812 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002813 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002814 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002815 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002816 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002817 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002818 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002819 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002820 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002821 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002822 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002823 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002824 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002825 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002826 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002827 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
2828
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002829 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2830 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002831 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002832 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002833 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002834 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2835 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002836 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002837 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2838 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002839 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002840 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2841 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002842 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002843 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2844 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002845 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002846 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2847 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002848 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002849 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2850 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002851 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002852 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2853 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002854 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002855 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2856 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002857 ac_rsassa_vect15, ARRAY, WITH_SALT),
2858
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002859 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002860 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002861 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002862 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002863 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002864 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002865 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002866 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002867 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002868 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002869 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002870 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
2871
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002872 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2873 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002874 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002875 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2876 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002877 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002878 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2879 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002880 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002881 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2882 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002883 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002884 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2885 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002886 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002887 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2888 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002889 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
2890
2891 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002892 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002893 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
2894 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002895 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
2896 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
2897 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
2898 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
2899 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
2900 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
2901 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
2902 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
2903 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
2904 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
2905 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
2906 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
2907 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
2908 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
2909 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
2910 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
2911 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
2912 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
2913 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
2914 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
2915 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
2916 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
2917 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
2918 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
2919 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
2920 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
2921 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
2922 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002923 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
2924 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
2925 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
2926 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
2927 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
2928 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002929 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
2930 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002931 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
2932 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
2933 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
2934 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
2935 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
2936 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
2937 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
2938 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
2939 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
2940 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
2941 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
2942 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
2943 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
2944 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
2945 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
2946 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
2947 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
2948 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
2949 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
2950 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
2951 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
2952 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
2953 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
2954 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
2955 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
2956 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
2957 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
2958 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002959 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002960 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
2961 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
2962 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
2963 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
2964 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
2965 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
2966 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
2967 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
2968 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
2969 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
2970 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
2971 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
2972 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
2973 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
2974 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
2975 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
2976 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
2977 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
2978 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
2979 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
2980 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
2981 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
2982 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
2983 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
2984 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
2985 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
2986 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
2987 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
2988 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
2989 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002990 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
2991 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
2992 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
2993 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002994 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
2995 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002996 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
2997 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
2998 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
2999 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3000 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3001 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3002 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3003 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3004 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3005 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3006 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3007 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3008 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3009 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3010 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3011 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3012 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3013 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3014 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3015 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3016 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3017 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3018 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3019 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3020 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3021 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3022 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3023 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003024 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003025 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3026 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003027 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3028 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3029 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3030 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3031 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3032 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3033 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3034 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3035 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3036 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3037 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3038 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3039 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3040 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3041 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3042 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3043 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3044 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3045 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3046 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3047 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3048 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3049 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3050 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3051 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3052 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3053 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3054 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003055 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3056 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3057 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3058 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3059 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003060 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3061 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003062 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3063 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3064 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3065 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3066 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3067 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3068 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3069 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3070 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3071 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3072 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3073 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3074 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3075 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3076 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3077 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3078 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3079 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3080 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3081 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3082 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3083 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3084 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3085 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3086 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3087 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3088 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3089 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003090 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3091 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003092
3093 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003094 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003095 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3096 nist_186_2_ecdsa_testvector_1),
3097 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3098 nist_186_2_ecdsa_testvector_1),
3099 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3100 nist_186_2_ecdsa_testvector_2),
3101 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3102 nist_186_2_ecdsa_testvector_2),
3103 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3104 nist_186_2_ecdsa_testvector_3),
3105 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3106 nist_186_2_ecdsa_testvector_3),
3107 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3108 nist_186_2_ecdsa_testvector_4),
3109 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3110 nist_186_2_ecdsa_testvector_4),
3111 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3112 nist_186_2_ecdsa_testvector_5),
3113 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3114 nist_186_2_ecdsa_testvector_5),
3115 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3116 nist_186_2_ecdsa_testvector_6),
3117 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3118 nist_186_2_ecdsa_testvector_6),
3119 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3120 nist_186_2_ecdsa_testvector_7),
3121 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3122 nist_186_2_ecdsa_testvector_7),
3123 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3124 nist_186_2_ecdsa_testvector_8),
3125 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3126 nist_186_2_ecdsa_testvector_8),
3127 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3128 nist_186_2_ecdsa_testvector_9),
3129 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3130 nist_186_2_ecdsa_testvector_9),
3131 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3132 nist_186_2_ecdsa_testvector_10),
3133 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3134 nist_186_2_ecdsa_testvector_10),
3135 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3136 nist_186_2_ecdsa_testvector_11),
3137 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3138 nist_186_2_ecdsa_testvector_11),
3139 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3140 nist_186_2_ecdsa_testvector_12),
3141 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3142 nist_186_2_ecdsa_testvector_12),
3143 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3144 nist_186_2_ecdsa_testvector_13),
3145 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3146 nist_186_2_ecdsa_testvector_13),
3147 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3148 nist_186_2_ecdsa_testvector_14),
3149 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3150 nist_186_2_ecdsa_testvector_14),
3151 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3152 nist_186_2_ecdsa_testvector_15),
3153 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3154 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003155 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003156 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3157 nist_186_2_ecdsa_testvector_16),
3158 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3159 nist_186_2_ecdsa_testvector_16),
3160 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3161 nist_186_2_ecdsa_testvector_17),
3162 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3163 nist_186_2_ecdsa_testvector_17),
3164 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3165 nist_186_2_ecdsa_testvector_18),
3166 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3167 nist_186_2_ecdsa_testvector_18),
3168 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3169 nist_186_2_ecdsa_testvector_19),
3170 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3171 nist_186_2_ecdsa_testvector_19),
3172 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3173 nist_186_2_ecdsa_testvector_20),
3174 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3175 nist_186_2_ecdsa_testvector_20),
3176 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3177 nist_186_2_ecdsa_testvector_21),
3178 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3179 nist_186_2_ecdsa_testvector_21),
3180 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3181 nist_186_2_ecdsa_testvector_22),
3182 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3183 nist_186_2_ecdsa_testvector_22),
3184 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3185 nist_186_2_ecdsa_testvector_23),
3186 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3187 nist_186_2_ecdsa_testvector_23),
3188 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3189 nist_186_2_ecdsa_testvector_24),
3190 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3191 nist_186_2_ecdsa_testvector_24),
3192 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3193 nist_186_2_ecdsa_testvector_25),
3194 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3195 nist_186_2_ecdsa_testvector_25),
3196 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3197 nist_186_2_ecdsa_testvector_26),
3198 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3199 nist_186_2_ecdsa_testvector_26),
3200 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3201 nist_186_2_ecdsa_testvector_27),
3202 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3203 nist_186_2_ecdsa_testvector_27),
3204 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3205 nist_186_2_ecdsa_testvector_28),
3206 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3207 nist_186_2_ecdsa_testvector_28),
3208 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3209 nist_186_2_ecdsa_testvector_29),
3210 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3211 nist_186_2_ecdsa_testvector_29),
3212 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3213 nist_186_2_ecdsa_testvector_30),
3214 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3215 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003216 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003217 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3218 nist_186_2_ecdsa_testvector_31),
3219 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3220 nist_186_2_ecdsa_testvector_31),
3221 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3222 nist_186_2_ecdsa_testvector_32),
3223 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3224 nist_186_2_ecdsa_testvector_32),
3225 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3226 nist_186_2_ecdsa_testvector_33),
3227 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3228 nist_186_2_ecdsa_testvector_33),
3229 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3230 nist_186_2_ecdsa_testvector_34),
3231 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3232 nist_186_2_ecdsa_testvector_34),
3233 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3234 nist_186_2_ecdsa_testvector_35),
3235 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3236 nist_186_2_ecdsa_testvector_35),
3237 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3238 nist_186_2_ecdsa_testvector_36),
3239 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3240 nist_186_2_ecdsa_testvector_36),
3241 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3242 nist_186_2_ecdsa_testvector_37),
3243 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3244 nist_186_2_ecdsa_testvector_37),
3245 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3246 nist_186_2_ecdsa_testvector_38),
3247 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3248 nist_186_2_ecdsa_testvector_38),
3249 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3250 nist_186_2_ecdsa_testvector_39),
3251 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3252 nist_186_2_ecdsa_testvector_39),
3253 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3254 nist_186_2_ecdsa_testvector_40),
3255 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3256 nist_186_2_ecdsa_testvector_40),
3257 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3258 nist_186_2_ecdsa_testvector_41),
3259 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3260 nist_186_2_ecdsa_testvector_41),
3261 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3262 nist_186_2_ecdsa_testvector_42),
3263 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3264 nist_186_2_ecdsa_testvector_42),
3265 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3266 nist_186_2_ecdsa_testvector_43),
3267 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3268 nist_186_2_ecdsa_testvector_43),
3269 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3270 nist_186_2_ecdsa_testvector_44),
3271 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3272 nist_186_2_ecdsa_testvector_44),
3273 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3274 nist_186_2_ecdsa_testvector_45),
3275 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3276 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003277 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003278 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3279 nist_186_2_ecdsa_testvector_46),
3280 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3281 nist_186_2_ecdsa_testvector_46),
3282 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3283 nist_186_2_ecdsa_testvector_47),
3284 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3285 nist_186_2_ecdsa_testvector_47),
3286 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3287 nist_186_2_ecdsa_testvector_48),
3288 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3289 nist_186_2_ecdsa_testvector_48),
3290 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3291 nist_186_2_ecdsa_testvector_49),
3292 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3293 nist_186_2_ecdsa_testvector_49),
3294 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3295 nist_186_2_ecdsa_testvector_50),
3296 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3297 nist_186_2_ecdsa_testvector_50),
3298 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3299 nist_186_2_ecdsa_testvector_51),
3300 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3301 nist_186_2_ecdsa_testvector_51),
3302 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3303 nist_186_2_ecdsa_testvector_52),
3304 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3305 nist_186_2_ecdsa_testvector_52),
3306 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3307 nist_186_2_ecdsa_testvector_53),
3308 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3309 nist_186_2_ecdsa_testvector_53),
3310 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3311 nist_186_2_ecdsa_testvector_54),
3312 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3313 nist_186_2_ecdsa_testvector_54),
3314 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3315 nist_186_2_ecdsa_testvector_55),
3316 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3317 nist_186_2_ecdsa_testvector_55),
3318 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3319 nist_186_2_ecdsa_testvector_56),
3320 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3321 nist_186_2_ecdsa_testvector_56),
3322 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3323 nist_186_2_ecdsa_testvector_57),
3324 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3325 nist_186_2_ecdsa_testvector_57),
3326 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3327 nist_186_2_ecdsa_testvector_58),
3328 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3329 nist_186_2_ecdsa_testvector_58),
3330 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3331 nist_186_2_ecdsa_testvector_59),
3332 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3333 nist_186_2_ecdsa_testvector_59),
3334 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3335 nist_186_2_ecdsa_testvector_60),
3336 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3337 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003338 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003339 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3340 nist_186_2_ecdsa_testvector_61),
3341 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3342 nist_186_2_ecdsa_testvector_61),
3343 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3344 nist_186_2_ecdsa_testvector_62),
3345 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3346 nist_186_2_ecdsa_testvector_62),
3347 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3348 nist_186_2_ecdsa_testvector_63),
3349 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3350 nist_186_2_ecdsa_testvector_63),
3351 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3352 nist_186_2_ecdsa_testvector_64),
3353 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3354 nist_186_2_ecdsa_testvector_64),
3355 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3356 nist_186_2_ecdsa_testvector_65),
3357 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3358 nist_186_2_ecdsa_testvector_65),
3359 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3360 nist_186_2_ecdsa_testvector_66),
3361 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3362 nist_186_2_ecdsa_testvector_66),
3363 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3364 nist_186_2_ecdsa_testvector_67),
3365 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3366 nist_186_2_ecdsa_testvector_67),
3367 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3368 nist_186_2_ecdsa_testvector_68),
3369 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3370 nist_186_2_ecdsa_testvector_68),
3371 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3372 nist_186_2_ecdsa_testvector_69),
3373 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3374 nist_186_2_ecdsa_testvector_69),
3375 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3376 nist_186_2_ecdsa_testvector_70),
3377 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3378 nist_186_2_ecdsa_testvector_70),
3379 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3380 nist_186_2_ecdsa_testvector_71),
3381 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3382 nist_186_2_ecdsa_testvector_71),
3383 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3384 nist_186_2_ecdsa_testvector_72),
3385 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3386 nist_186_2_ecdsa_testvector_72),
3387 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3388 nist_186_2_ecdsa_testvector_73),
3389 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3390 nist_186_2_ecdsa_testvector_73),
3391 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3392 nist_186_2_ecdsa_testvector_74),
3393 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3394 nist_186_2_ecdsa_testvector_74),
3395 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3396 nist_186_2_ecdsa_testvector_75),
3397 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3398 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003399 /* [K-163] - GP NOT SUPPORTED */
3400 /* [K-233] - GP NOT SUPPORTED */
3401 /* [K-283] - GP NOT SUPPORTED */
3402 /* [K-409] - GP NOT SUPPORTED */
3403 /* [K-571] - GP NOT SUPPORTED */
3404 /* [B-163] - GP NOT SUPPORTED */
3405 /* [B-233] - GP NOT SUPPORTED */
3406 /* [B-283] - GP NOT SUPPORTED */
3407 /* [B-409] - GP NOT SUPPORTED */
3408 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003409
3410 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3411 gmt_0003_part5_c2_sm2_testvector),
3412 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3413 gmt_0003_part5_c2_sm2_testvector),
3414 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3415 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003416
3417 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3418 gmt_003_part5_a2),
3419 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3420 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003421};
3422
3423static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3424 uint32_t max_key_size, uint32_t key_type,
3425 TEE_Attribute *attrs, size_t num_attrs,
3426 TEE_ObjectHandle *handle)
3427{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003428 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003429
3430 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3431 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3432 max_key_size, handle)))
3433 return false;
3434
3435 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3436 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3437 num_attrs)))
3438 return false;
3439
3440 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003441 uint8_t out[512] = { };
3442 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003443
3444 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3445 continue;
3446
Pascal Brandc639ac82015-07-02 08:53:34 +02003447 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3448 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3449 attrs[n].attributeID, out, &out_size)))
3450 return false;
3451
Pascal Brand3e143ee2015-07-15 17:17:16 +02003452 if (out_size < attrs[n].content.ref.length) {
3453 memmove(out + (attrs[n].content.ref.length - out_size),
3454 out,
3455 attrs[n].content.ref.length);
3456 memset(out, 0, attrs[n].content.ref.length - out_size);
3457 out_size = attrs[n].content.ref.length;
3458 }
3459
Pascal Brandc639ac82015-07-02 08:53:34 +02003460 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3461 attrs[n].content.ref.length, out, out_size))
3462 return false;
3463 }
3464
3465 return true;
3466}
3467
3468static void xtest_tee_test_4006(ADBG_Case_t *c)
3469{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003470 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003471 TEE_OperationHandle op = TEE_HANDLE_NULL;
3472 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3473 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003474 TEE_Attribute key_attrs[8] = { };
3475 TEE_Attribute algo_params[1] = { };
3476 size_t num_algo_params = 0;
3477 uint8_t out[512] = { };
3478 size_t out_size = 0;
3479 uint8_t out_enc[512] = { };
3480 size_t out_enc_size = 0;
3481 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003482 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003483 size_t max_key_size = 0;
3484 size_t num_key_attrs = 0;
3485 uint32_t ret_orig = 0;
3486 size_t n = 0;
3487 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003488 uint32_t pub_key_type = 0;
3489 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003490 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003491
3492 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3493 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3494 &ret_orig)))
3495 return;
3496
3497 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3498 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3499
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003500 if (tv->level > level)
3501 continue;
3502
Jerome Forissier4b03e282020-01-22 16:33:12 +01003503 if ((tv->algo == TEE_ALG_SM2_PKE ||
3504 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3505 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3506 TEE_ECC_CURVE_SM2)) {
3507 Do_ADBG_Log("SM2 not supported: skip subcase");
3508 continue;
3509 }
3510
Pascal Brandc639ac82015-07-02 08:53:34 +02003511 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3512 (int)n, (unsigned int)tv->algo,
3513 (int)tv->line);
3514
3515 /*
3516 * When signing or verifying we're working with the hash of
3517 * the payload.
3518 */
3519 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003520 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3521 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003522#if defined(CFG_CRYPTO_RSASSA_NA1)
3523 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3524 hash_algo = TEE_ALG_SHA256;
3525#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003526 else
3527 hash_algo = TEE_ALG_HASH_ALGO(
3528 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003529
3530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3531 ta_crypt_cmd_allocate_operation(c, &session,
3532 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3533 goto out;
3534
3535 ptx_hash_size = sizeof(ptx_hash);
3536 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3537 ta_crypt_cmd_digest_do_final(c, & session, op,
3538 tv->ptx, tv->ptx_len, ptx_hash,
3539 &ptx_hash_size)))
3540 goto out;
3541
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003542 /*
3543 * When we use DSA algorithms, the size of the hash we
3544 * consider equals the min between the size of the
3545 * "subprime" in the key and the size of the hash
3546 */
3547 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3548 TEE_MAIN_ALGO_DSA) {
3549 if (tv->params.dsa.sub_prime_len <=
3550 ptx_hash_size)
3551 ptx_hash_size =
3552 tv->params.dsa.sub_prime_len;
3553 }
3554
Pascal Brandc639ac82015-07-02 08:53:34 +02003555 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3556 ta_crypt_cmd_free_operation(c, &session, op)))
3557 goto out;
3558 }
3559
3560 num_algo_params = 0;
3561 num_key_attrs = 0;
3562 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3563 case TEE_MAIN_ALGO_RSA:
3564 if (tv->params.rsa.salt_len > 0) {
3565 algo_params[0].attributeID =
3566 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3567 algo_params[0].content.value.a =
3568 tv->params.rsa.salt_len;
3569 algo_params[0].content.value.b = 0;
3570 num_algo_params = 1;
3571 }
3572
3573 max_key_size = tv->params.rsa.modulus_len * 8;
3574
3575 xtest_add_attr(&num_key_attrs, key_attrs,
3576 TEE_ATTR_RSA_MODULUS,
3577 tv->params.rsa.modulus,
3578 tv->params.rsa.modulus_len);
3579 xtest_add_attr(&num_key_attrs, key_attrs,
3580 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3581 tv->params.rsa.pub_exp,
3582 tv->params.rsa.pub_exp_len);
3583
3584 if (!ADBG_EXPECT_TRUE(c,
3585 create_key(c, &session,
3586 max_key_size,
3587 TEE_TYPE_RSA_PUBLIC_KEY,
3588 key_attrs,
3589 num_key_attrs,
3590 &pub_key_handle)))
3591 goto out;
3592
3593 xtest_add_attr(&num_key_attrs, key_attrs,
3594 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3595 tv->params.rsa.priv_exp,
3596 tv->params.rsa.priv_exp_len);
3597
3598 if (tv->params.rsa.prime1_len != 0) {
3599 xtest_add_attr(&num_key_attrs, key_attrs,
3600 TEE_ATTR_RSA_PRIME1,
3601 tv->params.rsa.prime1,
3602 tv->params.rsa.prime1_len);
3603 }
3604
3605 if (tv->params.rsa.prime2_len != 0) {
3606 xtest_add_attr(&num_key_attrs, key_attrs,
3607 TEE_ATTR_RSA_PRIME2,
3608 tv->params.rsa.prime2,
3609 tv->params.rsa.prime2_len);
3610 }
3611
3612 if (tv->params.rsa.exp1_len != 0) {
3613 xtest_add_attr(&num_key_attrs, key_attrs,
3614 TEE_ATTR_RSA_EXPONENT1,
3615 tv->params.rsa.exp1,
3616 tv->params.rsa.exp1_len);
3617 }
3618
3619 if (tv->params.rsa.exp2_len != 0) {
3620 xtest_add_attr(&num_key_attrs, key_attrs,
3621 TEE_ATTR_RSA_EXPONENT2,
3622 tv->params.rsa.exp2,
3623 tv->params.rsa.exp2_len);
3624 }
3625
3626 if (tv->params.rsa.coeff_len != 0) {
3627 xtest_add_attr(&num_key_attrs, key_attrs,
3628 TEE_ATTR_RSA_COEFFICIENT,
3629 tv->params.rsa.coeff,
3630 tv->params.rsa.coeff_len);
3631 }
3632
3633 if (!ADBG_EXPECT_TRUE(c,
3634 create_key(c, &session,
3635 max_key_size,
3636 TEE_TYPE_RSA_KEYPAIR,
3637 key_attrs,
3638 num_key_attrs,
3639 &priv_key_handle)))
3640 goto out;
3641 break;
3642
3643 case TEE_MAIN_ALGO_DSA:
3644 max_key_size = tv->params.dsa.prime_len * 8;
3645
3646 xtest_add_attr(&num_key_attrs, key_attrs,
3647 TEE_ATTR_DSA_PRIME,
3648 tv->params.dsa.prime,
3649 tv->params.dsa.prime_len);
3650 xtest_add_attr(&num_key_attrs, key_attrs,
3651 TEE_ATTR_DSA_SUBPRIME,
3652 tv->params.dsa.sub_prime,
3653 tv->params.dsa.sub_prime_len);
3654 xtest_add_attr(&num_key_attrs, key_attrs,
3655 TEE_ATTR_DSA_BASE,
3656 tv->params.dsa.base,
3657 tv->params.dsa.base_len);
3658 xtest_add_attr(&num_key_attrs, key_attrs,
3659 TEE_ATTR_DSA_PUBLIC_VALUE,
3660 tv->params.dsa.pub_val,
3661 tv->params.dsa.pub_val_len);
3662
3663 if (!ADBG_EXPECT_TRUE(c,
3664 create_key(c, &session, max_key_size,
3665 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3666 num_key_attrs, &pub_key_handle)))
3667 goto out;
3668
3669 xtest_add_attr(&num_key_attrs, key_attrs,
3670 TEE_ATTR_DSA_PRIVATE_VALUE,
3671 tv->params.dsa.priv_val,
3672 tv->params.dsa.priv_val_len);
3673
3674 if (!ADBG_EXPECT_TRUE(c,
3675 create_key(c, &session, max_key_size,
3676 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3677 num_key_attrs, &priv_key_handle)))
3678 goto out;
3679 break;
3680
Pascal Brand3e143ee2015-07-15 17:17:16 +02003681 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003682 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003683 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003684 switch (tv->algo) {
3685 case TEE_ALG_ECDSA_P192:
3686 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003687 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3688 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003689 break;
3690 case TEE_ALG_ECDSA_P224:
3691 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003692 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3693 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003694 break;
3695 case TEE_ALG_ECDSA_P256:
3696 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003697 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3698 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003699 break;
3700 case TEE_ALG_ECDSA_P384:
3701 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003702 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3703 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003704 break;
3705 case TEE_ALG_ECDSA_P521:
3706 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003707 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3708 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3709 break;
3710 case TEE_ALG_SM2_PKE:
3711 curve = TEE_ECC_CURVE_SM2;
3712 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3713 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003714 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003715 case TEE_ALG_SM2_DSA_SM3:
3716 curve = TEE_ECC_CURVE_SM2;
3717 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3718 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3719 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003720 default:
3721 curve = 0xFF;
3722 break;
3723 }
3724
3725 if (tv->algo == TEE_ALG_ECDSA_P521)
3726 max_key_size = 521;
3727 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003728 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003729
3730 xtest_add_attr_value(&num_key_attrs, key_attrs,
3731 TEE_ATTR_ECC_CURVE, curve, 0);
3732 xtest_add_attr(&num_key_attrs, key_attrs,
3733 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003734 tv->params.ecc.public_x,
3735 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003736 xtest_add_attr(&num_key_attrs, key_attrs,
3737 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003738 tv->params.ecc.public_y,
3739 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003740
3741 if (!ADBG_EXPECT_TRUE(c,
3742 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003743 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003744 num_key_attrs, &pub_key_handle)))
3745 goto out;
3746
3747 xtest_add_attr(&num_key_attrs, key_attrs,
3748 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003749 tv->params.ecc.private,
3750 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003751
3752 if (!ADBG_EXPECT_TRUE(c,
3753 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003754 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003755 num_key_attrs, &priv_key_handle)))
3756 goto out;
3757 break;
3758
Pascal Brandc639ac82015-07-02 08:53:34 +02003759 default:
3760 ADBG_EXPECT_TRUE(c, false);
3761 goto out;
3762 }
3763
3764 out_size = sizeof(out);
3765 memset(out, 0, sizeof(out));
3766 switch (tv->mode) {
3767 case TEE_MODE_ENCRYPT:
3768 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3769 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003770 &op, tv->algo, TEE_MODE_ENCRYPT,
3771 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003772 goto out;
3773
3774 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3775 ta_crypt_cmd_set_operation_key(c, &session, op,
3776 pub_key_handle)))
3777 goto out;
3778
3779 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3780 ta_crypt_cmd_free_transient_object(c, &session,
3781 pub_key_handle)))
3782 goto out;
3783 pub_key_handle = TEE_HANDLE_NULL;
3784
3785 out_enc_size = sizeof(out_enc);
3786 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3787 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
3788 NULL, 0, tv->ptx, tv->ptx_len, out_enc,
3789 &out_enc_size)))
3790 goto out;
3791
3792 /*
3793 * A PS which is random is added when formatting the
3794 * message internally of the algorithm so we can't
3795 * verify against precomputed values, instead we use the
3796 * decrypt operation to see that output is correct.
3797 */
3798
3799 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3800 ta_crypt_cmd_free_operation(c, &session, op)))
3801 goto out;
3802
3803 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3804 ta_crypt_cmd_allocate_operation(c, &session,
3805 &op, tv->algo, TEE_MODE_DECRYPT,
3806 max_key_size)))
3807 goto out;
3808
3809 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3810 ta_crypt_cmd_set_operation_key(c, &session, op,
3811 priv_key_handle)))
3812 goto out;
3813
3814 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3815 ta_crypt_cmd_free_transient_object(c, &session,
3816 priv_key_handle)))
3817 goto out;
3818
3819 priv_key_handle = TEE_HANDLE_NULL;
3820
3821 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3822 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
3823 NULL, 0, out_enc, out_enc_size, out,
3824 &out_size)))
3825 goto out;
3826
3827 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
3828 out_size);
3829 break;
3830
3831 case TEE_MODE_DECRYPT:
3832 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3833 ta_crypt_cmd_allocate_operation(c, &session,
3834 &op, tv->algo, TEE_MODE_DECRYPT,
3835 max_key_size)))
3836 goto out;
3837
3838 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3839 ta_crypt_cmd_set_operation_key(c, &session, op,
3840 priv_key_handle)))
3841 goto out;
3842
3843 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3844 ta_crypt_cmd_free_transient_object(c, &session,
3845 priv_key_handle)))
3846 goto out;
3847
3848 priv_key_handle = TEE_HANDLE_NULL;
3849
3850 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3851 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
3852 NULL, 0, tv->ctx, tv->ctx_len, out,
3853 &out_size)))
3854 goto out;
3855
3856 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
3857 out_size);
3858 break;
3859
3860 case TEE_MODE_VERIFY:
3861 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3862 ta_crypt_cmd_allocate_operation(c, &session,
3863 &op, tv->algo, TEE_MODE_VERIFY,
3864 max_key_size)))
3865 goto out;
3866
3867 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3868 ta_crypt_cmd_set_operation_key(c, &session, op,
3869 pub_key_handle)))
3870 goto out;
3871
3872 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3873 ta_crypt_cmd_free_transient_object(c, &session,
3874 pub_key_handle)))
3875 goto out;
3876
3877 pub_key_handle = TEE_HANDLE_NULL;
3878
3879 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3880 ta_crypt_cmd_asymmetric_verify(c, &session, op,
3881 algo_params, num_algo_params, ptx_hash,
3882 ptx_hash_size, tv->ctx, tv->ctx_len)))
3883 goto out;
3884 break;
3885
3886 case TEE_MODE_SIGN:
3887 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3888 ta_crypt_cmd_allocate_operation(c, &session,
3889 &op, tv->algo, TEE_MODE_SIGN,
3890 max_key_size)))
3891 goto out;
3892
3893 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3894 ta_crypt_cmd_set_operation_key(c, &session, op,
3895 priv_key_handle)))
3896 goto out;
3897
3898 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3899 ta_crypt_cmd_free_transient_object(c, &session,
3900 priv_key_handle)))
3901 goto out;
3902
3903 priv_key_handle = TEE_HANDLE_NULL;
3904
3905 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3906 ta_crypt_cmd_asymmetric_sign(c, &session, op,
3907 algo_params, num_algo_params, ptx_hash,
3908 ptx_hash_size, out, &out_size)))
3909 goto out;
3910
3911 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
3912 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02003913 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003914 tv->algo == TEE_ALG_DSA_SHA224 ||
3915 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02003916 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01003917 TEE_MAIN_ALGO_ECDSA ||
3918 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02003919 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3920 ta_crypt_cmd_free_operation(c, &session,
3921 op)))
3922 goto out;
3923 /*
3924 * The salt or K is random so we can't verify
3925 * signing against precomputed values, instead
3926 * we use the verify operation to see that
3927 * output is correct.
3928 */
3929 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3930 ta_crypt_cmd_allocate_operation(c,
3931 &session, &op, tv->algo,
3932 TEE_MODE_VERIFY, max_key_size)))
3933 goto out;
3934
3935 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3936 ta_crypt_cmd_set_operation_key(c,
3937 &session, op, pub_key_handle)))
3938 goto out;
3939
3940 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3941 ta_crypt_cmd_free_transient_object(c,
3942 &session, pub_key_handle)))
3943 goto out;
3944
3945 pub_key_handle = TEE_HANDLE_NULL;
3946
3947 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3948 ta_crypt_cmd_asymmetric_verify(c,
3949 &session, op, algo_params,
3950 num_algo_params, ptx_hash,
3951 ptx_hash_size, out, out_size)))
3952 goto out;
3953 } else {
3954 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
3955 tv->ctx_len, out,
3956 out_size);
3957 }
3958 break;
3959
3960 default:
3961 break;
3962 }
3963
3964 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3965 ta_crypt_cmd_free_operation(c, &session, op)))
3966 goto out;
3967
3968 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3969 ta_crypt_cmd_free_transient_object(c, &session,
3970 pub_key_handle)))
3971 goto out;
3972 pub_key_handle = TEE_HANDLE_NULL;
3973
3974 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3975 ta_crypt_cmd_free_transient_object(c, &session,
3976 priv_key_handle)))
3977 goto out;
3978
3979 priv_key_handle = TEE_HANDLE_NULL;
3980
3981 Do_ADBG_EndSubCase(c, NULL);
3982 }
3983out:
3984 TEEC_CloseSession(&session);
3985}
Jens Wiklander14f48872018-06-29 15:30:13 +02003986ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
3987 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02003988
3989#define KEY_ATTR(x, y) { #x, (x), y }
3990
3991struct key_attrs {
3992 const char *name;
3993 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02003994 /*
3995 * When keysize_check != 0: size of attribute is checked
3996 * Expected value is key_size bits except for DH in which case it is
3997 * the value of keysize_check.
3998 */
3999 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004000};
4001
4002static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4003 TEE_ObjectHandle key, uint32_t key_size,
4004 struct key_attrs *attrs, size_t num_attrs)
4005{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004006 uint8_t out[2048] = { };
4007 size_t out_size = 0;
4008 size_t n = 0;
4009 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004010
4011 for (m = 0; m < num_attrs; m++) {
4012 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4013 out_size = sizeof(out);
4014 memset(out, 0, sizeof(out));
4015 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4016 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4017 key, attrs[m].attr, out, &out_size)))
4018 return false;
4019
4020 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01004021 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02004022 key_size / 8);
4023
4024 if (out_size > 0) {
4025 /* Check that buffer isn't all zeroes */
4026 for (n = 0; n < out_size; n++)
4027 if (out[n] != 0)
4028 break;
4029 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4030 out_size))
4031 return false;
4032 }
4033 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004034 uint32_t a = 0;
4035 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004036
4037 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4038 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4039 attrs[m].attr, &a, &b)))
4040 return false;
4041 }
4042 }
4043 return true;
4044}
4045
4046static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4047 TEE_ObjectHandle key, uint32_t key_size)
4048{
4049 const struct key_attrs attrs[] = {
4050 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4051 };
4052
4053 return test_keygen_attributes(c, s, key, key_size,
4054 (struct key_attrs *)&attrs,
4055 ARRAY_SIZE(attrs));
4056}
4057
4058
4059static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4060 TEE_ObjectHandle key, uint32_t key_size)
4061{
4062 const struct key_attrs attrs[] = {
4063 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4064 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4065 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4066 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4067 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4068 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4069 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4070 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4071 };
4072
4073 return test_keygen_attributes(c, s, key, key_size,
4074 (struct key_attrs *)&attrs,
4075 ARRAY_SIZE(attrs));
4076}
4077
Pascal Brande61133f2015-07-08 15:38:37 +02004078static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4079 TEE_ObjectHandle key, uint32_t key_size)
4080{
4081 const struct key_attrs attrs[] = {
4082 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4083 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4084 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4085 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4086 };
4087
4088 return test_keygen_attributes(c, s, key, key_size,
4089 (struct key_attrs *)&attrs,
4090 ARRAY_SIZE(attrs));
4091}
4092
Pascal Brandc639ac82015-07-02 08:53:34 +02004093static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004094 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004095{
4096 const struct key_attrs attrs[] = {
4097 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4098 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4099 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4100 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4101 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4102 };
4103
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004104 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004105 (struct key_attrs *)&attrs,
4106 ARRAY_SIZE(attrs));
4107}
4108
4109static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4110 TEE_ObjectHandle key, uint32_t key_size)
4111{
4112 const struct key_attrs attrs[] = {
4113 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4114 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4115 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4116 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4117 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4118 };
4119
4120 return test_keygen_attributes(c, s, key, key_size,
4121 (struct key_attrs *)&attrs,
4122 ARRAY_SIZE(attrs));
4123}
4124
4125static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4126 uint32_t key_type, uint32_t check_keysize,
4127 uint32_t key_size,
4128 TEE_Attribute *params, size_t param_count)
4129{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004130 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004131 bool ret_val = true;
4132
4133 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4134 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4135 &key)))
4136 return false;
4137
4138 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4139 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4140 param_count)))
4141 return false;
4142
4143 switch (key_type) {
4144 case TEE_TYPE_DES:
4145 case TEE_TYPE_DES3:
4146 ret_val = ADBG_EXPECT_TRUE(c,
4147 test_secret_value(c, s, key,
4148 key_size + key_size / 7));
4149 break;
4150 case TEE_TYPE_AES:
4151 case TEE_TYPE_HMAC_MD5:
4152 case TEE_TYPE_HMAC_SHA1:
4153 case TEE_TYPE_HMAC_SHA224:
4154 case TEE_TYPE_HMAC_SHA256:
4155 case TEE_TYPE_HMAC_SHA384:
4156 case TEE_TYPE_HMAC_SHA512:
4157 case TEE_TYPE_GENERIC_SECRET:
4158 ret_val = ADBG_EXPECT_TRUE(c,
4159 test_secret_value(c, s, key, key_size));
4160 break;
4161
4162 case TEE_TYPE_RSA_KEYPAIR:
4163 ret_val = ADBG_EXPECT_TRUE(c,
4164 test_rsa_key_pair(c, s, key, key_size));
4165 break;
4166
Pascal Brande61133f2015-07-08 15:38:37 +02004167 case TEE_TYPE_ECDSA_KEYPAIR:
4168 case TEE_TYPE_ECDH_KEYPAIR:
4169 ret_val = ADBG_EXPECT_TRUE(c,
4170 test_ecc_key_pair(c, s, key, key_size));
4171 break;
4172
Pascal Brandc639ac82015-07-02 08:53:34 +02004173 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004174 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004175 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004176 break;
4177
4178 case TEE_TYPE_DSA_KEYPAIR:
4179 ret_val = ADBG_EXPECT_TRUE(c,
4180 test_dsa_key_pair(c, s, key, key_size));
4181 break;
4182
4183 default:
4184 ret_val = false;
4185 break;
4186 }
4187
4188 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4189 ta_crypt_cmd_free_transient_object(c, s, key)))
4190 return false;
4191
4192 return ret_val;
4193}
4194
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004195struct key_types_noparam {
4196 unsigned level;
4197 const char *name;
4198 uint32_t key_type;
4199 uint32_t quanta;
4200 uint32_t min_size;
4201 uint32_t max_size;
4202};
4203
4204static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4205 const struct key_types_noparam *key_types,
4206 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004207{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004208 size_t n = 0;
4209 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004210
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004211 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004212 uint32_t min_size = key_types[n].min_size;
4213 uint32_t max_size = key_types[n].max_size;
4214 uint32_t quanta = key_types[n].quanta;
4215
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004216 if (key_types[n].level > level)
4217 continue;
4218
Pascal Brandc639ac82015-07-02 08:53:34 +02004219 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4220
4221 for (key_size = min_size; key_size <= max_size;
4222 key_size += quanta) {
4223 if (!ADBG_EXPECT_TRUE(c,
4224 generate_and_test_key(c, session, key_types
4225 [n].key_type, 1, key_size, NULL, 0)))
4226 break;
4227 }
4228
4229 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4230 }
4231}
4232
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004233static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004234{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004235 TEEC_Session session = { };
4236 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004237 static const struct key_types_noparam key_types[] = {
4238 { 0, "AES", TEE_TYPE_AES, 64, 128,
4239 256 /* valid sizes 128, 192, 256 */ },
4240 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4241 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4242 168 /* valid sizes 112, 168 */ },
4243 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4244 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4245 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4246 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4247 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4248 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4249 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4250 };
4251
4252 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4253 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4254 &ret_orig)))
4255 return;
4256
4257 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4258
4259 TEEC_CloseSession(&session);
4260}
4261ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4262 "Test TEE Internal API Generate Symmetric key");
4263
4264static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4265{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004266 TEEC_Session session = { };
4267 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004268 static const struct key_types_noparam key_types[] = {
4269 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4270 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
4271 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
4272 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4273 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4274 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
4275 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4276 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4277 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4278 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4279 };
4280
4281 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4282 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4283 &ret_orig)))
4284 return;
4285
4286 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4287
4288 TEEC_CloseSession(&session);
4289}
4290ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4291 "Test TEE Internal API Generate RSA key");
4292
4293static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4294{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004295 TEEC_Session session = { };
4296 uint32_t ret_orig = 0;
4297 size_t n = 0;
4298 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004299 /*
4300 * Note that the key size parameter is not used when creating the keys
4301 * but specifying these sizes make it possible to test the expected size
4302 * of the private value. This also means that the keysize must match the
4303 * size of p or what is specified in private_bits or the equvivalent
4304 * size of the subprime parameter.
4305 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004306 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004307
4308#define XTEST_DH_GK_DATA(vect) \
4309 ARRAY(vect ## _p), \
4310 ARRAY(vect ## _g), \
4311 &vect ## _private_bits, \
4312 0, 0
4313#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4314 ARRAY(vect ## _p), \
4315 ARRAY(vect ## _g), \
4316 &vect ## _private_bits, \
4317 ARRAY(vect ## _subprime)
4318 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004319 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004320 uint32_t key_size;
4321 const uint8_t *p;
4322 size_t p_len;
4323 const uint8_t *g;
4324 size_t g_len;
4325 const uint32_t *private_bits;
4326 const uint8_t *subprime;
4327 size_t subprime_len;
4328 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004329 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004330 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004331 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004332 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004333 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004334 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004335 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004336 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004337 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004338 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004339 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004340 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004341 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004342 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004343 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004344 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004345 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004346 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004347 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004348 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004349 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004350 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004351 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004352 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004353 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004354 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004355 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004356 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004357 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004358 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004359 };
4360
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004361 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4362 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4363 &ret_orig)))
4364 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004365
4366 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004367 if (key_types[n].level > level)
4368 continue;
4369
Pascal Brandc639ac82015-07-02 08:53:34 +02004370 Do_ADBG_BeginSubCase(c,
4371 "Generate DH key %d bits - Private bits = %d",
4372 key_types[n].key_size,
4373 *key_types[n].private_bits);
4374 param_count = 0;
4375
4376 xtest_add_attr(&param_count, params,
4377 TEE_ATTR_DH_PRIME,
4378 key_types[n].p, key_types[n].p_len);
4379
4380 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4381 key_types[n].g, key_types[n].g_len);
4382
4383 if (key_types[n].private_bits != 0) {
4384 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4385
4386 params[param_count].content.value.a =
4387 *key_types[n].private_bits;
4388
4389 params[param_count].content.value.b = 0;
4390 param_count++;
4391 }
4392
4393 if (key_types[n].subprime != 0) {
4394 xtest_add_attr(&param_count, params,
4395 TEE_ATTR_DH_SUBPRIME,
4396 key_types[n].subprime,
4397 key_types[n].subprime_len);
4398 }
4399
4400 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004401 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004402 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004403 key_types[n]. key_size, params, param_count)))
4404 break;
4405
4406 Do_ADBG_EndSubCase(c,
4407 "Generate DH key %d bits - Private bits = %d",
4408 key_types[n].key_size,
4409 *key_types[n].private_bits);
4410 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004411
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004412 TEEC_CloseSession(&session);
4413}
4414ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4415 "Test TEE Internal API Generate DH key");
4416
4417static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004418{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004419 TEEC_Session session = { };
4420 uint32_t ret_orig = 0;
4421 size_t n = 0;
4422 size_t param_count = 0;
4423 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004424
4425#define XTEST_DSA_GK_DATA(vect) \
4426 ARRAY(vect ## _p), \
4427 ARRAY(vect ## _g), \
4428 ARRAY(vect ## _q)
4429 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004430 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004431 uint32_t key_size;
4432 const uint8_t *prime;
4433 size_t prime_len;
4434 const uint8_t *base;
4435 size_t base_len;
4436 const uint8_t *sub_prime;
4437 size_t sub_prime_len;
4438 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004439 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004440 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004441 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4442 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4443 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4444 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4445 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4446 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4447 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4448 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004449 };
4450
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004451 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4452 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4453 &ret_orig)))
4454 return;
4455
Pascal Brandc639ac82015-07-02 08:53:34 +02004456 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004457 if (key_types[n].level > level)
4458 continue;
4459
Pascal Brandc639ac82015-07-02 08:53:34 +02004460 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4461 key_types[n].key_size);
4462 param_count = 0;
4463
4464
4465 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4466 key_types[n].prime, key_types[n].prime_len);
4467
4468 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4469 key_types[n].sub_prime,
4470 key_types[n].sub_prime_len);
4471
4472 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4473 key_types[n].base, key_types[n].base_len);
4474
4475 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004476 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004477 1, key_types[n]. key_size, params,
4478 param_count)))
4479 break;
4480
4481 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4482 key_types[n].key_size);
4483 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004484
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004485 TEEC_CloseSession(&session);
4486}
4487ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4488 "Test TEE Internal API Generate DSA key");
4489
4490static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004491{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004492 TEEC_Session session = { };
4493 uint32_t ret_orig = 0;
4494 size_t n = 0;
4495 size_t param_count = 0;
4496 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004497
4498 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004499 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004500 const char *name;
4501 uint32_t algo;
4502 uint32_t curve;
4503 uint32_t key_size;
4504 } key_types[] = {
4505 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004506 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4507 192 },
4508 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4509 224 },
4510 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4511 256 },
4512 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4513 384 },
4514 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4515 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004516
4517 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004518 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4519 192 },
4520 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4521 224 },
4522 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4523 256 },
4524 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4525 384 },
4526 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4527 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004528 };
4529
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004530 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4531 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4532 &ret_orig)))
4533 return;
4534
Pascal Brande61133f2015-07-08 15:38:37 +02004535 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004536 if (key_types[n].level > level)
4537 continue;
4538
Pascal Brande61133f2015-07-08 15:38:37 +02004539 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4540 param_count = 0;
4541
4542 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4543 key_types[n].curve, 0);
4544
4545 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004546 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004547 0, key_types[n].key_size, params,
4548 param_count)))
4549 break;
4550
4551 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4552 }
Pascal Brande61133f2015-07-08 15:38:37 +02004553
Pascal Brandc639ac82015-07-02 08:53:34 +02004554 TEEC_CloseSession(&session);
4555}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004556ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4557 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004558
4559static void xtest_tee_test_4008(ADBG_Case_t *c)
4560{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004561 TEEC_Session session = { };
4562 uint32_t ret_orig = 0;
4563 TEE_OperationHandle op = TEE_HANDLE_NULL;
4564 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4565 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4566 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004567 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004568 uint8_t out[2048] = { };
4569 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004570
4571 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4572 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4573 &ret_orig)))
4574 return;
4575
4576 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4577
4578 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4579 ta_crypt_cmd_allocate_operation(c, &session, &op,
4580 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4581 derive_key_max_keysize)))
4582 goto out;
4583
4584 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4585 ta_crypt_cmd_allocate_transient_object(c, & session,
4586 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4587 &key_handle)))
4588 goto out;
4589
4590 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4591 ARRAY(derive_key_dh_prime));
4592
4593 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4594 ARRAY(derive_key_dh_base));
4595
4596 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4597 ARRAY(derive_key_dh_public_value));
4598
4599 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4600 ARRAY(derive_key_dh_private_value));
4601
4602 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4603 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4604 params, param_count)))
4605 goto out;
4606
4607 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4608 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4609 goto out;
4610
4611 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4612 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4613 goto out;
4614
4615 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4616 ta_crypt_cmd_allocate_transient_object(c, &session,
4617 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4618 &sv_handle)))
4619 goto out;
4620
Pascal Brand2b92b642015-07-16 13:29:42 +02004621 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004622 param_count = 0;
4623
4624 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4625 ARRAY(derive_key_dh_public_value_2));
4626
4627 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4628 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
4629 param_count)))
4630 goto out;
4631
4632 out_size = sizeof(out);
4633 memset(out, 0, sizeof(out));
4634 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4635 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
4636 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4637 goto out;
4638
4639 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
4640 sizeof(derive_key_dh_shared_secret), out,
4641 out_size))
4642 goto out;
4643
4644 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4645 ta_crypt_cmd_free_operation(c, &session, op)))
4646 goto out;
4647
4648 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4649 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
4650 goto out;
4651out:
4652 Do_ADBG_EndSubCase(c, "Derive DH key success");
4653 TEEC_CloseSession(&session);
4654}
Jens Wiklander14f48872018-06-29 15:30:13 +02004655ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
4656 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02004657
4658static void xtest_tee_test_4009(ADBG_Case_t *c)
4659{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004660 TEEC_Session session = { };
4661 uint32_t ret_orig = 0;
4662 TEE_OperationHandle op = TEE_HANDLE_NULL;
4663 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4664 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4665 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02004666 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004667 uint8_t out[2048] = { };
4668 size_t out_size = 0;
4669 uint32_t size_bytes = 0;
4670 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05304671 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02004672
4673 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4674 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4675 &ret_orig)))
4676 return;
4677
4678 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
4679 pt = &derive_key_ecdh[i];
4680
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02004681 if (pt->level > level)
4682 continue;
4683
Pascal Brand2b92b642015-07-16 13:29:42 +02004684 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
4685 pt->algo);
4686 size_bytes = (pt->keysize + 7) / 8;
4687 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4688 ta_crypt_cmd_allocate_operation(c, &session, &op,
4689 pt->algo,
4690 TEE_MODE_DERIVE, pt->keysize)))
4691 goto out;
4692
4693 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4694 ta_crypt_cmd_allocate_transient_object(c, & session,
4695 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
4696 &key_handle)))
4697 goto out;
4698
4699 param_count = 0;
4700 xtest_add_attr_value(&param_count, params,
4701 TEE_ATTR_ECC_CURVE, pt->curve, 0);
4702 xtest_add_attr(&param_count, params,
4703 TEE_ATTR_ECC_PRIVATE_VALUE,
4704 pt->private, size_bytes);
4705 /*
Cedric Auger719047c2019-09-11 12:08:14 +02004706 * The public value is not used, but we should provide a valid
4707 * one to avoid rejection in case TEE_PopulateTransientObject()
4708 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02004709 */
4710 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004711 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4712 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02004713 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004714 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
4715 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02004716
4717 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4718 ta_crypt_cmd_populate_transient_object(c,
4719 &session,
4720 key_handle, params, param_count)))
4721 goto out;
4722
4723 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4724 ta_crypt_cmd_set_operation_key(c, &session, op,
4725 key_handle)))
4726 goto out;
4727
4728 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4729 ta_crypt_cmd_free_transient_object(c, & session,
4730 key_handle)))
4731 goto out;
4732
4733 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4734 ta_crypt_cmd_allocate_transient_object(c, &session,
4735 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
4736 &sv_handle)))
4737 goto out;
4738
4739 /* reuse but reset params and param-count */
4740 param_count = 0;
4741
4742 xtest_add_attr(&param_count, params,
4743 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4744 pt->public_x, size_bytes);
4745 xtest_add_attr(&param_count, params,
4746 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
4747 pt->public_y, size_bytes);
4748
4749 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4750 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
4751 params, param_count)))
4752 goto out;
4753
4754 out_size = sizeof(out);
4755 memset(out, 0, sizeof(out));
4756 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4757 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
4758 sv_handle,
4759 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4760 goto out;
4761
4762 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
4763 out, out_size))
4764 goto out;
4765
4766 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4767 ta_crypt_cmd_free_operation(c, &session, op)))
4768 goto out;
4769
4770 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4771 ta_crypt_cmd_free_transient_object(c, &session,
4772 sv_handle)))
4773 goto out;
4774
4775 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
4776 pt->algo);
4777 }
4778
4779 goto noerror;
4780
4781out:
4782 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
4783
4784noerror:
4785 TEEC_CloseSession(&session);
4786}
Jens Wiklander14f48872018-06-29 15:30:13 +02004787ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
4788 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02004789
4790static void xtest_tee_test_4010(ADBG_Case_t *c)
4791{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004792 TEEC_Session session = { };
4793 uint32_t ret_orig = 0;
4794 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02004795 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
4796 static const TEE_Attribute attr = {
4797 .attributeID = TEE_ATTR_SECRET_VALUE,
4798 .content.ref.buffer = (void *)large_key,
4799 .content.ref.length = sizeof(large_key),
4800 };
4801
4802 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4803 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4804 &ret_orig)))
4805 return;
4806
4807 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4808 ta_crypt_cmd_allocate_transient_object(c, &session,
4809 TEE_TYPE_HMAC_SHA256, 1024, &o)))
4810 goto out;
4811
4812 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
4813 ta_crypt_cmd_populate_transient_object(c, &session, o,
4814 &attr, 1));
4815
4816out:
4817 TEEC_CloseSession(&session);
4818}
Jens Wiklander14f48872018-06-29 15:30:13 +02004819ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
4820 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004821
4822static void xtest_tee_test_4011(ADBG_Case_t *c)
4823{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004824 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004825 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004826 TEE_ObjectHandle key = TEE_HANDLE_NULL;
4827 TEE_OperationHandle ops = TEE_HANDLE_NULL;
4828 TEE_OperationHandle opv = TEE_HANDLE_NULL;
4829 TEE_OperationHandle ope = TEE_HANDLE_NULL;
4830 TEE_OperationHandle opd = TEE_HANDLE_NULL;
4831 uint32_t ret_orig = 0;
4832 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
4833 uint8_t out[1024] = { };
4834 uint8_t tmp[1024] = { };
4835 size_t out_size = 0;
4836 size_t tmp_size = 0;
4837 size_t n = 0;
4838 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004839 size_t i = 0;
4840
4841 /* Setup session, initialize message to sign, create a keypair */
4842 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
4843 &crypt_user_ta_uuid, NULL, &ret_orig)))
4844 return;
4845 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
4846 &s, in, sizeof(in))))
4847 goto out;
4848 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
4849 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
4850 goto out;
4851 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
4852 key, key_size, NULL, 0)))
4853 goto out;
4854
4855 /* Allocate operations for sign, verify, encrypt and decrypt */
4856 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4857 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
4858 key_size)))
4859 goto out;
4860 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4861 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
4862 key_size)))
4863 goto out;
4864 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4865 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
4866 goto out;
4867 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4868 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
4869 goto out;
4870
4871 /* Assign the keypair to all operations */
4872 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4873 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
4874 goto out;
4875 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4876 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
4877 goto out;
4878 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4879 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
4880 goto out;
4881 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4882 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
4883 goto out;
4884
4885 /*
4886 * The core of the test case is inspired by the one in libtomcrypt:
4887 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
4888 *
4889 * Testcase for Bleichenbacher attack
4890 *
4891 * (1) Create a valid signature
4892 * (2) Check that it can be verified
4893 * (3) Transform the package to fetch plain text (using the encrypt
4894 * operation in GP TEE Internal API)
4895 * (4) Forge the structure of PKCS#1-EMSA encoded data
4896 * (4.1) Search for start and end of the padding string
4897 * (4.2) Move the signature to the front of the padding string
4898 * (4.3) Zero the message until the end
4899 * (5) Transform the package back (using the decrypt operation in
4900 * GP TEE Internal API)
4901 * (6) The result should not be valid if the implementation is robust.
4902 */
4903
4904
4905 for (i = 0; i < 9; i++) {
4906 Do_ADBG_Log("Iteration %zu", i);
4907
4908 /* 1 */
4909 out_size = sizeof(out);
4910 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4911 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
4912 in, sizeof(in), out, &out_size)))
4913 goto out;
4914
4915 /* 2 */
4916 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4917 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
4918 in, sizeof(in), out, out_size)))
4919 goto out;
4920
4921 /* 3 */
4922 tmp_size = sizeof(tmp);
4923 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4924 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
4925 out, out_size, tmp, &tmp_size)))
4926 goto out;
4927
Etienne Carriere0953bf02018-12-21 15:36:25 +01004928 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
4929 goto out;
4930
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004931 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01004932 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004933 if (tmp[n] == 0xff)
4934 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01004935
4936 /* Shall find at least a padding start before buffer end */
4937 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
4938 goto out;
4939
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004940 for (m = n + 1; m < tmp_size; m++)
4941 if (tmp[m] != 0xff)
4942 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01004943
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004944 /* 4.2 */
4945 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01004946
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004947 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01004948 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02004949
4950 /* Prevent overrun when zeroing buffer end */
4951 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
4952 goto out;
4953
Etienne Carriere0953bf02018-12-21 15:36:25 +01004954 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004955
4956 /* 5 */
4957 out_size = sizeof(out);
4958 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4959 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
4960 tmp, tmp_size, out, &out_size)))
4961 goto out;
4962
4963 /* 6 */
4964 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
4965 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
4966 in, sizeof(in), out, out_size)))
4967 goto out;
4968 }
4969
4970out:
4971 TEEC_CloseSession(&s);
4972}
Jens Wiklander14f48872018-06-29 15:30:13 +02004973ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
4974 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03004975
4976#ifdef CFG_SYSTEM_PTA
4977static void xtest_tee_test_4012(ADBG_Case_t *c)
4978{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004979 TEEC_Session session = { };
4980 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03004981 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
4982 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004983 uint8_t pool_input[32] = { };
4984 time_t t = 0;
4985 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03004986
4987 t = time(NULL);
4988 tm_local = *localtime(&t);
4989
4990 memcpy((void *)pool_input, (void *)&tm_local,
4991 sizeof(pool_input) < sizeof(tm_local) ?
4992 sizeof(pool_input) : sizeof(tm_local));
4993
4994
4995 op.params[0].tmpref.buffer = pool_input;
4996 op.params[0].tmpref.size = sizeof(pool_input);
4997 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
4998 TEEC_NONE,
4999 TEEC_NONE,
5000 TEEC_NONE);
5001 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5002 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5003 &ret_orig)))
5004 return;
5005
5006 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5007 TEEC_InvokeCommand(&session,
5008 TA_CRYPT_CMD_SEED_RNG_POOL,
5009 &op,
5010 &ret_orig));
5011 TEEC_CloseSession(&session);
5012}
Jens Wiklander14f48872018-06-29 15:30:13 +02005013ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5014 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005015
5016static void xtest_tee_test_4013(ADBG_Case_t *c)
5017{
5018 TEEC_Session session = { };
5019 uint32_t ret_orig = 0;
5020 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5021 uint8_t key[32] = { };
5022 uint8_t extra_data[32] = { };
5023
5024 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5025 TEEC_NONE,
5026 TEEC_NONE,
5027 TEEC_NONE);
5028 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5029 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5030 NULL, &ret_orig)))
5031 return;
5032
5033 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5034 TEEC_InvokeCommand(&session,
5035 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5036 &op,
5037 &ret_orig));
5038
5039 /* Negative test using non-secure memory */
5040 memset(&op, 0, sizeof(op));
5041 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5042 TEEC_MEMREF_TEMP_OUTPUT,
5043 TEEC_NONE,
5044 TEEC_NONE);
5045
5046 op.params[0].tmpref.buffer = extra_data;
5047 op.params[0].tmpref.size = sizeof(extra_data);
5048 op.params[1].tmpref.buffer = key;
5049 op.params[1].tmpref.size = sizeof(key);
5050 (void)ADBG_EXPECT_TEEC_RESULT(c,
5051 TEEC_ERROR_SECURITY,
5052 TEEC_InvokeCommand(&session,
5053 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5054 &op,
5055 &ret_orig));
5056
5057 TEEC_CloseSession(&session);
5058}
5059ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5060 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005061
5062static void xtest_tee_test_4014(ADBG_Case_t *c)
5063{
5064 TEEC_Session session = { };
5065 uint32_t ret_orig = 0;
5066 TEE_OperationHandle op = TEE_HANDLE_NULL;
5067 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5068 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5069 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5070 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5071 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5072 TEE_Attribute params[9] = { };
5073 size_t param_count = 0;
5074 uint8_t out[128] = { };
5075 size_t out_size = 0;
5076 uint8_t conf_A[32] = { };
5077 uint8_t conf_B[32] = { };
5078
5079 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5080 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5081 &ret_orig)))
5082 return;
5083
5084 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5085 TEE_ECC_CURVE_SM2)) {
5086 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5087 goto out;
5088 }
5089
5090 Do_ADBG_BeginSubCase(c, "Initiator side");
5091
5092 /*
5093 * Key exchange protocol running on user A's side. A is initiator.
5094 */
5095
5096 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5097 ta_crypt_cmd_allocate_operation(c, &session, &op,
5098 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5099 goto out;
5100
5101 /* Allocate and initialize keypair of user A */
5102
5103 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5104 ta_crypt_cmd_allocate_transient_object(c, &session,
5105 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5106 goto out;
5107
5108 param_count = 0;
5109
5110 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5111 TEE_ECC_CURVE_SM2, 0);
5112
5113 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5114 ARRAY(gmt_003_part5_b2_public_xA));
5115
5116 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5117 ARRAY(gmt_003_part5_b2_public_yA));
5118
5119 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5120 ARRAY(gmt_003_part5_b2_private_A));
5121
5122 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5123 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5124 params, param_count)))
5125 goto out;
5126
5127 /*
5128 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5129 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5130 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5131 * user B.
5132 */
5133
5134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5135 ta_crypt_cmd_allocate_transient_object(c, &session,
5136 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5137 goto out;
5138
5139 param_count = 0;
5140
5141 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5142 TEE_ECC_CURVE_SM2, 0);
5143
5144 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5145 ARRAY(gmt_003_part5_b2_eph_public_xA));
5146
5147 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5148 ARRAY(gmt_003_part5_b2_eph_public_yA));
5149
5150 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5151 ARRAY(gmt_003_part5_b2_eph_private_A));
5152
5153 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5154 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5155 params, param_count)))
5156 goto out;
5157
5158 /* Associate user A keys with operation */
5159
5160 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5161 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5162 eph_keyA)))
5163 goto out;
5164
5165 /* Keys have been set, free key objects */
5166
5167 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5168 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5169 goto out;
5170
5171 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5172 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5173 goto out;
5174
5175 /* Allocate output object */
5176
5177 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5178 ta_crypt_cmd_allocate_transient_object(c, &session,
5179 TEE_TYPE_GENERIC_SECRET,
5180 sizeof(gmt_003_part5_b2_shared_secret),
5181 &sv_handle)))
5182 goto out;
5183
5184 /* Set key derivation parameters: user A role, user B information */
5185
5186 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5187 params[0].content.value.a = 0; /* Initiator role */
5188 params[0].content.value.b = 0; /* Not used */
5189 param_count = 1;
5190
5191 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5192 ARRAY(gmt_003_part5_b2_public_xB));
5193
5194 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5195 ARRAY(gmt_003_part5_b2_public_yB));
5196
5197 xtest_add_attr(&param_count, params,
5198 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5199 ARRAY(gmt_003_part5_b2_eph_public_xB));
5200
5201 xtest_add_attr(&param_count, params,
5202 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5203 ARRAY(gmt_003_part5_b2_eph_public_yB));
5204
5205 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5206 ARRAY(gmt_003_part5_b2_id_A));
5207
5208 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5209 ARRAY(gmt_003_part5_b2_id_B));
5210
5211 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5212 ARRAY(gmt_003_part5_b2_conf_B));
5213
5214 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5215 ARRAY(conf_A));
5216
5217 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5218 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5219 param_count)))
5220 goto out;
5221
5222 out_size = sizeof(out);
5223 memset(out, 0, sizeof(out));
5224 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5225 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5226 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5227 goto out;
5228
5229 /* Check derived key */
5230 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5231 sizeof(gmt_003_part5_b2_shared_secret), out,
5232 out_size))
5233 goto out;
5234
5235 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5236 ta_crypt_cmd_free_operation(c, &session, op)))
5237 goto out;
5238
5239 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5240 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5241 goto out;
5242
5243 Do_ADBG_EndSubCase(c, "Initiator side");
5244
5245 Do_ADBG_BeginSubCase(c, "Responder side");
5246
5247 /*
5248 * Key derivation on user B's side
5249 */
5250
5251 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5252 ta_crypt_cmd_allocate_operation(c, &session, &op,
5253 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5254 goto out;
5255
5256 /* Allocate and initialize keypair of user B */
5257
5258 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5259 ta_crypt_cmd_allocate_transient_object(c, &session,
5260 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5261 goto out;
5262
5263 param_count = 0;
5264
5265 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5266 TEE_ECC_CURVE_SM2, 0);
5267
5268 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5269 ARRAY(gmt_003_part5_b2_public_xB));
5270
5271 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5272 ARRAY(gmt_003_part5_b2_public_yB));
5273
5274 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5275 ARRAY(gmt_003_part5_b2_private_B));
5276
5277 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5278 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5279 params, param_count)))
5280 goto out;
5281
5282 /* Allocate and set ephemeral key of user B */
5283
5284 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5285 ta_crypt_cmd_allocate_transient_object(c, &session,
5286 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5287 goto out;
5288
5289 param_count = 0;
5290
5291 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5292 TEE_ECC_CURVE_SM2, 0);
5293
5294 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5295 ARRAY(gmt_003_part5_b2_eph_public_xB));
5296
5297 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5298 ARRAY(gmt_003_part5_b2_eph_public_yB));
5299
5300 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5301 ARRAY(gmt_003_part5_b2_eph_private_B));
5302
5303 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5304 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5305 params, param_count)))
5306 goto out;
5307
5308 /* Associate user B keys with operation */
5309
5310 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5311 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5312 eph_keyB)))
5313 goto out;
5314
5315 /* Keys have been set, free key objects */
5316
5317 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5318 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5319 goto out;
5320
5321 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5322 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5323 goto out;
5324
5325 /* Allocate output object */
5326
5327 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5328 ta_crypt_cmd_allocate_transient_object(c, &session,
5329 TEE_TYPE_GENERIC_SECRET,
5330 sizeof(gmt_003_part5_b2_shared_secret),
5331 &sv_handle)))
5332 goto out;
5333
5334 /* Set key derivation parameters: user B role, user A information */
5335
5336 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5337 params[0].content.value.a = 1; /* Responder role */
5338 params[0].content.value.b = 0; /* Not used */
5339 param_count = 1;
5340
5341 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5342 ARRAY(gmt_003_part5_b2_public_xA));
5343
5344 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5345 ARRAY(gmt_003_part5_b2_public_yA));
5346
5347 xtest_add_attr(&param_count, params,
5348 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5349 ARRAY(gmt_003_part5_b2_eph_public_xA));
5350
5351 xtest_add_attr(&param_count, params,
5352 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5353 ARRAY(gmt_003_part5_b2_eph_public_yA));
5354
5355 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5356 ARRAY(gmt_003_part5_b2_id_A));
5357
5358 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5359 ARRAY(gmt_003_part5_b2_id_B));
5360
5361 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5362 ARRAY(gmt_003_part5_b2_conf_A));
5363
5364 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5365 ARRAY(conf_B));
5366
5367 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5368 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5369 param_count)))
5370 goto out;
5371
5372 out_size = sizeof(out);
5373 memset(out, 0, sizeof(out));
5374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5375 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5376 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5377 goto out;
5378
5379 /* Check derived key */
5380 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5381 sizeof(gmt_003_part5_b2_shared_secret), out,
5382 out_size))
5383 goto out;
5384
5385 Do_ADBG_EndSubCase(c, "Responder side");
5386
5387out:
5388 TEEC_CloseSession(&session);
5389}
5390ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5391 "Test SM2 KEP (key derivation)");
Jens Wiklander14f48872018-06-29 15:30:13 +02005392#endif /*CFG_SYSTEM_PTA*/