blob: deaedc1b312f007fc8da1cdd7ee703a826cd2c03 [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;
Pascal Brandc639ac82015-07-02 08:53:34 +02002073 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2074 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002075 uint8_t out[2048] = { };
2076 size_t out_size = 0;
2077 size_t out_offs = 0;
2078 uint32_t ret_orig = 0;
2079 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002080
2081 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2082 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2083 &ret_orig)))
2084 return;
2085
2086 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002087 TEE_Attribute key_attr = { };
2088 size_t key_size = 0;
2089 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002090
Jerome Forissier817d99f2020-01-22 16:33:12 +01002091 switch (ciph_cases[n].algo) {
2092 case TEE_ALG_SM4_CTR:
2093 case TEE_ALG_SM4_CBC_NOPAD:
2094 case TEE_ALG_SM4_ECB_NOPAD:
2095 if (!ta_crypt_cmd_is_algo_supported(c, &session,
2096 ciph_cases[n].algo, TEE_CRYPTO_ELEMENT_NONE)) {
2097 Do_ADBG_Log("SM4 not supported: skip subcase");
2098 continue;
2099 }
2100 break;
2101 default:
2102 break;
2103 }
2104
Pascal Brandc639ac82015-07-02 08:53:34 +02002105 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2106 (int)n, (unsigned int)ciph_cases[n].algo,
2107 (int)ciph_cases[n].line);
2108
2109 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2110 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2111 key_attr.content.ref.length = ciph_cases[n].key1_len;
2112
2113 key_size = key_attr.content.ref.length * 8;
2114 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2115 ciph_cases[n].key_type == TEE_TYPE_DES3)
2116 /* Exclude parity in bit size of key */
2117 key_size -= key_size / 8;
2118
2119 op_key_size = key_size;
2120 if (ciph_cases[n].key2 != NULL)
2121 op_key_size *= 2;
2122
2123 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2124 ta_crypt_cmd_allocate_operation(c, &session, &op,
2125 ciph_cases[n].algo, ciph_cases[n].mode,
2126 op_key_size)))
2127 goto out;
2128
2129 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2130 ta_crypt_cmd_allocate_transient_object(c, &session,
2131 ciph_cases[n].key_type, key_size,
2132 &key1_handle)))
2133 goto out;
2134
2135 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2136 ta_crypt_cmd_populate_transient_object(c, &session,
2137 key1_handle, &key_attr, 1)))
2138 goto out;
2139
2140 if (ciph_cases[n].key2 != NULL) {
2141 key_attr.content.ref.buffer =
2142 (void *)ciph_cases[n].key2;
2143 key_attr.content.ref.length = ciph_cases[n].key2_len;
2144
2145 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2146 ta_crypt_cmd_allocate_transient_object(c,
2147 &session, ciph_cases[n].key_type,
2148 key_attr.content.ref.length * 8,
2149 &key2_handle)))
2150 goto out;
2151
2152 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2153 ta_crypt_cmd_populate_transient_object(c,
2154 &session, key2_handle, &key_attr, 1)))
2155 goto out;
2156
2157 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2158 ta_crypt_cmd_set_operation_key2(c, &session, op,
2159 key1_handle, key2_handle)))
2160 goto out;
2161 } else {
2162 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2163 ta_crypt_cmd_set_operation_key(c, &session, op,
2164 key1_handle)))
2165 goto out;
2166 }
2167
2168 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2169 ta_crypt_cmd_free_transient_object(c, &session,
2170 key1_handle)))
2171 goto out;
2172 key1_handle = TEE_HANDLE_NULL;
2173
2174 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2175 ta_crypt_cmd_free_transient_object(c, &session,
2176 key2_handle)))
2177 goto out;
2178 key2_handle = TEE_HANDLE_NULL;
2179
2180 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2181 ta_crypt_cmd_cipher_init(c, &session, op,
2182 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2183 goto out;
2184
2185 out_offs = 0;
2186 out_size = sizeof(out);
2187 memset(out, 0, sizeof(out));
2188 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2189 ta_crypt_cmd_cipher_update(c, &session, op,
2190 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2191 &out_size)))
2192 goto out;
2193
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002194 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2195 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2196 ciph_cases[n].in_incr);
2197
Pascal Brandc639ac82015-07-02 08:53:34 +02002198 out_offs += out_size;
2199 out_size = sizeof(out) - out_offs;
2200
2201 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2202 ta_crypt_cmd_cipher_do_final(c, &session, op,
2203 ciph_cases[n].in + ciph_cases[n].in_incr,
2204 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2205 out + out_offs,
2206 &out_size)))
2207 goto out;
2208
2209 out_offs += out_size;
2210
2211 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2212 ciph_cases[n].out_len, out, out_offs);
2213
2214 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2215 ta_crypt_cmd_free_operation(c, &session, op)))
2216 goto out;
2217
2218 Do_ADBG_EndSubCase(c, NULL);
2219 }
2220out:
2221 TEEC_CloseSession(&session);
2222}
Jens Wiklander14f48872018-06-29 15:30:13 +02002223ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2224 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002225
Pascal Brandc639ac82015-07-02 08:53:34 +02002226static void xtest_tee_test_4004(ADBG_Case_t *c)
2227{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002228 TEEC_Session session = { };
2229 uint32_t ret_orig = 0;
2230 uint8_t buf1[45] = { };
2231 uint8_t buf2[45] = { };
2232 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002233
2234 Do_ADBG_BeginSubCase(c, "TEE get random");
2235 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2236 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2237 &ret_orig)))
2238 return;
2239
2240 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2241 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2242 sizeof(buf1))))
2243 goto out;
2244
2245 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2246 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2247
2248 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2249 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2250 sizeof(buf2))))
2251 goto out;
2252
2253 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2254 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2255
2256 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2257 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2258out:
2259 TEEC_CloseSession(&session);
2260 Do_ADBG_EndSubCase(c, "TEE get random");
2261}
Jens Wiklander14f48872018-06-29 15:30:13 +02002262ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2263 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002264
2265struct xtest_ae_case {
2266 uint32_t algo;
2267 uint32_t mode;
2268 uint32_t key_type;
2269 const uint8_t *key;
2270 size_t key_len;
2271 const uint8_t *nonce;
2272 size_t nonce_len;
2273 size_t aad_incr;
2274 const uint8_t *aad;
2275 size_t aad_len;
2276 size_t in_incr;
2277 const uint8_t *ptx;
2278 size_t ptx_len;
2279 const uint8_t *ctx;
2280 size_t ctx_len;
2281 const uint8_t *tag;
2282 size_t tag_len;
2283 size_t line;
2284};
2285
2286
2287#define ARRAY(a) a, ARRAY_SIZE(a)
2288#define NULL_ARRAY(a) NULL, 0
2289
2290#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2291 aad_array, ptx_array, ctx_array) \
2292 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2293 ARRAY(vect ## _nonce), (aad_incr), \
2294 aad_array(vect ## _aad), (in_incr), \
2295 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2296 ARRAY(vect ## _tag), \
2297 __LINE__ }, \
2298 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2299 ARRAY(vect ## _nonce), (aad_incr), \
2300 aad_array(vect ## _aad), (in_incr), \
2301 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2302 ARRAY(vect ## _tag), \
2303 __LINE__ }
2304
2305#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2306 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2307 in_incr, ARRAY, ARRAY, ARRAY)
2308
2309#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2310 aad_array, ptx_array, ctx_array) \
2311 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2312 in_incr, aad_array, ptx_array, ctx_array)
2313
2314
2315
2316static const struct xtest_ae_case ae_cases[] = {
2317 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2318 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2319 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2320
2321 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2322 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2323 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002324 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2325 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002326 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2327 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2328 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2329 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2330 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2331 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2332 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2333 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2334 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2335 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2336 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2337 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2338 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2339 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002340#ifdef CFG_GCM_NIST_VECTORS
2341#include "gcmDecrypt128.h"
2342#include "gcmDecrypt192.h"
2343#include "gcmDecrypt256.h"
2344#include "gcmEncryptExtIV128.h"
2345#include "gcmEncryptExtIV192.h"
2346#include "gcmEncryptExtIV256.h"
2347#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002348};
2349
2350static void xtest_tee_test_4005(ADBG_Case_t *c)
2351{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002352 TEEC_Session session = { };
2353 TEE_OperationHandle op = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002354 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002355 TEE_Attribute key_attr = { };
2356 uint8_t out[512] = { };
2357 size_t out_size = 0;
2358 size_t out_offs = 0;
2359 uint32_t ret_orig = 0;
2360 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002361
2362 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2363 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2364 &ret_orig)))
2365 return;
2366
2367 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2368 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2369 (int)n, (unsigned int)ae_cases[n].algo,
2370 (int)ae_cases[n].line);
2371
2372 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2373 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2374 key_attr.content.ref.length = ae_cases[n].key_len;
2375
2376 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2377 ta_crypt_cmd_allocate_operation(c, &session, &op,
2378 ae_cases[n].algo, ae_cases[n].mode,
2379 key_attr.content.ref.length * 8)))
2380 goto out;
2381
2382 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2383 ta_crypt_cmd_allocate_transient_object(c, &session,
2384 ae_cases[n].key_type,
2385 key_attr.content.ref.length * 8,
2386 &key_handle)))
2387 goto out;
2388
2389 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2390 ta_crypt_cmd_populate_transient_object(c, &session,
2391 key_handle, &key_attr, 1)))
2392 goto out;
2393
2394 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2395 ta_crypt_cmd_set_operation_key(c, &session, op,
2396 key_handle)))
2397 goto out;
2398
2399 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2400 ta_crypt_cmd_free_transient_object(c, &session,
2401 key_handle)))
2402 goto out;
2403 key_handle = TEE_HANDLE_NULL;
2404
2405 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2406 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2407 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2408 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2409 goto out;
2410
2411 if (ae_cases[n].aad != NULL) {
2412 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2413 ta_crypt_cmd_ae_update_aad(c, &session, op,
2414 ae_cases[n].aad, ae_cases[n].aad_incr)))
2415 goto out;
2416
2417 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2418 ta_crypt_cmd_ae_update_aad(c, &session, op,
2419 ae_cases[n].aad + ae_cases[n].aad_incr,
2420 ae_cases [n].aad_len -
2421 ae_cases[n].aad_incr)))
2422 goto out;
2423 }
2424
2425 out_offs = 0;
2426 out_size = sizeof(out);
2427 memset(out, 0, sizeof(out));
2428 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2429 if (ae_cases[n].ptx != NULL) {
2430 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2431 ta_crypt_cmd_ae_update(c, &session, op,
2432 ae_cases[n].ptx,
2433 ae_cases[n].in_incr, out,
2434 &out_size)))
2435 goto out;
2436 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002437 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2438 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2439 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002440 }
2441 } else {
2442 if (ae_cases[n].ctx != NULL) {
2443 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2444 ta_crypt_cmd_ae_update(c, &session, op,
2445 ae_cases[n].ctx,
2446 ae_cases[n].in_incr, out,
2447 &out_size)))
2448 goto out;
2449 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002450 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2451 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2452 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002453 }
2454 }
2455
2456 out_size = sizeof(out) - out_offs;
2457 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2458 uint8_t out_tag[64];
2459 size_t out_tag_len = MIN(sizeof(out_tag),
2460 ae_cases[n].tag_len);
2461
2462 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2463 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2464 ae_cases[n].ptx + ae_cases[n].in_incr,
2465 ae_cases[n].ptx_len -
2466 ae_cases[n].in_incr,
2467 out + out_offs,
2468 &out_size, out_tag, &out_tag_len)))
2469 goto out;
2470
2471 (void)ADBG_EXPECT_BUFFER(c,
2472 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2473 out_tag_len);
2474
2475 out_offs += out_size;
2476
2477 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2478 ae_cases[n].ctx_len, out, out_offs);
2479 } else {
2480 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2481 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2482 ae_cases[n].ctx + ae_cases[n].in_incr,
2483 ae_cases[n].ctx_len -
2484 ae_cases[n].in_incr,
2485 out + out_offs,
2486 &out_size, ae_cases[n].tag,
2487 ae_cases[n].tag_len)))
2488 goto out;
2489
2490 out_offs += out_size;
2491
2492 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
2493 ae_cases[n].ptx_len, out, out_offs);
2494 }
2495
2496 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2497 ta_crypt_cmd_free_operation(c, &session, op)))
2498 goto out;
2499
2500 Do_ADBG_EndSubCase(c, NULL);
2501 }
2502out:
2503 TEEC_CloseSession(&session);
2504}
Jens Wiklander14f48872018-06-29 15:30:13 +02002505ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
2506 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002507
2508struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002509 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02002510 uint32_t algo;
2511 TEE_OperationMode mode;
2512
2513 union {
2514 struct {
2515 const uint8_t *modulus;
2516 size_t modulus_len;
2517
2518 const uint8_t *pub_exp;
2519 size_t pub_exp_len;
2520
2521 const uint8_t *priv_exp;
2522 size_t priv_exp_len;
2523
2524 const uint8_t *prime1; /* q */
2525 size_t prime1_len;
2526 const uint8_t *prime2; /* p */
2527 size_t prime2_len;
2528 const uint8_t *exp1; /* dp */
2529 size_t exp1_len;
2530 const uint8_t *exp2; /* dq */
2531 size_t exp2_len;
2532 const uint8_t *coeff; /* iq */
2533 size_t coeff_len;
2534
2535 int salt_len;
2536 } rsa;
2537 struct {
2538 const uint8_t *prime;
2539 size_t prime_len;
2540 const uint8_t *sub_prime;
2541 size_t sub_prime_len;
2542 const uint8_t *base;
2543 size_t base_len;
2544 const uint8_t *pub_val;
2545 size_t pub_val_len;
2546 const uint8_t *priv_val;
2547 size_t priv_val_len;
2548 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02002549 struct {
2550 const uint8_t *private;
2551 size_t private_len;
2552 const uint8_t *public_x;
2553 size_t public_x_len;
2554 const uint8_t *public_y;
2555 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002556 } ecc;
Pascal Brandc639ac82015-07-02 08:53:34 +02002557 } params;
2558
2559 const uint8_t *ptx;
2560 size_t ptx_len;
2561 const uint8_t *ctx;
2562 size_t ctx_len;
2563 size_t line;
2564};
2565
2566#define WITHOUT_SALT(x) -1
2567#define WITH_SALT(x) x
2568
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002569#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
2570 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002571 ARRAY(vect ## _ptx), \
2572 ARRAY(vect ## _out), \
2573 __LINE__ }
2574
2575#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
2576 { .rsa = { \
2577 ARRAY(vect ## _modulus), \
2578 ARRAY(vect ## _pub_exp), \
2579 ARRAY(vect ## _priv_exp), \
2580 opt_crt_array(vect ## _prime1), \
2581 opt_crt_array(vect ## _prime2), \
2582 opt_crt_array(vect ## _exp1), \
2583 opt_crt_array(vect ## _exp2), \
2584 opt_crt_array(vect ## _coeff), \
2585 opt_salt(vect ## _salt_len) \
2586 } }
2587
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002588#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
2589 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02002590 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
2591
2592#define XTEST_AC_DSA_UNION(vect) \
2593 { .dsa = { \
2594 ARRAY(vect ## _prime), \
2595 ARRAY(vect ## _sub_prime), \
2596 ARRAY(vect ## _base), \
2597 ARRAY(vect ## _pub_val), \
2598 ARRAY(vect ## _priv_val), \
2599 } }
2600
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002601#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
2602 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02002603
Pascal Brand3e143ee2015-07-15 17:17:16 +02002604#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002605 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02002606 ARRAY(vect ## _private), \
2607 ARRAY(vect ## _public_x), \
2608 ARRAY(vect ## _public_y), \
2609 } }
2610
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01002611#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002612 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02002613
Pascal Brandc639ac82015-07-02 08:53:34 +02002614static const struct xtest_ac_case xtest_ac_cases[] = {
2615 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002616 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002617 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002618 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002619 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002620 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002621 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002622 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002623 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08002624 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2625 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
2626 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2627 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08002628 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
2629 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
2630 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
2631 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002632 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002633 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002634 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002635 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002636 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002637 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002638 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002639 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002640 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002641 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002642 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002643 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002644 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002645 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002646 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002647 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002648 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002649 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002650 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002651 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002652 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
2653 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
2654 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
2655 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02002656
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002657 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002658 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002659 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002660 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002661
Gabor Szekely2ad190f2018-09-14 14:05:06 +00002662#ifdef CFG_CRYPTO_RSASSA_NA1
2663 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
2664 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2665 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
2666 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
2667#endif
2668
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002669 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002670 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002671 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002672 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002673
2674 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002675 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002676 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002677 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002678
2679 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002680 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002681 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002682 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
2683
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002684 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2685 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002686 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002687 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002688 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002689
2690 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2691 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002692 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002693 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2694 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002695 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002696
2697 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2698 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002699 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002700 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2701 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002702 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002703
2704 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2705 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002706 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002707 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2708 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002709 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002710
2711 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2712 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002713 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002714 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2715 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002716 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
2717
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002718 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002719 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002720 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002721 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002722 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002723 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002724 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002725 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002726 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002727 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002728 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002729 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
2730
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002731 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2732 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002733 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002734 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2735 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002736 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002737 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2738 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002739 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002740 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2741 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002742 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002743 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2744 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002745 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002746 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2747 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002748 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
2749
2750 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002751 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002752 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002753 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002754 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002755 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002756 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002757 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002758 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002759 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002760 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002761 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002762 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002763 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002764 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002765 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002766 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002767 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002768 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002769 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002770 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002771 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002772 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002773 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002774 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002775 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002776 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002777 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002778 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002779 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002780 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002781 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002782 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002783 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002784 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002785 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002786 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002787 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002788 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002789 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002790 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002791 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002792 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002793 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002794 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
2795
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002796 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
2797 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002798 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002799 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002800 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002801 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2802 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002803 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002804 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
2805 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002806 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002807 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2808 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002809 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002810 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
2811 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002812 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002813 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2814 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002815 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002816 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
2817 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002818 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002819 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2820 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02002821 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002822 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
2823 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02002824 ac_rsassa_vect15, ARRAY, WITH_SALT),
2825
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002826 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002827 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002828 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002829 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002830 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002831 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002832 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002833 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002834 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002835 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002836 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002837 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
2838
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002839 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2840 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002841 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002842 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2843 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002844 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002845 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2846 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002847 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002848 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2849 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002850 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002851 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2852 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002853 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002854 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
2855 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02002856 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
2857
2858 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002859 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002860 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
2861 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002862 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
2863 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
2864 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
2865 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
2866 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
2867 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
2868 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
2869 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
2870 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
2871 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
2872 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
2873 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
2874 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
2875 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
2876 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
2877 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
2878 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
2879 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
2880 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
2881 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
2882 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
2883 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
2884 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
2885 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
2886 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
2887 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
2888 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
2889 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002890 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
2891 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
2892 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
2893 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
2894 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
2895 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002896 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
2897 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002898 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
2899 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
2900 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
2901 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
2902 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
2903 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
2904 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
2905 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
2906 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
2907 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
2908 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
2909 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
2910 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
2911 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
2912 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
2913 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
2914 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
2915 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
2916 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
2917 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
2918 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
2919 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
2920 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
2921 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
2922 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
2923 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
2924 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
2925 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002926 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002927 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
2928 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
2929 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
2930 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
2931 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
2932 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
2933 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
2934 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
2935 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
2936 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
2937 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
2938 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
2939 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
2940 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
2941 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
2942 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
2943 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
2944 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
2945 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
2946 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
2947 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
2948 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
2949 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
2950 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
2951 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
2952 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
2953 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
2954 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
2955 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
2956 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002957 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
2958 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
2959 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
2960 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002961 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
2962 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002963 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
2964 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
2965 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
2966 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
2967 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
2968 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
2969 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
2970 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
2971 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
2972 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
2973 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
2974 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
2975 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
2976 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
2977 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
2978 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
2979 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
2980 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
2981 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
2982 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
2983 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
2984 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
2985 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
2986 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
2987 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
2988 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
2989 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
2990 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02002991 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01002992 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
2993 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02002994 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
2995 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
2996 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
2997 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
2998 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
2999 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3000 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3001 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3002 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3003 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3004 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3005 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3006 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3007 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3008 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3009 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3010 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3011 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3012 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3013 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3014 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3015 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3016 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3017 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3018 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3019 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3020 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3021 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003022 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3023 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3024 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3025 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3026 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003027 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3028 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003029 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3030 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3031 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3032 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3033 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3034 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3035 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3036 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3037 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3038 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3039 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3040 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3041 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3042 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3043 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3044 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3045 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3046 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3047 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3048 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3049 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3050 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3051 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3052 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3053 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3054 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3055 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3056 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003057 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3058 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003059
3060 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003061 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003062 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3063 nist_186_2_ecdsa_testvector_1),
3064 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3065 nist_186_2_ecdsa_testvector_1),
3066 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3067 nist_186_2_ecdsa_testvector_2),
3068 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3069 nist_186_2_ecdsa_testvector_2),
3070 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3071 nist_186_2_ecdsa_testvector_3),
3072 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3073 nist_186_2_ecdsa_testvector_3),
3074 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3075 nist_186_2_ecdsa_testvector_4),
3076 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3077 nist_186_2_ecdsa_testvector_4),
3078 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3079 nist_186_2_ecdsa_testvector_5),
3080 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3081 nist_186_2_ecdsa_testvector_5),
3082 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3083 nist_186_2_ecdsa_testvector_6),
3084 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3085 nist_186_2_ecdsa_testvector_6),
3086 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3087 nist_186_2_ecdsa_testvector_7),
3088 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3089 nist_186_2_ecdsa_testvector_7),
3090 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3091 nist_186_2_ecdsa_testvector_8),
3092 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3093 nist_186_2_ecdsa_testvector_8),
3094 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3095 nist_186_2_ecdsa_testvector_9),
3096 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3097 nist_186_2_ecdsa_testvector_9),
3098 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3099 nist_186_2_ecdsa_testvector_10),
3100 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3101 nist_186_2_ecdsa_testvector_10),
3102 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3103 nist_186_2_ecdsa_testvector_11),
3104 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3105 nist_186_2_ecdsa_testvector_11),
3106 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3107 nist_186_2_ecdsa_testvector_12),
3108 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3109 nist_186_2_ecdsa_testvector_12),
3110 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3111 nist_186_2_ecdsa_testvector_13),
3112 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3113 nist_186_2_ecdsa_testvector_13),
3114 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3115 nist_186_2_ecdsa_testvector_14),
3116 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3117 nist_186_2_ecdsa_testvector_14),
3118 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3119 nist_186_2_ecdsa_testvector_15),
3120 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3121 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003122 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003123 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3124 nist_186_2_ecdsa_testvector_16),
3125 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3126 nist_186_2_ecdsa_testvector_16),
3127 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3128 nist_186_2_ecdsa_testvector_17),
3129 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3130 nist_186_2_ecdsa_testvector_17),
3131 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3132 nist_186_2_ecdsa_testvector_18),
3133 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3134 nist_186_2_ecdsa_testvector_18),
3135 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3136 nist_186_2_ecdsa_testvector_19),
3137 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3138 nist_186_2_ecdsa_testvector_19),
3139 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3140 nist_186_2_ecdsa_testvector_20),
3141 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3142 nist_186_2_ecdsa_testvector_20),
3143 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3144 nist_186_2_ecdsa_testvector_21),
3145 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3146 nist_186_2_ecdsa_testvector_21),
3147 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3148 nist_186_2_ecdsa_testvector_22),
3149 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3150 nist_186_2_ecdsa_testvector_22),
3151 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3152 nist_186_2_ecdsa_testvector_23),
3153 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3154 nist_186_2_ecdsa_testvector_23),
3155 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3156 nist_186_2_ecdsa_testvector_24),
3157 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3158 nist_186_2_ecdsa_testvector_24),
3159 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3160 nist_186_2_ecdsa_testvector_25),
3161 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3162 nist_186_2_ecdsa_testvector_25),
3163 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3164 nist_186_2_ecdsa_testvector_26),
3165 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3166 nist_186_2_ecdsa_testvector_26),
3167 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3168 nist_186_2_ecdsa_testvector_27),
3169 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3170 nist_186_2_ecdsa_testvector_27),
3171 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3172 nist_186_2_ecdsa_testvector_28),
3173 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3174 nist_186_2_ecdsa_testvector_28),
3175 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3176 nist_186_2_ecdsa_testvector_29),
3177 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3178 nist_186_2_ecdsa_testvector_29),
3179 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3180 nist_186_2_ecdsa_testvector_30),
3181 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3182 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003183 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003184 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3185 nist_186_2_ecdsa_testvector_31),
3186 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3187 nist_186_2_ecdsa_testvector_31),
3188 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3189 nist_186_2_ecdsa_testvector_32),
3190 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3191 nist_186_2_ecdsa_testvector_32),
3192 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3193 nist_186_2_ecdsa_testvector_33),
3194 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3195 nist_186_2_ecdsa_testvector_33),
3196 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3197 nist_186_2_ecdsa_testvector_34),
3198 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3199 nist_186_2_ecdsa_testvector_34),
3200 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3201 nist_186_2_ecdsa_testvector_35),
3202 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3203 nist_186_2_ecdsa_testvector_35),
3204 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3205 nist_186_2_ecdsa_testvector_36),
3206 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3207 nist_186_2_ecdsa_testvector_36),
3208 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3209 nist_186_2_ecdsa_testvector_37),
3210 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3211 nist_186_2_ecdsa_testvector_37),
3212 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3213 nist_186_2_ecdsa_testvector_38),
3214 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3215 nist_186_2_ecdsa_testvector_38),
3216 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3217 nist_186_2_ecdsa_testvector_39),
3218 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3219 nist_186_2_ecdsa_testvector_39),
3220 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3221 nist_186_2_ecdsa_testvector_40),
3222 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3223 nist_186_2_ecdsa_testvector_40),
3224 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3225 nist_186_2_ecdsa_testvector_41),
3226 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3227 nist_186_2_ecdsa_testvector_41),
3228 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3229 nist_186_2_ecdsa_testvector_42),
3230 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3231 nist_186_2_ecdsa_testvector_42),
3232 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3233 nist_186_2_ecdsa_testvector_43),
3234 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3235 nist_186_2_ecdsa_testvector_43),
3236 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3237 nist_186_2_ecdsa_testvector_44),
3238 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3239 nist_186_2_ecdsa_testvector_44),
3240 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3241 nist_186_2_ecdsa_testvector_45),
3242 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3243 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003244 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003245 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3246 nist_186_2_ecdsa_testvector_46),
3247 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3248 nist_186_2_ecdsa_testvector_46),
3249 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3250 nist_186_2_ecdsa_testvector_47),
3251 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3252 nist_186_2_ecdsa_testvector_47),
3253 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3254 nist_186_2_ecdsa_testvector_48),
3255 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3256 nist_186_2_ecdsa_testvector_48),
3257 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3258 nist_186_2_ecdsa_testvector_49),
3259 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3260 nist_186_2_ecdsa_testvector_49),
3261 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3262 nist_186_2_ecdsa_testvector_50),
3263 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3264 nist_186_2_ecdsa_testvector_50),
3265 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3266 nist_186_2_ecdsa_testvector_51),
3267 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3268 nist_186_2_ecdsa_testvector_51),
3269 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3270 nist_186_2_ecdsa_testvector_52),
3271 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3272 nist_186_2_ecdsa_testvector_52),
3273 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3274 nist_186_2_ecdsa_testvector_53),
3275 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3276 nist_186_2_ecdsa_testvector_53),
3277 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3278 nist_186_2_ecdsa_testvector_54),
3279 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3280 nist_186_2_ecdsa_testvector_54),
3281 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3282 nist_186_2_ecdsa_testvector_55),
3283 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3284 nist_186_2_ecdsa_testvector_55),
3285 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3286 nist_186_2_ecdsa_testvector_56),
3287 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3288 nist_186_2_ecdsa_testvector_56),
3289 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3290 nist_186_2_ecdsa_testvector_57),
3291 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3292 nist_186_2_ecdsa_testvector_57),
3293 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3294 nist_186_2_ecdsa_testvector_58),
3295 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3296 nist_186_2_ecdsa_testvector_58),
3297 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3298 nist_186_2_ecdsa_testvector_59),
3299 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3300 nist_186_2_ecdsa_testvector_59),
3301 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3302 nist_186_2_ecdsa_testvector_60),
3303 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3304 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003305 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003306 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3307 nist_186_2_ecdsa_testvector_61),
3308 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3309 nist_186_2_ecdsa_testvector_61),
3310 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3311 nist_186_2_ecdsa_testvector_62),
3312 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3313 nist_186_2_ecdsa_testvector_62),
3314 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3315 nist_186_2_ecdsa_testvector_63),
3316 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3317 nist_186_2_ecdsa_testvector_63),
3318 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3319 nist_186_2_ecdsa_testvector_64),
3320 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3321 nist_186_2_ecdsa_testvector_64),
3322 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3323 nist_186_2_ecdsa_testvector_65),
3324 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3325 nist_186_2_ecdsa_testvector_65),
3326 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3327 nist_186_2_ecdsa_testvector_66),
3328 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3329 nist_186_2_ecdsa_testvector_66),
3330 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3331 nist_186_2_ecdsa_testvector_67),
3332 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3333 nist_186_2_ecdsa_testvector_67),
3334 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3335 nist_186_2_ecdsa_testvector_68),
3336 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3337 nist_186_2_ecdsa_testvector_68),
3338 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3339 nist_186_2_ecdsa_testvector_69),
3340 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3341 nist_186_2_ecdsa_testvector_69),
3342 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3343 nist_186_2_ecdsa_testvector_70),
3344 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3345 nist_186_2_ecdsa_testvector_70),
3346 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3347 nist_186_2_ecdsa_testvector_71),
3348 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3349 nist_186_2_ecdsa_testvector_71),
3350 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3351 nist_186_2_ecdsa_testvector_72),
3352 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3353 nist_186_2_ecdsa_testvector_72),
3354 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3355 nist_186_2_ecdsa_testvector_73),
3356 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3357 nist_186_2_ecdsa_testvector_73),
3358 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3359 nist_186_2_ecdsa_testvector_74),
3360 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3361 nist_186_2_ecdsa_testvector_74),
3362 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3363 nist_186_2_ecdsa_testvector_75),
3364 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3365 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003366 /* [K-163] - GP NOT SUPPORTED */
3367 /* [K-233] - GP NOT SUPPORTED */
3368 /* [K-283] - GP NOT SUPPORTED */
3369 /* [K-409] - GP NOT SUPPORTED */
3370 /* [K-571] - GP NOT SUPPORTED */
3371 /* [B-163] - GP NOT SUPPORTED */
3372 /* [B-233] - GP NOT SUPPORTED */
3373 /* [B-283] - GP NOT SUPPORTED */
3374 /* [B-409] - GP NOT SUPPORTED */
3375 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003376
3377 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3378 gmt_0003_part5_c2_sm2_testvector),
3379 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3380 gmt_0003_part5_c2_sm2_testvector),
3381 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3382 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003383
3384 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3385 gmt_003_part5_a2),
3386 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3387 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003388};
3389
3390static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3391 uint32_t max_key_size, uint32_t key_type,
3392 TEE_Attribute *attrs, size_t num_attrs,
3393 TEE_ObjectHandle *handle)
3394{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003395 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003396
3397 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3398 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3399 max_key_size, handle)))
3400 return false;
3401
3402 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3403 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3404 num_attrs)))
3405 return false;
3406
3407 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003408 uint8_t out[512] = { };
3409 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003410
3411 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3412 continue;
3413
Pascal Brandc639ac82015-07-02 08:53:34 +02003414 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3415 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3416 attrs[n].attributeID, out, &out_size)))
3417 return false;
3418
Pascal Brand3e143ee2015-07-15 17:17:16 +02003419 if (out_size < attrs[n].content.ref.length) {
3420 memmove(out + (attrs[n].content.ref.length - out_size),
3421 out,
3422 attrs[n].content.ref.length);
3423 memset(out, 0, attrs[n].content.ref.length - out_size);
3424 out_size = attrs[n].content.ref.length;
3425 }
3426
Pascal Brandc639ac82015-07-02 08:53:34 +02003427 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3428 attrs[n].content.ref.length, out, out_size))
3429 return false;
3430 }
3431
3432 return true;
3433}
3434
3435static void xtest_tee_test_4006(ADBG_Case_t *c)
3436{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003437 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003438 TEE_OperationHandle op = TEE_HANDLE_NULL;
3439 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3440 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003441 TEE_Attribute key_attrs[8] = { };
3442 TEE_Attribute algo_params[1] = { };
3443 size_t num_algo_params = 0;
3444 uint8_t out[512] = { };
3445 size_t out_size = 0;
3446 uint8_t out_enc[512] = { };
3447 size_t out_enc_size = 0;
3448 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003449 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003450 size_t max_key_size = 0;
3451 size_t num_key_attrs = 0;
3452 uint32_t ret_orig = 0;
3453 size_t n = 0;
3454 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003455 uint32_t pub_key_type = 0;
3456 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003457 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003458
3459 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3460 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3461 &ret_orig)))
3462 return;
3463
3464 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3465 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3466
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003467 if (tv->level > level)
3468 continue;
3469
Jerome Forissier4b03e282020-01-22 16:33:12 +01003470 if ((tv->algo == TEE_ALG_SM2_PKE ||
3471 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3472 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3473 TEE_ECC_CURVE_SM2)) {
3474 Do_ADBG_Log("SM2 not supported: skip subcase");
3475 continue;
3476 }
3477
Pascal Brandc639ac82015-07-02 08:53:34 +02003478 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3479 (int)n, (unsigned int)tv->algo,
3480 (int)tv->line);
3481
3482 /*
3483 * When signing or verifying we're working with the hash of
3484 * the payload.
3485 */
3486 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003487 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3488 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003489#if defined(CFG_CRYPTO_RSASSA_NA1)
3490 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
3491 hash_algo = TEE_ALG_SHA256;
3492#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02003493 else
3494 hash_algo = TEE_ALG_HASH_ALGO(
3495 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02003496
3497 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3498 ta_crypt_cmd_allocate_operation(c, &session,
3499 &op, hash_algo, TEE_MODE_DIGEST, 0)))
3500 goto out;
3501
3502 ptx_hash_size = sizeof(ptx_hash);
3503 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3504 ta_crypt_cmd_digest_do_final(c, & session, op,
3505 tv->ptx, tv->ptx_len, ptx_hash,
3506 &ptx_hash_size)))
3507 goto out;
3508
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003509 /*
3510 * When we use DSA algorithms, the size of the hash we
3511 * consider equals the min between the size of the
3512 * "subprime" in the key and the size of the hash
3513 */
3514 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
3515 TEE_MAIN_ALGO_DSA) {
3516 if (tv->params.dsa.sub_prime_len <=
3517 ptx_hash_size)
3518 ptx_hash_size =
3519 tv->params.dsa.sub_prime_len;
3520 }
3521
Pascal Brandc639ac82015-07-02 08:53:34 +02003522 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3523 ta_crypt_cmd_free_operation(c, &session, op)))
3524 goto out;
3525 }
3526
3527 num_algo_params = 0;
3528 num_key_attrs = 0;
3529 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
3530 case TEE_MAIN_ALGO_RSA:
3531 if (tv->params.rsa.salt_len > 0) {
3532 algo_params[0].attributeID =
3533 TEE_ATTR_RSA_PSS_SALT_LENGTH;
3534 algo_params[0].content.value.a =
3535 tv->params.rsa.salt_len;
3536 algo_params[0].content.value.b = 0;
3537 num_algo_params = 1;
3538 }
3539
3540 max_key_size = tv->params.rsa.modulus_len * 8;
3541
3542 xtest_add_attr(&num_key_attrs, key_attrs,
3543 TEE_ATTR_RSA_MODULUS,
3544 tv->params.rsa.modulus,
3545 tv->params.rsa.modulus_len);
3546 xtest_add_attr(&num_key_attrs, key_attrs,
3547 TEE_ATTR_RSA_PUBLIC_EXPONENT,
3548 tv->params.rsa.pub_exp,
3549 tv->params.rsa.pub_exp_len);
3550
3551 if (!ADBG_EXPECT_TRUE(c,
3552 create_key(c, &session,
3553 max_key_size,
3554 TEE_TYPE_RSA_PUBLIC_KEY,
3555 key_attrs,
3556 num_key_attrs,
3557 &pub_key_handle)))
3558 goto out;
3559
3560 xtest_add_attr(&num_key_attrs, key_attrs,
3561 TEE_ATTR_RSA_PRIVATE_EXPONENT,
3562 tv->params.rsa.priv_exp,
3563 tv->params.rsa.priv_exp_len);
3564
3565 if (tv->params.rsa.prime1_len != 0) {
3566 xtest_add_attr(&num_key_attrs, key_attrs,
3567 TEE_ATTR_RSA_PRIME1,
3568 tv->params.rsa.prime1,
3569 tv->params.rsa.prime1_len);
3570 }
3571
3572 if (tv->params.rsa.prime2_len != 0) {
3573 xtest_add_attr(&num_key_attrs, key_attrs,
3574 TEE_ATTR_RSA_PRIME2,
3575 tv->params.rsa.prime2,
3576 tv->params.rsa.prime2_len);
3577 }
3578
3579 if (tv->params.rsa.exp1_len != 0) {
3580 xtest_add_attr(&num_key_attrs, key_attrs,
3581 TEE_ATTR_RSA_EXPONENT1,
3582 tv->params.rsa.exp1,
3583 tv->params.rsa.exp1_len);
3584 }
3585
3586 if (tv->params.rsa.exp2_len != 0) {
3587 xtest_add_attr(&num_key_attrs, key_attrs,
3588 TEE_ATTR_RSA_EXPONENT2,
3589 tv->params.rsa.exp2,
3590 tv->params.rsa.exp2_len);
3591 }
3592
3593 if (tv->params.rsa.coeff_len != 0) {
3594 xtest_add_attr(&num_key_attrs, key_attrs,
3595 TEE_ATTR_RSA_COEFFICIENT,
3596 tv->params.rsa.coeff,
3597 tv->params.rsa.coeff_len);
3598 }
3599
3600 if (!ADBG_EXPECT_TRUE(c,
3601 create_key(c, &session,
3602 max_key_size,
3603 TEE_TYPE_RSA_KEYPAIR,
3604 key_attrs,
3605 num_key_attrs,
3606 &priv_key_handle)))
3607 goto out;
3608 break;
3609
3610 case TEE_MAIN_ALGO_DSA:
3611 max_key_size = tv->params.dsa.prime_len * 8;
3612
3613 xtest_add_attr(&num_key_attrs, key_attrs,
3614 TEE_ATTR_DSA_PRIME,
3615 tv->params.dsa.prime,
3616 tv->params.dsa.prime_len);
3617 xtest_add_attr(&num_key_attrs, key_attrs,
3618 TEE_ATTR_DSA_SUBPRIME,
3619 tv->params.dsa.sub_prime,
3620 tv->params.dsa.sub_prime_len);
3621 xtest_add_attr(&num_key_attrs, key_attrs,
3622 TEE_ATTR_DSA_BASE,
3623 tv->params.dsa.base,
3624 tv->params.dsa.base_len);
3625 xtest_add_attr(&num_key_attrs, key_attrs,
3626 TEE_ATTR_DSA_PUBLIC_VALUE,
3627 tv->params.dsa.pub_val,
3628 tv->params.dsa.pub_val_len);
3629
3630 if (!ADBG_EXPECT_TRUE(c,
3631 create_key(c, &session, max_key_size,
3632 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
3633 num_key_attrs, &pub_key_handle)))
3634 goto out;
3635
3636 xtest_add_attr(&num_key_attrs, key_attrs,
3637 TEE_ATTR_DSA_PRIVATE_VALUE,
3638 tv->params.dsa.priv_val,
3639 tv->params.dsa.priv_val_len);
3640
3641 if (!ADBG_EXPECT_TRUE(c,
3642 create_key(c, &session, max_key_size,
3643 TEE_TYPE_DSA_KEYPAIR, key_attrs,
3644 num_key_attrs, &priv_key_handle)))
3645 goto out;
3646 break;
3647
Pascal Brand3e143ee2015-07-15 17:17:16 +02003648 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003649 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01003650 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02003651 switch (tv->algo) {
3652 case TEE_ALG_ECDSA_P192:
3653 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003654 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3655 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003656 break;
3657 case TEE_ALG_ECDSA_P224:
3658 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003659 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3660 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003661 break;
3662 case TEE_ALG_ECDSA_P256:
3663 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003664 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3665 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003666 break;
3667 case TEE_ALG_ECDSA_P384:
3668 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003669 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3670 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003671 break;
3672 case TEE_ALG_ECDSA_P521:
3673 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003674 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
3675 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
3676 break;
3677 case TEE_ALG_SM2_PKE:
3678 curve = TEE_ECC_CURVE_SM2;
3679 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
3680 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003681 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01003682 case TEE_ALG_SM2_DSA_SM3:
3683 curve = TEE_ECC_CURVE_SM2;
3684 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
3685 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
3686 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003687 default:
3688 curve = 0xFF;
3689 break;
3690 }
3691
3692 if (tv->algo == TEE_ALG_ECDSA_P521)
3693 max_key_size = 521;
3694 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003695 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003696
3697 xtest_add_attr_value(&num_key_attrs, key_attrs,
3698 TEE_ATTR_ECC_CURVE, curve, 0);
3699 xtest_add_attr(&num_key_attrs, key_attrs,
3700 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003701 tv->params.ecc.public_x,
3702 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003703 xtest_add_attr(&num_key_attrs, key_attrs,
3704 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003705 tv->params.ecc.public_y,
3706 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003707
3708 if (!ADBG_EXPECT_TRUE(c,
3709 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003710 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003711 num_key_attrs, &pub_key_handle)))
3712 goto out;
3713
3714 xtest_add_attr(&num_key_attrs, key_attrs,
3715 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003716 tv->params.ecc.private,
3717 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003718
3719 if (!ADBG_EXPECT_TRUE(c,
3720 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003721 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003722 num_key_attrs, &priv_key_handle)))
3723 goto out;
3724 break;
3725
Pascal Brandc639ac82015-07-02 08:53:34 +02003726 default:
3727 ADBG_EXPECT_TRUE(c, false);
3728 goto out;
3729 }
3730
3731 out_size = sizeof(out);
3732 memset(out, 0, sizeof(out));
3733 switch (tv->mode) {
3734 case TEE_MODE_ENCRYPT:
3735 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3736 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02003737 &op, tv->algo, TEE_MODE_ENCRYPT,
3738 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02003739 goto out;
3740
3741 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3742 ta_crypt_cmd_set_operation_key(c, &session, op,
3743 pub_key_handle)))
3744 goto out;
3745
3746 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3747 ta_crypt_cmd_free_transient_object(c, &session,
3748 pub_key_handle)))
3749 goto out;
3750 pub_key_handle = TEE_HANDLE_NULL;
3751
3752 out_enc_size = sizeof(out_enc);
3753 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3754 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
3755 NULL, 0, tv->ptx, tv->ptx_len, out_enc,
3756 &out_enc_size)))
3757 goto out;
3758
3759 /*
3760 * A PS which is random is added when formatting the
3761 * message internally of the algorithm so we can't
3762 * verify against precomputed values, instead we use the
3763 * decrypt operation to see that output is correct.
3764 */
3765
3766 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3767 ta_crypt_cmd_free_operation(c, &session, op)))
3768 goto out;
3769
3770 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3771 ta_crypt_cmd_allocate_operation(c, &session,
3772 &op, tv->algo, TEE_MODE_DECRYPT,
3773 max_key_size)))
3774 goto out;
3775
3776 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3777 ta_crypt_cmd_set_operation_key(c, &session, op,
3778 priv_key_handle)))
3779 goto out;
3780
3781 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3782 ta_crypt_cmd_free_transient_object(c, &session,
3783 priv_key_handle)))
3784 goto out;
3785
3786 priv_key_handle = TEE_HANDLE_NULL;
3787
3788 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3789 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
3790 NULL, 0, out_enc, out_enc_size, out,
3791 &out_size)))
3792 goto out;
3793
3794 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
3795 out_size);
3796 break;
3797
3798 case TEE_MODE_DECRYPT:
3799 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3800 ta_crypt_cmd_allocate_operation(c, &session,
3801 &op, tv->algo, TEE_MODE_DECRYPT,
3802 max_key_size)))
3803 goto out;
3804
3805 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3806 ta_crypt_cmd_set_operation_key(c, &session, op,
3807 priv_key_handle)))
3808 goto out;
3809
3810 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3811 ta_crypt_cmd_free_transient_object(c, &session,
3812 priv_key_handle)))
3813 goto out;
3814
3815 priv_key_handle = TEE_HANDLE_NULL;
3816
3817 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3818 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
3819 NULL, 0, tv->ctx, tv->ctx_len, out,
3820 &out_size)))
3821 goto out;
3822
3823 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
3824 out_size);
3825 break;
3826
3827 case TEE_MODE_VERIFY:
3828 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3829 ta_crypt_cmd_allocate_operation(c, &session,
3830 &op, tv->algo, TEE_MODE_VERIFY,
3831 max_key_size)))
3832 goto out;
3833
3834 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3835 ta_crypt_cmd_set_operation_key(c, &session, op,
3836 pub_key_handle)))
3837 goto out;
3838
3839 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3840 ta_crypt_cmd_free_transient_object(c, &session,
3841 pub_key_handle)))
3842 goto out;
3843
3844 pub_key_handle = TEE_HANDLE_NULL;
3845
3846 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3847 ta_crypt_cmd_asymmetric_verify(c, &session, op,
3848 algo_params, num_algo_params, ptx_hash,
3849 ptx_hash_size, tv->ctx, tv->ctx_len)))
3850 goto out;
3851 break;
3852
3853 case TEE_MODE_SIGN:
3854 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3855 ta_crypt_cmd_allocate_operation(c, &session,
3856 &op, tv->algo, TEE_MODE_SIGN,
3857 max_key_size)))
3858 goto out;
3859
3860 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3861 ta_crypt_cmd_set_operation_key(c, &session, op,
3862 priv_key_handle)))
3863 goto out;
3864
3865 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3866 ta_crypt_cmd_free_transient_object(c, &session,
3867 priv_key_handle)))
3868 goto out;
3869
3870 priv_key_handle = TEE_HANDLE_NULL;
3871
3872 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3873 ta_crypt_cmd_asymmetric_sign(c, &session, op,
3874 algo_params, num_algo_params, ptx_hash,
3875 ptx_hash_size, out, &out_size)))
3876 goto out;
3877
3878 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
3879 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02003880 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003881 tv->algo == TEE_ALG_DSA_SHA224 ||
3882 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02003883 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01003884 TEE_MAIN_ALGO_ECDSA ||
3885 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02003886 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3887 ta_crypt_cmd_free_operation(c, &session,
3888 op)))
3889 goto out;
3890 /*
3891 * The salt or K is random so we can't verify
3892 * signing against precomputed values, instead
3893 * we use the verify operation to see that
3894 * output is correct.
3895 */
3896 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3897 ta_crypt_cmd_allocate_operation(c,
3898 &session, &op, tv->algo,
3899 TEE_MODE_VERIFY, max_key_size)))
3900 goto out;
3901
3902 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3903 ta_crypt_cmd_set_operation_key(c,
3904 &session, op, pub_key_handle)))
3905 goto out;
3906
3907 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3908 ta_crypt_cmd_free_transient_object(c,
3909 &session, pub_key_handle)))
3910 goto out;
3911
3912 pub_key_handle = TEE_HANDLE_NULL;
3913
3914 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3915 ta_crypt_cmd_asymmetric_verify(c,
3916 &session, op, algo_params,
3917 num_algo_params, ptx_hash,
3918 ptx_hash_size, out, out_size)))
3919 goto out;
3920 } else {
3921 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
3922 tv->ctx_len, out,
3923 out_size);
3924 }
3925 break;
3926
3927 default:
3928 break;
3929 }
3930
3931 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3932 ta_crypt_cmd_free_operation(c, &session, op)))
3933 goto out;
3934
3935 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3936 ta_crypt_cmd_free_transient_object(c, &session,
3937 pub_key_handle)))
3938 goto out;
3939 pub_key_handle = TEE_HANDLE_NULL;
3940
3941 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3942 ta_crypt_cmd_free_transient_object(c, &session,
3943 priv_key_handle)))
3944 goto out;
3945
3946 priv_key_handle = TEE_HANDLE_NULL;
3947
3948 Do_ADBG_EndSubCase(c, NULL);
3949 }
3950out:
3951 TEEC_CloseSession(&session);
3952}
Jens Wiklander14f48872018-06-29 15:30:13 +02003953ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
3954 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02003955
3956#define KEY_ATTR(x, y) { #x, (x), y }
3957
3958struct key_attrs {
3959 const char *name;
3960 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02003961 /*
3962 * When keysize_check != 0: size of attribute is checked
3963 * Expected value is key_size bits except for DH in which case it is
3964 * the value of keysize_check.
3965 */
3966 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02003967};
3968
3969static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
3970 TEE_ObjectHandle key, uint32_t key_size,
3971 struct key_attrs *attrs, size_t num_attrs)
3972{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003973 uint8_t out[2048] = { };
3974 size_t out_size = 0;
3975 size_t n = 0;
3976 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003977
3978 for (m = 0; m < num_attrs; m++) {
3979 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
3980 out_size = sizeof(out);
3981 memset(out, 0, sizeof(out));
3982 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3983 ta_crypt_cmd_get_object_buffer_attribute(c, s,
3984 key, attrs[m].attr, out, &out_size)))
3985 return false;
3986
3987 if (attrs[m].keysize_check)
Jerome Forissierfe94e562020-11-17 17:22:40 +01003988 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, <=,
Pascal Brandc639ac82015-07-02 08:53:34 +02003989 key_size / 8);
3990
3991 if (out_size > 0) {
3992 /* Check that buffer isn't all zeroes */
3993 for (n = 0; n < out_size; n++)
3994 if (out[n] != 0)
3995 break;
3996 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
3997 out_size))
3998 return false;
3999 }
4000 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004001 uint32_t a = 0;
4002 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004003
4004 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4005 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4006 attrs[m].attr, &a, &b)))
4007 return false;
4008 }
4009 }
4010 return true;
4011}
4012
4013static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4014 TEE_ObjectHandle key, uint32_t key_size)
4015{
4016 const struct key_attrs attrs[] = {
4017 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4018 };
4019
4020 return test_keygen_attributes(c, s, key, key_size,
4021 (struct key_attrs *)&attrs,
4022 ARRAY_SIZE(attrs));
4023}
4024
4025
4026static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4027 TEE_ObjectHandle key, uint32_t key_size)
4028{
4029 const struct key_attrs attrs[] = {
4030 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4031 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4032 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4033 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4034 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4035 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4036 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4037 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4038 };
4039
4040 return test_keygen_attributes(c, s, key, key_size,
4041 (struct key_attrs *)&attrs,
4042 ARRAY_SIZE(attrs));
4043}
4044
Pascal Brande61133f2015-07-08 15:38:37 +02004045static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4046 TEE_ObjectHandle key, uint32_t key_size)
4047{
4048 const struct key_attrs attrs[] = {
4049 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4050 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4051 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4052 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4053 };
4054
4055 return test_keygen_attributes(c, s, key, key_size,
4056 (struct key_attrs *)&attrs,
4057 ARRAY_SIZE(attrs));
4058}
4059
Pascal Brandc639ac82015-07-02 08:53:34 +02004060static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004061 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004062{
4063 const struct key_attrs attrs[] = {
4064 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4065 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4066 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4067 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4068 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4069 };
4070
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004071 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004072 (struct key_attrs *)&attrs,
4073 ARRAY_SIZE(attrs));
4074}
4075
4076static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4077 TEE_ObjectHandle key, uint32_t key_size)
4078{
4079 const struct key_attrs attrs[] = {
4080 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4081 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4082 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4083 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4084 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4085 };
4086
4087 return test_keygen_attributes(c, s, key, key_size,
4088 (struct key_attrs *)&attrs,
4089 ARRAY_SIZE(attrs));
4090}
4091
4092static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4093 uint32_t key_type, uint32_t check_keysize,
4094 uint32_t key_size,
4095 TEE_Attribute *params, size_t param_count)
4096{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004097 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004098 bool ret_val = true;
4099
4100 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4101 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4102 &key)))
4103 return false;
4104
4105 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4106 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4107 param_count)))
4108 return false;
4109
4110 switch (key_type) {
4111 case TEE_TYPE_DES:
4112 case TEE_TYPE_DES3:
4113 ret_val = ADBG_EXPECT_TRUE(c,
4114 test_secret_value(c, s, key,
4115 key_size + key_size / 7));
4116 break;
4117 case TEE_TYPE_AES:
4118 case TEE_TYPE_HMAC_MD5:
4119 case TEE_TYPE_HMAC_SHA1:
4120 case TEE_TYPE_HMAC_SHA224:
4121 case TEE_TYPE_HMAC_SHA256:
4122 case TEE_TYPE_HMAC_SHA384:
4123 case TEE_TYPE_HMAC_SHA512:
4124 case TEE_TYPE_GENERIC_SECRET:
4125 ret_val = ADBG_EXPECT_TRUE(c,
4126 test_secret_value(c, s, key, key_size));
4127 break;
4128
4129 case TEE_TYPE_RSA_KEYPAIR:
4130 ret_val = ADBG_EXPECT_TRUE(c,
4131 test_rsa_key_pair(c, s, key, key_size));
4132 break;
4133
Pascal Brande61133f2015-07-08 15:38:37 +02004134 case TEE_TYPE_ECDSA_KEYPAIR:
4135 case TEE_TYPE_ECDH_KEYPAIR:
4136 ret_val = ADBG_EXPECT_TRUE(c,
4137 test_ecc_key_pair(c, s, key, key_size));
4138 break;
4139
Pascal Brandc639ac82015-07-02 08:53:34 +02004140 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004141 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004142 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004143 break;
4144
4145 case TEE_TYPE_DSA_KEYPAIR:
4146 ret_val = ADBG_EXPECT_TRUE(c,
4147 test_dsa_key_pair(c, s, key, key_size));
4148 break;
4149
4150 default:
4151 ret_val = false;
4152 break;
4153 }
4154
4155 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4156 ta_crypt_cmd_free_transient_object(c, s, key)))
4157 return false;
4158
4159 return ret_val;
4160}
4161
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004162struct key_types_noparam {
4163 unsigned level;
4164 const char *name;
4165 uint32_t key_type;
4166 uint32_t quanta;
4167 uint32_t min_size;
4168 uint32_t max_size;
4169};
4170
4171static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4172 const struct key_types_noparam *key_types,
4173 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004174{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004175 size_t n = 0;
4176 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004177
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004178 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004179 uint32_t min_size = key_types[n].min_size;
4180 uint32_t max_size = key_types[n].max_size;
4181 uint32_t quanta = key_types[n].quanta;
4182
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004183 if (key_types[n].level > level)
4184 continue;
4185
Pascal Brandc639ac82015-07-02 08:53:34 +02004186 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4187
4188 for (key_size = min_size; key_size <= max_size;
4189 key_size += quanta) {
4190 if (!ADBG_EXPECT_TRUE(c,
4191 generate_and_test_key(c, session, key_types
4192 [n].key_type, 1, key_size, NULL, 0)))
4193 break;
4194 }
4195
4196 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4197 }
4198}
4199
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004200static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004201{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004202 TEEC_Session session = { };
4203 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004204 static const struct key_types_noparam key_types[] = {
4205 { 0, "AES", TEE_TYPE_AES, 64, 128,
4206 256 /* valid sizes 128, 192, 256 */ },
4207 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4208 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4209 168 /* valid sizes 112, 168 */ },
4210 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4211 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4212 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4213 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4214 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4215 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4216 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4217 };
4218
4219 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4220 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4221 &ret_orig)))
4222 return;
4223
4224 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4225
4226 TEEC_CloseSession(&session);
4227}
4228ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4229 "Test TEE Internal API Generate Symmetric key");
4230
4231static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4232{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004233 TEEC_Session session = { };
4234 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004235 static const struct key_types_noparam key_types[] = {
4236 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4237 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
4238 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
4239 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4240 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4241 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
4242 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4243 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4244 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4245 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4246 };
4247
4248 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4249 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4250 &ret_orig)))
4251 return;
4252
4253 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4254
4255 TEEC_CloseSession(&session);
4256}
4257ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4258 "Test TEE Internal API Generate RSA key");
4259
4260static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4261{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004262 TEEC_Session session = { };
4263 uint32_t ret_orig = 0;
4264 size_t n = 0;
4265 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004266 /*
4267 * Note that the key size parameter is not used when creating the keys
4268 * but specifying these sizes make it possible to test the expected size
4269 * of the private value. This also means that the keysize must match the
4270 * size of p or what is specified in private_bits or the equvivalent
4271 * size of the subprime parameter.
4272 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004273 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004274
4275#define XTEST_DH_GK_DATA(vect) \
4276 ARRAY(vect ## _p), \
4277 ARRAY(vect ## _g), \
4278 &vect ## _private_bits, \
4279 0, 0
4280#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4281 ARRAY(vect ## _p), \
4282 ARRAY(vect ## _g), \
4283 &vect ## _private_bits, \
4284 ARRAY(vect ## _subprime)
4285 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004286 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004287 uint32_t key_size;
4288 const uint8_t *p;
4289 size_t p_len;
4290 const uint8_t *g;
4291 size_t g_len;
4292 const uint32_t *private_bits;
4293 const uint8_t *subprime;
4294 size_t subprime_len;
4295 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004296 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004297 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004298 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004299 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004300 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004301 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004302 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004303 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004304 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004305 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004306 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004307 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004308 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004309 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004310 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004311 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004312 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004313 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004314 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004315 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004316 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004317 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004318 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004319 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004320 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004321 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004322 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004323 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004324 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004325 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004326 };
4327
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004328 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4329 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4330 &ret_orig)))
4331 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004332
4333 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004334 if (key_types[n].level > level)
4335 continue;
4336
Pascal Brandc639ac82015-07-02 08:53:34 +02004337 Do_ADBG_BeginSubCase(c,
4338 "Generate DH key %d bits - Private bits = %d",
4339 key_types[n].key_size,
4340 *key_types[n].private_bits);
4341 param_count = 0;
4342
4343 xtest_add_attr(&param_count, params,
4344 TEE_ATTR_DH_PRIME,
4345 key_types[n].p, key_types[n].p_len);
4346
4347 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4348 key_types[n].g, key_types[n].g_len);
4349
4350 if (key_types[n].private_bits != 0) {
4351 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4352
4353 params[param_count].content.value.a =
4354 *key_types[n].private_bits;
4355
4356 params[param_count].content.value.b = 0;
4357 param_count++;
4358 }
4359
4360 if (key_types[n].subprime != 0) {
4361 xtest_add_attr(&param_count, params,
4362 TEE_ATTR_DH_SUBPRIME,
4363 key_types[n].subprime,
4364 key_types[n].subprime_len);
4365 }
4366
4367 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004368 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004369 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004370 key_types[n]. key_size, params, param_count)))
4371 break;
4372
4373 Do_ADBG_EndSubCase(c,
4374 "Generate DH key %d bits - Private bits = %d",
4375 key_types[n].key_size,
4376 *key_types[n].private_bits);
4377 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004378
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004379 TEEC_CloseSession(&session);
4380}
4381ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4382 "Test TEE Internal API Generate DH key");
4383
4384static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004385{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004386 TEEC_Session session = { };
4387 uint32_t ret_orig = 0;
4388 size_t n = 0;
4389 size_t param_count = 0;
4390 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004391
4392#define XTEST_DSA_GK_DATA(vect) \
4393 ARRAY(vect ## _p), \
4394 ARRAY(vect ## _g), \
4395 ARRAY(vect ## _q)
4396 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004397 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004398 uint32_t key_size;
4399 const uint8_t *prime;
4400 size_t prime_len;
4401 const uint8_t *base;
4402 size_t base_len;
4403 const uint8_t *sub_prime;
4404 size_t sub_prime_len;
4405 } key_types[] = {
Jerome Forissiereed7e652020-04-15 15:42:38 +02004406 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004407 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
Jerome Forissiereed7e652020-04-15 15:42:38 +02004408 { 0, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4409 { 0, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4410 { 0, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4411 { 0, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4412 { 0, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4413 { 0, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4414 { 0, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4415 { 0, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004416 };
4417
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004418 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4419 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4420 &ret_orig)))
4421 return;
4422
Pascal Brandc639ac82015-07-02 08:53:34 +02004423 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004424 if (key_types[n].level > level)
4425 continue;
4426
Pascal Brandc639ac82015-07-02 08:53:34 +02004427 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4428 key_types[n].key_size);
4429 param_count = 0;
4430
4431
4432 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4433 key_types[n].prime, key_types[n].prime_len);
4434
4435 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4436 key_types[n].sub_prime,
4437 key_types[n].sub_prime_len);
4438
4439 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4440 key_types[n].base, key_types[n].base_len);
4441
4442 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004443 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004444 1, key_types[n]. key_size, params,
4445 param_count)))
4446 break;
4447
4448 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4449 key_types[n].key_size);
4450 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004451
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004452 TEEC_CloseSession(&session);
4453}
4454ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4455 "Test TEE Internal API Generate DSA key");
4456
4457static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004458{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004459 TEEC_Session session = { };
4460 uint32_t ret_orig = 0;
4461 size_t n = 0;
4462 size_t param_count = 0;
4463 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004464
4465 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004466 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004467 const char *name;
4468 uint32_t algo;
4469 uint32_t curve;
4470 uint32_t key_size;
4471 } key_types[] = {
4472 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004473 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4474 192 },
4475 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4476 224 },
4477 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4478 256 },
4479 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4480 384 },
4481 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4482 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004483
4484 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004485 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4486 192 },
4487 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4488 224 },
4489 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4490 256 },
4491 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4492 384 },
4493 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4494 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004495 };
4496
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004497 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4498 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4499 &ret_orig)))
4500 return;
4501
Pascal Brande61133f2015-07-08 15:38:37 +02004502 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004503 if (key_types[n].level > level)
4504 continue;
4505
Pascal Brande61133f2015-07-08 15:38:37 +02004506 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
4507 param_count = 0;
4508
4509 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
4510 key_types[n].curve, 0);
4511
4512 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004513 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02004514 0, key_types[n].key_size, params,
4515 param_count)))
4516 break;
4517
4518 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
4519 }
Pascal Brande61133f2015-07-08 15:38:37 +02004520
Pascal Brandc639ac82015-07-02 08:53:34 +02004521 TEEC_CloseSession(&session);
4522}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004523ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
4524 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02004525
4526static void xtest_tee_test_4008(ADBG_Case_t *c)
4527{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004528 TEEC_Session session = { };
4529 uint32_t ret_orig = 0;
4530 TEE_OperationHandle op = TEE_HANDLE_NULL;
4531 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4532 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4533 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004534 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004535 uint8_t out[2048] = { };
4536 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004537
4538 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4539 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4540 &ret_orig)))
4541 return;
4542
4543 Do_ADBG_BeginSubCase(c, "Derive DH key success");
4544
4545 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4546 ta_crypt_cmd_allocate_operation(c, &session, &op,
4547 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
4548 derive_key_max_keysize)))
4549 goto out;
4550
4551 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4552 ta_crypt_cmd_allocate_transient_object(c, & session,
4553 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
4554 &key_handle)))
4555 goto out;
4556
4557 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
4558 ARRAY(derive_key_dh_prime));
4559
4560 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4561 ARRAY(derive_key_dh_base));
4562
4563 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4564 ARRAY(derive_key_dh_public_value));
4565
4566 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
4567 ARRAY(derive_key_dh_private_value));
4568
4569 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4570 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
4571 params, param_count)))
4572 goto out;
4573
4574 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4575 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
4576 goto out;
4577
4578 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4579 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
4580 goto out;
4581
4582 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4583 ta_crypt_cmd_allocate_transient_object(c, &session,
4584 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
4585 &sv_handle)))
4586 goto out;
4587
Pascal Brand2b92b642015-07-16 13:29:42 +02004588 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02004589 param_count = 0;
4590
4591 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
4592 ARRAY(derive_key_dh_public_value_2));
4593
4594 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4595 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
4596 param_count)))
4597 goto out;
4598
4599 out_size = sizeof(out);
4600 memset(out, 0, sizeof(out));
4601 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4602 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
4603 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4604 goto out;
4605
4606 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
4607 sizeof(derive_key_dh_shared_secret), out,
4608 out_size))
4609 goto out;
4610
4611 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4612 ta_crypt_cmd_free_operation(c, &session, op)))
4613 goto out;
4614
4615 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4616 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
4617 goto out;
4618out:
4619 Do_ADBG_EndSubCase(c, "Derive DH key success");
4620 TEEC_CloseSession(&session);
4621}
Jens Wiklander14f48872018-06-29 15:30:13 +02004622ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
4623 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02004624
4625static void xtest_tee_test_4009(ADBG_Case_t *c)
4626{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004627 TEEC_Session session = { };
4628 uint32_t ret_orig = 0;
4629 TEE_OperationHandle op = TEE_HANDLE_NULL;
4630 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
4631 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
4632 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02004633 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004634 uint8_t out[2048] = { };
4635 size_t out_size = 0;
4636 uint32_t size_bytes = 0;
4637 uint32_t i = 0;
Ruchika Gupta454b0b62020-10-30 13:23:19 +05304638 struct derive_key_ecdh_t const *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02004639
4640 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4641 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4642 &ret_orig)))
4643 return;
4644
4645 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
4646 pt = &derive_key_ecdh[i];
4647
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02004648 if (pt->level > level)
4649 continue;
4650
Pascal Brand2b92b642015-07-16 13:29:42 +02004651 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
4652 pt->algo);
4653 size_bytes = (pt->keysize + 7) / 8;
4654 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4655 ta_crypt_cmd_allocate_operation(c, &session, &op,
4656 pt->algo,
4657 TEE_MODE_DERIVE, pt->keysize)))
4658 goto out;
4659
4660 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4661 ta_crypt_cmd_allocate_transient_object(c, & session,
4662 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
4663 &key_handle)))
4664 goto out;
4665
4666 param_count = 0;
4667 xtest_add_attr_value(&param_count, params,
4668 TEE_ATTR_ECC_CURVE, pt->curve, 0);
4669 xtest_add_attr(&param_count, params,
4670 TEE_ATTR_ECC_PRIVATE_VALUE,
4671 pt->private, size_bytes);
4672 /*
Cedric Auger719047c2019-09-11 12:08:14 +02004673 * The public value is not used, but we should provide a valid
4674 * one to avoid rejection in case TEE_PopulateTransientObject()
4675 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02004676 */
4677 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004678 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4679 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02004680 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02004681 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
4682 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02004683
4684 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4685 ta_crypt_cmd_populate_transient_object(c,
4686 &session,
4687 key_handle, params, param_count)))
4688 goto out;
4689
4690 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4691 ta_crypt_cmd_set_operation_key(c, &session, op,
4692 key_handle)))
4693 goto out;
4694
4695 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4696 ta_crypt_cmd_free_transient_object(c, & session,
4697 key_handle)))
4698 goto out;
4699
4700 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4701 ta_crypt_cmd_allocate_transient_object(c, &session,
4702 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
4703 &sv_handle)))
4704 goto out;
4705
4706 /* reuse but reset params and param-count */
4707 param_count = 0;
4708
4709 xtest_add_attr(&param_count, params,
4710 TEE_ATTR_ECC_PUBLIC_VALUE_X,
4711 pt->public_x, size_bytes);
4712 xtest_add_attr(&param_count, params,
4713 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
4714 pt->public_y, size_bytes);
4715
4716 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4717 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
4718 params, param_count)))
4719 goto out;
4720
4721 out_size = sizeof(out);
4722 memset(out, 0, sizeof(out));
4723 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4724 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
4725 sv_handle,
4726 TEE_ATTR_SECRET_VALUE, out, &out_size)))
4727 goto out;
4728
4729 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
4730 out, out_size))
4731 goto out;
4732
4733 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4734 ta_crypt_cmd_free_operation(c, &session, op)))
4735 goto out;
4736
4737 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4738 ta_crypt_cmd_free_transient_object(c, &session,
4739 sv_handle)))
4740 goto out;
4741
4742 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
4743 pt->algo);
4744 }
4745
4746 goto noerror;
4747
4748out:
4749 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
4750
4751noerror:
4752 TEEC_CloseSession(&session);
4753}
Jens Wiklander14f48872018-06-29 15:30:13 +02004754ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
4755 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02004756
4757static void xtest_tee_test_4010(ADBG_Case_t *c)
4758{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004759 TEEC_Session session = { };
4760 uint32_t ret_orig = 0;
4761 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02004762 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
4763 static const TEE_Attribute attr = {
4764 .attributeID = TEE_ATTR_SECRET_VALUE,
4765 .content.ref.buffer = (void *)large_key,
4766 .content.ref.length = sizeof(large_key),
4767 };
4768
4769 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4770 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4771 &ret_orig)))
4772 return;
4773
4774 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4775 ta_crypt_cmd_allocate_transient_object(c, &session,
4776 TEE_TYPE_HMAC_SHA256, 1024, &o)))
4777 goto out;
4778
4779 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
4780 ta_crypt_cmd_populate_transient_object(c, &session, o,
4781 &attr, 1));
4782
4783out:
4784 TEEC_CloseSession(&session);
4785}
Jens Wiklander14f48872018-06-29 15:30:13 +02004786ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
4787 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004788
4789static void xtest_tee_test_4011(ADBG_Case_t *c)
4790{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004791 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004792 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004793 TEE_ObjectHandle key = TEE_HANDLE_NULL;
4794 TEE_OperationHandle ops = TEE_HANDLE_NULL;
4795 TEE_OperationHandle opv = TEE_HANDLE_NULL;
4796 TEE_OperationHandle ope = TEE_HANDLE_NULL;
4797 TEE_OperationHandle opd = TEE_HANDLE_NULL;
4798 uint32_t ret_orig = 0;
4799 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
4800 uint8_t out[1024] = { };
4801 uint8_t tmp[1024] = { };
4802 size_t out_size = 0;
4803 size_t tmp_size = 0;
4804 size_t n = 0;
4805 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004806 size_t i = 0;
4807
4808 /* Setup session, initialize message to sign, create a keypair */
4809 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
4810 &crypt_user_ta_uuid, NULL, &ret_orig)))
4811 return;
4812 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
4813 &s, in, sizeof(in))))
4814 goto out;
4815 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
4816 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
4817 goto out;
4818 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
4819 key, key_size, NULL, 0)))
4820 goto out;
4821
4822 /* Allocate operations for sign, verify, encrypt and decrypt */
4823 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4824 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
4825 key_size)))
4826 goto out;
4827 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4828 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
4829 key_size)))
4830 goto out;
4831 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4832 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
4833 goto out;
4834 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
4835 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
4836 goto out;
4837
4838 /* Assign the keypair to all operations */
4839 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4840 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
4841 goto out;
4842 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4843 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
4844 goto out;
4845 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4846 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
4847 goto out;
4848 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4849 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
4850 goto out;
4851
4852 /*
4853 * The core of the test case is inspired by the one in libtomcrypt:
4854 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
4855 *
4856 * Testcase for Bleichenbacher attack
4857 *
4858 * (1) Create a valid signature
4859 * (2) Check that it can be verified
4860 * (3) Transform the package to fetch plain text (using the encrypt
4861 * operation in GP TEE Internal API)
4862 * (4) Forge the structure of PKCS#1-EMSA encoded data
4863 * (4.1) Search for start and end of the padding string
4864 * (4.2) Move the signature to the front of the padding string
4865 * (4.3) Zero the message until the end
4866 * (5) Transform the package back (using the decrypt operation in
4867 * GP TEE Internal API)
4868 * (6) The result should not be valid if the implementation is robust.
4869 */
4870
4871
4872 for (i = 0; i < 9; i++) {
4873 Do_ADBG_Log("Iteration %zu", i);
4874
4875 /* 1 */
4876 out_size = sizeof(out);
4877 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4878 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
4879 in, sizeof(in), out, &out_size)))
4880 goto out;
4881
4882 /* 2 */
4883 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4884 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
4885 in, sizeof(in), out, out_size)))
4886 goto out;
4887
4888 /* 3 */
4889 tmp_size = sizeof(tmp);
4890 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4891 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
4892 out, out_size, tmp, &tmp_size)))
4893 goto out;
4894
Etienne Carriere0953bf02018-12-21 15:36:25 +01004895 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
4896 goto out;
4897
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004898 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01004899 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004900 if (tmp[n] == 0xff)
4901 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01004902
4903 /* Shall find at least a padding start before buffer end */
4904 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
4905 goto out;
4906
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004907 for (m = n + 1; m < tmp_size; m++)
4908 if (tmp[m] != 0xff)
4909 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01004910
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004911 /* 4.2 */
4912 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01004913
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004914 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01004915 n = n + i + tmp_size - m;
Etienne Carriereacb81c42020-04-24 14:58:58 +02004916
4917 /* Prevent overrun when zeroing buffer end */
4918 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <=, tmp_size))
4919 goto out;
4920
Etienne Carriere0953bf02018-12-21 15:36:25 +01004921 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02004922
4923 /* 5 */
4924 out_size = sizeof(out);
4925 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4926 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
4927 tmp, tmp_size, out, &out_size)))
4928 goto out;
4929
4930 /* 6 */
4931 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
4932 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
4933 in, sizeof(in), out, out_size)))
4934 goto out;
4935 }
4936
4937out:
4938 TEEC_CloseSession(&s);
4939}
Jens Wiklander14f48872018-06-29 15:30:13 +02004940ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
4941 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03004942
4943#ifdef CFG_SYSTEM_PTA
4944static void xtest_tee_test_4012(ADBG_Case_t *c)
4945{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004946 TEEC_Session session = { };
4947 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03004948 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
4949 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004950 uint8_t pool_input[32] = { };
4951 time_t t = 0;
4952 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03004953
4954 t = time(NULL);
4955 tm_local = *localtime(&t);
4956
4957 memcpy((void *)pool_input, (void *)&tm_local,
4958 sizeof(pool_input) < sizeof(tm_local) ?
4959 sizeof(pool_input) : sizeof(tm_local));
4960
4961
4962 op.params[0].tmpref.buffer = pool_input;
4963 op.params[0].tmpref.size = sizeof(pool_input);
4964 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
4965 TEEC_NONE,
4966 TEEC_NONE,
4967 TEEC_NONE);
4968 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4969 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4970 &ret_orig)))
4971 return;
4972
4973 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
4974 TEEC_InvokeCommand(&session,
4975 TA_CRYPT_CMD_SEED_RNG_POOL,
4976 &op,
4977 &ret_orig));
4978 TEEC_CloseSession(&session);
4979}
Jens Wiklander14f48872018-06-29 15:30:13 +02004980ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
4981 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02004982
4983static void xtest_tee_test_4013(ADBG_Case_t *c)
4984{
4985 TEEC_Session session = { };
4986 uint32_t ret_orig = 0;
4987 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
4988 uint8_t key[32] = { };
4989 uint8_t extra_data[32] = { };
4990
4991 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
4992 TEEC_NONE,
4993 TEEC_NONE,
4994 TEEC_NONE);
4995 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4996 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
4997 NULL, &ret_orig)))
4998 return;
4999
5000 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5001 TEEC_InvokeCommand(&session,
5002 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5003 &op,
5004 &ret_orig));
5005
5006 /* Negative test using non-secure memory */
5007 memset(&op, 0, sizeof(op));
5008 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5009 TEEC_MEMREF_TEMP_OUTPUT,
5010 TEEC_NONE,
5011 TEEC_NONE);
5012
5013 op.params[0].tmpref.buffer = extra_data;
5014 op.params[0].tmpref.size = sizeof(extra_data);
5015 op.params[1].tmpref.buffer = key;
5016 op.params[1].tmpref.size = sizeof(key);
5017 (void)ADBG_EXPECT_TEEC_RESULT(c,
5018 TEEC_ERROR_SECURITY,
5019 TEEC_InvokeCommand(&session,
5020 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5021 &op,
5022 &ret_orig));
5023
5024 TEEC_CloseSession(&session);
5025}
5026ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5027 "Test generation of device unique TA keys");
Jerome Forissierf0cf5182020-01-09 17:04:18 +01005028
5029static void xtest_tee_test_4014(ADBG_Case_t *c)
5030{
5031 TEEC_Session session = { };
5032 uint32_t ret_orig = 0;
5033 TEE_OperationHandle op = TEE_HANDLE_NULL;
5034 TEE_ObjectHandle keyA = TEE_HANDLE_NULL;
5035 TEE_ObjectHandle eph_keyA = TEE_HANDLE_NULL;
5036 TEE_ObjectHandle keyB = TEE_HANDLE_NULL;
5037 TEE_ObjectHandle eph_keyB = TEE_HANDLE_NULL;
5038 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5039 TEE_Attribute params[9] = { };
5040 size_t param_count = 0;
5041 uint8_t out[128] = { };
5042 size_t out_size = 0;
5043 uint8_t conf_A[32] = { };
5044 uint8_t conf_B[32] = { };
5045
5046 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5047 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5048 &ret_orig)))
5049 return;
5050
5051 if (!ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM2_KEP,
5052 TEE_ECC_CURVE_SM2)) {
5053 Do_ADBG_Log("SM2 KEP not supported: skip subcase");
5054 goto out;
5055 }
5056
5057 Do_ADBG_BeginSubCase(c, "Initiator side");
5058
5059 /*
5060 * Key exchange protocol running on user A's side. A is initiator.
5061 */
5062
5063 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5064 ta_crypt_cmd_allocate_operation(c, &session, &op,
5065 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5066 goto out;
5067
5068 /* Allocate and initialize keypair of user A */
5069
5070 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5071 ta_crypt_cmd_allocate_transient_object(c, &session,
5072 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyA)))
5073 goto out;
5074
5075 param_count = 0;
5076
5077 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5078 TEE_ECC_CURVE_SM2, 0);
5079
5080 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5081 ARRAY(gmt_003_part5_b2_public_xA));
5082
5083 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5084 ARRAY(gmt_003_part5_b2_public_yA));
5085
5086 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5087 ARRAY(gmt_003_part5_b2_private_A));
5088
5089 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5090 ta_crypt_cmd_populate_transient_object(c, &session, keyA,
5091 params, param_count)))
5092 goto out;
5093
5094 /*
5095 * Allocate and set ephemeral key of user A. Note: it is a regular ECC
5096 * key -- we don't use the *_EPHEMERAL_* attributes flags which are
5097 * reserved for use in TEE_DeriveKey() to pass the ephermeral key of
5098 * user B.
5099 */
5100
5101 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5102 ta_crypt_cmd_allocate_transient_object(c, &session,
5103 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyA)))
5104 goto out;
5105
5106 param_count = 0;
5107
5108 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5109 TEE_ECC_CURVE_SM2, 0);
5110
5111 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5112 ARRAY(gmt_003_part5_b2_eph_public_xA));
5113
5114 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5115 ARRAY(gmt_003_part5_b2_eph_public_yA));
5116
5117 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5118 ARRAY(gmt_003_part5_b2_eph_private_A));
5119
5120 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5121 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyA,
5122 params, param_count)))
5123 goto out;
5124
5125 /* Associate user A keys with operation */
5126
5127 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5128 ta_crypt_cmd_set_operation_key2(c, &session, op, keyA,
5129 eph_keyA)))
5130 goto out;
5131
5132 /* Keys have been set, free key objects */
5133
5134 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5135 ta_crypt_cmd_free_transient_object(c, &session, keyA)))
5136 goto out;
5137
5138 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5139 ta_crypt_cmd_free_transient_object(c, &session, eph_keyA)))
5140 goto out;
5141
5142 /* Allocate output object */
5143
5144 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5145 ta_crypt_cmd_allocate_transient_object(c, &session,
5146 TEE_TYPE_GENERIC_SECRET,
5147 sizeof(gmt_003_part5_b2_shared_secret),
5148 &sv_handle)))
5149 goto out;
5150
5151 /* Set key derivation parameters: user A role, user B information */
5152
5153 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5154 params[0].content.value.a = 0; /* Initiator role */
5155 params[0].content.value.b = 0; /* Not used */
5156 param_count = 1;
5157
5158 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5159 ARRAY(gmt_003_part5_b2_public_xB));
5160
5161 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5162 ARRAY(gmt_003_part5_b2_public_yB));
5163
5164 xtest_add_attr(&param_count, params,
5165 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5166 ARRAY(gmt_003_part5_b2_eph_public_xB));
5167
5168 xtest_add_attr(&param_count, params,
5169 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5170 ARRAY(gmt_003_part5_b2_eph_public_yB));
5171
5172 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5173 ARRAY(gmt_003_part5_b2_id_A));
5174
5175 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5176 ARRAY(gmt_003_part5_b2_id_B));
5177
5178 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5179 ARRAY(gmt_003_part5_b2_conf_B));
5180
5181 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5182 ARRAY(conf_A));
5183
5184 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5185 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5186 param_count)))
5187 goto out;
5188
5189 out_size = sizeof(out);
5190 memset(out, 0, sizeof(out));
5191 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5192 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5193 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5194 goto out;
5195
5196 /* Check derived key */
5197 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5198 sizeof(gmt_003_part5_b2_shared_secret), out,
5199 out_size))
5200 goto out;
5201
5202 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5203 ta_crypt_cmd_free_operation(c, &session, op)))
5204 goto out;
5205
5206 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5207 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5208 goto out;
5209
5210 Do_ADBG_EndSubCase(c, "Initiator side");
5211
5212 Do_ADBG_BeginSubCase(c, "Responder side");
5213
5214 /*
5215 * Key derivation on user B's side
5216 */
5217
5218 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5219 ta_crypt_cmd_allocate_operation(c, &session, &op,
5220 TEE_ALG_SM2_KEP, TEE_MODE_DERIVE, 512)))
5221 goto out;
5222
5223 /* Allocate and initialize keypair of user B */
5224
5225 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5226 ta_crypt_cmd_allocate_transient_object(c, &session,
5227 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &keyB)))
5228 goto out;
5229
5230 param_count = 0;
5231
5232 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5233 TEE_ECC_CURVE_SM2, 0);
5234
5235 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5236 ARRAY(gmt_003_part5_b2_public_xB));
5237
5238 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5239 ARRAY(gmt_003_part5_b2_public_yB));
5240
5241 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5242 ARRAY(gmt_003_part5_b2_private_B));
5243
5244 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5245 ta_crypt_cmd_populate_transient_object(c, &session, keyB,
5246 params, param_count)))
5247 goto out;
5248
5249 /* Allocate and set ephemeral key of user B */
5250
5251 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5252 ta_crypt_cmd_allocate_transient_object(c, &session,
5253 TEE_TYPE_SM2_KEP_KEYPAIR, 256, &eph_keyB)))
5254 goto out;
5255
5256 param_count = 0;
5257
5258 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5259 TEE_ECC_CURVE_SM2, 0);
5260
5261 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5262 ARRAY(gmt_003_part5_b2_eph_public_xB));
5263
5264 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5265 ARRAY(gmt_003_part5_b2_eph_public_yB));
5266
5267 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PRIVATE_VALUE,
5268 ARRAY(gmt_003_part5_b2_eph_private_B));
5269
5270 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5271 ta_crypt_cmd_populate_transient_object(c, &session, eph_keyB,
5272 params, param_count)))
5273 goto out;
5274
5275 /* Associate user B keys with operation */
5276
5277 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5278 ta_crypt_cmd_set_operation_key2(c, &session, op, keyB,
5279 eph_keyB)))
5280 goto out;
5281
5282 /* Keys have been set, free key objects */
5283
5284 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5285 ta_crypt_cmd_free_transient_object(c, &session, keyB)))
5286 goto out;
5287
5288 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5289 ta_crypt_cmd_free_transient_object(c, &session, eph_keyB)))
5290 goto out;
5291
5292 /* Allocate output object */
5293
5294 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5295 ta_crypt_cmd_allocate_transient_object(c, &session,
5296 TEE_TYPE_GENERIC_SECRET,
5297 sizeof(gmt_003_part5_b2_shared_secret),
5298 &sv_handle)))
5299 goto out;
5300
5301 /* Set key derivation parameters: user B role, user A information */
5302
5303 params[0].attributeID = TEE_ATTR_SM2_KEP_USER;
5304 params[0].content.value.a = 1; /* Responder role */
5305 params[0].content.value.b = 0; /* Not used */
5306 param_count = 1;
5307
5308 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_X,
5309 ARRAY(gmt_003_part5_b2_public_xA));
5310
5311 xtest_add_attr(&param_count, params, TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5312 ARRAY(gmt_003_part5_b2_public_yA));
5313
5314 xtest_add_attr(&param_count, params,
5315 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_X,
5316 ARRAY(gmt_003_part5_b2_eph_public_xA));
5317
5318 xtest_add_attr(&param_count, params,
5319 TEE_ATTR_ECC_EPHEMERAL_PUBLIC_VALUE_Y,
5320 ARRAY(gmt_003_part5_b2_eph_public_yA));
5321
5322 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_INITIATOR,
5323 ARRAY(gmt_003_part5_b2_id_A));
5324
5325 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_ID_RESPONDER,
5326 ARRAY(gmt_003_part5_b2_id_B));
5327
5328 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_IN,
5329 ARRAY(gmt_003_part5_b2_conf_A));
5330
5331 xtest_add_attr(&param_count, params, TEE_ATTR_SM2_KEP_CONFIRMATION_OUT,
5332 ARRAY(conf_B));
5333
5334 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5335 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5336 param_count)))
5337 goto out;
5338
5339 out_size = sizeof(out);
5340 memset(out, 0, sizeof(out));
5341 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5342 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5343 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5344 goto out;
5345
5346 /* Check derived key */
5347 if (!ADBG_EXPECT_BUFFER(c, gmt_003_part5_b2_shared_secret,
5348 sizeof(gmt_003_part5_b2_shared_secret), out,
5349 out_size))
5350 goto out;
5351
5352 Do_ADBG_EndSubCase(c, "Responder side");
5353
5354out:
5355 TEEC_CloseSession(&session);
5356}
5357ADBG_CASE_DEFINE(regression, 4014, xtest_tee_test_4014,
5358 "Test SM2 KEP (key derivation)");
Jens Wiklander14f48872018-06-29 15:30:13 +02005359#endif /*CFG_SYSTEM_PTA*/