blob: d9473f94d32c5ddedaca941a50e365527e50a1ea [file] [log] [blame]
Pascal Brandc639ac82015-07-02 08:53:34 +02001/*
2 * Copyright (c) 2014, STMicroelectronics International N.V.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <stdio.h>
15#include <string.h>
16#include <inttypes.h>
17#include <malloc.h>
Igor Opaniuk7ddaa782018-05-25 15:14:05 +030018#include <time.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020019
20#include "xtest_test.h"
21#include "xtest_helpers.h"
22
23#include <tee_api_types.h>
Gabor Szekely2ad190f2018-09-14 14:05:06 +000024#include <tee_api_defines_extensions.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020025#include <ta_crypt.h>
26#include <utee_defines.h>
27#include <util.h>
28
Jerome Forissier213ca8a2017-03-31 11:27:56 +020029#include <regression_4000_data.h>
Cedric Chaumontc7654962015-09-09 14:56:36 +020030#include <nist/186-2ecdsatestvectors.h>
Pascal Brandc639ac82015-07-02 08:53:34 +020031
32#include <assert.h>
33
Pascal Brandc639ac82015-07-02 08:53:34 +020034static TEEC_Result ta_crypt_cmd_reset_operation(ADBG_Case_t *c, TEEC_Session *s,
35 TEE_OperationHandle oph)
36{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010037 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020038 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010039 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020040
41 assert((uintptr_t)oph <= UINT32_MAX);
42 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
43 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
44 TEEC_NONE);
45 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RESET_OPERATION, &op,
46 &ret_orig);
47 if (res != TEEC_SUCCESS) {
48 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
49 ret_orig);
50 }
51 return res;
52}
53
54static TEEC_Result ta_crypt_cmd_copy_operation(ADBG_Case_t *c,
55 TEEC_Session *s,
56 TEE_OperationHandle dst_oph,
57 TEE_OperationHandle src_oph)
58{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010059 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020060 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010061 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020062
63 assert((uintptr_t)dst_oph <= UINT32_MAX);
64 op.params[0].value.a = (uint32_t)(uintptr_t)dst_oph;
65
66 assert((uintptr_t)src_oph <= UINT32_MAX);
67 op.params[0].value.b = (uint32_t)(uintptr_t)src_oph;
68 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE, TEEC_NONE,
69 TEEC_NONE);
70
71 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_COPY_OPERATION, &op,
72 &ret_orig);
73
74 if (res != TEEC_SUCCESS) {
75 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
76 ret_orig);
77 }
78 return res;
79}
80
81static TEEC_Result ta_crypt_cmd_digest_update(ADBG_Case_t *c, TEEC_Session *s,
82 TEE_OperationHandle oph,
83 const void *chunk,
84 size_t chunk_size)
85{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010086 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +020087 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +010088 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +020089
90 assert((uintptr_t)oph <= UINT32_MAX);
91 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
92 op.params[1].tmpref.buffer = (void *)chunk;
93 op.params[1].tmpref.size = chunk_size;
94
95 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
96 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
97 TEEC_NONE);
98
99 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_UPDATE, &op, &ret_orig);
100
101 if (res != TEEC_SUCCESS) {
102 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
103 ret_orig);
104 }
105
106 return res;
107}
108
109static TEEC_Result ta_crypt_cmd_digest_do_final(ADBG_Case_t *c, TEEC_Session *s,
110 TEE_OperationHandle oph,
111 const void *chunk,
112 size_t chunk_len, void *hash,
113 size_t *hash_len)
114{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100115 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200116 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100117 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200118
119 assert((uintptr_t)oph <= UINT32_MAX);
120 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
121
122 op.params[1].tmpref.buffer = (void *)chunk;
123 op.params[1].tmpref.size = chunk_len;
124
125 op.params[2].tmpref.buffer = (void *)hash;
126 op.params[2].tmpref.size = *hash_len;
127
128 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
129 TEEC_MEMREF_TEMP_INPUT,
130 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
131
132 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_DIGEST_DO_FINAL, &op,
133 &ret_orig);
134
135 if (res != TEEC_SUCCESS) {
136 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
137 ret_orig);
138 }
139
140 if (res == TEEC_SUCCESS)
141 *hash_len = op.params[2].tmpref.size;
142
143 return res;
144}
145
146static TEE_Result ta_crypt_cmd_set_operation_key2(ADBG_Case_t *c,
147 TEEC_Session *s,
148 TEE_OperationHandle oph,
149 TEE_ObjectHandle key1,
150 TEE_ObjectHandle key2)
151{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100152 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200153 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100154 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200155
156 assert((uintptr_t)oph <= UINT32_MAX);
157 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
158
159 assert((uintptr_t)key1 <= UINT32_MAX);
160 op.params[0].value.b = (uint32_t)(uintptr_t)key1;
161
162 assert((uintptr_t)key2 <= UINT32_MAX);
163 op.params[1].value.a = (uint32_t)(uintptr_t)key2;
164 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_INPUT,
165 TEEC_NONE, TEEC_NONE);
166
167 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_SET_OPERATION_KEY2, &op,
168 &ret_orig);
169
170 if (res != TEEC_SUCCESS) {
171 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
172 ret_orig);
173 }
174
175 return res;
176}
177
178static TEEC_Result ta_crypt_cmd_mac_init(ADBG_Case_t *c, TEEC_Session *s,
179 TEE_OperationHandle oph,
180 const void *iv, size_t iv_len)
181{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100182 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200183 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100184 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200185
186 assert((uintptr_t)oph <= UINT32_MAX);
187 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
188
189 if (iv != NULL) {
190 op.params[1].tmpref.buffer = (void *)iv;
191 op.params[1].tmpref.size = iv_len;
192 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
193 TEEC_MEMREF_TEMP_INPUT,
194 TEEC_NONE, TEEC_NONE);
195 } else {
196 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
197 TEEC_NONE, TEEC_NONE);
198 }
199
200 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_INIT, &op, &ret_orig);
201
202 if (res != TEEC_SUCCESS) {
203 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
204 ret_orig);
205 }
206
207 return res;
208}
209
210static TEEC_Result ta_crypt_cmd_mac_update(ADBG_Case_t *c, TEEC_Session *s,
211 TEE_OperationHandle oph,
212 const void *chunk, size_t chunk_size)
213{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100214 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200215 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100216 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200217
218 assert((uintptr_t)oph <= UINT32_MAX);
219 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
220
221 op.params[1].tmpref.buffer = (void *)chunk;
222 op.params[1].tmpref.size = chunk_size;
223
224 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
225 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
226 TEEC_NONE);
227
228 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_UPDATE, &op, &ret_orig);
229
230 if (res != TEEC_SUCCESS) {
231 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
232 ret_orig);
233 }
234
235 return res;
236}
237
238static TEEC_Result ta_crypt_cmd_mac_final_compute(ADBG_Case_t *c,
239 TEEC_Session *s,
240 TEE_OperationHandle oph,
241 const void *chunk,
242 size_t chunk_len,
243 void *hash,
244 size_t *hash_len)
245{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100246 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200247 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100248 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200249
250 assert((uintptr_t)oph <= UINT32_MAX);
251 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
252
253 op.params[1].tmpref.buffer = (void *)chunk;
254 op.params[1].tmpref.size = chunk_len;
255
256 op.params[2].tmpref.buffer = (void *)hash;
257 op.params[2].tmpref.size = *hash_len;
258
259 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
260 TEEC_MEMREF_TEMP_INPUT,
261 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
262
263 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_MAC_FINAL_COMPUTE, &op,
264 &ret_orig);
265
266 if (res != TEEC_SUCCESS) {
267 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
268 ret_orig);
269 }
270
271 if (res == TEEC_SUCCESS)
272 *hash_len = op.params[2].tmpref.size;
273
274 return res;
275}
276
277static TEEC_Result ta_crypt_cmd_cipher_init(ADBG_Case_t *c, TEEC_Session *s,
278 TEE_OperationHandle oph,
279 const void *iv, size_t iv_len)
280{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100281 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200282 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100283 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200284
285 assert((uintptr_t)oph <= UINT32_MAX);
286 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
287
288 if (iv != NULL) {
289 op.params[1].tmpref.buffer = (void *)iv;
290 op.params[1].tmpref.size = iv_len;
291
292 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
293 TEEC_MEMREF_TEMP_INPUT,
294 TEEC_NONE, TEEC_NONE);
295 } else {
296 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_NONE,
297 TEEC_NONE, TEEC_NONE);
298 }
299
300 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_INIT, &op, &ret_orig);
301
302 if (res != TEEC_SUCCESS) {
303 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
304 ret_orig);
305 }
306
307 return res;
308}
309
310static TEEC_Result ta_crypt_cmd_cipher_update(ADBG_Case_t *c, TEEC_Session *s,
311 TEE_OperationHandle oph,
312 const void *src, size_t src_len,
313 void *dst, size_t *dst_len)
314{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100315 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200316 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100317 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200318
319 assert((uintptr_t)oph <= UINT32_MAX);
320 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
321
322 op.params[1].tmpref.buffer = (void *)src;
323 op.params[1].tmpref.size = src_len;
324
325 op.params[2].tmpref.buffer = dst;
326 op.params[2].tmpref.size = *dst_len;
327
328 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
329 TEEC_MEMREF_TEMP_INPUT,
330 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
331
332 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_UPDATE, &op, &ret_orig);
333
334 if (res != TEEC_SUCCESS) {
335 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
336 ret_orig);
337 }
338
339 if (res == TEEC_SUCCESS)
340 *dst_len = op.params[2].tmpref.size;
341
342 return res;
343}
344
345static TEEC_Result ta_crypt_cmd_cipher_do_final(ADBG_Case_t *c,
346 TEEC_Session *s,
347 TEE_OperationHandle oph,
348 const void *src,
349 size_t src_len,
350 void *dst,
351 size_t *dst_len)
352{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100353 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200354 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100355 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200356
357 assert((uintptr_t)oph <= UINT32_MAX);
358 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
359
360 op.params[1].tmpref.buffer = (void *)src;
361 op.params[1].tmpref.size = src_len;
362
363 op.params[2].tmpref.buffer = (void *)dst;
364 op.params[2].tmpref.size = *dst_len;
365
366 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
367 TEEC_MEMREF_TEMP_INPUT,
368 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
369
370 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_CIPHER_DO_FINAL, &op,
371 &ret_orig);
372
373 if (res != TEEC_SUCCESS) {
374 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
375 ret_orig);
376 }
377
378 if (res == TEEC_SUCCESS)
379 *dst_len = op.params[2].tmpref.size;
380
381 return res;
382}
383
384static TEEC_Result ta_crypt_cmd_random_number_generate(ADBG_Case_t *c,
385 TEEC_Session *s,
386 void *buf,
387 size_t blen)
388{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100389 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200390 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100391 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200392
393 op.params[0].tmpref.buffer = buf;
394 op.params[0].tmpref.size = blen;
395
396 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE,
397 TEEC_NONE, TEEC_NONE);
398
399 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_RANDOM_NUMBER_GENEREATE, &op,
400 &ret_orig);
401
402 if (res != TEEC_SUCCESS) {
403 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
404 ret_orig);
405 }
406
407 (void)ADBG_EXPECT_COMPARE_UNSIGNED(c, blen, ==,
408 op.params[0].tmpref.size);
409 return res;
410}
411
412static TEEC_Result ta_crypt_cmd_ae_init(ADBG_Case_t *c, TEEC_Session *s,
413 TEE_OperationHandle oph,
414 const void *nonce, size_t nonce_len,
415 size_t tag_len, size_t aad_len,
416 size_t payload_len)
417{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100418 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200419 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100420 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200421
422 assert((uintptr_t)oph <= UINT32_MAX);
423 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
424 op.params[0].value.b = tag_len;
425
426 op.params[1].tmpref.buffer = (void *)nonce;
427 op.params[1].tmpref.size = nonce_len;
428
429 op.params[2].value.a = aad_len;
430 op.params[2].value.b = payload_len;
431
432 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
433 TEEC_MEMREF_TEMP_INPUT,
Jens Wiklander74a42302015-07-07 01:08:41 +0200434 TEEC_VALUE_INPUT, TEEC_NONE);
Pascal Brandc639ac82015-07-02 08:53:34 +0200435
436 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_INIT, &op, &ret_orig);
437
438 if (res != TEEC_SUCCESS) {
439 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
440 ret_orig);
441 }
442 return res;
443}
444
445static TEEC_Result ta_crypt_cmd_ae_update_aad(ADBG_Case_t *c, TEEC_Session *s,
446 TEE_OperationHandle oph,
447 const void *aad, size_t aad_len)
448{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100449 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200450 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100451 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200452
453 assert((uintptr_t)oph <= UINT32_MAX);
454 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
455
456 op.params[1].tmpref.buffer = (void *)aad;
457 op.params[1].tmpref.size = aad_len;
458
459 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
460 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
461 TEEC_NONE);
462
463 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE_AAD, &op, &ret_orig);
464
465 if (res != TEEC_SUCCESS) {
466 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
467 ret_orig);
468 }
469
470 return res;
471}
472
473static TEEC_Result ta_crypt_cmd_ae_update(ADBG_Case_t *c,
474 TEEC_Session *s,
475 TEE_OperationHandle oph,
476 const void *src,
477 size_t src_len,
478 void *dst,
479 size_t *dst_len)
480{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100481 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200482 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100483 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200484
485 assert((uintptr_t)oph <= UINT32_MAX);
486 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
487
488 op.params[1].tmpref.buffer = (void *)src;
489 op.params[1].tmpref.size = src_len;
490
491 op.params[2].tmpref.buffer = (void *)dst;
492 op.params[2].tmpref.size = *dst_len;
493
494 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
495 TEEC_MEMREF_TEMP_INPUT,
496 TEEC_MEMREF_TEMP_OUTPUT, TEEC_NONE);
497
498 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_UPDATE, &op, &ret_orig);
499
500 if (res != TEEC_SUCCESS) {
501 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
502 ret_orig);
503 }
504
505 if (res == TEEC_SUCCESS)
506 *dst_len = op.params[2].tmpref.size;
507
508 return res;
509}
510
511static TEEC_Result ta_crypt_cmd_ae_encrypt_final(ADBG_Case_t *c,
512 TEEC_Session *s,
513 TEE_OperationHandle oph,
514 const void *src,
515 size_t src_len, void *dst,
516 size_t *dst_len, void *tag,
517 size_t *tag_len)
518{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100519 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200520 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100521 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200522
523 assert((uintptr_t)oph <= UINT32_MAX);
524 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
525
526 op.params[1].tmpref.buffer = (void *)src;
527 op.params[1].tmpref.size = src_len;
528
529 op.params[2].tmpref.buffer = (void *)dst;
530 op.params[2].tmpref.size = *dst_len;
531
532 op.params[3].tmpref.buffer = (void *)tag;
533 op.params[3].tmpref.size = *tag_len;
534
535 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
536 TEEC_MEMREF_TEMP_INPUT,
537 TEEC_MEMREF_TEMP_OUTPUT,
538 TEEC_MEMREF_TEMP_OUTPUT);
539
540 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_ENCRYPT_FINAL, &op,
541 &ret_orig);
542
543 if (res != TEEC_SUCCESS) {
544 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
545 ret_orig);
546 }
547
548 if (res == TEEC_SUCCESS) {
549 *dst_len = op.params[2].tmpref.size;
550 *tag_len = op.params[3].tmpref.size;
551 }
552
553 return res;
554}
555
556static TEEC_Result ta_crypt_cmd_ae_decrypt_final(ADBG_Case_t *c,
557 TEEC_Session *s,
558 TEE_OperationHandle oph,
559 const void *src, size_t src_len,
560 void *dst, size_t *dst_len,
561 const void *tag, size_t tag_len)
562{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100563 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200564 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100565 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200566
567 assert((uintptr_t)oph <= UINT32_MAX);
568 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
569
570 op.params[1].tmpref.buffer = (void *)src;
571 op.params[1].tmpref.size = src_len;
572
573 op.params[2].tmpref.buffer = dst;
574 op.params[2].tmpref.size = *dst_len;
575
576 op.params[3].tmpref.buffer = (void *)tag;
577 op.params[3].tmpref.size = tag_len;
578
579 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
580 TEEC_MEMREF_TEMP_INPUT,
581 TEEC_MEMREF_TEMP_OUTPUT,
582 TEEC_MEMREF_TEMP_INPUT);
583
584 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_AE_DECRYPT_FINAL, &op,
585 &ret_orig);
586
587 if (res != TEEC_SUCCESS) {
588 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
589 ret_orig);
590 }
591
592 if (res == TEEC_SUCCESS)
593 *dst_len = op.params[2].tmpref.size;
594
595 return res;
596}
597
598static TEEC_Result ta_crypt_cmd_asymmetric_operate(ADBG_Case_t *c,
599 TEEC_Session *s,
600 TEE_OperationHandle oph,
601 uint32_t cmd,
602 const TEE_Attribute *params,
603 uint32_t paramCount,
604 const void *src,
605 size_t src_len,
606 void *dst,
607 size_t *dst_len)
608{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100609 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200610 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100611 uint32_t ret_orig = 0;
612 uint8_t *buf = NULL;
613 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200614
615 res = pack_attrs(params, paramCount, &buf, &blen);
616 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
617 return res;
618
619 assert((uintptr_t)oph <= UINT32_MAX);
620 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
621
622 op.params[1].tmpref.buffer = buf;
623 op.params[1].tmpref.size = blen;
624
625 op.params[2].tmpref.buffer = (void *)src;
626 op.params[2].tmpref.size = src_len;
627
628 op.params[3].tmpref.buffer = dst;
629 op.params[3].tmpref.size = *dst_len;
630
631 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
632 TEEC_MEMREF_TEMP_INPUT,
633 TEEC_MEMREF_TEMP_INPUT,
634 TEEC_MEMREF_TEMP_OUTPUT);
635
636 res = TEEC_InvokeCommand(s, cmd, &op, &ret_orig);
637
638 if (res != TEEC_SUCCESS) {
639 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
640 ret_orig);
641 }
642
643 if (res == TEEC_SUCCESS)
644 *dst_len = op.params[3].tmpref.size;
645
646 free(buf);
647 return res;
648}
649
650static TEEC_Result ta_crypt_cmd_asymmetric_encrypt(ADBG_Case_t *c,
651 TEEC_Session *s,
652 TEE_OperationHandle oph,
653 const TEE_Attribute *params,
654 uint32_t paramCount,
655 const void *src,
656 size_t src_len,
657 void *dst,
658 size_t *dst_len)
659{
660 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
661 TA_CRYPT_CMD_ASYMMETRIC_ENCRYPT,
662 params, paramCount,
663 src, src_len, dst, dst_len);
664}
665
666static TEEC_Result ta_crypt_cmd_asymmetric_decrypt(ADBG_Case_t *c,
667 TEEC_Session *s,
668 TEE_OperationHandle oph,
669 const TEE_Attribute *params,
670 uint32_t paramCount,
671 const void *src,
672 size_t src_len,
673 void *dst,
674 size_t *dst_len)
675{
676 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
677 TA_CRYPT_CMD_ASYMMETRIC_DECRYPT,
678 params, paramCount,
679 src, src_len, dst, dst_len);
680}
681
682static TEEC_Result ta_crypt_cmd_asymmetric_sign(ADBG_Case_t *c,
683 TEEC_Session *s,
684 TEE_OperationHandle oph,
685 const TEE_Attribute *params,
686 uint32_t paramCount,
687 const void *digest,
688 size_t digest_len,
689 void *signature,
690 size_t *signature_len)
691{
692 return ta_crypt_cmd_asymmetric_operate(c, s, oph,
693 TA_CRYPT_CMD_ASYMMETRIC_SIGN_DIGEST, params, paramCount,
694 digest, digest_len, signature, signature_len);
695}
696
697static TEEC_Result ta_crypt_cmd_asymmetric_verify(ADBG_Case_t *c,
698 TEEC_Session *s,
699 TEE_OperationHandle oph,
700 const TEE_Attribute *params,
701 uint32_t paramCount,
702 const void *digest,
703 size_t digest_len,
704 const void *signature,
705 size_t signature_len)
706{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100707 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200708 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100709 uint32_t ret_orig = 0;
710 uint8_t *buf = NULL;
711 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200712
713 res = pack_attrs(params, paramCount, &buf, &blen);
714 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
715 return res;
716
717 assert((uintptr_t)oph <= UINT32_MAX);
718 op.params[0].value.a = (uint32_t)(uintptr_t)oph;
719
720 op.params[1].tmpref.buffer = buf;
721 op.params[1].tmpref.size = blen;
722
723 op.params[2].tmpref.buffer = (void *)digest;
724 op.params[2].tmpref.size = digest_len;
725
726 op.params[3].tmpref.buffer = (void *)signature;
727 op.params[3].tmpref.size = signature_len;
728
729 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
730 TEEC_MEMREF_TEMP_INPUT,
731 TEEC_MEMREF_TEMP_INPUT,
732 TEEC_MEMREF_TEMP_INPUT);
733
734 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_ASYMMETRIC_VERIFY_DIGEST,
735 &op, &ret_orig);
736
737 if (res != TEEC_SUCCESS) {
738 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
739 ret_orig);
740 }
741
742 free(buf);
743 return res;
744}
745
746static TEEC_Result ta_crypt_cmd_get_object_value_attribute(ADBG_Case_t *c,
747 TEEC_Session *s,
748 TEE_ObjectHandle o,
749 uint32_t attr_id,
750 uint32_t *valuea,
751 uint32_t *valueb)
752{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100753 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200754 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100755 uint32_t ret_orig = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200756
757 assert((uintptr_t)o <= UINT32_MAX);
758 op.params[0].value.a = (uint32_t)(uintptr_t)o;
759 op.params[0].value.b = attr_id;
760 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT, TEEC_VALUE_OUTPUT,
761 TEEC_NONE, TEEC_NONE);
762
763 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GET_OBJECT_VALUE_ATTRIBUTE,
764 &op, &ret_orig);
765
766 if (res != TEEC_SUCCESS) {
767 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
768 ret_orig);
769 }
770
771 if (res == TEEC_SUCCESS) {
772 *valuea = op.params[1].value.a;
773 *valueb = op.params[1].value.b;
774 }
775
776 return res;
777}
778
779static TEEC_Result ta_crypt_cmd_generate_key(ADBG_Case_t *c,
780 TEEC_Session *s,
781 TEE_ObjectHandle o,
782 uint32_t key_size,
783 const TEE_Attribute *params,
784 uint32_t paramCount)
785{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100786 TEEC_Result res = TEEC_ERROR_GENERIC;
Pascal Brandc639ac82015-07-02 08:53:34 +0200787 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100788 uint32_t ret_orig = 0;
789 uint8_t *buf = NULL;
790 size_t blen = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200791
792 res = pack_attrs(params, paramCount, &buf, &blen);
793 if (!ADBG_EXPECT_TEEC_SUCCESS(c, res))
794 return res;
795
796 assert((uintptr_t)o <= UINT32_MAX);
797 op.params[0].value.a = (uint32_t)(uintptr_t)o;
798 op.params[0].value.b = key_size;
799
800 op.params[1].tmpref.buffer = buf;
801 op.params[1].tmpref.size = blen;
802
803 op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INPUT,
804 TEEC_MEMREF_TEMP_INPUT, TEEC_NONE,
805 TEEC_NONE);
806
807 res = TEEC_InvokeCommand(s, TA_CRYPT_CMD_GENERATE_KEY, &op, &ret_orig);
808
809 if (res != TEEC_SUCCESS) {
810 (void)ADBG_EXPECT_TEEC_ERROR_ORIGIN(c, TEEC_ORIGIN_TRUSTED_APP,
811 ret_orig);
812 }
813
814 free(buf);
815 return res;
816}
817
818static const uint8_t hash_data_md5_in1[] = {
819 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
820};
821
822static const uint8_t hash_data_md5_out1[] = {
823 0x61, 0x12, 0x71, 0x83, 0x70, 0x8d, 0x3a, 0xc7,
824 0xf1, 0x9b, 0x66, 0x06, 0xfc, 0xae, 0x7d, 0xf6
825};
826
827static const uint8_t hash_data_sha1_in1[] = {
828 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
829};
830
831static const uint8_t hash_data_sha1_out1[] = {
832 0x4b, 0x98, 0x92, 0xb6, 0x52, 0x72, 0x14, 0xaf,
833 0xc6, 0x55, 0xb8, 0xaa, 0x52, 0xf4, 0xd2, 0x03,
834 0xc1, 0x5e, 0x7c, 0x9c
835};
836
837static const uint8_t hash_data_sha224_in1[] = {
838 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
839};
840
841static const uint8_t hash_data_sha224_out1[] = {
842 0x08, 0x21, 0x69, 0xf9, 0x77, 0x1b, 0x80, 0x15,
843 0xf3, 0x97, 0xae, 0xde, 0x5b, 0xba, 0xa2, 0x72,
844 0x2d, 0x8f, 0x5c, 0x19, 0xfe, 0xd2, 0xe2, 0x68,
845 0x92, 0x49, 0xd8, 0x44
846};
847
848static const uint8_t hash_data_sha256_in1[] = { 'a', 'b', 'c' };
849
850static const uint8_t hash_data_sha256_out1[] = {
851 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea,
852 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23,
853 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
854 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad
855};
856
857static const uint8_t hash_data_sha256_in2[] = { 'e', 'f', 'g' };
858
859static const uint8_t hash_data_sha256_out2[] = {
860 0xd4, 0xff, 0xe8, 0xe9, 0xee, 0x0b, 0x48, 0xeb,
861 0xa7, 0x16, 0x70, 0x61, 0x23, 0xa7, 0x18, 0x7f,
862 0x32, 0xea, 0xe3, 0xbd, 0xcb, 0x0e, 0x77, 0x63,
863 0xe4, 0x1e, 0x53, 0x32, 0x67, 0xbd, 0x8a, 0x53
864};
865
866
867static const uint8_t hash_data_sha384_in1[] = {
868 'a', 'b', 'c', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
869};
870
871static const uint8_t hash_data_sha384_out1[] = {
872 0x4c, 0xab, 0x80, 0x9d, 0x96, 0x84, 0x01, 0x47,
873 0x67, 0x0a, 0xc1, 0x7a, 0xb6, 0xb9, 0xf7, 0x6e,
874 0x35, 0xa6, 0xb0, 0x8c, 0xf5, 0x2a, 0x3d, 0x64,
875 0x9a, 0x8c, 0x7e, 0x0c, 0x55, 0x45, 0xd3, 0x7d,
876 0x1f, 0x7f, 0x28, 0x34, 0x96, 0x14, 0x44, 0x2a,
877 0xf5, 0x98, 0xa2, 0x95, 0x24, 0x76, 0x53, 0x97
878};
879
880static const uint8_t hash_data_sha512_in1[] = {
881 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm'
882};
883
884static const uint8_t hash_data_sha512_out1[] = {
885 0x20, 0xd8, 0x64, 0x4f, 0x54, 0xa2, 0x5f, 0x6f,
886 0x0a, 0xf9, 0xd5, 0x27, 0x7d, 0x17, 0xa8, 0x99,
887 0x4c, 0x64, 0x3f, 0xd0, 0xf3, 0x83, 0x36, 0xee,
888 0x93, 0x12, 0x55, 0xcd, 0x2e, 0x12, 0x34, 0xa0,
889 0xc2, 0xaa, 0xf9, 0xbb, 0x15, 0xc5, 0xe9, 0xfa,
890 0xf7, 0xa7, 0xda, 0xb8, 0x2f, 0x72, 0xa0, 0x47,
891 0xe3, 0x02, 0x04, 0xe8, 0xa0, 0x35, 0x0c, 0x96,
892 0x26, 0xd1, 0xcb, 0x8b, 0x47, 0x45, 0x25, 0xd0
893};
894
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100895/*
896 * SM3
897 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100898 * Appendix A.1
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100899 */
900static const uint8_t hash_data_sm3_a1_in[3] = "abc";
901
902static const uint8_t hash_data_sm3_a1_out[] = {
903 0x66, 0xc7, 0xf0, 0xf4, 0x62, 0xee, 0xed, 0xd9,
904 0xd1, 0xf2, 0xd4, 0x6b, 0xdc, 0x10, 0xe4, 0xe2,
905 0x41, 0x67, 0xc4, 0x87, 0x5c, 0xf2, 0xf7, 0xa2,
906 0x29, 0x7d, 0xa0, 0x2b, 0x8f, 0x4b, 0xa8, 0xe0
907};
908
909/*
910 * SM3
911 * https://tools.ietf.org/html/draft-sca-cfrg-sm3-02
Jerome Forissier9f17e262019-12-13 14:12:41 +0100912 * Appendix A.2
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100913 */
914static const uint8_t hash_data_sm3_a2_in[] = {
915 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
916 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
917 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
918 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
919 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
920 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
921 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64,
922 0x61, 0x62, 0x63, 0x64, 0x61, 0x62, 0x63, 0x64
923};
924
925static const uint8_t hash_data_sm3_a2_out[] = {
926 0xde, 0xbe, 0x9f, 0xf9, 0x22, 0x75, 0xb8, 0xa1,
927 0x38, 0x60, 0x48, 0x89, 0xc1, 0x8e, 0x5a, 0x4d,
928 0x6f, 0xdb, 0x70, 0xe5, 0x38, 0x7e, 0x57, 0x65,
929 0x29, 0x3d, 0xcb, 0xa3, 0x9c, 0x0c, 0x57, 0x32
930};
931
Pascal Brandc639ac82015-07-02 08:53:34 +0200932struct xtest_hash_case {
933 uint32_t algo;
934 size_t in_incr;
935 const uint8_t *in;
936 size_t in_len;
937 const uint8_t *out;
938 size_t out_len;
939};
940
941#define XTEST_HASH_CASE(algo, in_incr, in, out) \
942 { (algo), (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out) }
943
944static const struct xtest_hash_case hash_cases[] = {
945 XTEST_HASH_CASE(TEE_ALG_MD5, 6, hash_data_md5_in1,
946 hash_data_md5_out1),
947 XTEST_HASH_CASE(TEE_ALG_SHA1, 3, hash_data_sha1_in1,
948 hash_data_sha1_out1),
949 XTEST_HASH_CASE(TEE_ALG_SHA224, 7, hash_data_sha224_in1,
950 hash_data_sha224_out1),
951 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in1,
952 hash_data_sha256_out1),
953 XTEST_HASH_CASE(TEE_ALG_SHA256, 1, hash_data_sha256_in2,
954 hash_data_sha256_out2),
955 XTEST_HASH_CASE(TEE_ALG_SHA384, 1, hash_data_sha384_in1,
956 hash_data_sha384_out1),
957 XTEST_HASH_CASE(TEE_ALG_SHA512, 1, hash_data_sha512_in1,
958 hash_data_sha512_out1),
Jerome Forissier3ed850a2019-12-13 10:58:23 +0100959 XTEST_HASH_CASE(TEE_ALG_SM3, 2, hash_data_sm3_a1_in,
960 hash_data_sm3_a1_out),
961 XTEST_HASH_CASE(TEE_ALG_SM3, 19, hash_data_sm3_a2_in,
962 hash_data_sm3_a2_out),
Pascal Brandc639ac82015-07-02 08:53:34 +0200963};
964
965static void xtest_tee_test_4001(ADBG_Case_t *c)
966{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100967 TEEC_Session session = { };
968 uint32_t ret_orig = 0;
969 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200970
971 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
972 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
973 &ret_orig)))
974 return;
975
976
977 for (n = 0; n < ARRAY_SIZE(hash_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +0100978 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
979 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
980 uint8_t out[64] = { };
981 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +0200982
Jerome Forissier87b00c02020-01-22 16:33:12 +0100983 if (hash_cases[n].algo == TEE_ALG_SM3 &&
984 !ta_crypt_cmd_is_algo_supported(c, &session, TEE_ALG_SM3,
985 TEE_CRYPTO_ELEMENT_NONE)) {
986 Do_ADBG_Log("SM3 not supported: skip subcase");
987 continue;
988 }
989
Pascal Brandc639ac82015-07-02 08:53:34 +0200990 Do_ADBG_BeginSubCase(c, "Hash case %d algo 0x%x",
991 (int)n, (unsigned int)hash_cases[n].algo);
992
993 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
994 ta_crypt_cmd_allocate_operation(c, &session, &op1,
995 hash_cases[n].algo,
996 TEE_MODE_DIGEST, 0)))
997 goto out;
998
999 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1000 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1001 hash_cases[n].algo,
1002 TEE_MODE_DIGEST, 0)))
1003 goto out;
1004
1005 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1006 ta_crypt_cmd_digest_update(c, &session, op1,
1007 hash_cases[n].in,
1008 hash_cases[n].in_incr)))
1009 goto out;
1010
1011 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1012 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1013 goto out;
1014
1015 out_size = sizeof(out);
1016 memset(out, 0, sizeof(out));
1017 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1018 ta_crypt_cmd_digest_do_final(c, &session, op2,
1019 hash_cases[n].in + hash_cases[n].in_incr,
1020 hash_cases[n].in_len - hash_cases[n].in_incr,
1021 out, &out_size)))
1022 goto out;
1023
1024 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1025 hash_cases[n].out_len, out, out_size);
1026
1027 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1028 ta_crypt_cmd_reset_operation(c, &session, op1)))
1029 goto out;
1030
1031 out_size = sizeof(out);
1032 memset(out, 0, sizeof(out));
1033 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1034 ta_crypt_cmd_digest_do_final(c, &session, op1,
1035 hash_cases[n].in,
1036 hash_cases[n].in_len, out,
1037 &out_size)))
1038 goto out;
1039
1040 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1041 hash_cases[n].out_len, out, out_size);
1042
Jerome Forissier1e05e262015-07-29 16:09:07 +02001043 /*
1044 * Invoke TEE_DigestDoFinal() a second time to check that state
1045 * was properly reset
1046 */
1047 out_size = sizeof(out);
1048 memset(out, 0, sizeof(out));
1049 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1050 ta_crypt_cmd_digest_do_final(c, &session, op1,
1051 hash_cases[n].in,
1052 hash_cases[n].in_len, out,
1053 &out_size)))
1054 goto out;
1055
1056 (void)ADBG_EXPECT_BUFFER(c, hash_cases[n].out,
1057 hash_cases[n].out_len, out, out_size);
1058
Pascal Brandc639ac82015-07-02 08:53:34 +02001059 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1060 ta_crypt_cmd_free_operation(c, &session, op1)))
1061 goto out;
1062
1063 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1064 ta_crypt_cmd_free_operation(c, &session, op2)))
1065 goto out;
1066
1067 Do_ADBG_EndSubCase(c, NULL);
1068 }
1069
1070out:
1071 TEEC_CloseSession(&session);
1072}
Jens Wiklander14f48872018-06-29 15:30:13 +02001073ADBG_CASE_DEFINE(regression, 4001, xtest_tee_test_4001,
1074 "Test TEE Internal API hash operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001075
1076static const uint8_t mac_data_md5_key1[10] = {
1077 0x6B, 0x65, 0x79, /* key */
1078};
1079
1080static const uint8_t mac_data_md5_in1[] = {
1081 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, /* The quic */
1082 0x6B, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x6E, 0x20, /* k brown */
1083 0x66, 0x6F, 0x78, 0x20, 0x6A, 0x75, 0x6D, 0x70, /* fox jump */
1084 0x73, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, /* s over t */
1085 0x68, 0x65, 0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, /* he lazy */
1086 0x64, 0x6F, 0x67, /* dog */
1087};
1088
1089static const uint8_t mac_data_md5_out1[] = {
1090 0x80, 0x07, 0x07, 0x13, 0x46, 0x3e, 0x77, 0x49,
1091 0xb9, 0x0c, 0x2d, 0xc2, 0x49, 0x11, 0xe2, 0x75
1092};
1093
1094
1095/* generated with scripts/digest_hmac.pl */
1096static const uint8_t mac_data_sha1_key1[10] = {
1097 0x6B, 0x65, 0x79, /* key */
1098};
1099
1100static const uint8_t mac_data_sha1_in1[] = {
1101 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, /* The quic */
1102 0x6B, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x6E, 0x20, /* k brown */
1103 0x66, 0x6F, 0x78, 0x20, 0x6A, 0x75, 0x6D, 0x70, /* fox jump */
1104 0x73, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, /* s over t */
1105 0x68, 0x65, 0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, /* he lazy */
1106 0x64, 0x6F, 0x67, /* dog */
1107};
1108
1109static const uint8_t mac_data_sha1_out1[] = {
1110 0xDE, 0x7C, 0x9B, 0x85, 0xB8, 0xB7, 0x8A, 0xA6, /* .|...... */
1111 0xBC, 0x8A, 0x7A, 0x36, 0xF7, 0x0A, 0x90, 0x70, /* ..z6...p */
1112 0x1C, 0x9D, 0xB4, 0xD9, /* .... */
1113};
1114
1115static const uint8_t mac_data_sha224_key1[24] = {
1116 0x6B, 0x65, 0x79, /* key */
1117};
1118
1119static const uint8_t mac_data_sha224_in1[] = {
1120 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, /* The quic */
1121 0x6B, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x6E, 0x20, /* k brown */
1122 0x66, 0x6F, 0x78, 0x20, 0x6A, 0x75, 0x6D, 0x70, /* fox jump */
1123 0x73, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, /* s over t */
1124 0x68, 0x65, 0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, /* he lazy */
1125 0x64, 0x6F, 0x67, /* dog */
1126};
1127
1128static const uint8_t mac_data_sha224_out1[] = {
1129 0x88, 0xFF, 0x8B, 0x54, 0x67, 0x5D, 0x39, 0xB8, /* ...Tg]9. */
1130 0xF7, 0x23, 0x22, 0xE6, 0x5F, 0xF9, 0x45, 0xC5, /* .#"._.E. */
1131 0x2D, 0x96, 0x37, 0x99, 0x88, 0xAD, 0xA2, 0x56, /* -.7....V */
1132 0x39, 0x74, 0x7E, 0x69, /* 9t~i */
1133};
1134
1135
1136static const uint8_t mac_data_sha256_key1[24] = {
1137 'Q', 'W', 'E', 'R', 'T', 'Y'
1138};
1139
1140static const uint8_t mac_data_sha256_in1[] = { 'a', 'b', 'c' };
1141
1142static const uint8_t mac_data_sha256_out1[] = {
1143 0xee, 0x2e, 0x5d, 0x9b, 0x51, 0xe2, 0x9c, 0x1d,
1144 0x49, 0xe9, 0xae, 0x6f, 0x0a, 0xcc, 0x15, 0x18,
1145 0xde, 0x1e, 0xa3, 0x88, 0x8e, 0xee, 0x48, 0xbb,
1146 0x82, 0x77, 0xe9, 0x09, 0x74, 0x4b, 0xa2, 0xf2
1147};
1148
1149/* generated with scripts/digest_hmac.pl */
1150static const uint8_t mac_data_sha256_key2[24] = {
1151 0x6B, 0x65, 0x79, /* key */
1152};
1153
1154static const uint8_t mac_data_sha256_in2[] = {
1155 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, /* The quic */
1156 0x6B, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x6E, 0x20, /* k brown */
1157 0x66, 0x6F, 0x78, 0x20, 0x6A, 0x75, 0x6D, 0x70, /* fox jump */
1158 0x73, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, /* s over t */
1159 0x68, 0x65, 0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, /* he lazy */
1160 0x64, 0x6F, 0x67, /* dog */
1161};
1162
1163static const uint8_t mac_data_sha256_out2[] = {
1164 0xF7, 0xBC, 0x83, 0xF4, 0x30, 0x53, 0x84, 0x24, /* ....0S.$ */
1165 0xB1, 0x32, 0x98, 0xE6, 0xAA, 0x6F, 0xB1, 0x43, /* .2...o.C */
1166 0xEF, 0x4D, 0x59, 0xA1, 0x49, 0x46, 0x17, 0x59, /* .MY.IF.Y */
1167 0x97, 0x47, 0x9D, 0xBC, 0x2D, 0x1A, 0x3C, 0xD8, /* .G..-.<. */
1168};
1169
1170static const uint8_t mac_data_sha384_key1[32] = {
1171 0x6B, 0x65, 0x79, /* key */
1172};
1173
1174static const uint8_t mac_data_sha384_in1[] = {
1175 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, /* The quic */
1176 0x6B, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x6E, 0x20, /* k brown */
1177 0x66, 0x6F, 0x78, 0x20, 0x6A, 0x75, 0x6D, 0x70, /* fox jump */
1178 0x73, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, /* s over t */
1179 0x68, 0x65, 0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, /* he lazy */
1180 0x64, 0x6F, 0x67, /* dog */
1181};
1182
1183static const uint8_t mac_data_sha384_out1[] = {
1184 0xD7, 0xF4, 0x72, 0x7E, 0x2C, 0x0B, 0x39, 0xAE, /* ..r~, .9. */
1185 0x0F, 0x1E, 0x40, 0xCC, 0x96, 0xF6, 0x02, 0x42, /* ..@....B */
1186 0xD5, 0xB7, 0x80, 0x18, 0x41, 0xCE, 0xA6, 0xFC, /* ....A... */
1187 0x59, 0x2C, 0x5D, 0x3E, 0x1A, 0xE5, 0x07, 0x00, /* Y, ]>.... */
1188 0x58, 0x2A, 0x96, 0xCF, 0x35, 0xE1, 0xE5, 0x54, /* X...5..T */
1189 0x99, 0x5F, 0xE4, 0xE0, 0x33, 0x81, 0xC2, 0x37, /* ._..3..7 */
1190};
1191
1192static const uint8_t mac_data_sha512_key1[32] = {
1193 0x6B, 0x65, 0x79, /* key */
1194};
1195
1196static const uint8_t mac_data_sha512_in1[] = {
1197 0x54, 0x68, 0x65, 0x20, 0x71, 0x75, 0x69, 0x63, /* The quic */
1198 0x6B, 0x20, 0x62, 0x72, 0x6F, 0x77, 0x6E, 0x20, /* k brown */
1199 0x66, 0x6F, 0x78, 0x20, 0x6A, 0x75, 0x6D, 0x70, /* fox jump */
1200 0x73, 0x20, 0x6F, 0x76, 0x65, 0x72, 0x20, 0x74, /* s over t */
1201 0x68, 0x65, 0x20, 0x6C, 0x61, 0x7A, 0x79, 0x20, /* he lazy */
1202 0x64, 0x6F, 0x67, /* dog */
1203};
1204
1205static const uint8_t mac_data_sha512_out1[] = {
1206 0xB4, 0x2A, 0xF0, 0x90, 0x57, 0xBA, 0xC1, 0xE2, /* ....W... */
1207 0xD4, 0x17, 0x08, 0xE4, 0x8A, 0x90, 0x2E, 0x09, /* ........ */
1208 0xB5, 0xFF, 0x7F, 0x12, 0xAB, 0x42, 0x8A, 0x4F, /* .....B.O */
1209 0xE8, 0x66, 0x53, 0xC7, 0x3D, 0xD2, 0x48, 0xFB, /* .fS.=.H. */
1210 0x82, 0xF9, 0x48, 0xA5, 0x49, 0xF7, 0xB7, 0x91, /* ..H.I... */
1211 0xA5, 0xB4, 0x19, 0x15, 0xEE, 0x4D, 0x1E, 0xC3, /* .....M.. */
1212 0x93, 0x53, 0x57, 0xE4, 0xE2, 0x31, 0x72, 0x50, /* .SW..1rP */
1213 0xD0, 0x37, 0x2A, 0xFA, 0x2E, 0xBE, 0xEB, 0x3A, /* .7.....: */
1214};
1215
Jerome Forissier9f17e262019-12-13 14:12:41 +01001216/*
1217 * SM3 HMAC
1218 * GM/T 0042-2015
1219 * Section D.3 Test vector 1
1220 */
1221static const uint8_t mac_data_sm3_d31_in[112] =
1222 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomn"
1223 "opnopqabcdbcdecdefdefgefghfghighijhijkijkljklmklmn"
1224 "lmnomnopnopq";
1225
1226static const uint8_t mac_data_sm3_d31_key[] = {
1227 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1228 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1229 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1230 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
1231};
1232
1233static const uint8_t mac_data_sm3_d31_out[] = {
1234 0xca, 0x05, 0xe1, 0x44, 0xed, 0x05, 0xd1, 0x85,
1235 0x78, 0x40, 0xd1, 0xf3, 0x18, 0xa4, 0xa8, 0x66,
1236 0x9e, 0x55, 0x9f, 0xc8, 0x39, 0x1f, 0x41, 0x44,
1237 0x85, 0xbf, 0xdf, 0x7b, 0xb4, 0x08, 0x96, 0x3a,
1238};
1239
1240/*
1241 * SM3 HMAC
1242 * GM/T 0042-2015
1243 * Section D.3 Test vector 2
1244 */
1245static const uint8_t mac_data_sm3_d32_in[] = {
1246 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1247 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1248 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1249 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1250 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1251 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,
1252 0xcd, 0xcd
1253};
1254
1255static const uint8_t mac_data_sm3_d32_key[] = {
1256 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1257 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1258 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
1259 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
1260 0x21, 0x22, 0x23, 0x24, 0x25,
1261};
1262
1263static const uint8_t mac_data_sm3_d32_out[] = {
1264 0x22, 0x0b, 0xf5, 0x79, 0xde, 0xd5, 0x55, 0x39,
1265 0x3f, 0x01, 0x59, 0xf6, 0x6c, 0x99, 0x87, 0x78,
1266 0x22, 0xa3, 0xec, 0xf6, 0x10, 0xd1, 0x55, 0x21,
1267 0x54, 0xb4, 0x1d, 0x44, 0xb9, 0x4d, 0xb3, 0xae,
1268};
Pascal Brandc639ac82015-07-02 08:53:34 +02001269
1270/* AES-CBC-MAC */
1271static const uint8_t mac_cbc_vect1_key[] = {
1272 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1273 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1274};
1275
1276static const uint8_t mac_cbc_vect1_data[] = {
1277 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1278 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1279 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1280 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1281 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1282 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1283 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1284 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1285 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1286 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1287 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1288 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1289 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1290 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1291 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1292 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1293 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1294 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1295 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1296 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
1297};
1298
1299static const uint8_t mac_cbc_vect1_out[] = {
1300 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
1301 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
1302};
1303
1304/* DES-CBC-MAC */
1305static const uint8_t mac_cbc_vect2_key[] = {
1306 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1307};
1308
1309#define mac_cbc_vect2_data mac_cbc_vect1_data
1310static const uint8_t mac_cbc_vect2_out[] = {
1311 0xE9, 0x41, 0x46, 0x30, 0x69, 0x32, 0xBD, 0xD6, /* .AF0i2.. */
1312};
1313
1314/* DES3-CBC-MAC */
1315static const uint8_t mac_cbc_vect3_key[] = {
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
1321#define mac_cbc_vect3_data mac_cbc_vect2_data
1322static const uint8_t mac_cbc_vect3_out[] = {
1323 0x1C, 0x17, 0xB7, 0xB5, 0x9F, 0x54, 0x9C, 0x63, /* .....T.c */
1324};
1325
1326/* AES-CBC-MAC PKCS#5 pad*/
1327static const uint8_t mac_cbc_vect4_key[] = {
1328 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1329 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1330 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1331 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1332};
1333
1334#define mac_cbc_vect4_data mac_cbc_vect1_data
1335static const uint8_t mac_cbc_vect4_out[] = {
1336 0x0B, 0x46, 0xC7, 0xA2, 0xE1, 0x5A, 0xE2, 0x23, /* .F...Z.# */
1337 0x83, 0x34, 0x1C, 0x86, 0x53, 0xF8, 0x51, 0x24, /* .4..S.Q$ */
1338};
1339
1340/* DES-CBC-MAC PKCS#5 pad*/
1341static const uint8_t mac_cbc_vect5_key[] = {
1342 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1343};
1344
1345#define mac_cbc_vect5_data mac_cbc_vect1_data
1346static const uint8_t mac_cbc_vect5_out[] = {
1347 0x30, 0x81, 0x4F, 0x42, 0x03, 0x7E, 0xD8, 0xA9, /* 0.OB.~.. */
1348};
1349
1350/* DES3-CBC-MAC PKCS#5 pad*/
1351static const uint8_t mac_cbc_vect6_key[] = {
1352 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1353 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1354 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1355};
1356
1357#define mac_cbc_vect6_data mac_cbc_vect1_data
1358static const uint8_t mac_cbc_vect6_out[] = {
1359 0x6E, 0x37, 0x6E, 0x14, 0x5E, 0x21, 0xDD, 0xF8, /* n7n.^!.. */
1360};
1361
1362/* AES-CBC-MAC PKCS#5 pad*/
1363#define mac_cbc_vect7_key mac_cbc_vect4_key
1364static const uint8_t mac_cbc_vect7_data[] = {
1365 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1366 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1367 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1368 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1369 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1370 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1371 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1372 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1373 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1374 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1375 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1376 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
1377 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
1378 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
1379 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
1380 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
1381 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
1382 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
1383 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
1384 0x74, 0x69, 0x6F, 0x6E, 0x2E, /* tion. */
1385};
1386
1387static const uint8_t mac_cbc_vect7_out[] = {
1388 0xFD, 0x89, 0x35, 0xB3, 0x93, 0x7F, 0xBB, 0xA2, /* ..5..... */
1389 0xFB, 0x65, 0x60, 0xC4, 0x0A, 0x62, 0xA0, 0xF9, /* .e`..b.. */
1390};
1391
1392/* DES-CBC-MAC PKCS#5 pad*/
1393#define mac_cbc_vect8_key mac_cbc_vect5_key
1394#define mac_cbc_vect8_data mac_cbc_vect7_data
1395static const uint8_t mac_cbc_vect8_out[] = {
1396 0x02, 0x2A, 0xA8, 0x2E, 0x47, 0xC6, 0xBB, 0x7C, /* ....G..| */
1397};
1398
1399/* DES3-CBC-MAC PKCS#5 pad*/
1400#define mac_cbc_vect9_key mac_cbc_vect6_key
1401#define mac_cbc_vect9_data mac_cbc_vect7_data
1402static const uint8_t mac_cbc_vect9_out[] = {
1403 0xD4, 0xF7, 0x3E, 0x27, 0x78, 0x0E, 0x1C, 0x79, /* ..>'x..y */
1404};
1405
1406/*
Pascal Brand5c3d8092015-07-23 08:20:26 +02001407 * DES3-CBC-MAC, with key size of 112bit
1408 * out obtained with:
1409 * echo -n "Cipher block chaining (CBC) is a common chaining mode in which the previous block's ciphertext is xored with the current block's plaintext before encryption...."|openssl enc -iv 0 -des3 -K 303132333435363738394142434445463031323334353637 |xxd
1410 */
1411/* DES3-CBC-MAC PKCS#5 pad*/
1412static const uint8_t mac_cbc_vect10_key[] = {
1413 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1414 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1415};
1416#define mac_cbc_vect10_data mac_cbc_vect1_data
1417static const uint8_t mac_cbc_vect10_out[] = {
1418 0x30, 0x92, 0x60, 0x99, 0x66, 0xac, 0x8c, 0xa6,
1419};
1420
1421
1422/*
Pascal Brandc639ac82015-07-02 08:53:34 +02001423 * AES-CMAC
1424 * Test vectors from
1425 * http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf
1426 */
1427
1428/* AES-128 */
1429static const uint8_t mac_cmac_vect1_key[] = {
1430 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
1431 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
1432};
1433
1434static const uint8_t mac_cmac_vect1_out[] = {
1435 0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28,
1436 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46
1437};
1438
1439#define mac_cmac_vect2_key mac_cmac_vect1_key
1440static const uint8_t mac_cmac_vect2_data[] = {
1441 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1442 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
1443};
1444
1445static const uint8_t mac_cmac_vect2_out[] = {
1446 0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44,
1447 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c
1448};
1449
1450#define mac_cmac_vect3_key mac_cmac_vect1_key
1451static const uint8_t mac_cmac_vect3_data[] = {
1452 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1453 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1454 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1455 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1456 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11
1457};
1458
1459static const uint8_t mac_cmac_vect3_out[] = {
1460 0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30,
1461 0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27
1462};
1463
1464#define mac_cmac_vect4_key mac_cmac_vect1_key
1465static const uint8_t mac_cmac_vect4_data[] = {
1466 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1467 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1468 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1469 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1470 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
1471 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
1472 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
1473 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1474};
1475
1476static const uint8_t mac_cmac_vect4_out[] = {
1477 0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92,
1478 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe
1479};
1480
1481/* AES-192 */
1482static const uint8_t mac_cmac_vect5_key[] = {
1483 0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52,
1484 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5,
1485 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b
1486};
1487
1488static const uint8_t mac_cmac_vect5_out[] = {
1489 0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5,
1490 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67
1491};
1492
1493
1494#define mac_cmac_vect6_key mac_cmac_vect5_key
1495static const uint8_t mac_cmac_vect6_data[] = {
1496 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1497 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
1498};
1499
1500static const uint8_t mac_cmac_vect6_out[] = {
1501 0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90,
1502 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84
1503};
1504
1505#define mac_cmac_vect7_key mac_cmac_vect5_key
1506static const uint8_t mac_cmac_vect7_data[] = {
1507 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1508 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1509 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1510 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1511 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11
1512};
1513
1514static const uint8_t mac_cmac_vect7_out[] = {
1515 0x8a, 0x1d, 0xe5, 0xbe, 0x2e, 0xb3, 0x1a, 0xad,
1516 0x08, 0x9a, 0x82, 0xe6, 0xee, 0x90, 0x8b, 0x0e
1517};
1518
1519#define mac_cmac_vect8_key mac_cmac_vect5_key
1520static const uint8_t mac_cmac_vect8_data[] = {
1521 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1522 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1523 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1524 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1525 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
1526 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
1527 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
1528 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1529};
1530
1531static const uint8_t mac_cmac_vect8_out[] = {
1532 0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79,
1533 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11
1534};
1535
1536/* AES-256 */
1537static const uint8_t mac_cmac_vect9_key[] = {
1538 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe,
1539 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
1540 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7,
1541 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4
1542};
1543
1544static const uint8_t mac_cmac_vect9_out[] = {
1545 0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e,
1546 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83
1547};
1548
1549#define mac_cmac_vect10_key mac_cmac_vect9_key
1550static const uint8_t mac_cmac_vect10_data[] = {
1551 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1552 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a
1553};
1554
1555static const uint8_t mac_cmac_vect10_out[] = {
1556 0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82,
1557 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c
1558};
1559
1560#define mac_cmac_vect11_key mac_cmac_vect9_key
1561static const uint8_t mac_cmac_vect11_data[] = {
1562 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1563 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1564 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1565 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1566 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11
1567};
1568
1569static const uint8_t mac_cmac_vect11_out[] = {
1570 0xaa, 0xf3, 0xd8, 0xf1, 0xde, 0x56, 0x40, 0xc2,
1571 0x32, 0xf5, 0xb1, 0x69, 0xb9, 0xc9, 0x11, 0xe6
1572};
1573
1574#define mac_cmac_vect12_key mac_cmac_vect9_key
1575static const uint8_t mac_cmac_vect12_data[] = {
1576 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1577 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1578 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1579 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1580 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
1581 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
1582 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
1583 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1584};
1585
1586static const uint8_t mac_cmac_vect12_out[] = {
1587 0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5,
1588 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10
1589};
1590
1591struct xtest_mac_case {
1592 uint32_t algo;
1593 uint32_t key_type;
1594 const uint8_t *key;
1595 size_t key_len;
1596 size_t in_incr;
1597 const uint8_t *in;
1598 size_t in_len;
1599 const uint8_t *out;
1600 size_t out_len;
Jerome Forissier3dec7442019-01-30 17:50:05 +01001601 bool multiple_incr;
Pascal Brandc639ac82015-07-02 08:53:34 +02001602};
1603
Jerome Forissier3dec7442019-01-30 17:50:05 +01001604#define XTEST_MAC_CASE_1(algo, key_type, key, in_incr, in, out) \
Pascal Brandc639ac82015-07-02 08:53:34 +02001605 { (algo), (key_type), (key), ARRAY_SIZE(key), \
Jerome Forissier3dec7442019-01-30 17:50:05 +01001606 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), false }
1607
1608#define XTEST_MAC_CASE_MULT(algo, key_type, key, in_incr, in, out) \
1609 { (algo), (key_type), (key), ARRAY_SIZE(key), \
1610 (in_incr), (in), ARRAY_SIZE(in), (out), ARRAY_SIZE(out), true }
1611
1612#define XTEST_MAC_CASE(algo, key_type, key, in_incr, in, out) \
1613 XTEST_MAC_CASE_1((algo), (key_type), (key), (in_incr), (in), (out)), \
1614 XTEST_MAC_CASE_MULT((algo), (key_type), (key), (in_incr), (in), (out))
Pascal Brandc639ac82015-07-02 08:53:34 +02001615
1616#define XTEST_MAC_CBC_CASE(algo, key_type, vect, in_incr) \
1617 XTEST_MAC_CASE((algo), (key_type), \
1618 mac_cbc_ ## vect ## _key, (in_incr), \
1619 mac_cbc_ ## vect ## _data, mac_cbc_ ## vect ## _out)
1620
1621#define XTEST_MAC_CMAC_CASE(vect, in_incr) \
1622 XTEST_MAC_CASE(TEE_ALG_AES_CMAC, TEE_TYPE_AES, \
1623 mac_cmac_ ## vect ## _key, (in_incr), \
1624 mac_cmac_ ## vect ## _data, mac_cmac_ ## vect ## _out)
1625
1626static const struct xtest_mac_case mac_cases[] = {
1627 XTEST_MAC_CASE(TEE_ALG_HMAC_MD5, TEE_TYPE_HMAC_MD5,
1628 mac_data_md5_key1,
1629 4, mac_data_md5_in1, mac_data_md5_out1),
1630 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA1, TEE_TYPE_HMAC_SHA1,
1631 mac_data_sha1_key1,
1632 5, mac_data_sha1_in1, mac_data_sha1_out1),
1633 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA224, TEE_TYPE_HMAC_SHA224,
1634 mac_data_sha224_key1,
1635 8, mac_data_sha224_in1, mac_data_sha224_out1),
1636 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1637 mac_data_sha256_key1,
1638 1, mac_data_sha256_in1, mac_data_sha256_out1),
1639 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA256, TEE_TYPE_HMAC_SHA256,
1640 mac_data_sha256_key2,
1641 7, mac_data_sha256_in2, mac_data_sha256_out2),
1642 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA384, TEE_TYPE_HMAC_SHA384,
1643 mac_data_sha384_key1,
1644 11, mac_data_sha384_in1, mac_data_sha384_out1),
1645 XTEST_MAC_CASE(TEE_ALG_HMAC_SHA512, TEE_TYPE_HMAC_SHA512,
1646 mac_data_sha512_key1,
1647 13, mac_data_sha512_in1, mac_data_sha512_out1),
1648
1649 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_NOPAD, TEE_TYPE_AES, vect1, 14),
1650 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_NOPAD, TEE_TYPE_DES, vect2, 16),
1651 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_NOPAD, TEE_TYPE_DES3, vect3,
1652 17),
1653 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect4, 11),
1654 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect5, 9),
1655 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect6, 4),
1656 XTEST_MAC_CBC_CASE(TEE_ALG_AES_CBC_MAC_PKCS5, TEE_TYPE_AES, vect7, 3),
1657 XTEST_MAC_CBC_CASE(TEE_ALG_DES_CBC_MAC_PKCS5, TEE_TYPE_DES, vect8, 23),
1658 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect9,
1659 34),
Pascal Brand5c3d8092015-07-23 08:20:26 +02001660 XTEST_MAC_CBC_CASE(TEE_ALG_DES3_CBC_MAC_PKCS5, TEE_TYPE_DES3, vect10, 4),
Pascal Brandc639ac82015-07-02 08:53:34 +02001661
1662 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect1_key,
1663 ARRAY_SIZE(mac_cmac_vect1_key), 0, NULL, 0, mac_cmac_vect1_out,
1664 ARRAY_SIZE(mac_cmac_vect1_out) },
1665 XTEST_MAC_CMAC_CASE(vect2, 9),
1666 XTEST_MAC_CMAC_CASE(vect3, 9),
1667 XTEST_MAC_CMAC_CASE(vect4, 9),
1668 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect5_key,
1669 ARRAY_SIZE(mac_cmac_vect5_key), 0, NULL, 0, mac_cmac_vect5_out,
1670 ARRAY_SIZE(mac_cmac_vect5_out) },
1671 XTEST_MAC_CMAC_CASE(vect6, 9),
1672 XTEST_MAC_CMAC_CASE(vect7, 9),
1673 XTEST_MAC_CMAC_CASE(vect8, 9),
1674 { TEE_ALG_AES_CMAC, TEE_TYPE_AES, mac_cmac_vect9_key,
1675 ARRAY_SIZE(mac_cmac_vect9_key), 0, NULL, 0, mac_cmac_vect9_out,
1676 ARRAY_SIZE(mac_cmac_vect9_out) },
1677 XTEST_MAC_CMAC_CASE(vect10, 9),
1678 XTEST_MAC_CMAC_CASE(vect11, 9),
1679 XTEST_MAC_CMAC_CASE(vect12, 9),
Jerome Forissier9f17e262019-12-13 14:12:41 +01001680
1681 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1682 mac_data_sm3_d31_key,
1683 13, mac_data_sm3_d31_in, mac_data_sm3_d31_out),
1684 XTEST_MAC_CASE(TEE_ALG_HMAC_SM3, TEE_TYPE_HMAC_SM3,
1685 mac_data_sm3_d32_key,
1686 13, mac_data_sm3_d32_in, mac_data_sm3_d32_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02001687};
1688
1689static void xtest_tee_test_4002(ADBG_Case_t *c)
1690{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001691 TEEC_Session session = { };
1692 TEE_OperationHandle op1 = TEE_HANDLE_NULL;
1693 TEE_OperationHandle op2 = TEE_HANDLE_NULL;
1694 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
1695 uint8_t out[64] = { };
1696 size_t out_size = 0;
1697 uint32_t ret_orig = 0;
1698 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001699
1700 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1701 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
1702 &ret_orig)))
1703 return;
1704
1705 for (n = 0; n < ARRAY_SIZE(mac_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01001706 TEE_Attribute key_attr = { };
1707 size_t key_size = 0;
1708 size_t offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001709
1710 Do_ADBG_BeginSubCase(c, "MAC case %d algo 0x%x",
1711 (int)n, (unsigned int)mac_cases[n].algo);
1712
1713 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
1714 key_attr.content.ref.buffer = (void *)mac_cases[n].key;
1715 key_attr.content.ref.length = mac_cases[n].key_len;
1716
1717 key_size = key_attr.content.ref.length * 8;
1718 if (mac_cases[n].key_type == TEE_TYPE_DES ||
1719 mac_cases[n].key_type == TEE_TYPE_DES3)
1720 /* Exclude parity in bit size of key */
1721 key_size -= key_size / 8;
1722
1723 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1724 ta_crypt_cmd_allocate_operation(c, &session, &op1,
1725 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1726 goto out;
1727
1728 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1729 ta_crypt_cmd_allocate_operation(c, &session, &op2,
1730 mac_cases[n].algo, TEE_MODE_MAC, key_size)))
1731 goto out;
1732
1733 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1734 ta_crypt_cmd_allocate_transient_object(c, &session,
1735 mac_cases[n].key_type, key_size, &key_handle)))
1736 goto out;
1737
1738 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1739 ta_crypt_cmd_populate_transient_object(c, &session,
1740 key_handle, &key_attr, 1)))
1741 goto out;
1742
1743 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1744 ta_crypt_cmd_set_operation_key(c, &session, op1,
1745 key_handle)))
1746 goto out;
1747
1748 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1749 ta_crypt_cmd_free_transient_object(c, &session,
1750 key_handle)))
1751 goto out;
1752
1753 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1754 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1755 goto out;
1756
Jerome Forissier3dec7442019-01-30 17:50:05 +01001757 offs = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02001758 if (mac_cases[n].in != NULL) {
Jerome Forissier3dec7442019-01-30 17:50:05 +01001759 while (offs + mac_cases[n].in_incr <
1760 mac_cases[n].in_len) {
1761 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1762 ta_crypt_cmd_mac_update(c, &session,
1763 op1, mac_cases[n].in + offs,
1764 mac_cases[n].in_incr)))
1765 goto out;
1766 offs += mac_cases[n].in_incr;
1767 if (!mac_cases[n].multiple_incr)
1768 break;
1769 }
Pascal Brandc639ac82015-07-02 08:53:34 +02001770 }
1771
1772 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1773 ta_crypt_cmd_copy_operation(c, &session, op2, op1)))
1774 goto out;
1775
1776 out_size = sizeof(out);
1777 memset(out, 0, sizeof(out));
1778 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1779 ta_crypt_cmd_mac_final_compute(c, &session, op2,
Jerome Forissier3dec7442019-01-30 17:50:05 +01001780 mac_cases[n].in + offs,
1781 mac_cases [n].in_len - offs,
Pascal Brandc639ac82015-07-02 08:53:34 +02001782 out, &out_size)))
1783 goto out;
1784
1785 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1786 mac_cases[n].out_len, out, out_size);
1787
1788 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1789 ta_crypt_cmd_mac_init(c, &session, op1, NULL, 0)))
1790 goto out;
1791
1792 out_size = sizeof(out);
1793 memset(out, 0, sizeof(out));
1794 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1795 ta_crypt_cmd_mac_final_compute(c, &session, op1,
1796 mac_cases[n].in, mac_cases[n].in_len, out,
1797 &out_size)))
1798 goto out;
1799
1800 (void)ADBG_EXPECT_BUFFER(c, mac_cases[n].out,
1801 mac_cases[n].out_len, out, out_size);
1802
1803 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1804 ta_crypt_cmd_free_operation(c, &session, op1)))
1805 goto out;
1806
1807 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
1808 ta_crypt_cmd_free_operation(c, &session, op2)))
1809 goto out;
1810
1811 Do_ADBG_EndSubCase(c, NULL);
1812 }
1813out:
1814 TEEC_CloseSession(&session);
1815}
Jens Wiklander14f48872018-06-29 15:30:13 +02001816ADBG_CASE_DEFINE(regression, 4002, xtest_tee_test_4002,
1817 "Test TEE Internal API MAC operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02001818
Pascal Brandc639ac82015-07-02 08:53:34 +02001819static const uint8_t ciph_data_aes_key1[] = {
1820 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1821 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1822};
1823
Jerome Forissier0780ad42018-06-05 15:02:37 +02001824static const uint8_t ciph_data_aes_key2[] = {
1825 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1826 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
1827};
1828
Pascal Brandc639ac82015-07-02 08:53:34 +02001829static const uint8_t ciph_data_des_key1[] = {
1830 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 /* 01234567 */
1831};
1832
1833static const uint8_t ciph_data_des_key2[] = {
1834 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1835};
1836
1837
1838static const uint8_t ciph_data_des3_key1[] = {
1839 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1840 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1841 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1842};
1843
1844static const uint8_t ciph_data_des3_key2[] = {
1845 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1846 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1,
1847 0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1
1848};
1849
1850static const uint8_t ciph_data_des2_key1[] = {
1851 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1852 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1853};
1854
1855static const uint8_t ciph_data_in1[] = {
1856 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1857 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1858 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1859 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1860 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1861 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1862};
1863
1864static const uint8_t ciph_data_in3[] = {
1865 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1866 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1867 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1868 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1869 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1870 0x43, 0x44, 0x45, 0x46, 0x30, /* CDEF0 */
1871};
1872
Jerome Forissier45218eb2018-04-11 13:03:26 +02001873static const uint8_t ciph_data_in4[] = {
1874 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, /* 23456789 */
1875 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, /* ABCDEF01 */
1876 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, /* 3456789A */
1877 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, /* BCDEF012 */
1878 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, /* 456789AB */
1879 0x43, 0x44, 0x45, 0x46, 0x30, 0x31, 0x32, 0x33, /* CDEF0123 */
1880 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1881 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1882};
1883
Jerome Forissier0780ad42018-06-05 15:02:37 +02001884static const uint8_t ciph_data_in5[] = {
1885 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1886 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1887 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1888 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1889 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1890 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1891 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1892 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001893 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
1894 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
Jerome Forissier0780ad42018-06-05 15:02:37 +02001895 0x01, 0x01, 0x01
1896};
1897
Pascal Brandc639ac82015-07-02 08:53:34 +02001898static const uint8_t ciph_data_128_iv1[] = {
1899 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1900 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30, /* 9ABCDEF0 */
1901};
1902
Jerome Forissier0780ad42018-06-05 15:02:37 +02001903static const uint8_t ciph_data_128_iv2[] = {
1904 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1905 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
1906};
1907
Pascal Brandc639ac82015-07-02 08:53:34 +02001908static const uint8_t ciph_data_64_iv1[] = {
1909 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, /* 12345678 */
1910};
1911
1912static const uint8_t ciph_data_in2[] = {
1913 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef
1914};
1915
1916static const uint8_t ciph_data_aes_ecb_nopad_out1[] = {
1917 0xA5, 0xBE, 0x14, 0xD5, 0x01, 0x05, 0x24, 0x48, /* ......$H */
1918 0x58, 0x1A, 0x6B, 0x82, 0xD4, 0x41, 0xD2, 0xB3, /* X.k..A.. */
1919 0xBB, 0xF9, 0xAE, 0x37, 0x94, 0xAC, 0x18, 0x50, /* ...7...P */
1920 0x87, 0x09, 0xCC, 0x3F, 0x43, 0xD2, 0xC2, 0xB7, /* ...?C... */
1921 0xD7, 0x6F, 0x84, 0x07, 0xB4, 0x78, 0xCE, 0x34, /* .o...x.4 */
1922 0x48, 0xC9, 0x16, 0x86, 0x42, 0xB8, 0xFF, 0xCF, /* H...B... */
1923};
1924
1925static const uint8_t ciph_data_aes_cbc_nopad_out1[] = {
1926 0x8D, 0x9F, 0x88, 0xD8, 0xAF, 0x9F, 0xC1, 0x3B, /* .......; */
1927 0x02, 0x15, 0x43, 0x6A, 0x8C, 0x1E, 0x34, 0x5C, /* ..Cj..4\ */
1928 0x83, 0xF4, 0x85, 0x3E, 0x43, 0x0F, 0xE5, 0x5F, /* ...>C.._ */
1929 0x81, 0x4C, 0xC0, 0x28, 0x3F, 0xD9, 0x98, 0x53, /* .L.(?..S */
1930 0xB1, 0x44, 0x51, 0x38, 0x21, 0xAB, 0x10, 0xCE, /* .DQ8!... */
1931 0xC2, 0xEC, 0x65, 0x54, 0xDD, 0x5C, 0xEA, 0xDC, /* ..eT.\.. */
1932};
1933
1934static const uint8_t ciph_data_aes_ctr_out1[] = {
1935 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1936 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1937 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1938 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1939 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1940 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1941};
1942
1943static const uint8_t ciph_data_aes_ctr_out2[] = {
1944 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1945 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1946 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1947 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1948 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1949 0x72, 0x0E, 0x3C, 0xD1, 0xA1, /* r.<.. */
1950};
1951
Jerome Forissier45218eb2018-04-11 13:03:26 +02001952static const uint8_t ciph_data_aes_ctr_out4[] = {
1953 0xD2, 0xDD, 0x11, 0xA8, 0xF7, 0xB0, 0xAE, 0x55, /* .......U */
1954 0xBE, 0x61, 0x7A, 0xE6, 0xA1, 0x6C, 0x79, 0xF4, /* .az..ly. */
1955 0x62, 0x51, 0x7B, 0xE9, 0x7C, 0xA0, 0x31, 0x0C, /* bQ{.|.1. */
1956 0x24, 0x15, 0x70, 0x7F, 0x47, 0x37, 0x69, 0xE0, /* $.p.G7i. */
1957 0x24, 0xC3, 0x29, 0xCD, 0xF2, 0x26, 0x69, 0xFF, /* $.)..&i. */
1958 0x72, 0x0E, 0x3C, 0xD1, 0xA1, 0x2F, 0x5D, 0x33, /* r.<../]3 */
1959 0x9F, 0xD7, 0x0C, 0x92, 0xD4, 0xA5, 0x9D, 0x06, /* ........ */
1960 0x01, 0x80, 0x38, 0xCD, 0xC2, 0x71, 0x5D, 0x4A, /* ..8..q]J */
1961};
1962
Jerome Forissier0780ad42018-06-05 15:02:37 +02001963static const uint8_t ciph_data_aes_ctr_out5[] = {
1964 0xbb, 0xfe, 0x07, 0x04, 0x1c, 0x8e, 0x09, 0x61,
1965 0xfb, 0xb1, 0x7c, 0xa5, 0x4d, 0x2b, 0x30, 0xf6,
1966 0x26, 0x9e, 0xff, 0x61, 0x18, 0x47, 0xc6, 0x06,
1967 0x81, 0x02, 0x84, 0xcd, 0x9c, 0x4b, 0x6d, 0x21,
1968 0xe2, 0x64, 0xa6, 0x50, 0x7f, 0x28, 0x81, 0x6f,
1969 0x29, 0xda, 0xd5, 0x56, 0x3f, 0x46, 0xac, 0xca,
1970 0x37, 0xe7, 0x77, 0x36, 0xbc, 0x76, 0x39, 0x57,
1971 0xaa, 0x67, 0x1b, 0x2a, 0xe6, 0x36, 0x57, 0x6d,
Jerome Forissierbf9009e2018-06-05 18:44:42 +02001972 0x2a, 0xb8, 0x77, 0x41, 0xc2, 0x4e, 0x4f, 0x27,
1973 0x4c, 0x34, 0x7a, 0x01, 0x6a, 0xda, 0x75, 0x75,
1974 0x3e, 0x68, 0xb2
Jerome Forissier0780ad42018-06-05 15:02:37 +02001975};
1976
Pascal Brandc639ac82015-07-02 08:53:34 +02001977static const uint8_t ciph_data_aes_cbc_vect1_key[] = {
1978 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* 01234567 */
1979 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, /* 89ABCDEF */
1980};
1981
1982static const uint8_t ciph_data_aes_cbc_vect1_iv[] = {
1983 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ........ */
1985};
1986
1987static const uint8_t ciph_data_aes_cbc_vect1_ptx[] = {
1988 0x43, 0x69, 0x70, 0x68, 0x65, 0x72, 0x20, 0x62, /* Cipher b */
1989 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x63, 0x68, 0x61, /* lock cha */
1990 0x69, 0x6E, 0x69, 0x6E, 0x67, 0x20, 0x28, 0x43, /* ining (C */
1991 0x42, 0x43, 0x29, 0x20, 0x69, 0x73, 0x20, 0x61, /* BC) is a */
1992 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, /* common */
1993 0x63, 0x68, 0x61, 0x69, 0x6E, 0x69, 0x6E, 0x67, /* chaining */
1994 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x20, 0x69, 0x6E, /* mode in */
1995 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, /* which t */
1996 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, /* he previ */
1997 0x6F, 0x75, 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, /* ous bloc */
1998 0x6B, 0x27, 0x73, 0x20, 0x63, 0x69, 0x70, 0x68, /* k's ciph */
1999 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x20, 0x69, /* ertext i */
2000 0x73, 0x20, 0x78, 0x6F, 0x72, 0x65, 0x64, 0x20, /* s xored */
2001 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, /* with the */
2002 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, /* current */
2003 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x27, 0x73, /* block's */
2004 0x20, 0x70, 0x6C, 0x61, 0x69, 0x6E, 0x74, 0x65, /* plainte */
2005 0x78, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6F, 0x72, /* xt befor */
2006 0x65, 0x20, 0x65, 0x6E, 0x63, 0x72, 0x79, 0x70, /* e encryp */
2007 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x2E, 0x2E, 0x2E, /* tion.... */
2008};
2009
2010static const uint8_t ciph_data_aes_cbc_vect1_ctx[] = {
2011 0xDD, 0x16, 0xC3, 0x47, 0x69, 0xEC, 0xF5, 0x86, /* ...Gi... */
2012 0x20, 0xB4, 0xF7, 0xE3, 0xB9, 0x36, 0xE8, 0xAC, /* ....6.. */
2013 0xC9, 0xA2, 0x11, 0x71, 0x3B, 0x10, 0x9D, 0x45, /* ...q;..E */
2014 0xCA, 0xE2, 0x49, 0xA6, 0x4E, 0x56, 0x07, 0xC5, /* ..I.NV.. */
2015 0xCE, 0xA3, 0x14, 0xB5, 0x30, 0x1B, 0x63, 0xBB, /* ....0.c. */
2016 0x2D, 0x6F, 0xE9, 0xCA, 0x0B, 0x00, 0x31, 0x3F, /* -o....1? */
2017 0xA4, 0x9A, 0x39, 0xE1, 0xC8, 0xD2, 0x24, 0x95, /* ..9...$. */
2018 0x14, 0xE9, 0xD2, 0x43, 0xE8, 0xA8, 0x1E, 0x0A, /* ...C.... */
2019 0xFE, 0x9D, 0x4F, 0xF5, 0xBB, 0x16, 0xB9, 0x54, /* ..O....T */
2020 0x78, 0x07, 0x94, 0x05, 0x8E, 0x47, 0xC3, 0xCB, /* x....G.. */
2021 0x7C, 0xEC, 0xF4, 0xF8, 0xF2, 0xA4, 0x59, 0x6E, /* |.....Yn */
2022 0xED, 0xAD, 0x7F, 0x62, 0xAF, 0x89, 0xA8, 0x5B, /* ...b...[ */
2023 0x75, 0xD4, 0x73, 0xE3, 0xBA, 0x9F, 0x9A, 0xD2, /* u.s..... */
2024 0x0F, 0xFD, 0x3C, 0xE6, 0xC6, 0xA4, 0xD6, 0x6C, /* ..<....l */
2025 0x6A, 0x09, 0xE2, 0x16, 0xB0, 0x8C, 0x69, 0x3C, /* j.....i< */
2026 0xC8, 0x1C, 0xE4, 0x3E, 0x86, 0x4D, 0xB0, 0x2B, /* ...>.M.+ */
2027 0x29, 0xA0, 0x5A, 0xA3, 0x67, 0xBA, 0xDC, 0x11, /* ).Z.g... */
2028 0x08, 0x5E, 0x69, 0xB4, 0x6F, 0xA5, 0xE2, 0xB8, /* .^i.o... */
2029 0xC9, 0x6E, 0x83, 0x7E, 0x35, 0xC8, 0xA7, 0xA0, /* .n.~5... */
2030 0x33, 0xA3, 0xB1, 0x4B, 0x5A, 0x92, 0x51, 0x2E, /* 3..KZ.Q. */
2031};
2032
2033/* AES-CTS test vectors from http://tools.ietf.org/html/rfc3962
2034 * and http://tools.ietf.org/html/draft-raeburn-krb-rijndael-krb-02 */
2035static const uint8_t ciph_data_aes_cts_vect1_key[] = {
2036 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20,
2037 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69
2038};
2039
2040static const uint8_t ciph_data_aes_cts_vect1_iv[16] = {
2041 0x00
2042};
2043
2044static const uint8_t ciph_data_aes_cts_vect1_ptx[] = {
2045 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
2046 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
2047 0x20
2048};
2049
2050static const uint8_t ciph_data_aes_cts_vect1_ctx[] = {
2051 0xc6, 0x35, 0x35, 0x68, 0xf2, 0xbf, 0x8c, 0xb4,
2052 0xd8, 0xa5, 0x80, 0x36, 0x2d, 0xa7, 0xff, 0x7f,
2053 0x97
2054};
2055
2056#define ciph_data_aes_cts_vect2_key ciph_data_aes_cts_vect1_key
2057#define ciph_data_aes_cts_vect2_iv ciph_data_aes_cts_vect1_iv
2058static const uint8_t ciph_data_aes_cts_vect2_ptx[] = {
2059 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
2060 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
2061 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
2062 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20
2063};
2064
2065static const uint8_t ciph_data_aes_cts_vect2_ctx[] = {
2066 0xfc, 0x00, 0x78, 0x3e, 0x0e, 0xfd, 0xb2, 0xc1,
2067 0xd4, 0x45, 0xd4, 0xc8, 0xef, 0xf7, 0xed, 0x22,
2068 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
2069 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5
2070};
2071
2072#define ciph_data_aes_cts_vect3_key ciph_data_aes_cts_vect1_key
2073#define ciph_data_aes_cts_vect3_iv ciph_data_aes_cts_vect1_iv
2074static const uint8_t ciph_data_aes_cts_vect3_ptx[] = {
2075 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
2076 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
2077 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
2078 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
2079};
2080
2081static const uint8_t ciph_data_aes_cts_vect3_ctx[] = {
2082 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
2083 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
2084 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
2085 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
2086};
2087
2088#define ciph_data_aes_cts_vect4_key ciph_data_aes_cts_vect1_key
2089#define ciph_data_aes_cts_vect4_iv ciph_data_aes_cts_vect1_iv
2090static const uint8_t ciph_data_aes_cts_vect4_ptx[] = {
2091 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
2092 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
2093 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
2094 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
2095 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
2096 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c,
2097};
2098
2099static const uint8_t ciph_data_aes_cts_vect4_ctx[] = {
2100 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
2101 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
2102 0xb3, 0xff, 0xfd, 0x94, 0x0c, 0x16, 0xa1, 0x8c,
2103 0x1b, 0x55, 0x49, 0xd2, 0xf8, 0x38, 0x02, 0x9e,
2104 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
2105 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5,
2106};
2107
2108#define ciph_data_aes_cts_vect5_key ciph_data_aes_cts_vect1_key
2109#define ciph_data_aes_cts_vect5_iv ciph_data_aes_cts_vect1_iv
2110static const uint8_t ciph_data_aes_cts_vect5_ptx[] = {
2111 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
2112 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
2113 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
2114 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
2115 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
2116 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
2117};
2118
2119static const uint8_t ciph_data_aes_cts_vect5_ctx[] = {
2120 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
2121 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
2122 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
2123 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
2124 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
2125 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
2126};
2127
2128#define ciph_data_aes_cts_vect6_key ciph_data_aes_cts_vect1_key
2129#define ciph_data_aes_cts_vect6_iv ciph_data_aes_cts_vect1_iv
2130static const uint8_t ciph_data_aes_cts_vect6_ptx[] = {
2131 0x49, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20,
2132 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65,
2133 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
2134 0x20, 0x47, 0x61, 0x75, 0x27, 0x73, 0x20, 0x43,
2135 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x2c, 0x20,
2136 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20,
2137 0x61, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x6e, 0x74,
2138 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x70, 0x2e,
2139};
2140
2141static const uint8_t ciph_data_aes_cts_vect6_ctx[] = {
2142 0x97, 0x68, 0x72, 0x68, 0xd6, 0xec, 0xcc, 0xc0,
2143 0xc0, 0x7b, 0x25, 0xe2, 0x5e, 0xcf, 0xe5, 0x84,
2144 0x39, 0x31, 0x25, 0x23, 0xa7, 0x86, 0x62, 0xd5,
2145 0xbe, 0x7f, 0xcb, 0xcc, 0x98, 0xeb, 0xf5, 0xa8,
2146 0x48, 0x07, 0xef, 0xe8, 0x36, 0xee, 0x89, 0xa5,
2147 0x26, 0x73, 0x0d, 0xbc, 0x2f, 0x7b, 0xc8, 0x40,
2148 0x9d, 0xad, 0x8b, 0xbb, 0x96, 0xc4, 0xcd, 0xc0,
2149 0x3b, 0xc1, 0x03, 0xe1, 0xa1, 0x94, 0xbb, 0xd8,
2150};
2151
Jerome Forissiered00e162017-01-20 09:22:52 +01002152/*
2153 * Test case for https://github.com/OP-TEE/optee_os/issues/1203
2154 * 80 bytes of data, processed in two steps (32 + 48).
2155 */
2156
2157#define ciph_data_aes_cts_issue1203_key ciph_data_aes_cts_vect1_key
2158
2159static const uint8_t ciph_data_aes_cts_issue1203_iv[] = {
2160 0x5b, 0x11, 0x7b, 0xf9, 0x83, 0x6a, 0x01, 0x27,
2161 0x1d, 0x2a, 0xae, 0x0a, 0xd3, 0x27, 0x35, 0x81,
2162};
2163
2164static const uint8_t ciph_data_aes_cts_issue1203_ptx[] = {
2165 0x33, 0x2a, 0xf4, 0x8c, 0x18, 0xa1, 0x30, 0x7c,
2166 0xa7, 0x52, 0x76, 0xca, 0xa6, 0x68, 0xad, 0xf6,
2167 0x1e, 0xba, 0xc9, 0x66, 0x66, 0x52, 0x1a, 0xe7,
2168 0x3e, 0xbc, 0xba, 0x60, 0x95, 0x71, 0x04, 0x5e,
2169 0xb4, 0xb7, 0x10, 0xd7, 0x93, 0x6d, 0x5f, 0x9a,
2170 0xb8, 0xbb, 0x6b, 0xb0, 0x6d, 0x47, 0x93, 0x41,
2171 0x29, 0x21, 0xf2, 0x84, 0xf5, 0xb2, 0xf2, 0x6d,
2172 0xbe, 0xe5, 0x8a, 0x2b, 0x58, 0x8d, 0x1b, 0x5e,
2173 0x41, 0x04, 0xba, 0x9e, 0x92, 0xe9, 0x52, 0xb6,
2174 0x8b, 0x1e, 0x36, 0x72, 0x91, 0xe4, 0x56, 0x66,
2175};
2176
2177/*
2178 * Ciphertext was generated by an online tool for AES CBC.
2179 * Since the input size is a multiple of the block size, and the ciphertext
2180 * format is CS3, the output is the same as plain AES CBC with the last
2181 * two blocks swapped.
2182 */
2183static const uint8_t ciph_data_aes_cts_issue1203_ctx[] = {
2184 0x6c, 0xfe, 0xef, 0x6a, 0x1c, 0x8f, 0xd3, 0xc3,
2185 0x66, 0xc4, 0xd9, 0x0e, 0xbe, 0x24, 0x17, 0x3f,
2186 0xcd, 0x19, 0xc9, 0xd2, 0x10, 0x3f, 0xcf, 0xdc,
2187 0xe9, 0x05, 0xab, 0xd5, 0x1a, 0x31, 0x41, 0x77,
2188 0x3b, 0xd7, 0x6a, 0x26, 0xae, 0x0d, 0xc9, 0x47,
2189 0x77, 0xd4, 0xa7, 0xd5, 0x73, 0x88, 0x9e, 0xde,
2190 0x72, 0x66, 0xe0, 0xe2, 0x3d, 0x62, 0x91, 0x22,
2191 0xae, 0x11, 0x01, 0x97, 0x22, 0x6a, 0x45, 0xa9,
2192 0xba, 0x56, 0xd2, 0xbc, 0x55, 0x2d, 0x99, 0x4d,
2193 0x3d, 0x22, 0x27, 0x9a, 0xac, 0x66, 0x2f, 0xf5,
2194};
2195
Pascal Brandc639ac82015-07-02 08:53:34 +02002196static const uint8_t ciph_data_des_ecb_nopad_out1[] = {
2197 0x46, 0x2B, 0x91, 0xA8, 0x55, 0xE6, 0x7E, 0x75, /* F+..U.~u */
2198 0x5E, 0x53, 0xF4, 0x8F, 0x29, 0x41, 0x4E, 0xEF, /* ^S..)AN. */
2199 0x32, 0x1B, 0x58, 0x42, 0x9B, 0xB4, 0x3A, 0x1F, /* 2.XB..:. */
2200 0x9A, 0xEA, 0xA4, 0xB4, 0xCD, 0xE9, 0x87, 0x7C, /* .......| */
2201 0xC0, 0x05, 0x34, 0xED, 0x86, 0x3C, 0x2A, 0x81, /* ..4..<.. */
2202 0x5E, 0x93, 0x0E, 0x86, 0xA9, 0xBB, 0x80, 0xFF, /* ^....... */
2203};
2204
2205static const uint8_t ciph_data_des_ecb_nopad_out2[] = {
2206 0x85, 0xE8, 0x13, 0x54, 0x0F, 0x0A, 0xB4, 0x05
2207};
2208
2209static const uint8_t ciph_data_des_cbc_nopad_out1[] = {
2210 0xAD, 0xD6, 0xD6, 0x3E, 0x88, 0xD0, 0xDD, 0xD4, /* ...>.... */
2211 0x9A, 0x93, 0x95, 0xA0, 0x86, 0x22, 0x5B, 0x9E, /* ....."[. */
2212 0x84, 0x0C, 0x6F, 0x12, 0x04, 0x11, 0x6F, 0xD4, /* ..o...o. */
2213 0x12, 0x29, 0xC6, 0x78, 0x0C, 0xFB, 0x58, 0x5B, /* .).x..X[ */
2214 0x66, 0x82, 0x0E, 0x52, 0xDC, 0x25, 0x16, 0x51, /* f..R.%.Q */
2215 0x69, 0xDF, 0xFE, 0x4E, 0x11, 0x1D, 0x9D, 0x08, /* i..N.... */
2216};
2217
2218static const uint8_t ciph_data_des3_ecb_nopad_out1[] = {
2219 0xA7, 0x46, 0xEC, 0xA8, 0x6A, 0x7F, 0x4A, 0xF1, /* .F..j.J. */
2220 0x44, 0x60, 0x37, 0x3B, 0x7F, 0x76, 0xE5, 0xFF, /* D`7;.v.. */
2221 0xC1, 0xE7, 0xA5, 0x04, 0x9C, 0x29, 0x5C, 0xA5, /* .....)\. */
2222 0xDD, 0xC8, 0xEE, 0x36, 0x1F, 0x48, 0xE0, 0xA9, /* ...6.H.. */
2223 0x82, 0x2D, 0x53, 0x84, 0x49, 0x69, 0x78, 0xFA, /* .-S.Iix. */
2224 0x23, 0x69, 0x1D, 0xF7, 0x08, 0x38, 0x44, 0x05, /* #i...8D. */
2225};
2226
2227static const uint8_t ciph_data_des3_cbc_nopad_out1[] = {
2228 0x18, 0x09, 0xEB, 0x98, 0xE4, 0x58, 0x72, 0x11, /* .....Xr. */
2229 0x30, 0x58, 0xAB, 0x38, 0xB0, 0xC9, 0x2B, 0xED, /* 0X.8..+. */
2230 0xDA, 0xC5, 0xE8, 0xA9, 0xF6, 0x8A, 0xA7, 0x80, /* ........ */
2231 0xBE, 0x54, 0x1F, 0x63, 0xF6, 0xEE, 0xA2, 0x4C, /* .T.c...L */
2232 0x7C, 0xEB, 0x84, 0x7D, 0xDA, 0xCA, 0x1E, 0xB2, /* |..}.... */
2233 0xED, 0x5E, 0x96, 0xB8, 0x01, 0x4B, 0x77, 0x02, /* .^...Kw. */
2234};
2235
2236static const uint8_t ciph_data_des2_ecb_nopad_out1[] = {
2237 0xAB, 0x12, 0xB6, 0xE2, 0x4A, 0x3A, 0x26, 0x14, /* ....J:&. */
2238 0xF0, 0x7D, 0x23, 0xD0, 0x55, 0xDF, 0x5C, 0x16, /* .}#.U.\. */
2239 0x43, 0x59, 0x1E, 0x44, 0x01, 0x76, 0xD7, 0x50, /* CY.D.v.P */
2240 0x44, 0xC0, 0x15, 0xDF, 0x2E, 0x7F, 0x8B, 0xC5, /* D....... */
2241 0xFF, 0x8B, 0x87, 0xFE, 0x33, 0xD7, 0xCB, 0x2C, /* ....3.., */
2242 0xDA, 0x79, 0x6F, 0xA4, 0x05, 0x2B, 0x30, 0xCE, /* .yo..+0. */
2243};
2244
2245static const uint8_t ciph_data_des2_cbc_nopad_out1[] = {
2246 0x47, 0x2F, 0xB1, 0x83, 0xC4, 0xBB, 0x93, 0x16, /* G/...... */
2247 0x73, 0xF9, 0xAD, 0x6F, 0x00, 0xF9, 0xCB, 0x4A, /* s..o...J */
2248 0x0F, 0x4F, 0x75, 0x75, 0xFB, 0x39, 0x0B, 0xFC, /* .Ouu.9.. */
2249 0x9F, 0x48, 0x52, 0xAD, 0xA2, 0x75, 0x2C, 0xF1, /* .HR..u, . */
2250 0x7D, 0xC3, 0x8F, 0x16, 0xCF, 0xC9, 0x76, 0x29, /* }.....v) */
2251 0x1A, 0xBF, 0xB3, 0xD9, 0x10, 0x7E, 0xAA, 0x49, /* .....~.I */
2252};
2253
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002254/* SM4 ECB */
2255
2256static const uint8_t ciph_data_sm4_key1[] = {
2257 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2258 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2259};
2260
2261static const uint8_t ciph_data_sm4_in1[] = {
2262 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2263 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2264};
2265
2266static const uint8_t ciph_data_sm4_ecb_nopad_out1[] = {
2267 0x68, 0x1e, 0xdf, 0x34, 0xd2, 0x06, 0x96, 0x5e,
2268 0x86, 0xb3, 0xe9, 0x4f, 0x53, 0x6e, 0x42, 0x46,
2269};
2270
2271/*
2272 * SM4 CBC
2273 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.1
2274 */
2275static const uint8_t ciph_data_sm4_cbc_a221_key[] = {
2276 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2277 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2278};
2279
2280static const uint8_t ciph_data_sm4_cbc_a221_iv[] = {
2281 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2282 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2283};
2284
2285static const uint8_t ciph_data_sm4_cbc_a221_in[] = {
2286 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2287 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2288 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2289 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2290};
2291
2292static const uint8_t ciph_data_sm4_cbc_a221_out[] = {
2293 0x78, 0xeb, 0xb1, 0x1c, 0xc4, 0x0b, 0x0a, 0x48,
2294 0x31, 0x2a, 0xae, 0xb2, 0x04, 0x02, 0x44, 0xcb,
2295 0x4c, 0xb7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26,
2296 0x97, 0x9b, 0x0d, 0x15, 0xdc, 0x6a, 0x8f, 0x6d,
2297};
2298
2299/*
2300 * SM4 CBC
2301 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.2.2
2302 */
2303static const uint8_t ciph_data_sm4_cbc_a222_key[] = {
2304 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2305 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2306};
2307
2308static const uint8_t ciph_data_sm4_cbc_a222_iv[] = {
2309 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2310 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2311};
2312
2313static const uint8_t ciph_data_sm4_cbc_a222_in[] = {
2314 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2315 0xcc, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd,
2316 0xee, 0xee, 0xee, 0xee, 0xff, 0xff, 0xff, 0xff,
2317 0xaa, 0xaa, 0xaa, 0xaa, 0xbb, 0xbb, 0xbb, 0xbb,
2318};
2319
2320static const uint8_t ciph_data_sm4_cbc_a222_out[] = {
2321 0x0d, 0x3a, 0x6d, 0xdc, 0x2d, 0x21, 0xc6, 0x98,
2322 0x85, 0x72, 0x15, 0x58, 0x7b, 0x7b, 0xb5, 0x9a,
2323 0x91, 0xf2, 0xc1, 0x47, 0x91, 0x1a, 0x41, 0x44,
2324 0x66, 0x5e, 0x1f, 0xa1, 0xd4, 0x0b, 0xae, 0x38,
2325};
2326
2327/*
2328 * SM4 CTR
2329 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.1
2330 */
2331static const uint8_t ciph_data_sm4_ctr_a251_key[] = {
2332 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2333 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2334};
2335
2336static const uint8_t ciph_data_sm4_ctr_a251_iv[] = {
2337 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2338 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2339};
2340
2341static const uint8_t ciph_data_sm4_ctr_a251_in[] = {
2342 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2343 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2344 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2345 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2346 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2347 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2348 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2349 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2350};
2351
2352static const uint8_t ciph_data_sm4_ctr_a251_out[] = {
2353 0xac, 0x32, 0x36, 0xcb, 0x97, 0x0c, 0xc2, 0x07,
2354 0x91, 0x36, 0x4c, 0x39, 0x5a, 0x13, 0x42, 0xd1,
2355 0xa3, 0xcb, 0xc1, 0x87, 0x8c, 0x6f, 0x30, 0xcd,
2356 0x07, 0x4c, 0xce, 0x38, 0x5c, 0xdd, 0x70, 0xc7,
2357 0xf2, 0x34, 0xbc, 0x0e, 0x24, 0xc1, 0x19, 0x80,
2358 0xfd, 0x12, 0x86, 0x31, 0x0c, 0xe3, 0x7b, 0x92,
2359 0x6e, 0x02, 0xfc, 0xd0, 0xfa, 0xa0, 0xba, 0xf3,
2360 0x8b, 0x29, 0x33, 0x85, 0x1d, 0x82, 0x45, 0x14,
2361};
2362
2363/*
2364 * SM4 CTR
2365 * https://tools.ietf.org/html/draft-ribose-cfrg-sm4-10#appendix-A.2.5.2
2366 */
2367static const uint8_t ciph_data_sm4_ctr_a252_key[] = {
2368 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
2369 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,
2370};
2371
2372static const uint8_t ciph_data_sm4_ctr_a252_iv[] = {
2373 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
2374 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
2375};
2376
2377static const uint8_t ciph_data_sm4_ctr_a252_in[] = {
2378 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2379 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2380 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2381 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
2382 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee,
2383 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2384 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
2385 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb,
2386};
2387
2388static const uint8_t ciph_data_sm4_ctr_a252_out[] = {
2389 0x5d, 0xcc, 0xcd, 0x25, 0xb9, 0x5a, 0xb0, 0x74,
2390 0x17, 0xa0, 0x85, 0x12, 0xee, 0x16, 0x0e, 0x2f,
2391 0x8f, 0x66, 0x15, 0x21, 0xcb, 0xba, 0xb4, 0x4c,
2392 0xc8, 0x71, 0x38, 0x44, 0x5b, 0xc2, 0x9e, 0x5c,
2393 0x0a, 0xe0, 0x29, 0x72, 0x05, 0xd6, 0x27, 0x04,
2394 0x17, 0x3b, 0x21, 0x23, 0x9b, 0x88, 0x7f, 0x6c,
2395 0x8c, 0xb5, 0xb8, 0x00, 0x91, 0x7a, 0x24, 0x88,
2396 0x28, 0x4b, 0xde, 0x9e, 0x16, 0xea, 0x29, 0x06,
2397};
2398
Pascal Brandc639ac82015-07-02 08:53:34 +02002399struct xtest_ciph_case {
2400 uint32_t algo;
2401 uint32_t mode;
2402 uint32_t key_type;
2403 const uint8_t *key1;
2404 size_t key1_len;
2405 const uint8_t *key2;
2406 size_t key2_len;
2407 const uint8_t *iv;
2408 size_t iv_len;
2409 size_t in_incr;
2410 const uint8_t *in;
2411 size_t in_len;
2412 const uint8_t *out;
2413 size_t out_len;
2414 size_t line;
2415};
2416
2417#define XTEST_CIPH_CASE_NO_IV(algo, key_type, key, in_incr, ptx, ctx) \
2418 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2419 NULL, 0, NULL, 0, \
2420 (in_incr), (ptx), ARRAY_SIZE(ptx), (ctx), ARRAY_SIZE(ctx), \
2421 __LINE__ }, \
2422 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2423 NULL, 0, NULL, 0, \
2424 (in_incr), (ctx), ARRAY_SIZE(ctx), (ptx), ARRAY_SIZE(ptx), __LINE__ }
2425
2426#define XTEST_CIPH_CASE(algo, key_type, key, iv, in_incr, ptx, ctx) \
2427 { (algo), TEE_MODE_ENCRYPT, (key_type), (key), ARRAY_SIZE(key), \
2428 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ptx), ARRAY_SIZE(ptx), \
2429 (ctx), ARRAY_SIZE(ctx), __LINE__ }, \
2430 { (algo), TEE_MODE_DECRYPT, (key_type), (key), ARRAY_SIZE(key), \
2431 NULL, 0, iv, ARRAY_SIZE(iv), (in_incr), (ctx), ARRAY_SIZE(ctx), \
2432 (ptx), ARRAY_SIZE(ptx), __LINE__ }
2433
2434#define XTEST_CIPH_CASE_AES_XTS(vect, in_incr) \
2435 { TEE_ALG_AES_XTS, TEE_MODE_ENCRYPT, TEE_TYPE_AES, \
2436 ciph_data_aes_xts_ ## vect ## _key1, \
2437 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2438 ciph_data_aes_xts_ ## vect ## _key2, \
2439 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2440 ciph_data_aes_xts_ ## vect ## _iv, \
2441 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2442 (in_incr), \
2443 ciph_data_aes_xts_ ## vect ## _ptx, \
2444 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), \
2445 ciph_data_aes_xts_ ## vect ## _ctx, \
2446 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), __LINE__ }, \
2447 { TEE_ALG_AES_XTS, TEE_MODE_DECRYPT, TEE_TYPE_AES, \
2448 ciph_data_aes_xts_ ## vect ## _key1, \
2449 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key1), \
2450 ciph_data_aes_xts_ ## vect ## _key2, \
2451 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _key2), \
2452 ciph_data_aes_xts_ ## vect ## _iv, \
2453 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _iv), \
2454 (in_incr), \
2455 ciph_data_aes_xts_ ## vect ## _ctx, \
2456 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ctx), \
2457 ciph_data_aes_xts_ ## vect ## _ptx, \
2458 ARRAY_SIZE(ciph_data_aes_xts_ ## vect ## _ptx), __LINE__ }
2459
2460#define XTEST_CIPH_CASE_AES_CBC(vect, in_incr) \
2461 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES, \
2462 ciph_data_aes_cbc_ ## vect ## _key, \
2463 ciph_data_aes_cbc_ ## vect ## _iv, \
2464 (in_incr), ciph_data_aes_cbc_ ## vect ## _ptx, \
2465 ciph_data_aes_cbc_ ## vect ## _ctx)
2466
2467#define XTEST_CIPH_CASE_AES_CTS(vect, in_incr) \
2468 XTEST_CIPH_CASE(TEE_ALG_AES_CTS, TEE_TYPE_AES, \
2469 ciph_data_aes_cts_ ## vect ## _key, \
2470 ciph_data_aes_cts_ ## vect ## _iv, \
2471 (in_incr), ciph_data_aes_cts_ ## vect ## _ptx, \
2472 ciph_data_aes_cts_ ## vect ## _ctx)
2473
2474static const struct xtest_ciph_case ciph_cases[] = {
2475 /* AES */
2476 XTEST_CIPH_CASE_NO_IV(TEE_ALG_AES_ECB_NOPAD, TEE_TYPE_AES,
2477 ciph_data_aes_key1, 11, ciph_data_in1,
2478 ciph_data_aes_ecb_nopad_out1),
2479 XTEST_CIPH_CASE(TEE_ALG_AES_CBC_NOPAD, TEE_TYPE_AES,
2480 ciph_data_aes_key1, ciph_data_128_iv1, 11,
2481 ciph_data_in1,
2482 ciph_data_aes_cbc_nopad_out1),
2483 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2484 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2485 ciph_data_in1,
2486 ciph_data_aes_ctr_out1),
2487 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2488 ciph_data_aes_key1, ciph_data_128_iv1, 13,
2489 ciph_data_in3,
2490 ciph_data_aes_ctr_out2),
Jens Wiklander692efd12018-01-19 09:52:00 +01002491 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2492 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2493 ciph_data_in3,
2494 ciph_data_aes_ctr_out2),
Jerome Forissier45218eb2018-04-11 13:03:26 +02002495 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2496 ciph_data_aes_key1, ciph_data_128_iv1, 16,
2497 ciph_data_in4,
2498 ciph_data_aes_ctr_out4),
Jerome Forissier0780ad42018-06-05 15:02:37 +02002499 XTEST_CIPH_CASE(TEE_ALG_AES_CTR, TEE_TYPE_AES,
2500 ciph_data_aes_key2, ciph_data_128_iv2, 11,
2501 ciph_data_in5,
2502 ciph_data_aes_ctr_out5),
Pascal Brandc639ac82015-07-02 08:53:34 +02002503
2504 XTEST_CIPH_CASE_AES_CBC(vect1, 11),
Jerome Forissierfc1bbc32018-06-12 10:13:04 +02002505 XTEST_CIPH_CASE_AES_CBC(vect1, 64),
Pascal Brandc639ac82015-07-02 08:53:34 +02002506
2507 /* AES-CTS */
2508 XTEST_CIPH_CASE_AES_CTS(vect1, 13),
2509 XTEST_CIPH_CASE_AES_CTS(vect2, 14),
2510 XTEST_CIPH_CASE_AES_CTS(vect3, 11),
2511 XTEST_CIPH_CASE_AES_CTS(vect4, 9),
2512 XTEST_CIPH_CASE_AES_CTS(vect5, 7),
2513 XTEST_CIPH_CASE_AES_CTS(vect6, 17),
2514 XTEST_CIPH_CASE_AES_CTS(vect6, 0x20),
Jerome Forissiered00e162017-01-20 09:22:52 +01002515 XTEST_CIPH_CASE_AES_CTS(issue1203, 32),
Pascal Brandc639ac82015-07-02 08:53:34 +02002516
2517 /* DES */
2518 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2519 ciph_data_des_key1, 14, ciph_data_in1,
2520 ciph_data_des_ecb_nopad_out1),
2521 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES_ECB_NOPAD, TEE_TYPE_DES,
2522 ciph_data_des_key2, 3, ciph_data_in2,
2523 ciph_data_des_ecb_nopad_out2),
2524 XTEST_CIPH_CASE(TEE_ALG_DES_CBC_NOPAD, TEE_TYPE_DES,
2525 ciph_data_des_key1, ciph_data_64_iv1, 15, ciph_data_in1,
2526 ciph_data_des_cbc_nopad_out1),
2527
2528 /* DES3 */
2529 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2530 ciph_data_des3_key1, 11, ciph_data_in1,
2531 ciph_data_des3_ecb_nopad_out1),
2532 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2533 ciph_data_des3_key2, 3, ciph_data_in2,
2534 ciph_data_des_ecb_nopad_out2),
2535 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2536 ciph_data_des3_key1, ciph_data_64_iv1, 11,
2537 ciph_data_in1,
2538 ciph_data_des3_cbc_nopad_out1),
2539
2540 /* DES2 */
2541 XTEST_CIPH_CASE_NO_IV(TEE_ALG_DES3_ECB_NOPAD, TEE_TYPE_DES3,
2542 ciph_data_des2_key1, 11, ciph_data_in1,
2543 ciph_data_des2_ecb_nopad_out1),
2544 XTEST_CIPH_CASE(TEE_ALG_DES3_CBC_NOPAD, TEE_TYPE_DES3,
2545 ciph_data_des2_key1, ciph_data_64_iv1, 11,
2546 ciph_data_in1,
2547 ciph_data_des2_cbc_nopad_out1),
Pascal Brandc639ac82015-07-02 08:53:34 +02002548
Pascal Brandc639ac82015-07-02 08:53:34 +02002549 /* AES-XTS */
2550 XTEST_CIPH_CASE_AES_XTS(vect1, 3),
2551 XTEST_CIPH_CASE_AES_XTS(vect2, 6),
2552 XTEST_CIPH_CASE_AES_XTS(vect3, 7),
2553 XTEST_CIPH_CASE_AES_XTS(vect4, 8),
2554 XTEST_CIPH_CASE_AES_XTS(vect5, 9),
2555 XTEST_CIPH_CASE_AES_XTS(vect6, 13),
2556 XTEST_CIPH_CASE_AES_XTS(vect7, 1),
2557 XTEST_CIPH_CASE_AES_XTS(vect8, 3),
2558 XTEST_CIPH_CASE_AES_XTS(vect9, 2),
2559 XTEST_CIPH_CASE_AES_XTS(vect10, 5),
2560 XTEST_CIPH_CASE_AES_XTS(vect11, 6),
2561 XTEST_CIPH_CASE_AES_XTS(vect12, 7),
2562 XTEST_CIPH_CASE_AES_XTS(vect13, 3),
2563 XTEST_CIPH_CASE_AES_XTS(vect14, 2),
2564 XTEST_CIPH_CASE_AES_XTS(vect15, 0),
2565 XTEST_CIPH_CASE_AES_XTS(vect16, 9),
2566 XTEST_CIPH_CASE_AES_XTS(vect17, 6),
2567 XTEST_CIPH_CASE_AES_XTS(vect18, 8),
2568 XTEST_CIPH_CASE_AES_XTS(vect19, 23),
Jerome Forissiere73e0fb2019-12-12 17:08:03 +01002569
2570 /* SM4 */
2571 XTEST_CIPH_CASE_NO_IV(TEE_ALG_SM4_ECB_NOPAD, TEE_TYPE_SM4,
2572 ciph_data_sm4_key1, 11, ciph_data_sm4_in1,
2573 ciph_data_sm4_ecb_nopad_out1),
2574 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2575 ciph_data_sm4_cbc_a221_key, ciph_data_sm4_cbc_a221_iv,
2576 11, ciph_data_sm4_cbc_a221_in,
2577 ciph_data_sm4_cbc_a221_out),
2578 XTEST_CIPH_CASE(TEE_ALG_SM4_CBC_NOPAD, TEE_TYPE_SM4,
2579 ciph_data_sm4_cbc_a222_key, ciph_data_sm4_cbc_a222_iv,
2580 11, ciph_data_sm4_cbc_a222_in,
2581 ciph_data_sm4_cbc_a222_out),
2582 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2583 ciph_data_sm4_ctr_a251_key, ciph_data_sm4_ctr_a251_iv,
2584 11, ciph_data_sm4_ctr_a251_in,
2585 ciph_data_sm4_ctr_a251_out),
2586 XTEST_CIPH_CASE(TEE_ALG_SM4_CTR, TEE_TYPE_SM4,
2587 ciph_data_sm4_ctr_a252_key, ciph_data_sm4_ctr_a252_iv,
2588 11, ciph_data_sm4_ctr_a252_in,
2589 ciph_data_sm4_ctr_a252_out),
Pascal Brandc639ac82015-07-02 08:53:34 +02002590};
2591
Jerome Forissier23256842018-02-16 09:25:35 +01002592static void xtest_tee_test_4003(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02002593{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002594 TEEC_Session session = { };
2595 TEE_OperationHandle op = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002596 TEE_ObjectHandle key1_handle = TEE_HANDLE_NULL;
2597 TEE_ObjectHandle key2_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002598 uint8_t out[2048] = { };
2599 size_t out_size = 0;
2600 size_t out_offs = 0;
2601 uint32_t ret_orig = 0;
2602 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002603
2604 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2605 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2606 &ret_orig)))
2607 return;
2608
2609 for (n = 0; n < ARRAY_SIZE(ciph_cases); n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002610 TEE_Attribute key_attr = { };
2611 size_t key_size = 0;
2612 size_t op_key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002613
2614 Do_ADBG_BeginSubCase(c, "Cipher case %d algo 0x%x line %d",
2615 (int)n, (unsigned int)ciph_cases[n].algo,
2616 (int)ciph_cases[n].line);
2617
2618 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2619 key_attr.content.ref.buffer = (void *)ciph_cases[n].key1;
2620 key_attr.content.ref.length = ciph_cases[n].key1_len;
2621
2622 key_size = key_attr.content.ref.length * 8;
2623 if (ciph_cases[n].key_type == TEE_TYPE_DES ||
2624 ciph_cases[n].key_type == TEE_TYPE_DES3)
2625 /* Exclude parity in bit size of key */
2626 key_size -= key_size / 8;
2627
2628 op_key_size = key_size;
2629 if (ciph_cases[n].key2 != NULL)
2630 op_key_size *= 2;
2631
2632 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2633 ta_crypt_cmd_allocate_operation(c, &session, &op,
2634 ciph_cases[n].algo, ciph_cases[n].mode,
2635 op_key_size)))
2636 goto out;
2637
2638 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2639 ta_crypt_cmd_allocate_transient_object(c, &session,
2640 ciph_cases[n].key_type, key_size,
2641 &key1_handle)))
2642 goto out;
2643
2644 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2645 ta_crypt_cmd_populate_transient_object(c, &session,
2646 key1_handle, &key_attr, 1)))
2647 goto out;
2648
2649 if (ciph_cases[n].key2 != NULL) {
2650 key_attr.content.ref.buffer =
2651 (void *)ciph_cases[n].key2;
2652 key_attr.content.ref.length = ciph_cases[n].key2_len;
2653
2654 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2655 ta_crypt_cmd_allocate_transient_object(c,
2656 &session, ciph_cases[n].key_type,
2657 key_attr.content.ref.length * 8,
2658 &key2_handle)))
2659 goto out;
2660
2661 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2662 ta_crypt_cmd_populate_transient_object(c,
2663 &session, key2_handle, &key_attr, 1)))
2664 goto out;
2665
2666 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2667 ta_crypt_cmd_set_operation_key2(c, &session, op,
2668 key1_handle, key2_handle)))
2669 goto out;
2670 } else {
2671 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2672 ta_crypt_cmd_set_operation_key(c, &session, op,
2673 key1_handle)))
2674 goto out;
2675 }
2676
2677 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2678 ta_crypt_cmd_free_transient_object(c, &session,
2679 key1_handle)))
2680 goto out;
2681 key1_handle = TEE_HANDLE_NULL;
2682
2683 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2684 ta_crypt_cmd_free_transient_object(c, &session,
2685 key2_handle)))
2686 goto out;
2687 key2_handle = TEE_HANDLE_NULL;
2688
2689 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2690 ta_crypt_cmd_cipher_init(c, &session, op,
2691 ciph_cases[n].iv, ciph_cases[n].iv_len)))
2692 goto out;
2693
2694 out_offs = 0;
2695 out_size = sizeof(out);
2696 memset(out, 0, sizeof(out));
2697 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2698 ta_crypt_cmd_cipher_update(c, &session, op,
2699 ciph_cases[n].in, ciph_cases[n].in_incr, out,
2700 &out_size)))
2701 goto out;
2702
Jerome Forissierd2d94b42017-06-02 16:39:34 +02002703 if (ciph_cases[n].algo == TEE_ALG_AES_CTR)
2704 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
2705 ciph_cases[n].in_incr);
2706
Pascal Brandc639ac82015-07-02 08:53:34 +02002707 out_offs += out_size;
2708 out_size = sizeof(out) - out_offs;
2709
2710 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2711 ta_crypt_cmd_cipher_do_final(c, &session, op,
2712 ciph_cases[n].in + ciph_cases[n].in_incr,
2713 ciph_cases[n].in_len - ciph_cases[n].in_incr,
2714 out + out_offs,
2715 &out_size)))
2716 goto out;
2717
2718 out_offs += out_size;
2719
2720 (void)ADBG_EXPECT_BUFFER(c, ciph_cases[n].out,
2721 ciph_cases[n].out_len, out, out_offs);
2722
2723 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2724 ta_crypt_cmd_free_operation(c, &session, op)))
2725 goto out;
2726
2727 Do_ADBG_EndSubCase(c, NULL);
2728 }
2729out:
2730 TEEC_CloseSession(&session);
2731}
Jens Wiklander14f48872018-06-29 15:30:13 +02002732ADBG_CASE_DEFINE(regression, 4003, xtest_tee_test_4003,
2733 "Test TEE Internal API cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02002734
Pascal Brandc639ac82015-07-02 08:53:34 +02002735static void xtest_tee_test_4004(ADBG_Case_t *c)
2736{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002737 TEEC_Session session = { };
2738 uint32_t ret_orig = 0;
2739 uint8_t buf1[45] = { };
2740 uint8_t buf2[45] = { };
2741 static const uint8_t zeros[45];
Pascal Brandc639ac82015-07-02 08:53:34 +02002742
2743 Do_ADBG_BeginSubCase(c, "TEE get random");
2744 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2745 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2746 &ret_orig)))
2747 return;
2748
2749 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2750 ta_crypt_cmd_random_number_generate(c, &session, buf1,
2751 sizeof(buf1))))
2752 goto out;
2753
2754 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2755 0, !=, memcmp(buf1, zeros, sizeof(buf1)));
2756
2757 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2758 ta_crypt_cmd_random_number_generate(c, &session, buf2,
2759 sizeof(buf2))))
2760 goto out;
2761
2762 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2763 0, !=, memcmp(buf2, zeros, sizeof(buf2)));
2764
2765 (void)ADBG_EXPECT_COMPARE_SIGNED(c,
2766 0, !=, memcmp(buf2, buf1, sizeof(buf1)));
2767out:
2768 TEEC_CloseSession(&session);
2769 Do_ADBG_EndSubCase(c, "TEE get random");
2770}
Jens Wiklander14f48872018-06-29 15:30:13 +02002771ADBG_CASE_DEFINE(regression, 4004, xtest_tee_test_4004,
2772 "Test TEE Internal API get random");
Pascal Brandc639ac82015-07-02 08:53:34 +02002773
2774struct xtest_ae_case {
2775 uint32_t algo;
2776 uint32_t mode;
2777 uint32_t key_type;
2778 const uint8_t *key;
2779 size_t key_len;
2780 const uint8_t *nonce;
2781 size_t nonce_len;
2782 size_t aad_incr;
2783 const uint8_t *aad;
2784 size_t aad_len;
2785 size_t in_incr;
2786 const uint8_t *ptx;
2787 size_t ptx_len;
2788 const uint8_t *ctx;
2789 size_t ctx_len;
2790 const uint8_t *tag;
2791 size_t tag_len;
2792 size_t line;
2793};
2794
2795
2796#define ARRAY(a) a, ARRAY_SIZE(a)
2797#define NULL_ARRAY(a) NULL, 0
2798
2799#define XTEST_AE_CASE(algo, vect, aad_incr, in_incr, \
2800 aad_array, ptx_array, ctx_array) \
2801 { (algo), TEE_MODE_ENCRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2802 ARRAY(vect ## _nonce), (aad_incr), \
2803 aad_array(vect ## _aad), (in_incr), \
2804 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2805 ARRAY(vect ## _tag), \
2806 __LINE__ }, \
2807 { (algo), TEE_MODE_DECRYPT, TEE_TYPE_AES, ARRAY(vect ## _key), \
2808 ARRAY(vect ## _nonce), (aad_incr), \
2809 aad_array(vect ## _aad), (in_incr), \
2810 ptx_array(vect ## _ptx), ctx_array(vect ## _ctx), \
2811 ARRAY(vect ## _tag), \
2812 __LINE__ }
2813
2814#define XTEST_AE_CASE_AES_CCM(vect, aad_incr, in_incr) \
2815 XTEST_AE_CASE(TEE_ALG_AES_CCM, ae_data_aes_ccm_ ## vect, aad_incr, \
2816 in_incr, ARRAY, ARRAY, ARRAY)
2817
2818#define XTEST_AE_CASE_AES_GCM(vect, aad_incr, in_incr, \
2819 aad_array, ptx_array, ctx_array) \
2820 XTEST_AE_CASE(TEE_ALG_AES_GCM, ae_data_aes_gcm_ ## vect, aad_incr, \
2821 in_incr, aad_array, ptx_array, ctx_array)
2822
2823
2824
2825static const struct xtest_ae_case ae_cases[] = {
2826 XTEST_AE_CASE_AES_CCM(vect1, 3, 2),
2827 XTEST_AE_CASE_AES_CCM(vect2, 7, 13),
2828 XTEST_AE_CASE_AES_CCM(vect3, 5, 21),
2829
2830 XTEST_AE_CASE_AES_GCM(vect1, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2831 XTEST_AE_CASE_AES_GCM(vect2, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2832 XTEST_AE_CASE_AES_GCM(vect3, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
Jens Wiklander9fc63f52017-11-10 11:13:26 +01002833 XTEST_AE_CASE_AES_GCM(vect3, 0, 0x1F, NULL_ARRAY, ARRAY, ARRAY),
2834 XTEST_AE_CASE_AES_GCM(vect4, 5, 0x20, ARRAY, ARRAY, ARRAY),
Pascal Brandc639ac82015-07-02 08:53:34 +02002835 XTEST_AE_CASE_AES_GCM(vect5, 5, 9, ARRAY, ARRAY, ARRAY),
2836 XTEST_AE_CASE_AES_GCM(vect6, 5, 9, ARRAY, ARRAY, ARRAY),
2837 XTEST_AE_CASE_AES_GCM(vect7, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2838 XTEST_AE_CASE_AES_GCM(vect8, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2839 XTEST_AE_CASE_AES_GCM(vect9, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2840 XTEST_AE_CASE_AES_GCM(vect10, 5, 9, ARRAY, ARRAY, ARRAY),
2841 XTEST_AE_CASE_AES_GCM(vect11, 5, 9, ARRAY, ARRAY, ARRAY),
2842 XTEST_AE_CASE_AES_GCM(vect12, 5, 9, ARRAY, ARRAY, ARRAY),
2843 XTEST_AE_CASE_AES_GCM(vect13, 0, 0, NULL_ARRAY, NULL_ARRAY, NULL_ARRAY),
2844 XTEST_AE_CASE_AES_GCM(vect14, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2845 XTEST_AE_CASE_AES_GCM(vect15, 0, 9, NULL_ARRAY, ARRAY, ARRAY),
2846 XTEST_AE_CASE_AES_GCM(vect16, 5, 9, ARRAY, ARRAY, ARRAY),
2847 XTEST_AE_CASE_AES_GCM(vect17, 5, 9, ARRAY, ARRAY, ARRAY),
2848 XTEST_AE_CASE_AES_GCM(vect18, 5, 9, ARRAY, ARRAY, ARRAY),
Jens Wiklanderf6efe242017-11-06 13:16:43 +01002849#ifdef CFG_GCM_NIST_VECTORS
2850#include "gcmDecrypt128.h"
2851#include "gcmDecrypt192.h"
2852#include "gcmDecrypt256.h"
2853#include "gcmEncryptExtIV128.h"
2854#include "gcmEncryptExtIV192.h"
2855#include "gcmEncryptExtIV256.h"
2856#endif
Pascal Brandc639ac82015-07-02 08:53:34 +02002857};
2858
2859static void xtest_tee_test_4005(ADBG_Case_t *c)
2860{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002861 TEEC_Session session = { };
2862 TEE_OperationHandle op = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02002863 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01002864 TEE_Attribute key_attr = { };
2865 uint8_t out[512] = { };
2866 size_t out_size = 0;
2867 size_t out_offs = 0;
2868 uint32_t ret_orig = 0;
2869 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02002870
2871 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2872 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
2873 &ret_orig)))
2874 return;
2875
2876 for (n = 0; n < ARRAY_SIZE(ae_cases); n++) {
2877 Do_ADBG_BeginSubCase(c, "AE case %d algo 0x%x line %d",
2878 (int)n, (unsigned int)ae_cases[n].algo,
2879 (int)ae_cases[n].line);
2880
2881 key_attr.attributeID = TEE_ATTR_SECRET_VALUE;
2882 key_attr.content.ref.buffer = (void *)ae_cases[n].key;
2883 key_attr.content.ref.length = ae_cases[n].key_len;
2884
2885 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2886 ta_crypt_cmd_allocate_operation(c, &session, &op,
2887 ae_cases[n].algo, ae_cases[n].mode,
2888 key_attr.content.ref.length * 8)))
2889 goto out;
2890
2891 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2892 ta_crypt_cmd_allocate_transient_object(c, &session,
2893 ae_cases[n].key_type,
2894 key_attr.content.ref.length * 8,
2895 &key_handle)))
2896 goto out;
2897
2898 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2899 ta_crypt_cmd_populate_transient_object(c, &session,
2900 key_handle, &key_attr, 1)))
2901 goto out;
2902
2903 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2904 ta_crypt_cmd_set_operation_key(c, &session, op,
2905 key_handle)))
2906 goto out;
2907
2908 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2909 ta_crypt_cmd_free_transient_object(c, &session,
2910 key_handle)))
2911 goto out;
2912 key_handle = TEE_HANDLE_NULL;
2913
2914 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2915 ta_crypt_cmd_ae_init(c, &session, op, ae_cases[n].nonce,
2916 ae_cases[n].nonce_len, ae_cases[n].tag_len,
2917 ae_cases[n].aad_len, ae_cases[n].ptx_len)))
2918 goto out;
2919
2920 if (ae_cases[n].aad != NULL) {
2921 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2922 ta_crypt_cmd_ae_update_aad(c, &session, op,
2923 ae_cases[n].aad, ae_cases[n].aad_incr)))
2924 goto out;
2925
2926 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2927 ta_crypt_cmd_ae_update_aad(c, &session, op,
2928 ae_cases[n].aad + ae_cases[n].aad_incr,
2929 ae_cases [n].aad_len -
2930 ae_cases[n].aad_incr)))
2931 goto out;
2932 }
2933
2934 out_offs = 0;
2935 out_size = sizeof(out);
2936 memset(out, 0, sizeof(out));
2937 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2938 if (ae_cases[n].ptx != NULL) {
2939 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2940 ta_crypt_cmd_ae_update(c, &session, op,
2941 ae_cases[n].ptx,
2942 ae_cases[n].in_incr, out,
2943 &out_size)))
2944 goto out;
2945 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002946 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2947 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2948 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002949 }
2950 } else {
2951 if (ae_cases[n].ctx != NULL) {
2952 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2953 ta_crypt_cmd_ae_update(c, &session, op,
2954 ae_cases[n].ctx,
2955 ae_cases[n].in_incr, out,
2956 &out_size)))
2957 goto out;
2958 out_offs += out_size;
Jerome Forissierc13fafa2017-06-01 15:49:07 +02002959 if (ae_cases[n].algo == TEE_ALG_AES_GCM)
2960 ADBG_EXPECT_COMPARE_UNSIGNED(c,
2961 out_size, ==, ae_cases[n].in_incr);
Pascal Brandc639ac82015-07-02 08:53:34 +02002962 }
2963 }
2964
2965 out_size = sizeof(out) - out_offs;
2966 if (ae_cases[n].mode == TEE_MODE_ENCRYPT) {
2967 uint8_t out_tag[64];
2968 size_t out_tag_len = MIN(sizeof(out_tag),
2969 ae_cases[n].tag_len);
2970
2971 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2972 ta_crypt_cmd_ae_encrypt_final(c, &session, op,
2973 ae_cases[n].ptx + ae_cases[n].in_incr,
2974 ae_cases[n].ptx_len -
2975 ae_cases[n].in_incr,
2976 out + out_offs,
2977 &out_size, out_tag, &out_tag_len)))
2978 goto out;
2979
2980 (void)ADBG_EXPECT_BUFFER(c,
2981 ae_cases[n].tag, ae_cases[n].tag_len, out_tag,
2982 out_tag_len);
2983
2984 out_offs += out_size;
2985
2986 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ctx,
2987 ae_cases[n].ctx_len, out, out_offs);
2988 } else {
2989 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
2990 ta_crypt_cmd_ae_decrypt_final(c, &session, op,
2991 ae_cases[n].ctx + ae_cases[n].in_incr,
2992 ae_cases[n].ctx_len -
2993 ae_cases[n].in_incr,
2994 out + out_offs,
2995 &out_size, ae_cases[n].tag,
2996 ae_cases[n].tag_len)))
2997 goto out;
2998
2999 out_offs += out_size;
3000
3001 (void)ADBG_EXPECT_BUFFER(c, ae_cases[n].ptx,
3002 ae_cases[n].ptx_len, out, out_offs);
3003 }
3004
3005 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3006 ta_crypt_cmd_free_operation(c, &session, op)))
3007 goto out;
3008
3009 Do_ADBG_EndSubCase(c, NULL);
3010 }
3011out:
3012 TEEC_CloseSession(&session);
3013}
Jens Wiklander14f48872018-06-29 15:30:13 +02003014ADBG_CASE_DEFINE(regression, 4005, xtest_tee_test_4005,
3015 "Test TEE Internal API Authenticated Encryption operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02003016
3017struct xtest_ac_case {
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003018 unsigned int level;
Pascal Brandc639ac82015-07-02 08:53:34 +02003019 uint32_t algo;
3020 TEE_OperationMode mode;
3021
3022 union {
3023 struct {
3024 const uint8_t *modulus;
3025 size_t modulus_len;
3026
3027 const uint8_t *pub_exp;
3028 size_t pub_exp_len;
3029
3030 const uint8_t *priv_exp;
3031 size_t priv_exp_len;
3032
3033 const uint8_t *prime1; /* q */
3034 size_t prime1_len;
3035 const uint8_t *prime2; /* p */
3036 size_t prime2_len;
3037 const uint8_t *exp1; /* dp */
3038 size_t exp1_len;
3039 const uint8_t *exp2; /* dq */
3040 size_t exp2_len;
3041 const uint8_t *coeff; /* iq */
3042 size_t coeff_len;
3043
3044 int salt_len;
3045 } rsa;
3046 struct {
3047 const uint8_t *prime;
3048 size_t prime_len;
3049 const uint8_t *sub_prime;
3050 size_t sub_prime_len;
3051 const uint8_t *base;
3052 size_t base_len;
3053 const uint8_t *pub_val;
3054 size_t pub_val_len;
3055 const uint8_t *priv_val;
3056 size_t priv_val_len;
3057 } dsa;
Pascal Brand3e143ee2015-07-15 17:17:16 +02003058 struct {
3059 const uint8_t *private;
3060 size_t private_len;
3061 const uint8_t *public_x;
3062 size_t public_x_len;
3063 const uint8_t *public_y;
3064 size_t public_y_len;
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003065 } ecc;
Pascal Brandc639ac82015-07-02 08:53:34 +02003066 } params;
3067
3068 const uint8_t *ptx;
3069 size_t ptx_len;
3070 const uint8_t *ctx;
3071 size_t ctx_len;
3072 size_t line;
3073};
3074
3075#define WITHOUT_SALT(x) -1
3076#define WITH_SALT(x) x
3077
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003078#define XTEST_AC_CASE(level, algo, mode, vect, union_params) \
3079 { level, (algo), (mode), .params = union_params, \
Pascal Brandc639ac82015-07-02 08:53:34 +02003080 ARRAY(vect ## _ptx), \
3081 ARRAY(vect ## _out), \
3082 __LINE__ }
3083
3084#define XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt) \
3085 { .rsa = { \
3086 ARRAY(vect ## _modulus), \
3087 ARRAY(vect ## _pub_exp), \
3088 ARRAY(vect ## _priv_exp), \
3089 opt_crt_array(vect ## _prime1), \
3090 opt_crt_array(vect ## _prime2), \
3091 opt_crt_array(vect ## _exp1), \
3092 opt_crt_array(vect ## _exp2), \
3093 opt_crt_array(vect ## _coeff), \
3094 opt_salt(vect ## _salt_len) \
3095 } }
3096
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003097#define XTEST_AC_RSA_CASE(level, algo, mode, vect, opt_crt_array, opt_salt) \
3098 XTEST_AC_CASE(level, algo, mode, vect, \
Pascal Brandc639ac82015-07-02 08:53:34 +02003099 XTEST_AC_RSA_UNION(vect, opt_crt_array, opt_salt))
3100
3101#define XTEST_AC_DSA_UNION(vect) \
3102 { .dsa = { \
3103 ARRAY(vect ## _prime), \
3104 ARRAY(vect ## _sub_prime), \
3105 ARRAY(vect ## _base), \
3106 ARRAY(vect ## _pub_val), \
3107 ARRAY(vect ## _priv_val), \
3108 } }
3109
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003110#define XTEST_AC_DSA_CASE(level, algo, mode, vect) \
3111 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_DSA_UNION(vect))
Pascal Brandc639ac82015-07-02 08:53:34 +02003112
Pascal Brand3e143ee2015-07-15 17:17:16 +02003113#define XTEST_AC_ECDSA_UNION(vect) \
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003114 { .ecc = { \
Pascal Brand3e143ee2015-07-15 17:17:16 +02003115 ARRAY(vect ## _private), \
3116 ARRAY(vect ## _public_x), \
3117 ARRAY(vect ## _public_y), \
3118 } }
3119
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003120#define XTEST_AC_ECC_CASE(level, algo, mode, vect) \
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003121 XTEST_AC_CASE(level, algo, mode, vect, XTEST_AC_ECDSA_UNION(vect))
Pascal Brand3e143ee2015-07-15 17:17:16 +02003122
Pascal Brandc639ac82015-07-02 08:53:34 +02003123static const struct xtest_ac_case xtest_ac_cases[] = {
3124 /* RSA test without crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003125 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003126 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003127 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003128 ac_rsassa_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003129 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003130 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003131 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003132 ac_rsassa_vect2, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissiere576f052018-03-23 21:24:21 +08003133 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
3134 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
3135 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
3136 ac_rsassa_vect18, NULL_ARRAY, WITHOUT_SALT),
Jerome Forissier0451e372018-03-27 00:10:23 +08003137 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
3138 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
3139 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
3140 ac_rsassa_vect19, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003141 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003142 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003143 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003144 ac_rsassa_vect3, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003145 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003146 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003147 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003148 ac_rsassa_vect4, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003149 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003150 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003151 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003152 ac_rsassa_vect5, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003153 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003154 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003155 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003156 ac_rsassa_vect6, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003157 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003158 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003159 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003160 ac_rsassa_vect7, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003161 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
3162 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
3163 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
3164 ac_rsassa_vect8, NULL_ARRAY, WITHOUT_SALT),
Pascal Brandc639ac82015-07-02 08:53:34 +02003165
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003166 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003167 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003168 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA224, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003169 ac_rsassa_vect16, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003170
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003171#ifdef CFG_CRYPTO_RSASSA_NA1
3172 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_SIGN,
3173 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3174 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5, TEE_MODE_VERIFY,
3175 ac_rsassa_vect20, NULL_ARRAY, WITHOUT_SALT),
3176#endif
3177
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003178 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003179 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003180 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003181 ac_rsassa_vect9, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003182
3183 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003184 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003185 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003186 ac_rsassa_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003187
3188 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003189 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003190 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003191 ac_rsassa_vect11, NULL_ARRAY, WITHOUT_SALT),
3192
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003193 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3194 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003195 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003196 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003197 ac_rsassa_vect12, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003198
3199 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3200 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003201 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003202 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3203 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003204 ac_rsassa_vect17, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003205
3206 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3207 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003208 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003209 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3210 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003211 ac_rsassa_vect13, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003212
3213 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3214 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003215 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003216 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3217 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003218 ac_rsassa_vect14, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003219
3220 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3221 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003222 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003223 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3224 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003225 ac_rsassa_vect15, NULL_ARRAY, WITH_SALT),
3226
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003227 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003228 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003229 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003230 ac_rsaes_pkcs1_v1_5_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003231 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003232 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003233 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003234 ac_rsaes_pkcs1_v1_5_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003235 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003236 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003237 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003238 ac_rsaes_pkcs1_v1_5_vect15, NULL_ARRAY, WITHOUT_SALT),
3239
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003240 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3241 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003242 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003243 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3244 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003245 ac_rsaes_oaep_vect1, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003246 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3247 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003248 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003249 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3250 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003251 ac_rsaes_oaep_vect2, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003252 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3253 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003254 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003255 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3256 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003257 ac_rsaes_oaep_vect10, NULL_ARRAY, WITHOUT_SALT),
3258
3259 /* RSA test with crt parameters */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003260 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003261 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003262 XTEST_AC_RSA_CASE(0, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003263 ac_rsassa_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003264 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003265 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003266 XTEST_AC_RSA_CASE(1, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003267 ac_rsassa_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003268 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003269 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003270 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003271 ac_rsassa_vect3, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003272 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003273 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003274 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003275 ac_rsassa_vect4, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003276 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003277 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003278 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003279 ac_rsassa_vect5, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003280 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003281 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003282 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003283 ac_rsassa_vect6, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003284 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003285 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003286 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003287 ac_rsassa_vect7, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003288 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003289 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003290 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003291 ac_rsassa_vect8, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003292 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003293 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003294 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_V1_5_SHA256, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003295 ac_rsassa_vect9, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003296 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003297 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003298 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA384, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003299 ac_rsassa_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003300 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003301 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003302 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_V1_5_SHA512, TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003303 ac_rsassa_vect11, ARRAY, WITHOUT_SALT),
3304
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003305 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1,
3306 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003307 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003308 XTEST_AC_RSA_CASE(1,TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA1, TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003309 ac_rsassa_vect12, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003310 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3311 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003312 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003313 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA224,
3314 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003315 ac_rsassa_vect17, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003316 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3317 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003318 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003319 XTEST_AC_RSA_CASE(0, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA256,
3320 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003321 ac_rsassa_vect13, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003322 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3323 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003324 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003325 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA384,
3326 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003327 ac_rsassa_vect14, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003328 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3329 TEE_MODE_VERIFY,
Pascal Brandc639ac82015-07-02 08:53:34 +02003330 ac_rsassa_vect15, ARRAY, WITH_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003331 XTEST_AC_RSA_CASE(1, TEE_ALG_RSASSA_PKCS1_PSS_MGF1_SHA512,
3332 TEE_MODE_SIGN,
Pascal Brandc639ac82015-07-02 08:53:34 +02003333 ac_rsassa_vect15, ARRAY, WITH_SALT),
3334
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003335 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003336 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003337 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003338 ac_rsaes_pkcs1_v1_5_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003339 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003340 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003341 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003342 ac_rsaes_pkcs1_v1_5_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003343 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003344 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003345 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_V1_5, TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003346 ac_rsaes_pkcs1_v1_5_vect15, ARRAY, WITHOUT_SALT),
3347
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003348 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3349 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003350 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003351 XTEST_AC_RSA_CASE(0, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3352 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003353 ac_rsaes_oaep_vect1, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003354 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3355 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003356 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003357 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3358 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003359 ac_rsaes_oaep_vect2, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003360 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3361 TEE_MODE_DECRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003362 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003363 XTEST_AC_RSA_CASE(1, TEE_ALG_RSAES_PKCS1_OAEP_MGF1_SHA1,
3364 TEE_MODE_ENCRYPT,
Pascal Brandc639ac82015-07-02 08:53:34 +02003365 ac_rsaes_oaep_vect10, ARRAY, WITHOUT_SALT),
3366
3367 /* DSA tests */
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003368 /* [mod = L=1024, N=160, SHA-1] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003369 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect1),
3370 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect1),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003371 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect2),
3372 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect2),
3373 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect3),
3374 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect3),
3375 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect4),
3376 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect4),
3377 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect5),
3378 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect5),
3379 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect6),
3380 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect6),
3381 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect7),
3382 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect7),
3383 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect8),
3384 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect8),
3385 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect9),
3386 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect9),
3387 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect10),
3388 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect10),
3389 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect11),
3390 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect11),
3391 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect12),
3392 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect12),
3393 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect13),
3394 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect13),
3395 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect14),
3396 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect14),
3397 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_VERIFY, ac_dsa_vect15),
3398 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA1, TEE_MODE_SIGN, ac_dsa_vect15),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003399 /* [mod = L=1024, N=160, SHA-224] - GP NOT SUPPORTED */
3400 /* [mod = L=1024, N=160, SHA-256] - GP NOT SUPPORTED */
3401 /* [mod = L=1024, N=160, SHA-384] - GP NOT SUPPORTED */
3402 /* [mod = L=1024, N=160, SHA-512] - GP NOT SUPPORTED */
3403 /* [mod = L=2048, N=224, SHA-1] - GP NOT SUPPORTED */
3404 /* [mod = L=2048, N=224, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003405 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect91),
3406 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect91),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003407 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect92),
3408 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect92),
3409 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect93),
3410 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect93),
3411 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect94),
3412 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect94),
3413 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect95),
3414 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect95),
3415 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect96),
3416 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect96),
3417 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect97),
3418 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect97),
3419 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect98),
3420 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect98),
3421 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect99),
3422 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect99),
3423 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect100),
3424 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect100),
3425 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect101),
3426 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect101),
3427 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect102),
3428 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect102),
3429 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect103),
3430 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect103),
3431 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect104),
3432 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect104),
3433 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect105),
3434 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect105),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003435 /* [mod = L=2048, N=224, SHA-256] */
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003436 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect106),
3437 XTEST_AC_DSA_CASE(0, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect106),
3438 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect107),
3439 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect107),
3440 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect108),
3441 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect108),
3442 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect109),
3443 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect109),
3444 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect110),
3445 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect110),
3446 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect111),
3447 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect111),
3448 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect112),
3449 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect112),
3450 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect113),
3451 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect113),
3452 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect114),
3453 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect114),
3454 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect115),
3455 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect115),
3456 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect116),
3457 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect116),
3458 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect117),
3459 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect117),
3460 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect118),
3461 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect118),
3462 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect119),
3463 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect119),
3464 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect120),
3465 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect120),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003466 /* [mod = L=2048, N=224, SHA-384] - GP NOT SUPPORTED */
3467 /* [mod = L=2048, N=224, SHA-512] - GP NOT SUPPORTED */
3468 /* [mod = L=2048, N=256, SHA-1] - GP NOT SUPPORTED */
3469 /* [mod = L=2048, N=256, SHA-224] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003470 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect166),
3471 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect166),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003472 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect167),
3473 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect167),
3474 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect168),
3475 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect168),
3476 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect169),
3477 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect169),
3478 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect170),
3479 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect170),
3480 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect171),
3481 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect171),
3482 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect172),
3483 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect172),
3484 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect173),
3485 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect173),
3486 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect174),
3487 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect174),
3488 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect175),
3489 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect175),
3490 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect176),
3491 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect176),
3492 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect177),
3493 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect177),
3494 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect178),
3495 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect178),
3496 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect179),
3497 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect179),
3498 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_VERIFY, ac_dsa_vect180),
3499 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA224, TEE_MODE_SIGN, ac_dsa_vect180),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003500 /* [mod = L=2048, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003501 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect181),
3502 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect181),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003503 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect182),
3504 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect182),
3505 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect183),
3506 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect183),
3507 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect184),
3508 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect184),
3509 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect185),
3510 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect185),
3511 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect186),
3512 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect186),
3513 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect187),
3514 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect187),
3515 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect188),
3516 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect188),
3517 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect189),
3518 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect189),
3519 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect190),
3520 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect190),
3521 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect191),
3522 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect191),
3523 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect192),
3524 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect192),
3525 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect193),
3526 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect193),
3527 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect194),
3528 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect194),
3529 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect195),
3530 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect195),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003531 /* [mod = L=2048, N=256, SHA-384] - GP NOT SUPPORTED */
3532 /* [mod = L=2048, N=256, SHA-512] - GP NOT SUPPORTED */
3533 /* [mod = L=3072, N=256, SHA-1] - GP NOT SUPPORTED */
3534 /* [mod = L=3072, N=256, SHA-224] - GP NOT SUPPORTED */
3535 /* [mod = L=3072, N=256, SHA-256] */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01003536 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect256),
3537 XTEST_AC_DSA_CASE(1, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect256),
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003538 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect257),
3539 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect257),
3540 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect258),
3541 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect258),
3542 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect259),
3543 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect259),
3544 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect260),
3545 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect260),
3546 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect261),
3547 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect261),
3548 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect262),
3549 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect262),
3550 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect263),
3551 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect263),
3552 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect264),
3553 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect264),
3554 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect265),
3555 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect265),
3556 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect266),
3557 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect266),
3558 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect267),
3559 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect267),
3560 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect268),
3561 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect268),
3562 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect269),
3563 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect269),
3564 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_VERIFY, ac_dsa_vect270),
3565 XTEST_AC_DSA_CASE(15, TEE_ALG_DSA_SHA256, TEE_MODE_SIGN, ac_dsa_vect270),
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02003566 /* [mod = L=3072, N=256, SHA-384] - GP NOT SUPPORTED */
3567 /* [mod = L=3072, N=256, SHA-512] - GP NOT SUPPORTED */
Pascal Brand3e143ee2015-07-15 17:17:16 +02003568
3569 /* ECDSA tests */
Cedric Chaumontc7654962015-09-09 14:56:36 +02003570 /* [P-192] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003571 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3572 nist_186_2_ecdsa_testvector_1),
3573 XTEST_AC_ECC_CASE(0, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3574 nist_186_2_ecdsa_testvector_1),
3575 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3576 nist_186_2_ecdsa_testvector_2),
3577 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3578 nist_186_2_ecdsa_testvector_2),
3579 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3580 nist_186_2_ecdsa_testvector_3),
3581 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3582 nist_186_2_ecdsa_testvector_3),
3583 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3584 nist_186_2_ecdsa_testvector_4),
3585 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3586 nist_186_2_ecdsa_testvector_4),
3587 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3588 nist_186_2_ecdsa_testvector_5),
3589 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3590 nist_186_2_ecdsa_testvector_5),
3591 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3592 nist_186_2_ecdsa_testvector_6),
3593 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3594 nist_186_2_ecdsa_testvector_6),
3595 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3596 nist_186_2_ecdsa_testvector_7),
3597 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3598 nist_186_2_ecdsa_testvector_7),
3599 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3600 nist_186_2_ecdsa_testvector_8),
3601 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3602 nist_186_2_ecdsa_testvector_8),
3603 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3604 nist_186_2_ecdsa_testvector_9),
3605 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3606 nist_186_2_ecdsa_testvector_9),
3607 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3608 nist_186_2_ecdsa_testvector_10),
3609 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3610 nist_186_2_ecdsa_testvector_10),
3611 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3612 nist_186_2_ecdsa_testvector_11),
3613 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3614 nist_186_2_ecdsa_testvector_11),
3615 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3616 nist_186_2_ecdsa_testvector_12),
3617 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3618 nist_186_2_ecdsa_testvector_12),
3619 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3620 nist_186_2_ecdsa_testvector_13),
3621 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3622 nist_186_2_ecdsa_testvector_13),
3623 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3624 nist_186_2_ecdsa_testvector_14),
3625 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3626 nist_186_2_ecdsa_testvector_14),
3627 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_VERIFY,
3628 nist_186_2_ecdsa_testvector_15),
3629 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P192, TEE_MODE_SIGN,
3630 nist_186_2_ecdsa_testvector_15),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003631 /* [P-224] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003632 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3633 nist_186_2_ecdsa_testvector_16),
3634 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3635 nist_186_2_ecdsa_testvector_16),
3636 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3637 nist_186_2_ecdsa_testvector_17),
3638 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3639 nist_186_2_ecdsa_testvector_17),
3640 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3641 nist_186_2_ecdsa_testvector_18),
3642 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3643 nist_186_2_ecdsa_testvector_18),
3644 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3645 nist_186_2_ecdsa_testvector_19),
3646 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3647 nist_186_2_ecdsa_testvector_19),
3648 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3649 nist_186_2_ecdsa_testvector_20),
3650 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3651 nist_186_2_ecdsa_testvector_20),
3652 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3653 nist_186_2_ecdsa_testvector_21),
3654 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3655 nist_186_2_ecdsa_testvector_21),
3656 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3657 nist_186_2_ecdsa_testvector_22),
3658 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3659 nist_186_2_ecdsa_testvector_22),
3660 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3661 nist_186_2_ecdsa_testvector_23),
3662 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3663 nist_186_2_ecdsa_testvector_23),
3664 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3665 nist_186_2_ecdsa_testvector_24),
3666 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3667 nist_186_2_ecdsa_testvector_24),
3668 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3669 nist_186_2_ecdsa_testvector_25),
3670 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3671 nist_186_2_ecdsa_testvector_25),
3672 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3673 nist_186_2_ecdsa_testvector_26),
3674 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3675 nist_186_2_ecdsa_testvector_26),
3676 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3677 nist_186_2_ecdsa_testvector_27),
3678 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3679 nist_186_2_ecdsa_testvector_27),
3680 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3681 nist_186_2_ecdsa_testvector_28),
3682 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3683 nist_186_2_ecdsa_testvector_28),
3684 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3685 nist_186_2_ecdsa_testvector_29),
3686 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3687 nist_186_2_ecdsa_testvector_29),
3688 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_VERIFY,
3689 nist_186_2_ecdsa_testvector_30),
3690 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P224, TEE_MODE_SIGN,
3691 nist_186_2_ecdsa_testvector_30),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003692 /* [P-256] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003693 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3694 nist_186_2_ecdsa_testvector_31),
3695 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3696 nist_186_2_ecdsa_testvector_31),
3697 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3698 nist_186_2_ecdsa_testvector_32),
3699 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3700 nist_186_2_ecdsa_testvector_32),
3701 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3702 nist_186_2_ecdsa_testvector_33),
3703 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3704 nist_186_2_ecdsa_testvector_33),
3705 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3706 nist_186_2_ecdsa_testvector_34),
3707 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3708 nist_186_2_ecdsa_testvector_34),
3709 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3710 nist_186_2_ecdsa_testvector_35),
3711 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3712 nist_186_2_ecdsa_testvector_35),
3713 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3714 nist_186_2_ecdsa_testvector_36),
3715 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3716 nist_186_2_ecdsa_testvector_36),
3717 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3718 nist_186_2_ecdsa_testvector_37),
3719 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3720 nist_186_2_ecdsa_testvector_37),
3721 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3722 nist_186_2_ecdsa_testvector_38),
3723 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3724 nist_186_2_ecdsa_testvector_38),
3725 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3726 nist_186_2_ecdsa_testvector_39),
3727 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3728 nist_186_2_ecdsa_testvector_39),
3729 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3730 nist_186_2_ecdsa_testvector_40),
3731 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3732 nist_186_2_ecdsa_testvector_40),
3733 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3734 nist_186_2_ecdsa_testvector_41),
3735 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3736 nist_186_2_ecdsa_testvector_41),
3737 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3738 nist_186_2_ecdsa_testvector_42),
3739 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3740 nist_186_2_ecdsa_testvector_42),
3741 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3742 nist_186_2_ecdsa_testvector_43),
3743 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3744 nist_186_2_ecdsa_testvector_43),
3745 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3746 nist_186_2_ecdsa_testvector_44),
3747 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3748 nist_186_2_ecdsa_testvector_44),
3749 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_VERIFY,
3750 nist_186_2_ecdsa_testvector_45),
3751 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P256, TEE_MODE_SIGN,
3752 nist_186_2_ecdsa_testvector_45),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003753 /* [P-384] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003754 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3755 nist_186_2_ecdsa_testvector_46),
3756 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3757 nist_186_2_ecdsa_testvector_46),
3758 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3759 nist_186_2_ecdsa_testvector_47),
3760 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3761 nist_186_2_ecdsa_testvector_47),
3762 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3763 nist_186_2_ecdsa_testvector_48),
3764 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3765 nist_186_2_ecdsa_testvector_48),
3766 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3767 nist_186_2_ecdsa_testvector_49),
3768 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3769 nist_186_2_ecdsa_testvector_49),
3770 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3771 nist_186_2_ecdsa_testvector_50),
3772 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3773 nist_186_2_ecdsa_testvector_50),
3774 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3775 nist_186_2_ecdsa_testvector_51),
3776 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3777 nist_186_2_ecdsa_testvector_51),
3778 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3779 nist_186_2_ecdsa_testvector_52),
3780 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3781 nist_186_2_ecdsa_testvector_52),
3782 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3783 nist_186_2_ecdsa_testvector_53),
3784 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3785 nist_186_2_ecdsa_testvector_53),
3786 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3787 nist_186_2_ecdsa_testvector_54),
3788 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3789 nist_186_2_ecdsa_testvector_54),
3790 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3791 nist_186_2_ecdsa_testvector_55),
3792 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3793 nist_186_2_ecdsa_testvector_55),
3794 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3795 nist_186_2_ecdsa_testvector_56),
3796 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3797 nist_186_2_ecdsa_testvector_56),
3798 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3799 nist_186_2_ecdsa_testvector_57),
3800 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3801 nist_186_2_ecdsa_testvector_57),
3802 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3803 nist_186_2_ecdsa_testvector_58),
3804 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3805 nist_186_2_ecdsa_testvector_58),
3806 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3807 nist_186_2_ecdsa_testvector_59),
3808 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3809 nist_186_2_ecdsa_testvector_59),
3810 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_VERIFY,
3811 nist_186_2_ecdsa_testvector_60),
3812 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P384, TEE_MODE_SIGN,
3813 nist_186_2_ecdsa_testvector_60),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003814 /* [P-521] */
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01003815 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3816 nist_186_2_ecdsa_testvector_61),
3817 XTEST_AC_ECC_CASE(1, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3818 nist_186_2_ecdsa_testvector_61),
3819 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3820 nist_186_2_ecdsa_testvector_62),
3821 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3822 nist_186_2_ecdsa_testvector_62),
3823 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3824 nist_186_2_ecdsa_testvector_63),
3825 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3826 nist_186_2_ecdsa_testvector_63),
3827 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3828 nist_186_2_ecdsa_testvector_64),
3829 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3830 nist_186_2_ecdsa_testvector_64),
3831 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3832 nist_186_2_ecdsa_testvector_65),
3833 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3834 nist_186_2_ecdsa_testvector_65),
3835 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3836 nist_186_2_ecdsa_testvector_66),
3837 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3838 nist_186_2_ecdsa_testvector_66),
3839 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3840 nist_186_2_ecdsa_testvector_67),
3841 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3842 nist_186_2_ecdsa_testvector_67),
3843 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3844 nist_186_2_ecdsa_testvector_68),
3845 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3846 nist_186_2_ecdsa_testvector_68),
3847 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3848 nist_186_2_ecdsa_testvector_69),
3849 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3850 nist_186_2_ecdsa_testvector_69),
3851 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3852 nist_186_2_ecdsa_testvector_70),
3853 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3854 nist_186_2_ecdsa_testvector_70),
3855 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3856 nist_186_2_ecdsa_testvector_71),
3857 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3858 nist_186_2_ecdsa_testvector_71),
3859 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3860 nist_186_2_ecdsa_testvector_72),
3861 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3862 nist_186_2_ecdsa_testvector_72),
3863 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3864 nist_186_2_ecdsa_testvector_73),
3865 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3866 nist_186_2_ecdsa_testvector_73),
3867 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3868 nist_186_2_ecdsa_testvector_74),
3869 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3870 nist_186_2_ecdsa_testvector_74),
3871 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_VERIFY,
3872 nist_186_2_ecdsa_testvector_75),
3873 XTEST_AC_ECC_CASE(15, TEE_ALG_ECDSA_P521, TEE_MODE_SIGN,
3874 nist_186_2_ecdsa_testvector_75),
Cedric Chaumontc7654962015-09-09 14:56:36 +02003875 /* [K-163] - GP NOT SUPPORTED */
3876 /* [K-233] - GP NOT SUPPORTED */
3877 /* [K-283] - GP NOT SUPPORTED */
3878 /* [K-409] - GP NOT SUPPORTED */
3879 /* [K-571] - GP NOT SUPPORTED */
3880 /* [B-163] - GP NOT SUPPORTED */
3881 /* [B-233] - GP NOT SUPPORTED */
3882 /* [B-283] - GP NOT SUPPORTED */
3883 /* [B-409] - GP NOT SUPPORTED */
3884 /* [B-571] - GP NOT SUPPORTED */
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003885
3886 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3887 gmt_0003_part5_c2_sm2_testvector),
3888 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_DECRYPT,
3889 gmt_0003_part5_c2_sm2_testvector),
3890 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_PKE, TEE_MODE_ENCRYPT,
3891 sm2_testvector2),
Jerome Forissier849b57e2019-12-19 16:37:14 +01003892
3893 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_VERIFY,
3894 gmt_003_part5_a2),
3895 XTEST_AC_ECC_CASE(0, TEE_ALG_SM2_DSA_SM3, TEE_MODE_SIGN,
3896 gmt_003_part5_a2),
Pascal Brandc639ac82015-07-02 08:53:34 +02003897};
3898
3899static bool create_key(ADBG_Case_t *c, TEEC_Session *s,
3900 uint32_t max_key_size, uint32_t key_type,
3901 TEE_Attribute *attrs, size_t num_attrs,
3902 TEE_ObjectHandle *handle)
3903{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003904 size_t n = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003905
3906 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3907 ta_crypt_cmd_allocate_transient_object(c, s, key_type,
3908 max_key_size, handle)))
3909 return false;
3910
3911 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3912 ta_crypt_cmd_populate_transient_object(c, s, *handle, attrs,
3913 num_attrs)))
3914 return false;
3915
3916 for (n = 0; n < num_attrs; n++) {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003917 uint8_t out[512] = { };
3918 size_t out_size = sizeof(out);
Pascal Brand3e143ee2015-07-15 17:17:16 +02003919
3920 if (attrs[n].attributeID == TEE_ATTR_ECC_CURVE)
3921 continue;
3922
Pascal Brandc639ac82015-07-02 08:53:34 +02003923 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3924 ta_crypt_cmd_get_object_buffer_attribute(c, s, *handle,
3925 attrs[n].attributeID, out, &out_size)))
3926 return false;
3927
Pascal Brand3e143ee2015-07-15 17:17:16 +02003928 if (out_size < attrs[n].content.ref.length) {
3929 memmove(out + (attrs[n].content.ref.length - out_size),
3930 out,
3931 attrs[n].content.ref.length);
3932 memset(out, 0, attrs[n].content.ref.length - out_size);
3933 out_size = attrs[n].content.ref.length;
3934 }
3935
Pascal Brandc639ac82015-07-02 08:53:34 +02003936 if (!ADBG_EXPECT_BUFFER(c, attrs[n].content.ref.buffer,
3937 attrs[n].content.ref.length, out, out_size))
3938 return false;
3939 }
3940
3941 return true;
3942}
3943
3944static void xtest_tee_test_4006(ADBG_Case_t *c)
3945{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003946 TEEC_Session session = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02003947 TEE_OperationHandle op = TEE_HANDLE_NULL;
3948 TEE_ObjectHandle priv_key_handle = TEE_HANDLE_NULL;
3949 TEE_ObjectHandle pub_key_handle = TEE_HANDLE_NULL;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003950 TEE_Attribute key_attrs[8] = { };
3951 TEE_Attribute algo_params[1] = { };
3952 size_t num_algo_params = 0;
3953 uint8_t out[512] = { };
3954 size_t out_size = 0;
3955 uint8_t out_enc[512] = { };
3956 size_t out_enc_size = 0;
3957 uint8_t ptx_hash[TEE_MAX_HASH_SIZE] = { };
Etienne Carriere481c6602019-01-22 13:27:26 +01003958 size_t ptx_hash_size = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003959 size_t max_key_size = 0;
3960 size_t num_key_attrs = 0;
3961 uint32_t ret_orig = 0;
3962 size_t n = 0;
3963 uint32_t curve = 0;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01003964 uint32_t pub_key_type = 0;
3965 uint32_t priv_key_type = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01003966 uint32_t hash_algo = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02003967
3968 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
3969 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
3970 &ret_orig)))
3971 return;
3972
3973 for (n = 0; n < ARRAY_SIZE(xtest_ac_cases); n++) {
3974 const struct xtest_ac_case *tv = xtest_ac_cases + n;
3975
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02003976 if (tv->level > level)
3977 continue;
3978
Jerome Forissier4b03e282020-01-22 16:33:12 +01003979 if ((tv->algo == TEE_ALG_SM2_PKE ||
3980 tv->algo == TEE_ALG_SM2_DSA_SM3) &&
3981 !ta_crypt_cmd_is_algo_supported(c, &session, tv->algo,
3982 TEE_ECC_CURVE_SM2)) {
3983 Do_ADBG_Log("SM2 not supported: skip subcase");
3984 continue;
3985 }
3986
Pascal Brandc639ac82015-07-02 08:53:34 +02003987 Do_ADBG_BeginSubCase(c, "Asym Crypto case %d algo 0x%x line %d",
3988 (int)n, (unsigned int)tv->algo,
3989 (int)tv->line);
3990
3991 /*
3992 * When signing or verifying we're working with the hash of
3993 * the payload.
3994 */
3995 if (tv->mode == TEE_MODE_VERIFY || tv->mode == TEE_MODE_SIGN) {
Pascal Brand3e143ee2015-07-15 17:17:16 +02003996 if (TEE_ALG_GET_MAIN_ALG(tv->algo) == TEE_MAIN_ALGO_ECDSA)
3997 hash_algo = TEE_ALG_SHA1;
Gabor Szekely2ad190f2018-09-14 14:05:06 +00003998#if defined(CFG_CRYPTO_RSASSA_NA1)
3999 else if (tv->algo == TEE_ALG_RSASSA_PKCS1_V1_5)
4000 hash_algo = TEE_ALG_SHA256;
4001#endif
Pascal Brand3e143ee2015-07-15 17:17:16 +02004002 else
4003 hash_algo = TEE_ALG_HASH_ALGO(
4004 TEE_ALG_GET_DIGEST_HASH(tv->algo));
Pascal Brandc639ac82015-07-02 08:53:34 +02004005
4006 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4007 ta_crypt_cmd_allocate_operation(c, &session,
4008 &op, hash_algo, TEE_MODE_DIGEST, 0)))
4009 goto out;
4010
4011 ptx_hash_size = sizeof(ptx_hash);
4012 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4013 ta_crypt_cmd_digest_do_final(c, & session, op,
4014 tv->ptx, tv->ptx_len, ptx_hash,
4015 &ptx_hash_size)))
4016 goto out;
4017
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004018 /*
4019 * When we use DSA algorithms, the size of the hash we
4020 * consider equals the min between the size of the
4021 * "subprime" in the key and the size of the hash
4022 */
4023 if (TEE_ALG_GET_MAIN_ALG(tv->algo) ==
4024 TEE_MAIN_ALGO_DSA) {
4025 if (tv->params.dsa.sub_prime_len <=
4026 ptx_hash_size)
4027 ptx_hash_size =
4028 tv->params.dsa.sub_prime_len;
4029 }
4030
Pascal Brandc639ac82015-07-02 08:53:34 +02004031 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4032 ta_crypt_cmd_free_operation(c, &session, op)))
4033 goto out;
4034 }
4035
4036 num_algo_params = 0;
4037 num_key_attrs = 0;
4038 switch (TEE_ALG_GET_MAIN_ALG(tv->algo)) {
4039 case TEE_MAIN_ALGO_RSA:
4040 if (tv->params.rsa.salt_len > 0) {
4041 algo_params[0].attributeID =
4042 TEE_ATTR_RSA_PSS_SALT_LENGTH;
4043 algo_params[0].content.value.a =
4044 tv->params.rsa.salt_len;
4045 algo_params[0].content.value.b = 0;
4046 num_algo_params = 1;
4047 }
4048
4049 max_key_size = tv->params.rsa.modulus_len * 8;
4050
4051 xtest_add_attr(&num_key_attrs, key_attrs,
4052 TEE_ATTR_RSA_MODULUS,
4053 tv->params.rsa.modulus,
4054 tv->params.rsa.modulus_len);
4055 xtest_add_attr(&num_key_attrs, key_attrs,
4056 TEE_ATTR_RSA_PUBLIC_EXPONENT,
4057 tv->params.rsa.pub_exp,
4058 tv->params.rsa.pub_exp_len);
4059
4060 if (!ADBG_EXPECT_TRUE(c,
4061 create_key(c, &session,
4062 max_key_size,
4063 TEE_TYPE_RSA_PUBLIC_KEY,
4064 key_attrs,
4065 num_key_attrs,
4066 &pub_key_handle)))
4067 goto out;
4068
4069 xtest_add_attr(&num_key_attrs, key_attrs,
4070 TEE_ATTR_RSA_PRIVATE_EXPONENT,
4071 tv->params.rsa.priv_exp,
4072 tv->params.rsa.priv_exp_len);
4073
4074 if (tv->params.rsa.prime1_len != 0) {
4075 xtest_add_attr(&num_key_attrs, key_attrs,
4076 TEE_ATTR_RSA_PRIME1,
4077 tv->params.rsa.prime1,
4078 tv->params.rsa.prime1_len);
4079 }
4080
4081 if (tv->params.rsa.prime2_len != 0) {
4082 xtest_add_attr(&num_key_attrs, key_attrs,
4083 TEE_ATTR_RSA_PRIME2,
4084 tv->params.rsa.prime2,
4085 tv->params.rsa.prime2_len);
4086 }
4087
4088 if (tv->params.rsa.exp1_len != 0) {
4089 xtest_add_attr(&num_key_attrs, key_attrs,
4090 TEE_ATTR_RSA_EXPONENT1,
4091 tv->params.rsa.exp1,
4092 tv->params.rsa.exp1_len);
4093 }
4094
4095 if (tv->params.rsa.exp2_len != 0) {
4096 xtest_add_attr(&num_key_attrs, key_attrs,
4097 TEE_ATTR_RSA_EXPONENT2,
4098 tv->params.rsa.exp2,
4099 tv->params.rsa.exp2_len);
4100 }
4101
4102 if (tv->params.rsa.coeff_len != 0) {
4103 xtest_add_attr(&num_key_attrs, key_attrs,
4104 TEE_ATTR_RSA_COEFFICIENT,
4105 tv->params.rsa.coeff,
4106 tv->params.rsa.coeff_len);
4107 }
4108
4109 if (!ADBG_EXPECT_TRUE(c,
4110 create_key(c, &session,
4111 max_key_size,
4112 TEE_TYPE_RSA_KEYPAIR,
4113 key_attrs,
4114 num_key_attrs,
4115 &priv_key_handle)))
4116 goto out;
4117 break;
4118
4119 case TEE_MAIN_ALGO_DSA:
4120 max_key_size = tv->params.dsa.prime_len * 8;
4121
4122 xtest_add_attr(&num_key_attrs, key_attrs,
4123 TEE_ATTR_DSA_PRIME,
4124 tv->params.dsa.prime,
4125 tv->params.dsa.prime_len);
4126 xtest_add_attr(&num_key_attrs, key_attrs,
4127 TEE_ATTR_DSA_SUBPRIME,
4128 tv->params.dsa.sub_prime,
4129 tv->params.dsa.sub_prime_len);
4130 xtest_add_attr(&num_key_attrs, key_attrs,
4131 TEE_ATTR_DSA_BASE,
4132 tv->params.dsa.base,
4133 tv->params.dsa.base_len);
4134 xtest_add_attr(&num_key_attrs, key_attrs,
4135 TEE_ATTR_DSA_PUBLIC_VALUE,
4136 tv->params.dsa.pub_val,
4137 tv->params.dsa.pub_val_len);
4138
4139 if (!ADBG_EXPECT_TRUE(c,
4140 create_key(c, &session, max_key_size,
4141 TEE_TYPE_DSA_PUBLIC_KEY, key_attrs,
4142 num_key_attrs, &pub_key_handle)))
4143 goto out;
4144
4145 xtest_add_attr(&num_key_attrs, key_attrs,
4146 TEE_ATTR_DSA_PRIVATE_VALUE,
4147 tv->params.dsa.priv_val,
4148 tv->params.dsa.priv_val_len);
4149
4150 if (!ADBG_EXPECT_TRUE(c,
4151 create_key(c, &session, max_key_size,
4152 TEE_TYPE_DSA_KEYPAIR, key_attrs,
4153 num_key_attrs, &priv_key_handle)))
4154 goto out;
4155 break;
4156
Pascal Brand3e143ee2015-07-15 17:17:16 +02004157 case TEE_MAIN_ALGO_ECDSA:
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004158 case TEE_MAIN_ALGO_SM2_PKE:
Jerome Forissier849b57e2019-12-19 16:37:14 +01004159 case TEE_MAIN_ALGO_SM2_DSA_SM3:
Pascal Brand3e143ee2015-07-15 17:17:16 +02004160 switch (tv->algo) {
4161 case TEE_ALG_ECDSA_P192:
4162 curve = TEE_ECC_CURVE_NIST_P192;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004163 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4164 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004165 break;
4166 case TEE_ALG_ECDSA_P224:
4167 curve = TEE_ECC_CURVE_NIST_P224;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004168 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4169 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004170 break;
4171 case TEE_ALG_ECDSA_P256:
4172 curve = TEE_ECC_CURVE_NIST_P256;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004173 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4174 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004175 break;
4176 case TEE_ALG_ECDSA_P384:
4177 curve = TEE_ECC_CURVE_NIST_P384;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004178 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4179 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004180 break;
4181 case TEE_ALG_ECDSA_P521:
4182 curve = TEE_ECC_CURVE_NIST_P521;
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004183 pub_key_type = TEE_TYPE_ECDSA_PUBLIC_KEY;
4184 priv_key_type = TEE_TYPE_ECDSA_KEYPAIR;
4185 break;
4186 case TEE_ALG_SM2_PKE:
4187 curve = TEE_ECC_CURVE_SM2;
4188 pub_key_type = TEE_TYPE_SM2_PKE_PUBLIC_KEY;
4189 priv_key_type = TEE_TYPE_SM2_PKE_KEYPAIR;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004190 break;
Jerome Forissier849b57e2019-12-19 16:37:14 +01004191 case TEE_ALG_SM2_DSA_SM3:
4192 curve = TEE_ECC_CURVE_SM2;
4193 pub_key_type = TEE_TYPE_SM2_DSA_PUBLIC_KEY;
4194 priv_key_type = TEE_TYPE_SM2_DSA_KEYPAIR;
4195 break;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004196 default:
4197 curve = 0xFF;
4198 break;
4199 }
4200
4201 if (tv->algo == TEE_ALG_ECDSA_P521)
4202 max_key_size = 521;
4203 else
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004204 max_key_size = tv->params.ecc.private_len * 8;
Pascal Brand3e143ee2015-07-15 17:17:16 +02004205
4206 xtest_add_attr_value(&num_key_attrs, key_attrs,
4207 TEE_ATTR_ECC_CURVE, curve, 0);
4208 xtest_add_attr(&num_key_attrs, key_attrs,
4209 TEE_ATTR_ECC_PUBLIC_VALUE_X,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004210 tv->params.ecc.public_x,
4211 tv->params.ecc.public_x_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004212 xtest_add_attr(&num_key_attrs, key_attrs,
4213 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004214 tv->params.ecc.public_y,
4215 tv->params.ecc.public_y_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004216
4217 if (!ADBG_EXPECT_TRUE(c,
4218 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004219 pub_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004220 num_key_attrs, &pub_key_handle)))
4221 goto out;
4222
4223 xtest_add_attr(&num_key_attrs, key_attrs,
4224 TEE_ATTR_ECC_PRIVATE_VALUE,
Jerome Forissier3fbfd0d2019-12-17 16:44:01 +01004225 tv->params.ecc.private,
4226 tv->params.ecc.private_len);
Pascal Brand3e143ee2015-07-15 17:17:16 +02004227
4228 if (!ADBG_EXPECT_TRUE(c,
4229 create_key(c, &session, max_key_size,
Jerome Forissierb6f5ac92019-12-19 16:37:14 +01004230 priv_key_type, key_attrs,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004231 num_key_attrs, &priv_key_handle)))
4232 goto out;
4233 break;
4234
Pascal Brandc639ac82015-07-02 08:53:34 +02004235 default:
4236 ADBG_EXPECT_TRUE(c, false);
4237 goto out;
4238 }
4239
4240 out_size = sizeof(out);
4241 memset(out, 0, sizeof(out));
4242 switch (tv->mode) {
4243 case TEE_MODE_ENCRYPT:
4244 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4245 ta_crypt_cmd_allocate_operation(c, &session,
Pascal Brand3e143ee2015-07-15 17:17:16 +02004246 &op, tv->algo, TEE_MODE_ENCRYPT,
4247 max_key_size)))
Pascal Brandc639ac82015-07-02 08:53:34 +02004248 goto out;
4249
4250 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4251 ta_crypt_cmd_set_operation_key(c, &session, op,
4252 pub_key_handle)))
4253 goto out;
4254
4255 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4256 ta_crypt_cmd_free_transient_object(c, &session,
4257 pub_key_handle)))
4258 goto out;
4259 pub_key_handle = TEE_HANDLE_NULL;
4260
4261 out_enc_size = sizeof(out_enc);
4262 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4263 ta_crypt_cmd_asymmetric_encrypt(c, &session, op,
4264 NULL, 0, tv->ptx, tv->ptx_len, out_enc,
4265 &out_enc_size)))
4266 goto out;
4267
4268 /*
4269 * A PS which is random is added when formatting the
4270 * message internally of the algorithm so we can't
4271 * verify against precomputed values, instead we use the
4272 * decrypt operation to see that output is correct.
4273 */
4274
4275 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4276 ta_crypt_cmd_free_operation(c, &session, op)))
4277 goto out;
4278
4279 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4280 ta_crypt_cmd_allocate_operation(c, &session,
4281 &op, tv->algo, TEE_MODE_DECRYPT,
4282 max_key_size)))
4283 goto out;
4284
4285 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4286 ta_crypt_cmd_set_operation_key(c, &session, op,
4287 priv_key_handle)))
4288 goto out;
4289
4290 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4291 ta_crypt_cmd_free_transient_object(c, &session,
4292 priv_key_handle)))
4293 goto out;
4294
4295 priv_key_handle = TEE_HANDLE_NULL;
4296
4297 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4298 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4299 NULL, 0, out_enc, out_enc_size, out,
4300 &out_size)))
4301 goto out;
4302
4303 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4304 out_size);
4305 break;
4306
4307 case TEE_MODE_DECRYPT:
4308 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4309 ta_crypt_cmd_allocate_operation(c, &session,
4310 &op, tv->algo, TEE_MODE_DECRYPT,
4311 max_key_size)))
4312 goto out;
4313
4314 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4315 ta_crypt_cmd_set_operation_key(c, &session, op,
4316 priv_key_handle)))
4317 goto out;
4318
4319 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4320 ta_crypt_cmd_free_transient_object(c, &session,
4321 priv_key_handle)))
4322 goto out;
4323
4324 priv_key_handle = TEE_HANDLE_NULL;
4325
4326 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4327 ta_crypt_cmd_asymmetric_decrypt(c, &session, op,
4328 NULL, 0, tv->ctx, tv->ctx_len, out,
4329 &out_size)))
4330 goto out;
4331
4332 (void)ADBG_EXPECT_BUFFER(c, tv->ptx, tv->ptx_len, out,
4333 out_size);
4334 break;
4335
4336 case TEE_MODE_VERIFY:
4337 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4338 ta_crypt_cmd_allocate_operation(c, &session,
4339 &op, tv->algo, TEE_MODE_VERIFY,
4340 max_key_size)))
4341 goto out;
4342
4343 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4344 ta_crypt_cmd_set_operation_key(c, &session, op,
4345 pub_key_handle)))
4346 goto out;
4347
4348 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4349 ta_crypt_cmd_free_transient_object(c, &session,
4350 pub_key_handle)))
4351 goto out;
4352
4353 pub_key_handle = TEE_HANDLE_NULL;
4354
4355 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4356 ta_crypt_cmd_asymmetric_verify(c, &session, op,
4357 algo_params, num_algo_params, ptx_hash,
4358 ptx_hash_size, tv->ctx, tv->ctx_len)))
4359 goto out;
4360 break;
4361
4362 case TEE_MODE_SIGN:
4363 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4364 ta_crypt_cmd_allocate_operation(c, &session,
4365 &op, tv->algo, TEE_MODE_SIGN,
4366 max_key_size)))
4367 goto out;
4368
4369 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4370 ta_crypt_cmd_set_operation_key(c, &session, op,
4371 priv_key_handle)))
4372 goto out;
4373
4374 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4375 ta_crypt_cmd_free_transient_object(c, &session,
4376 priv_key_handle)))
4377 goto out;
4378
4379 priv_key_handle = TEE_HANDLE_NULL;
4380
4381 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4382 ta_crypt_cmd_asymmetric_sign(c, &session, op,
4383 algo_params, num_algo_params, ptx_hash,
4384 ptx_hash_size, out, &out_size)))
4385 goto out;
4386
4387 if (TEE_ALG_GET_CHAIN_MODE(tv->algo) ==
4388 TEE_CHAIN_MODE_PKCS1_PSS_MGF1 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004389 tv->algo == TEE_ALG_DSA_SHA1 ||
Cedric Chaumontb2ba8782015-09-03 13:23:05 +02004390 tv->algo == TEE_ALG_DSA_SHA224 ||
4391 tv->algo == TEE_ALG_DSA_SHA256 ||
Pascal Brand3e143ee2015-07-15 17:17:16 +02004392 TEE_ALG_GET_MAIN_ALG(tv->algo) ==
Jerome Forissier849b57e2019-12-19 16:37:14 +01004393 TEE_MAIN_ALGO_ECDSA ||
4394 tv->algo == TEE_ALG_SM2_DSA_SM3) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004395 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4396 ta_crypt_cmd_free_operation(c, &session,
4397 op)))
4398 goto out;
4399 /*
4400 * The salt or K is random so we can't verify
4401 * signing against precomputed values, instead
4402 * we use the verify operation to see that
4403 * output is correct.
4404 */
4405 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4406 ta_crypt_cmd_allocate_operation(c,
4407 &session, &op, tv->algo,
4408 TEE_MODE_VERIFY, max_key_size)))
4409 goto out;
4410
4411 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4412 ta_crypt_cmd_set_operation_key(c,
4413 &session, op, pub_key_handle)))
4414 goto out;
4415
4416 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4417 ta_crypt_cmd_free_transient_object(c,
4418 &session, pub_key_handle)))
4419 goto out;
4420
4421 pub_key_handle = TEE_HANDLE_NULL;
4422
4423 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4424 ta_crypt_cmd_asymmetric_verify(c,
4425 &session, op, algo_params,
4426 num_algo_params, ptx_hash,
4427 ptx_hash_size, out, out_size)))
4428 goto out;
4429 } else {
4430 (void)ADBG_EXPECT_BUFFER(c, tv->ctx,
4431 tv->ctx_len, out,
4432 out_size);
4433 }
4434 break;
4435
4436 default:
4437 break;
4438 }
4439
4440 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4441 ta_crypt_cmd_free_operation(c, &session, op)))
4442 goto out;
4443
4444 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4445 ta_crypt_cmd_free_transient_object(c, &session,
4446 pub_key_handle)))
4447 goto out;
4448 pub_key_handle = TEE_HANDLE_NULL;
4449
4450 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4451 ta_crypt_cmd_free_transient_object(c, &session,
4452 priv_key_handle)))
4453 goto out;
4454
4455 priv_key_handle = TEE_HANDLE_NULL;
4456
4457 Do_ADBG_EndSubCase(c, NULL);
4458 }
4459out:
4460 TEEC_CloseSession(&session);
4461}
Jens Wiklander14f48872018-06-29 15:30:13 +02004462ADBG_CASE_DEFINE(regression, 4006, xtest_tee_test_4006,
4463 "Test TEE Internal API Asymmetric Cipher operations");
Pascal Brandc639ac82015-07-02 08:53:34 +02004464
4465#define KEY_ATTR(x, y) { #x, (x), y }
4466
4467struct key_attrs {
4468 const char *name;
4469 uint32_t attr;
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004470 /*
4471 * When keysize_check != 0: size of attribute is checked
4472 * Expected value is key_size bits except for DH in which case it is
4473 * the value of keysize_check.
4474 */
4475 uint32_t keysize_check;
Pascal Brandc639ac82015-07-02 08:53:34 +02004476};
4477
4478static bool test_keygen_attributes(ADBG_Case_t *c, TEEC_Session *s,
4479 TEE_ObjectHandle key, uint32_t key_size,
4480 struct key_attrs *attrs, size_t num_attrs)
4481{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004482 uint8_t out[2048] = { };
4483 size_t out_size = 0;
4484 size_t n = 0;
4485 size_t m = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004486
4487 for (m = 0; m < num_attrs; m++) {
4488 if ((attrs[m].attr & TEE_ATTR_BIT_VALUE) == 0) {
4489 out_size = sizeof(out);
4490 memset(out, 0, sizeof(out));
4491 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4492 ta_crypt_cmd_get_object_buffer_attribute(c, s,
4493 key, attrs[m].attr, out, &out_size)))
4494 return false;
4495
4496 if (attrs[m].keysize_check)
4497 ADBG_EXPECT_COMPARE_UNSIGNED(c, out_size, ==,
4498 key_size / 8);
4499
4500 if (out_size > 0) {
4501 /* Check that buffer isn't all zeroes */
4502 for (n = 0; n < out_size; n++)
4503 if (out[n] != 0)
4504 break;
4505 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <,
4506 out_size))
4507 return false;
4508 }
4509 } else {
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004510 uint32_t a = 0;
4511 uint32_t b = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004512
4513 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4514 ta_crypt_cmd_get_object_value_attribute(c, s, key,
4515 attrs[m].attr, &a, &b)))
4516 return false;
4517 }
4518 }
4519 return true;
4520}
4521
4522static bool test_secret_value(ADBG_Case_t *c, TEEC_Session *s,
4523 TEE_ObjectHandle key, uint32_t key_size)
4524{
4525 const struct key_attrs attrs[] = {
4526 KEY_ATTR(TEE_ATTR_SECRET_VALUE, true),
4527 };
4528
4529 return test_keygen_attributes(c, s, key, key_size,
4530 (struct key_attrs *)&attrs,
4531 ARRAY_SIZE(attrs));
4532}
4533
4534
4535static bool test_rsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4536 TEE_ObjectHandle key, uint32_t key_size)
4537{
4538 const struct key_attrs attrs[] = {
4539 KEY_ATTR(TEE_ATTR_RSA_MODULUS, true),
4540 KEY_ATTR(TEE_ATTR_RSA_PUBLIC_EXPONENT, false),
4541 KEY_ATTR(TEE_ATTR_RSA_PRIVATE_EXPONENT, false),
4542 KEY_ATTR(TEE_ATTR_RSA_PRIME1, false),
4543 KEY_ATTR(TEE_ATTR_RSA_PRIME2, false),
4544 KEY_ATTR(TEE_ATTR_RSA_EXPONENT1, false),
4545 KEY_ATTR(TEE_ATTR_RSA_EXPONENT2, false),
4546 KEY_ATTR(TEE_ATTR_RSA_COEFFICIENT, false),
4547 };
4548
4549 return test_keygen_attributes(c, s, key, key_size,
4550 (struct key_attrs *)&attrs,
4551 ARRAY_SIZE(attrs));
4552}
4553
Pascal Brande61133f2015-07-08 15:38:37 +02004554static bool test_ecc_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4555 TEE_ObjectHandle key, uint32_t key_size)
4556{
4557 const struct key_attrs attrs[] = {
4558 KEY_ATTR(TEE_ATTR_ECC_PRIVATE_VALUE, false),
4559 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_X , false),
4560 KEY_ATTR(TEE_ATTR_ECC_PUBLIC_VALUE_Y , false),
4561 /* KEY_ATTR(TEE_ATTR_ECC_CURVE, false), - do not test */
4562 };
4563
4564 return test_keygen_attributes(c, s, key, key_size,
4565 (struct key_attrs *)&attrs,
4566 ARRAY_SIZE(attrs));
4567}
4568
Pascal Brandc639ac82015-07-02 08:53:34 +02004569static bool test_dh_key_pair(ADBG_Case_t *c, TEEC_Session *s,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004570 TEE_ObjectHandle key, uint32_t check_keysize)
Pascal Brandc639ac82015-07-02 08:53:34 +02004571{
4572 const struct key_attrs attrs[] = {
4573 KEY_ATTR(TEE_ATTR_DH_PRIME, false),
4574 KEY_ATTR(TEE_ATTR_DH_BASE, false),
4575 KEY_ATTR(TEE_ATTR_DH_PUBLIC_VALUE, false),
4576 KEY_ATTR(TEE_ATTR_DH_PRIVATE_VALUE, check_keysize),
4577 KEY_ATTR(TEE_ATTR_DH_X_BITS, false),
4578 };
4579
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004580 return test_keygen_attributes(c, s, key, check_keysize,
Pascal Brandc639ac82015-07-02 08:53:34 +02004581 (struct key_attrs *)&attrs,
4582 ARRAY_SIZE(attrs));
4583}
4584
4585static bool test_dsa_key_pair(ADBG_Case_t *c, TEEC_Session *s,
4586 TEE_ObjectHandle key, uint32_t key_size)
4587{
4588 const struct key_attrs attrs[] = {
4589 KEY_ATTR(TEE_ATTR_DSA_PRIME, true),
4590 KEY_ATTR(TEE_ATTR_DSA_SUBPRIME, false),
4591 KEY_ATTR(TEE_ATTR_DSA_BASE, false),
4592 KEY_ATTR(TEE_ATTR_DSA_PUBLIC_VALUE, false),
4593 KEY_ATTR(TEE_ATTR_DSA_PRIVATE_VALUE, false),
4594 };
4595
4596 return test_keygen_attributes(c, s, key, key_size,
4597 (struct key_attrs *)&attrs,
4598 ARRAY_SIZE(attrs));
4599}
4600
4601static bool generate_and_test_key(ADBG_Case_t *c, TEEC_Session *s,
4602 uint32_t key_type, uint32_t check_keysize,
4603 uint32_t key_size,
4604 TEE_Attribute *params, size_t param_count)
4605{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004606 TEE_ObjectHandle key = TEE_HANDLE_NULL;
Pascal Brandc639ac82015-07-02 08:53:34 +02004607 bool ret_val = true;
4608
4609 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4610 ta_crypt_cmd_allocate_transient_object(c, s, key_type, key_size,
4611 &key)))
4612 return false;
4613
4614 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4615 ta_crypt_cmd_generate_key(c, s, key, key_size, params,
4616 param_count)))
4617 return false;
4618
4619 switch (key_type) {
4620 case TEE_TYPE_DES:
4621 case TEE_TYPE_DES3:
4622 ret_val = ADBG_EXPECT_TRUE(c,
4623 test_secret_value(c, s, key,
4624 key_size + key_size / 7));
4625 break;
4626 case TEE_TYPE_AES:
4627 case TEE_TYPE_HMAC_MD5:
4628 case TEE_TYPE_HMAC_SHA1:
4629 case TEE_TYPE_HMAC_SHA224:
4630 case TEE_TYPE_HMAC_SHA256:
4631 case TEE_TYPE_HMAC_SHA384:
4632 case TEE_TYPE_HMAC_SHA512:
4633 case TEE_TYPE_GENERIC_SECRET:
4634 ret_val = ADBG_EXPECT_TRUE(c,
4635 test_secret_value(c, s, key, key_size));
4636 break;
4637
4638 case TEE_TYPE_RSA_KEYPAIR:
4639 ret_val = ADBG_EXPECT_TRUE(c,
4640 test_rsa_key_pair(c, s, key, key_size));
4641 break;
4642
Pascal Brande61133f2015-07-08 15:38:37 +02004643 case TEE_TYPE_ECDSA_KEYPAIR:
4644 case TEE_TYPE_ECDH_KEYPAIR:
4645 ret_val = ADBG_EXPECT_TRUE(c,
4646 test_ecc_key_pair(c, s, key, key_size));
4647 break;
4648
Pascal Brandc639ac82015-07-02 08:53:34 +02004649 case TEE_TYPE_DH_KEYPAIR:
Pascal Brande61133f2015-07-08 15:38:37 +02004650 ret_val = ADBG_EXPECT_TRUE(c,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004651 test_dh_key_pair(c, s, key, check_keysize));
Pascal Brandc639ac82015-07-02 08:53:34 +02004652 break;
4653
4654 case TEE_TYPE_DSA_KEYPAIR:
4655 ret_val = ADBG_EXPECT_TRUE(c,
4656 test_dsa_key_pair(c, s, key, key_size));
4657 break;
4658
4659 default:
4660 ret_val = false;
4661 break;
4662 }
4663
4664 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4665 ta_crypt_cmd_free_transient_object(c, s, key)))
4666 return false;
4667
4668 return ret_val;
4669}
4670
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004671struct key_types_noparam {
4672 unsigned level;
4673 const char *name;
4674 uint32_t key_type;
4675 uint32_t quanta;
4676 uint32_t min_size;
4677 uint32_t max_size;
4678};
4679
4680static void keygen_noparams(ADBG_Case_t *c, TEEC_Session *session,
4681 const struct key_types_noparam *key_types,
4682 size_t num_key_types)
Pascal Brandc639ac82015-07-02 08:53:34 +02004683{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004684 size_t n = 0;
4685 uint32_t key_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004686
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004687 for (n = 0; n < num_key_types; n++) {
Pascal Brandc639ac82015-07-02 08:53:34 +02004688 uint32_t min_size = key_types[n].min_size;
4689 uint32_t max_size = key_types[n].max_size;
4690 uint32_t quanta = key_types[n].quanta;
4691
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004692 if (key_types[n].level > level)
4693 continue;
4694
Pascal Brandc639ac82015-07-02 08:53:34 +02004695 Do_ADBG_BeginSubCase(c, "Generate %s key", key_types[n].name);
4696
4697 for (key_size = min_size; key_size <= max_size;
4698 key_size += quanta) {
4699 if (!ADBG_EXPECT_TRUE(c,
4700 generate_and_test_key(c, session, key_types
4701 [n].key_type, 1, key_size, NULL, 0)))
4702 break;
4703 }
4704
4705 Do_ADBG_EndSubCase(c, "Generate %s key", key_types[n].name);
4706 }
4707}
4708
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004709static void xtest_tee_test_4007_symmetric(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004710{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004711 TEEC_Session session = { };
4712 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004713 static const struct key_types_noparam key_types[] = {
4714 { 0, "AES", TEE_TYPE_AES, 64, 128,
4715 256 /* valid sizes 128, 192, 256 */ },
4716 { 0, "DES", TEE_TYPE_DES, 56, 56, 56 /* valid size 56 */ },
4717 { 0, "DES3", TEE_TYPE_DES3, 56, 112,
4718 168 /* valid sizes 112, 168 */ },
4719 { 0, "HMAC-MD5", TEE_TYPE_HMAC_MD5, 8, 64, 512 },
4720 { 0, "HMAC-SHA1", TEE_TYPE_HMAC_SHA1, 8, 80, 512 },
4721 { 0, "HMAC-SHA224", TEE_TYPE_HMAC_SHA224, 8, 112, 512 },
4722 { 0, "HMAC-SHA256", TEE_TYPE_HMAC_SHA256, 8, 192, 1024 },
4723 { 0, "HMAC-SHA384", TEE_TYPE_HMAC_SHA384, 8, 256, 1024 },
4724 { 0, "HMAC-SHA512", TEE_TYPE_HMAC_SHA512, 8, 256, 1024 },
4725 { 0, "Generic secret", TEE_TYPE_GENERIC_SECRET, 8, 128, 4096 },
4726 };
4727
4728 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4729 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4730 &ret_orig)))
4731 return;
4732
4733 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4734
4735 TEEC_CloseSession(&session);
4736}
4737ADBG_CASE_DEFINE(regression, 4007_symmetric, xtest_tee_test_4007_symmetric,
4738 "Test TEE Internal API Generate Symmetric key");
4739
4740static void xtest_tee_test_4007_rsa(ADBG_Case_t *c)
4741{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004742 TEEC_Session session = { };
4743 uint32_t ret_orig = 0;
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004744 static const struct key_types_noparam key_types[] = {
4745 { 0, "RSA-256", TEE_TYPE_RSA_KEYPAIR, 1, 256, 256 },
4746 { 1, "RSA-384", TEE_TYPE_RSA_KEYPAIR, 1, 384, 384 },
4747 { 1, "RSA-512", TEE_TYPE_RSA_KEYPAIR, 1, 512, 512 },
4748 { 1, "RSA-640", TEE_TYPE_RSA_KEYPAIR, 1, 640, 640 },
4749 { 1, "RSA-768", TEE_TYPE_RSA_KEYPAIR, 1, 768, 768 },
4750 { 1, "RSA-896", TEE_TYPE_RSA_KEYPAIR, 1, 896, 896 },
4751 { 1, "RSA-1024", TEE_TYPE_RSA_KEYPAIR, 1, 1024, 1024 },
4752 { 1, "RSA-2048", TEE_TYPE_RSA_KEYPAIR, 1, 2048, 2048 },
4753 { 1, "RSA-3072", TEE_TYPE_RSA_KEYPAIR, 1, 3072, 3072 },
4754 { 1, "RSA-4096", TEE_TYPE_RSA_KEYPAIR, 1, 4096, 4096 },
4755 };
4756
4757 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4758 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4759 &ret_orig)))
4760 return;
4761
4762 keygen_noparams(c, &session, key_types, ARRAY_SIZE(key_types));
4763
4764 TEEC_CloseSession(&session);
4765}
4766ADBG_CASE_DEFINE(regression, 4007_rsa, xtest_tee_test_4007_rsa,
4767 "Test TEE Internal API Generate RSA key");
4768
4769static void xtest_tee_test_4007_dh(ADBG_Case_t *c)
4770{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004771 TEEC_Session session = { };
4772 uint32_t ret_orig = 0;
4773 size_t n = 0;
4774 size_t param_count = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02004775 /*
4776 * Note that the key size parameter is not used when creating the keys
4777 * but specifying these sizes make it possible to test the expected size
4778 * of the private value. This also means that the keysize must match the
4779 * size of p or what is specified in private_bits or the equvivalent
4780 * size of the subprime parameter.
4781 */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004782 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004783
4784#define XTEST_DH_GK_DATA(vect) \
4785 ARRAY(vect ## _p), \
4786 ARRAY(vect ## _g), \
4787 &vect ## _private_bits, \
4788 0, 0
4789#define XTEST_DH_GK_DATA_SUBPRIME(vect) \
4790 ARRAY(vect ## _p), \
4791 ARRAY(vect ## _g), \
4792 &vect ## _private_bits, \
4793 ARRAY(vect ## _subprime)
4794 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004795 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004796 uint32_t key_size;
4797 const uint8_t *p;
4798 size_t p_len;
4799 const uint8_t *g;
4800 size_t g_len;
4801 const uint32_t *private_bits;
4802 const uint8_t *subprime;
4803 size_t subprime_len;
4804 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004805 { 0, 256, XTEST_DH_GK_DATA(keygen_dh256) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004806 { 0, 320, XTEST_DH_GK_DATA(keygen_dh320) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004807 { 1, 384, XTEST_DH_GK_DATA(keygen_dh384) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004808 { 1, 448, XTEST_DH_GK_DATA(keygen_dh448) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004809 { 1, 512, XTEST_DH_GK_DATA(keygen_dh512) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004810 { 1, 576, XTEST_DH_GK_DATA(keygen_dh576) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004811 { 1, 640, XTEST_DH_GK_DATA(keygen_dh640) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004812 { 1, 704, XTEST_DH_GK_DATA(keygen_dh704) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004813 { 1, 768, XTEST_DH_GK_DATA(keygen_dh768) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004814 { 1, 832, XTEST_DH_GK_DATA(keygen_dh832) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004815 { 1, 896, XTEST_DH_GK_DATA(keygen_dh896) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004816 { 1, 960, XTEST_DH_GK_DATA(keygen_dh960) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004817 { 1, 1024, XTEST_DH_GK_DATA(keygen_dh1024) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004818 { 1, 1088, XTEST_DH_GK_DATA(keygen_dh1088) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004819 { 1, 1152, XTEST_DH_GK_DATA(keygen_dh1152) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004820 { 1, 1216, XTEST_DH_GK_DATA(keygen_dh1216) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004821 { 1, 1280, XTEST_DH_GK_DATA(keygen_dh1280) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004822 { 1, 1344, XTEST_DH_GK_DATA(keygen_dh1344) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004823 { 1, 1408, XTEST_DH_GK_DATA(keygen_dh1408) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004824 { 1, 1472, XTEST_DH_GK_DATA(keygen_dh1472) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004825 { 1, 1536, XTEST_DH_GK_DATA(keygen_dh1536) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004826 { 1, 1600, XTEST_DH_GK_DATA(keygen_dh1600) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004827 { 1, 1664, XTEST_DH_GK_DATA(keygen_dh1664) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004828 { 1, 1728, XTEST_DH_GK_DATA(keygen_dh1728) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004829 { 1, 1792, XTEST_DH_GK_DATA(keygen_dh1792) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004830 { 1, 1856, XTEST_DH_GK_DATA(keygen_dh1856) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004831 { 1, 1920, XTEST_DH_GK_DATA(keygen_dh1920) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004832 { 1, 1984, XTEST_DH_GK_DATA(keygen_dh1984) },
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004833 { 1, 2048, XTEST_DH_GK_DATA(keygen_dh2048) },
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004834 { 1, 2048, XTEST_DH_GK_DATA_SUBPRIME(keygen_dh2048_subprime) }
Pascal Brandc639ac82015-07-02 08:53:34 +02004835 };
4836
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004837 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4838 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4839 &ret_orig)))
4840 return;
Pascal Brandc639ac82015-07-02 08:53:34 +02004841
4842 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004843 if (key_types[n].level > level)
4844 continue;
4845
Pascal Brandc639ac82015-07-02 08:53:34 +02004846 Do_ADBG_BeginSubCase(c,
4847 "Generate DH key %d bits - Private bits = %d",
4848 key_types[n].key_size,
4849 *key_types[n].private_bits);
4850 param_count = 0;
4851
4852 xtest_add_attr(&param_count, params,
4853 TEE_ATTR_DH_PRIME,
4854 key_types[n].p, key_types[n].p_len);
4855
4856 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
4857 key_types[n].g, key_types[n].g_len);
4858
4859 if (key_types[n].private_bits != 0) {
4860 params[param_count].attributeID = TEE_ATTR_DH_X_BITS;
4861
4862 params[param_count].content.value.a =
4863 *key_types[n].private_bits;
4864
4865 params[param_count].content.value.b = 0;
4866 param_count++;
4867 }
4868
4869 if (key_types[n].subprime != 0) {
4870 xtest_add_attr(&param_count, params,
4871 TEE_ATTR_DH_SUBPRIME,
4872 key_types[n].subprime,
4873 key_types[n].subprime_len);
4874 }
4875
4876 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004877 generate_and_test_key(c, &session, TEE_TYPE_DH_KEYPAIR,
Jerome Forissier4032c8c2016-05-31 13:25:08 +02004878 *key_types[n].private_bits,
Pascal Brandc639ac82015-07-02 08:53:34 +02004879 key_types[n]. key_size, params, param_count)))
4880 break;
4881
4882 Do_ADBG_EndSubCase(c,
4883 "Generate DH key %d bits - Private bits = %d",
4884 key_types[n].key_size,
4885 *key_types[n].private_bits);
4886 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004887
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004888 TEEC_CloseSession(&session);
4889}
4890ADBG_CASE_DEFINE(regression, 4007_dh, xtest_tee_test_4007_dh,
4891 "Test TEE Internal API Generate DH key");
4892
4893static void xtest_tee_test_4007_dsa(ADBG_Case_t *c)
Pascal Brandc639ac82015-07-02 08:53:34 +02004894{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004895 TEEC_Session session = { };
4896 uint32_t ret_orig = 0;
4897 size_t n = 0;
4898 size_t param_count = 0;
4899 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02004900
4901#define XTEST_DSA_GK_DATA(vect) \
4902 ARRAY(vect ## _p), \
4903 ARRAY(vect ## _g), \
4904 ARRAY(vect ## _q)
4905 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004906 unsigned level;
Pascal Brandc639ac82015-07-02 08:53:34 +02004907 uint32_t key_size;
4908 const uint8_t *prime;
4909 size_t prime_len;
4910 const uint8_t *base;
4911 size_t base_len;
4912 const uint8_t *sub_prime;
4913 size_t sub_prime_len;
4914 } key_types[] = {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004915 { 1, 1024, XTEST_DSA_GK_DATA(keygen_dsa_test1) },
4916 { 0, 512, XTEST_DSA_GK_DATA(keygen_dsa512) },
4917 { 1, 576, XTEST_DSA_GK_DATA(keygen_dsa576) },
4918 { 1, 640, XTEST_DSA_GK_DATA(keygen_dsa640) },
4919 { 1, 704, XTEST_DSA_GK_DATA(keygen_dsa704) },
4920 { 1, 768, XTEST_DSA_GK_DATA(keygen_dsa768) },
4921 { 1, 832, XTEST_DSA_GK_DATA(keygen_dsa832) },
4922 { 1, 896, XTEST_DSA_GK_DATA(keygen_dsa896) },
4923 { 1, 960, XTEST_DSA_GK_DATA(keygen_dsa960) },
4924 { 1, 1024, XTEST_DSA_GK_DATA(keygen_dsa1024) },
Pascal Brandc639ac82015-07-02 08:53:34 +02004925 };
4926
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004927 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
4928 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
4929 &ret_orig)))
4930 return;
4931
Pascal Brandc639ac82015-07-02 08:53:34 +02004932 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004933 if (key_types[n].level > level)
4934 continue;
4935
Pascal Brandc639ac82015-07-02 08:53:34 +02004936 Do_ADBG_BeginSubCase(c, "Generate DSA key %d bits",
4937 key_types[n].key_size);
4938 param_count = 0;
4939
4940
4941 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_PRIME,
4942 key_types[n].prime, key_types[n].prime_len);
4943
4944 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_SUBPRIME,
4945 key_types[n].sub_prime,
4946 key_types[n].sub_prime_len);
4947
4948 xtest_add_attr(&param_count, params, TEE_ATTR_DSA_BASE,
4949 key_types[n].base, key_types[n].base_len);
4950
4951 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004952 generate_and_test_key(c, &session, TEE_TYPE_DSA_KEYPAIR,
Pascal Brandc639ac82015-07-02 08:53:34 +02004953 1, key_types[n]. key_size, params,
4954 param_count)))
4955 break;
4956
4957 Do_ADBG_EndSubCase(c, "Generate DSA key %d bits",
4958 key_types[n].key_size);
4959 }
Pascal Brandc639ac82015-07-02 08:53:34 +02004960
Jens Wiklandera8c8f872018-12-14 11:41:36 +01004961 TEEC_CloseSession(&session);
4962}
4963ADBG_CASE_DEFINE(regression, 4007_dsa, xtest_tee_test_4007_dsa,
4964 "Test TEE Internal API Generate DSA key");
4965
4966static void xtest_tee_test_4007_ecc(ADBG_Case_t *c)
Pascal Brande61133f2015-07-08 15:38:37 +02004967{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01004968 TEEC_Session session = { };
4969 uint32_t ret_orig = 0;
4970 size_t n = 0;
4971 size_t param_count = 0;
4972 TEE_Attribute params[4] = { };
Pascal Brande61133f2015-07-08 15:38:37 +02004973
4974 static const struct {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004975 unsigned level;
Pascal Brande61133f2015-07-08 15:38:37 +02004976 const char *name;
4977 uint32_t algo;
4978 uint32_t curve;
4979 uint32_t key_size;
4980 } key_types[] = {
4981 /* ECDSA */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004982 { 0, "ECDSA-192", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4983 192 },
4984 { 1, "ECDSA-224", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4985 224 },
4986 { 1, "ECDSA-256", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4987 256 },
4988 { 1, "ECDSA-384", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
4989 384 },
4990 { 1, "ECDSA-521", TEE_TYPE_ECDSA_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
4991 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02004992
4993 /* ECDH */
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01004994 { 0, "ECDH-192", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P192,
4995 192 },
4996 { 1, "ECDH-224", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P224,
4997 224 },
4998 { 1, "ECDH-256", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P256,
4999 256 },
5000 { 1, "ECDH-384", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P384,
5001 384 },
5002 { 1, "ECDH-521", TEE_TYPE_ECDH_KEYPAIR, TEE_ECC_CURVE_NIST_P521,
5003 521 },
Pascal Brande61133f2015-07-08 15:38:37 +02005004 };
5005
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005006 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5007 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5008 &ret_orig)))
5009 return;
5010
Pascal Brande61133f2015-07-08 15:38:37 +02005011 for (n = 0; n < ARRAY_SIZE(key_types); n++) {
Jens Wiklander6a9d15a2016-02-01 10:29:42 +01005012 if (key_types[n].level > level)
5013 continue;
5014
Pascal Brande61133f2015-07-08 15:38:37 +02005015 Do_ADBG_BeginSubCase(c, "Generate %s", key_types[n].name);
5016 param_count = 0;
5017
5018 xtest_add_attr_value(&param_count, params, TEE_ATTR_ECC_CURVE,
5019 key_types[n].curve, 0);
5020
5021 if (!ADBG_EXPECT_TRUE(c,
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005022 generate_and_test_key(c, &session, key_types[n].algo,
Pascal Brande61133f2015-07-08 15:38:37 +02005023 0, key_types[n].key_size, params,
5024 param_count)))
5025 break;
5026
5027 Do_ADBG_EndSubCase(c, "Generate %s", key_types[n].name);
5028 }
Pascal Brande61133f2015-07-08 15:38:37 +02005029
Pascal Brandc639ac82015-07-02 08:53:34 +02005030 TEEC_CloseSession(&session);
5031}
Jens Wiklandera8c8f872018-12-14 11:41:36 +01005032ADBG_CASE_DEFINE(regression, 4007_ecc, xtest_tee_test_4007_ecc,
5033 "Test TEE Internal API Generate ECC key");
Pascal Brandc639ac82015-07-02 08:53:34 +02005034
5035static void xtest_tee_test_4008(ADBG_Case_t *c)
5036{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005037 TEEC_Session session = { };
5038 uint32_t ret_orig = 0;
5039 TEE_OperationHandle op = TEE_HANDLE_NULL;
5040 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5041 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5042 TEE_Attribute params[4] = { };
Pascal Brandc639ac82015-07-02 08:53:34 +02005043 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005044 uint8_t out[2048] = { };
5045 size_t out_size = 0;
Pascal Brandc639ac82015-07-02 08:53:34 +02005046
5047 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5048 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5049 &ret_orig)))
5050 return;
5051
5052 Do_ADBG_BeginSubCase(c, "Derive DH key success");
5053
5054 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5055 ta_crypt_cmd_allocate_operation(c, &session, &op,
5056 TEE_ALG_DH_DERIVE_SHARED_SECRET, TEE_MODE_DERIVE,
5057 derive_key_max_keysize)))
5058 goto out;
5059
5060 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5061 ta_crypt_cmd_allocate_transient_object(c, & session,
5062 TEE_TYPE_DH_KEYPAIR, derive_key_max_keysize,
5063 &key_handle)))
5064 goto out;
5065
5066 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIME,
5067 ARRAY(derive_key_dh_prime));
5068
5069 xtest_add_attr(&param_count, params, TEE_ATTR_DH_BASE,
5070 ARRAY(derive_key_dh_base));
5071
5072 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5073 ARRAY(derive_key_dh_public_value));
5074
5075 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PRIVATE_VALUE,
5076 ARRAY(derive_key_dh_private_value));
5077
5078 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5079 ta_crypt_cmd_populate_transient_object(c, &session, key_handle,
5080 params, param_count)))
5081 goto out;
5082
5083 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5084 ta_crypt_cmd_set_operation_key(c, &session, op, key_handle)))
5085 goto out;
5086
5087 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5088 ta_crypt_cmd_free_transient_object(c, & session, key_handle)))
5089 goto out;
5090
5091 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5092 ta_crypt_cmd_allocate_transient_object(c, &session,
5093 TEE_TYPE_GENERIC_SECRET, derive_key_max_keysize,
5094 &sv_handle)))
5095 goto out;
5096
Pascal Brand2b92b642015-07-16 13:29:42 +02005097 /* reuse but reset params and param-count */
Pascal Brandc639ac82015-07-02 08:53:34 +02005098 param_count = 0;
5099
5100 xtest_add_attr(&param_count, params, TEE_ATTR_DH_PUBLIC_VALUE,
5101 ARRAY(derive_key_dh_public_value_2));
5102
5103 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5104 ta_crypt_cmd_derive_key(c, &session, op, sv_handle, params,
5105 param_count)))
5106 goto out;
5107
5108 out_size = sizeof(out);
5109 memset(out, 0, sizeof(out));
5110 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5111 ta_crypt_cmd_get_object_buffer_attribute(c, &session, sv_handle,
5112 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5113 goto out;
5114
5115 if (!ADBG_EXPECT_BUFFER(c, derive_key_dh_shared_secret,
5116 sizeof(derive_key_dh_shared_secret), out,
5117 out_size))
5118 goto out;
5119
5120 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5121 ta_crypt_cmd_free_operation(c, &session, op)))
5122 goto out;
5123
5124 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5125 ta_crypt_cmd_free_transient_object(c, &session, sv_handle)))
5126 goto out;
5127out:
5128 Do_ADBG_EndSubCase(c, "Derive DH key success");
5129 TEEC_CloseSession(&session);
5130}
Jens Wiklander14f48872018-06-29 15:30:13 +02005131ADBG_CASE_DEFINE(regression, 4008, xtest_tee_test_4008,
5132 "Test TEE Internal API Derive key");
Pascal Brand2b92b642015-07-16 13:29:42 +02005133
5134static void xtest_tee_test_4009(ADBG_Case_t *c)
5135{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005136 TEEC_Session session = { };
5137 uint32_t ret_orig = 0;
5138 TEE_OperationHandle op = TEE_HANDLE_NULL;
5139 TEE_ObjectHandle key_handle = TEE_HANDLE_NULL;
5140 TEE_ObjectHandle sv_handle = TEE_HANDLE_NULL;
5141 TEE_Attribute params[4] = { };
Pascal Brand2b92b642015-07-16 13:29:42 +02005142 size_t param_count = 0;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005143 uint8_t out[2048] = { };
5144 size_t out_size = 0;
5145 uint32_t size_bytes = 0;
5146 uint32_t i = 0;
5147 struct derive_key_ecdh_t *pt = NULL;
Pascal Brand2b92b642015-07-16 13:29:42 +02005148
5149 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5150 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5151 &ret_orig)))
5152 return;
5153
5154 for (i = 0; i < ARRAY_SIZE(derive_key_ecdh); i++) {
5155 pt = &derive_key_ecdh[i];
5156
Cedric Chaumontc3b6c282015-09-25 03:05:18 +02005157 if (pt->level > level)
5158 continue;
5159
Pascal Brand2b92b642015-07-16 13:29:42 +02005160 Do_ADBG_BeginSubCase(c, "Derive ECDH key - algo = 0x%x",
5161 pt->algo);
5162 size_bytes = (pt->keysize + 7) / 8;
5163 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5164 ta_crypt_cmd_allocate_operation(c, &session, &op,
5165 pt->algo,
5166 TEE_MODE_DERIVE, pt->keysize)))
5167 goto out;
5168
5169 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5170 ta_crypt_cmd_allocate_transient_object(c, & session,
5171 TEE_TYPE_ECDH_KEYPAIR, pt->keysize,
5172 &key_handle)))
5173 goto out;
5174
5175 param_count = 0;
5176 xtest_add_attr_value(&param_count, params,
5177 TEE_ATTR_ECC_CURVE, pt->curve, 0);
5178 xtest_add_attr(&param_count, params,
5179 TEE_ATTR_ECC_PRIVATE_VALUE,
5180 pt->private, size_bytes);
5181 /*
Cedric Auger719047c2019-09-11 12:08:14 +02005182 * The public value is not used, but we should provide a valid
5183 * one to avoid rejection in case TEE_PopulateTransientObject()
5184 * checks for key validity.
Pascal Brand2b92b642015-07-16 13:29:42 +02005185 */
5186 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005187 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5188 pt->public_x, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005189 xtest_add_attr(&param_count, params,
Cedric Auger719047c2019-09-11 12:08:14 +02005190 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5191 pt->public_y, size_bytes);
Pascal Brand2b92b642015-07-16 13:29:42 +02005192
5193 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5194 ta_crypt_cmd_populate_transient_object(c,
5195 &session,
5196 key_handle, params, param_count)))
5197 goto out;
5198
5199 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5200 ta_crypt_cmd_set_operation_key(c, &session, op,
5201 key_handle)))
5202 goto out;
5203
5204 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5205 ta_crypt_cmd_free_transient_object(c, & session,
5206 key_handle)))
5207 goto out;
5208
5209 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5210 ta_crypt_cmd_allocate_transient_object(c, &session,
5211 TEE_TYPE_GENERIC_SECRET, size_bytes * 8,
5212 &sv_handle)))
5213 goto out;
5214
5215 /* reuse but reset params and param-count */
5216 param_count = 0;
5217
5218 xtest_add_attr(&param_count, params,
5219 TEE_ATTR_ECC_PUBLIC_VALUE_X,
5220 pt->public_x, size_bytes);
5221 xtest_add_attr(&param_count, params,
5222 TEE_ATTR_ECC_PUBLIC_VALUE_Y,
5223 pt->public_y, size_bytes);
5224
5225 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5226 ta_crypt_cmd_derive_key(c, &session, op, sv_handle,
5227 params, param_count)))
5228 goto out;
5229
5230 out_size = sizeof(out);
5231 memset(out, 0, sizeof(out));
5232 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5233 ta_crypt_cmd_get_object_buffer_attribute(c, &session,
5234 sv_handle,
5235 TEE_ATTR_SECRET_VALUE, out, &out_size)))
5236 goto out;
5237
5238 if (!ADBG_EXPECT_BUFFER(c, pt->out, size_bytes,
5239 out, out_size))
5240 goto out;
5241
5242 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5243 ta_crypt_cmd_free_operation(c, &session, op)))
5244 goto out;
5245
5246 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5247 ta_crypt_cmd_free_transient_object(c, &session,
5248 sv_handle)))
5249 goto out;
5250
5251 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x",
5252 pt->algo);
5253 }
5254
5255 goto noerror;
5256
5257out:
5258 Do_ADBG_EndSubCase(c, "Derive ECDH key - algo = 0x%x", pt->algo);
5259
5260noerror:
5261 TEEC_CloseSession(&session);
5262}
Jens Wiklander14f48872018-06-29 15:30:13 +02005263ADBG_CASE_DEFINE(regression, 4009, xtest_tee_test_4009,
5264 "Test TEE Internal API Derive key ECDH");
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005265
5266static void xtest_tee_test_4010(ADBG_Case_t *c)
5267{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005268 TEEC_Session session = { };
5269 uint32_t ret_orig = 0;
5270 TEE_ObjectHandle o = TEE_HANDLE_NULL;
Jens Wiklander70a0b2c2016-05-18 08:39:35 +02005271 static const uint8_t large_key[1024] = { 1, 2, 3, 4, 5, 6 };
5272 static const TEE_Attribute attr = {
5273 .attributeID = TEE_ATTR_SECRET_VALUE,
5274 .content.ref.buffer = (void *)large_key,
5275 .content.ref.length = sizeof(large_key),
5276 };
5277
5278 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5279 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5280 &ret_orig)))
5281 return;
5282
5283 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5284 ta_crypt_cmd_allocate_transient_object(c, &session,
5285 TEE_TYPE_HMAC_SHA256, 1024, &o)))
5286 goto out;
5287
5288 ADBG_EXPECT_TEEC_RESULT(c, TEEC_ERROR_TARGET_DEAD,
5289 ta_crypt_cmd_populate_transient_object(c, &session, o,
5290 &attr, 1));
5291
5292out:
5293 TEEC_CloseSession(&session);
5294}
Jens Wiklander14f48872018-06-29 15:30:13 +02005295ADBG_CASE_DEFINE(regression, 4010, xtest_tee_test_4010,
5296 "Test TEE Internal API create transient object (negative)");
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005297
5298static void xtest_tee_test_4011(ADBG_Case_t *c)
5299{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005300 TEEC_Session s = { };
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005301 size_t key_size = 512;
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005302 TEE_ObjectHandle key = TEE_HANDLE_NULL;
5303 TEE_OperationHandle ops = TEE_HANDLE_NULL;
5304 TEE_OperationHandle opv = TEE_HANDLE_NULL;
5305 TEE_OperationHandle ope = TEE_HANDLE_NULL;
5306 TEE_OperationHandle opd = TEE_HANDLE_NULL;
5307 uint32_t ret_orig = 0;
5308 uint8_t in[TEE_SHA1_HASH_SIZE] = { };
5309 uint8_t out[1024] = { };
5310 uint8_t tmp[1024] = { };
5311 size_t out_size = 0;
5312 size_t tmp_size = 0;
5313 size_t n = 0;
5314 size_t m = 0;
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005315 size_t i = 0;
5316
5317 /* Setup session, initialize message to sign, create a keypair */
5318 if (!ADBG_EXPECT_TEEC_SUCCESS(c, xtest_teec_open_session(&s,
5319 &crypt_user_ta_uuid, NULL, &ret_orig)))
5320 return;
5321 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_random_number_generate(c,
5322 &s, in, sizeof(in))))
5323 goto out;
5324 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_transient_object(
5325 c, &s, TEE_TYPE_RSA_KEYPAIR, key_size, &key)))
5326 goto out;
5327 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_generate_key(c, &s,
5328 key, key_size, NULL, 0)))
5329 goto out;
5330
5331 /* Allocate operations for sign, verify, encrypt and decrypt */
5332 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5333 &ops, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_SIGN,
5334 key_size)))
5335 goto out;
5336 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5337 &opv, TEE_ALG_RSASSA_PKCS1_V1_5_SHA1, TEE_MODE_VERIFY,
5338 key_size)))
5339 goto out;
5340 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5341 &ope, TEE_ALG_RSA_NOPAD, TEE_MODE_ENCRYPT, key_size)))
5342 goto out;
5343 if (!ADBG_EXPECT_TEEC_SUCCESS(c, ta_crypt_cmd_allocate_operation(c, &s,
5344 &opd, TEE_ALG_RSA_NOPAD, TEE_MODE_DECRYPT, key_size)))
5345 goto out;
5346
5347 /* Assign the keypair to all operations */
5348 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5349 ta_crypt_cmd_set_operation_key(c, &s, ops, key)))
5350 goto out;
5351 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5352 ta_crypt_cmd_set_operation_key(c, &s, opv, key)))
5353 goto out;
5354 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5355 ta_crypt_cmd_set_operation_key(c, &s, ope, key)))
5356 goto out;
5357 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5358 ta_crypt_cmd_set_operation_key(c, &s, opd, key)))
5359 goto out;
5360
5361 /*
5362 * The core of the test case is inspired by the one in libtomcrypt:
5363 * https://github.com/libtom/libtomcrypt/blob/6ad52252688bb34f90b5e79da4830a927e87b81f/testprof/rsa_test.c#L398
5364 *
5365 * Testcase for Bleichenbacher attack
5366 *
5367 * (1) Create a valid signature
5368 * (2) Check that it can be verified
5369 * (3) Transform the package to fetch plain text (using the encrypt
5370 * operation in GP TEE Internal API)
5371 * (4) Forge the structure of PKCS#1-EMSA encoded data
5372 * (4.1) Search for start and end of the padding string
5373 * (4.2) Move the signature to the front of the padding string
5374 * (4.3) Zero the message until the end
5375 * (5) Transform the package back (using the decrypt operation in
5376 * GP TEE Internal API)
5377 * (6) The result should not be valid if the implementation is robust.
5378 */
5379
5380
5381 for (i = 0; i < 9; i++) {
5382 Do_ADBG_Log("Iteration %zu", i);
5383
5384 /* 1 */
5385 out_size = sizeof(out);
5386 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5387 ta_crypt_cmd_asymmetric_sign(c, &s, ops, NULL, 0,
5388 in, sizeof(in), out, &out_size)))
5389 goto out;
5390
5391 /* 2 */
5392 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5393 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5394 in, sizeof(in), out, out_size)))
5395 goto out;
5396
5397 /* 3 */
5398 tmp_size = sizeof(tmp);
5399 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5400 ta_crypt_cmd_asymmetric_encrypt(c, &s, ope, NULL, 0,
5401 out, out_size, tmp, &tmp_size)))
5402 goto out;
5403
Etienne Carriere0953bf02018-12-21 15:36:25 +01005404 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, tmp_size, <=, sizeof(tmp)))
5405 goto out;
5406
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005407 /* 4.1 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005408 for (n = 0; n < tmp_size - i; n++)
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005409 if (tmp[n] == 0xff)
5410 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005411
5412 /* Shall find at least a padding start before buffer end */
5413 if (!ADBG_EXPECT_COMPARE_UNSIGNED(c, n, <, tmp_size - i - 1))
5414 goto out;
5415
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005416 for (m = n + 1; m < tmp_size; m++)
5417 if (tmp[m] != 0xff)
5418 break;
Etienne Carriere0953bf02018-12-21 15:36:25 +01005419
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005420 /* 4.2 */
5421 memmove(tmp + n + i, tmp + m, tmp_size - m);
Etienne Carriere0953bf02018-12-21 15:36:25 +01005422
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005423 /* 4.3 */
Etienne Carriere0953bf02018-12-21 15:36:25 +01005424 n = n + i + tmp_size - m;
5425 memset(tmp + n, 0, tmp_size - n);
Jens Wiklanderb58916e2016-07-07 15:29:32 +02005426
5427 /* 5 */
5428 out_size = sizeof(out);
5429 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5430 ta_crypt_cmd_asymmetric_decrypt(c, &s, opd, NULL, 0,
5431 tmp, tmp_size, out, &out_size)))
5432 goto out;
5433
5434 /* 6 */
5435 if (!ADBG_EXPECT_TEEC_RESULT(c, TEE_ERROR_SIGNATURE_INVALID,
5436 ta_crypt_cmd_asymmetric_verify(c, &s, opv, NULL, 0,
5437 in, sizeof(in), out, out_size)))
5438 goto out;
5439 }
5440
5441out:
5442 TEEC_CloseSession(&s);
5443}
Jens Wiklander14f48872018-06-29 15:30:13 +02005444ADBG_CASE_DEFINE(regression, 4011, xtest_tee_test_4011,
5445 "Test TEE Internal API Bleichenbacher attack (negative)");
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005446
5447#ifdef CFG_SYSTEM_PTA
5448static void xtest_tee_test_4012(ADBG_Case_t *c)
5449{
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005450 TEEC_Session session = { };
5451 uint32_t ret_orig = 0;
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005452 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5453 /* Fortuna PRNG requires seed <= 32 bytes */
Etienne Carrieree4ec9e42019-03-28 13:30:21 +01005454 uint8_t pool_input[32] = { };
5455 time_t t = 0;
5456 struct tm tm_local = { };
Igor Opaniuk7ddaa782018-05-25 15:14:05 +03005457
5458 t = time(NULL);
5459 tm_local = *localtime(&t);
5460
5461 memcpy((void *)pool_input, (void *)&tm_local,
5462 sizeof(pool_input) < sizeof(tm_local) ?
5463 sizeof(pool_input) : sizeof(tm_local));
5464
5465
5466 op.params[0].tmpref.buffer = pool_input;
5467 op.params[0].tmpref.size = sizeof(pool_input);
5468 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5469 TEEC_NONE,
5470 TEEC_NONE,
5471 TEEC_NONE);
5472 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5473 xtest_teec_open_session(&session, &crypt_user_ta_uuid, NULL,
5474 &ret_orig)))
5475 return;
5476
5477 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5478 TEEC_InvokeCommand(&session,
5479 TA_CRYPT_CMD_SEED_RNG_POOL,
5480 &op,
5481 &ret_orig));
5482 TEEC_CloseSession(&session);
5483}
Jens Wiklander14f48872018-06-29 15:30:13 +02005484ADBG_CASE_DEFINE(regression, 4012, xtest_tee_test_4012,
5485 "Test seeding RNG entropy");
Joakim Bech83a30ca2019-05-29 11:22:27 +02005486
5487static void xtest_tee_test_4013(ADBG_Case_t *c)
5488{
5489 TEEC_Session session = { };
5490 uint32_t ret_orig = 0;
5491 TEEC_Operation op = TEEC_OPERATION_INITIALIZER;
5492 uint8_t key[32] = { };
5493 uint8_t extra_data[32] = { };
5494
5495 op.paramTypes = TEEC_PARAM_TYPES(TEEC_NONE,
5496 TEEC_NONE,
5497 TEEC_NONE,
5498 TEEC_NONE);
5499 if (!ADBG_EXPECT_TEEC_SUCCESS(c,
5500 xtest_teec_open_session(&session, &crypt_user_ta_uuid,
5501 NULL, &ret_orig)))
5502 return;
5503
5504 (void)ADBG_EXPECT_TEEC_SUCCESS(c,
5505 TEEC_InvokeCommand(&session,
5506 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY,
5507 &op,
5508 &ret_orig));
5509
5510 /* Negative test using non-secure memory */
5511 memset(&op, 0, sizeof(op));
5512 op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
5513 TEEC_MEMREF_TEMP_OUTPUT,
5514 TEEC_NONE,
5515 TEEC_NONE);
5516
5517 op.params[0].tmpref.buffer = extra_data;
5518 op.params[0].tmpref.size = sizeof(extra_data);
5519 op.params[1].tmpref.buffer = key;
5520 op.params[1].tmpref.size = sizeof(key);
5521 (void)ADBG_EXPECT_TEEC_RESULT(c,
5522 TEEC_ERROR_SECURITY,
5523 TEEC_InvokeCommand(&session,
5524 TA_CRYPT_CMD_DERIVE_TA_UNIQUE_KEY_SHM,
5525 &op,
5526 &ret_orig));
5527
5528 TEEC_CloseSession(&session);
5529}
5530ADBG_CASE_DEFINE(regression, 4013, xtest_tee_test_4013,
5531 "Test generation of device unique TA keys");
Jens Wiklander14f48872018-06-29 15:30:13 +02005532#endif /*CFG_SYSTEM_PTA*/