1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/aes.h"
3a8e1175bSopenharmony_ci
4a8e1175bSopenharmony_ci/* Test AES with a copied context.
5a8e1175bSopenharmony_ci *
6a8e1175bSopenharmony_ci * master, enc and dec must be AES context objects. They don't need to
7a8e1175bSopenharmony_ci * be initialized, and are left freed.
8a8e1175bSopenharmony_ci */
9a8e1175bSopenharmony_ci#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
10a8e1175bSopenharmony_cistatic int test_copy(const data_t *key,
11a8e1175bSopenharmony_ci                     mbedtls_aes_context *master,
12a8e1175bSopenharmony_ci                     mbedtls_aes_context *enc,
13a8e1175bSopenharmony_ci                     mbedtls_aes_context *dec)
14a8e1175bSopenharmony_ci{
15a8e1175bSopenharmony_ci    unsigned char plaintext[16] = {
16a8e1175bSopenharmony_ci        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
17a8e1175bSopenharmony_ci        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
18a8e1175bSopenharmony_ci    };
19a8e1175bSopenharmony_ci    unsigned char ciphertext[16];
20a8e1175bSopenharmony_ci    unsigned char output[16];
21a8e1175bSopenharmony_ci
22a8e1175bSopenharmony_ci    // Set key and encrypt with original context
23a8e1175bSopenharmony_ci    mbedtls_aes_init(master);
24a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(master, key->x,
25a8e1175bSopenharmony_ci                                       key->len * 8) == 0);
26a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_ecb(master, MBEDTLS_AES_ENCRYPT,
27a8e1175bSopenharmony_ci                                      plaintext, ciphertext) == 0);
28a8e1175bSopenharmony_ci    *enc = *master;
29a8e1175bSopenharmony_ci
30a8e1175bSopenharmony_ci    // Set key for decryption with original context
31a8e1175bSopenharmony_ci    mbedtls_aes_init(master);
32a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_dec(master, key->x,
33a8e1175bSopenharmony_ci                                       key->len * 8) == 0);
34a8e1175bSopenharmony_ci    *dec = *master;
35a8e1175bSopenharmony_ci
36a8e1175bSopenharmony_ci    // Wipe the original context to make sure nothing from it is used
37a8e1175bSopenharmony_ci    memset(master, 0, sizeof(*master));
38a8e1175bSopenharmony_ci
39a8e1175bSopenharmony_ci    // Encrypt with copied context
40a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_ecb(enc, MBEDTLS_AES_ENCRYPT,
41a8e1175bSopenharmony_ci                                      plaintext, output) == 0);
42a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(ciphertext, 16, output, 16);
43a8e1175bSopenharmony_ci    mbedtls_aes_free(enc);
44a8e1175bSopenharmony_ci
45a8e1175bSopenharmony_ci    // Decrypt with copied context
46a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_ecb(dec, MBEDTLS_AES_DECRYPT,
47a8e1175bSopenharmony_ci                                      ciphertext, output) == 0);
48a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(plaintext, 16, output, 16);
49a8e1175bSopenharmony_ci    mbedtls_aes_free(dec);
50a8e1175bSopenharmony_ci
51a8e1175bSopenharmony_ci    return 1;
52a8e1175bSopenharmony_ci
53a8e1175bSopenharmony_ciexit:
54a8e1175bSopenharmony_ci    /* Bug: we may be leaving something unfreed. This is harmless
55a8e1175bSopenharmony_ci     * in our built-in implementations, but might cause a memory leak
56a8e1175bSopenharmony_ci     * with alternative implementations. */
57a8e1175bSopenharmony_ci    return 0;
58a8e1175bSopenharmony_ci}
59a8e1175bSopenharmony_ci#endif
60a8e1175bSopenharmony_ci
61a8e1175bSopenharmony_ci/* END_HEADER */
62a8e1175bSopenharmony_ci
63a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
64a8e1175bSopenharmony_ci * depends_on:MBEDTLS_AES_C
65a8e1175bSopenharmony_ci * END_DEPENDENCIES
66a8e1175bSopenharmony_ci */
67a8e1175bSopenharmony_ci
68a8e1175bSopenharmony_ci/* BEGIN_CASE */
69a8e1175bSopenharmony_civoid aes_encrypt_ecb(data_t *key_str, data_t *src_str,
70a8e1175bSopenharmony_ci                     data_t *dst, int setkey_result)
71a8e1175bSopenharmony_ci{
72a8e1175bSopenharmony_ci    unsigned char output[100];
73a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
74a8e1175bSopenharmony_ci
75a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
76a8e1175bSopenharmony_ci
77a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
78a8e1175bSopenharmony_ci
79a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == setkey_result);
80a8e1175bSopenharmony_ci    if (setkey_result == 0) {
81a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, src_str->x, output) == 0);
82a8e1175bSopenharmony_ci
83a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
84a8e1175bSopenharmony_ci    }
85a8e1175bSopenharmony_ci
86a8e1175bSopenharmony_ciexit:
87a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
88a8e1175bSopenharmony_ci}
89a8e1175bSopenharmony_ci/* END_CASE */
90a8e1175bSopenharmony_ci
91a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CTR */
92a8e1175bSopenharmony_civoid aes_ctr(data_t *key, data_t *ictr, data_t *pt, data_t *ct, int expected)
93a8e1175bSopenharmony_ci{
94a8e1175bSopenharmony_ci    unsigned char *output = NULL;
95a8e1175bSopenharmony_ci    unsigned char ctr[16];
96a8e1175bSopenharmony_ci    unsigned char stream_block[16];
97a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
98a8e1175bSopenharmony_ci
99a8e1175bSopenharmony_ci    // sanity checks on test input
100a8e1175bSopenharmony_ci    TEST_ASSERT(pt->len == ct->len);
101a8e1175bSopenharmony_ci    TEST_ASSERT(key->len == 16 || key->len == 24 || key->len == 32);
102a8e1175bSopenharmony_ci
103a8e1175bSopenharmony_ci    TEST_CALLOC(output, pt->len);
104a8e1175bSopenharmony_ci
105a8e1175bSopenharmony_ci    // expected result is always success on zero-length input, so skip len == 0 if expecting failure
106a8e1175bSopenharmony_ci    for (size_t len = (expected == 0 ? 0 : 1); len <= pt->len; len++) {
107a8e1175bSopenharmony_ci        for (int i = 0; i < 2; i++) {
108a8e1175bSopenharmony_ci            mbedtls_aes_init(&ctx);
109a8e1175bSopenharmony_ci            TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key->x, key->len * 8) == 0);
110a8e1175bSopenharmony_ci
111a8e1175bSopenharmony_ci            memcpy(ctr, ictr->x, 16);
112a8e1175bSopenharmony_ci            memset(stream_block, 0, 16);
113a8e1175bSopenharmony_ci            memset(output, 0, pt->len);
114a8e1175bSopenharmony_ci
115a8e1175bSopenharmony_ci            size_t nc_off = 0;
116a8e1175bSopenharmony_ci
117a8e1175bSopenharmony_ci            if (i == 0) {
118a8e1175bSopenharmony_ci                // encrypt
119a8e1175bSopenharmony_ci                TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, ctr,
120a8e1175bSopenharmony_ci                                                 stream_block, pt->x, output), 0);
121a8e1175bSopenharmony_ci                TEST_ASSERT(!!memcmp(output, ct->x, len) == expected);
122a8e1175bSopenharmony_ci            } else {
123a8e1175bSopenharmony_ci                // decrypt
124a8e1175bSopenharmony_ci                TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, ctr,
125a8e1175bSopenharmony_ci                                                 stream_block, ct->x, output), 0);
126a8e1175bSopenharmony_ci                TEST_ASSERT(!!memcmp(output, pt->x, len) == expected);
127a8e1175bSopenharmony_ci            }
128a8e1175bSopenharmony_ci        }
129a8e1175bSopenharmony_ci    }
130a8e1175bSopenharmony_ci
131a8e1175bSopenharmony_ciexit:
132a8e1175bSopenharmony_ci    mbedtls_free(output);
133a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
134a8e1175bSopenharmony_ci}
135a8e1175bSopenharmony_ci/* END_CASE */
136a8e1175bSopenharmony_ci
137a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CTR */
138a8e1175bSopenharmony_civoid aes_encrypt_ctr_multipart(int length, int step_size)
139a8e1175bSopenharmony_ci{
140a8e1175bSopenharmony_ci    unsigned char key[16];
141a8e1175bSopenharmony_ci    unsigned char ctr_a[16];
142a8e1175bSopenharmony_ci    unsigned char ctr_b[16];
143a8e1175bSopenharmony_ci    unsigned char stream_block_a[16];
144a8e1175bSopenharmony_ci    unsigned char stream_block_b[16];
145a8e1175bSopenharmony_ci    unsigned char *input = NULL;
146a8e1175bSopenharmony_ci    unsigned char *output_a = NULL;
147a8e1175bSopenharmony_ci    unsigned char *output_b = NULL;
148a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
149a8e1175bSopenharmony_ci    size_t nc_off_a, nc_off_b;
150a8e1175bSopenharmony_ci
151a8e1175bSopenharmony_ci    TEST_ASSERT(length >= 0);
152a8e1175bSopenharmony_ci    TEST_ASSERT(step_size > 0);
153a8e1175bSopenharmony_ci
154a8e1175bSopenharmony_ci    TEST_CALLOC(input, length);
155a8e1175bSopenharmony_ci    TEST_CALLOC(output_a, length);
156a8e1175bSopenharmony_ci    TEST_CALLOC(output_b, length);
157a8e1175bSopenharmony_ci
158a8e1175bSopenharmony_ci    // set up a random key
159a8e1175bSopenharmony_ci    mbedtls_test_rnd_std_rand(NULL, key, sizeof(key));
160a8e1175bSopenharmony_ci
161a8e1175bSopenharmony_ci    // random input
162a8e1175bSopenharmony_ci    mbedtls_test_rnd_std_rand(NULL, input, length);
163a8e1175bSopenharmony_ci
164a8e1175bSopenharmony_ci
165a8e1175bSopenharmony_ci    // complete encryption in one call
166a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
167a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key, sizeof(key) * 8) == 0);
168a8e1175bSopenharmony_ci    memset(ctr_a, 0, sizeof(ctr_a));
169a8e1175bSopenharmony_ci    memset(stream_block_a, 0, sizeof(stream_block_a));
170a8e1175bSopenharmony_ci    nc_off_a = 0;
171a8e1175bSopenharmony_ci    TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, length, &nc_off_a, ctr_a,
172a8e1175bSopenharmony_ci                                     stream_block_a, input, output_a), 0);
173a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
174a8e1175bSopenharmony_ci
175a8e1175bSopenharmony_ci
176a8e1175bSopenharmony_ci    // encrypt in multiple steps of varying size
177a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
178a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key, sizeof(key) * 8) == 0);
179a8e1175bSopenharmony_ci    memset(ctr_b, 0, sizeof(ctr_b));
180a8e1175bSopenharmony_ci    memset(stream_block_b, 0, sizeof(stream_block_b));
181a8e1175bSopenharmony_ci    nc_off_b = 0;
182a8e1175bSopenharmony_ci    size_t remaining = length;
183a8e1175bSopenharmony_ci    unsigned char *ip = input, *op = output_b;
184a8e1175bSopenharmony_ci    while (remaining != 0) {
185a8e1175bSopenharmony_ci        size_t l = MIN(remaining, (size_t) step_size);
186a8e1175bSopenharmony_ci        step_size *= 2;
187a8e1175bSopenharmony_ci        remaining -= l;
188a8e1175bSopenharmony_ci        TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, l, &nc_off_b, ctr_b, stream_block_b, ip, op), 0);
189a8e1175bSopenharmony_ci        ip += l;
190a8e1175bSopenharmony_ci        op += l;
191a8e1175bSopenharmony_ci    }
192a8e1175bSopenharmony_ci
193a8e1175bSopenharmony_ci    // finally, validate that multiple steps produced same result as single-pass
194a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(output_a, length, output_b, length);
195a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(ctr_a, sizeof(ctr_a), ctr_b, sizeof(ctr_b));
196a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(stream_block_a, sizeof(stream_block_a),
197a8e1175bSopenharmony_ci                        stream_block_b, sizeof(stream_block_b));
198a8e1175bSopenharmony_ci    TEST_EQUAL(nc_off_a, nc_off_b);
199a8e1175bSopenharmony_ci
200a8e1175bSopenharmony_ciexit:
201a8e1175bSopenharmony_ci    mbedtls_free(input);
202a8e1175bSopenharmony_ci    mbedtls_free(output_a);
203a8e1175bSopenharmony_ci    mbedtls_free(output_b);
204a8e1175bSopenharmony_ci
205a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
206a8e1175bSopenharmony_ci}
207a8e1175bSopenharmony_ci/* END_CASE */
208a8e1175bSopenharmony_ci
209a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
210a8e1175bSopenharmony_civoid aes_decrypt_ecb(data_t *key_str, data_t *src_str,
211a8e1175bSopenharmony_ci                     data_t *dst, int setkey_result)
212a8e1175bSopenharmony_ci{
213a8e1175bSopenharmony_ci    unsigned char output[100];
214a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
215a8e1175bSopenharmony_ci
216a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
217a8e1175bSopenharmony_ci
218a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
219a8e1175bSopenharmony_ci
220a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result);
221a8e1175bSopenharmony_ci    if (setkey_result == 0) {
222a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0);
223a8e1175bSopenharmony_ci
224a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
225a8e1175bSopenharmony_ci    }
226a8e1175bSopenharmony_ci
227a8e1175bSopenharmony_ciexit:
228a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
229a8e1175bSopenharmony_ci}
230a8e1175bSopenharmony_ci/* END_CASE */
231a8e1175bSopenharmony_ci
232a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
233a8e1175bSopenharmony_civoid aes_encrypt_cbc(data_t *key_str, data_t *iv_str,
234a8e1175bSopenharmony_ci                     data_t *src_str, data_t *dst,
235a8e1175bSopenharmony_ci                     int cbc_result)
236a8e1175bSopenharmony_ci{
237a8e1175bSopenharmony_ci    unsigned char output[100];
238a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
239a8e1175bSopenharmony_ci
240a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
241a8e1175bSopenharmony_ci
242a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
243a8e1175bSopenharmony_ci
244a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
245a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
246a8e1175bSopenharmony_ci                                      src_str->x, output) == cbc_result);
247a8e1175bSopenharmony_ci    if (cbc_result == 0) {
248a8e1175bSopenharmony_ci
249a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
250a8e1175bSopenharmony_ci                                        src_str->len, dst->len) == 0);
251a8e1175bSopenharmony_ci    }
252a8e1175bSopenharmony_ci
253a8e1175bSopenharmony_ciexit:
254a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
255a8e1175bSopenharmony_ci}
256a8e1175bSopenharmony_ci/* END_CASE */
257a8e1175bSopenharmony_ci
258a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
259a8e1175bSopenharmony_civoid aes_decrypt_cbc(data_t *key_str, data_t *iv_str,
260a8e1175bSopenharmony_ci                     data_t *src_str, data_t *dst,
261a8e1175bSopenharmony_ci                     int cbc_result)
262a8e1175bSopenharmony_ci{
263a8e1175bSopenharmony_ci    unsigned char output[100];
264a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
265a8e1175bSopenharmony_ci
266a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
267a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
268a8e1175bSopenharmony_ci
269a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0);
270a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
271a8e1175bSopenharmony_ci                                      src_str->x, output) == cbc_result);
272a8e1175bSopenharmony_ci    if (cbc_result == 0) {
273a8e1175bSopenharmony_ci
274a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
275a8e1175bSopenharmony_ci                                        src_str->len, dst->len) == 0);
276a8e1175bSopenharmony_ci    }
277a8e1175bSopenharmony_ci
278a8e1175bSopenharmony_ciexit:
279a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
280a8e1175bSopenharmony_ci}
281a8e1175bSopenharmony_ci/* END_CASE */
282a8e1175bSopenharmony_ci
283a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
284a8e1175bSopenharmony_civoid aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string,
285a8e1175bSopenharmony_ci                     char *hex_src_string, char *hex_dst_string)
286a8e1175bSopenharmony_ci{
287a8e1175bSopenharmony_ci    enum { AES_BLOCK_SIZE = 16 };
288a8e1175bSopenharmony_ci    unsigned char *data_unit = NULL;
289a8e1175bSopenharmony_ci    unsigned char *key = NULL;
290a8e1175bSopenharmony_ci    unsigned char *src = NULL;
291a8e1175bSopenharmony_ci    unsigned char *dst = NULL;
292a8e1175bSopenharmony_ci    unsigned char *output = NULL;
293a8e1175bSopenharmony_ci    mbedtls_aes_xts_context ctx;
294a8e1175bSopenharmony_ci    size_t key_len, src_len, dst_len, data_unit_len;
295a8e1175bSopenharmony_ci
296a8e1175bSopenharmony_ci    mbedtls_aes_xts_init(&ctx);
297a8e1175bSopenharmony_ci
298a8e1175bSopenharmony_ci    data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
299a8e1175bSopenharmony_ci                                            &data_unit_len);
300a8e1175bSopenharmony_ci    TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
301a8e1175bSopenharmony_ci
302a8e1175bSopenharmony_ci    key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
303a8e1175bSopenharmony_ci    TEST_ASSERT(key_len % 2 == 0);
304a8e1175bSopenharmony_ci
305a8e1175bSopenharmony_ci    src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
306a8e1175bSopenharmony_ci    dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
307a8e1175bSopenharmony_ci    TEST_ASSERT(src_len == dst_len);
308a8e1175bSopenharmony_ci
309a8e1175bSopenharmony_ci    output = mbedtls_test_zero_alloc(dst_len);
310a8e1175bSopenharmony_ci
311a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0);
312a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len,
313a8e1175bSopenharmony_ci                                      data_unit, src, output) == 0);
314a8e1175bSopenharmony_ci
315a8e1175bSopenharmony_ci    TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
316a8e1175bSopenharmony_ci
317a8e1175bSopenharmony_ciexit:
318a8e1175bSopenharmony_ci    mbedtls_aes_xts_free(&ctx);
319a8e1175bSopenharmony_ci    mbedtls_free(data_unit);
320a8e1175bSopenharmony_ci    mbedtls_free(key);
321a8e1175bSopenharmony_ci    mbedtls_free(src);
322a8e1175bSopenharmony_ci    mbedtls_free(dst);
323a8e1175bSopenharmony_ci    mbedtls_free(output);
324a8e1175bSopenharmony_ci}
325a8e1175bSopenharmony_ci/* END_CASE */
326a8e1175bSopenharmony_ci
327a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
328a8e1175bSopenharmony_civoid aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string,
329a8e1175bSopenharmony_ci                     char *hex_dst_string, char *hex_src_string)
330a8e1175bSopenharmony_ci{
331a8e1175bSopenharmony_ci    enum { AES_BLOCK_SIZE = 16 };
332a8e1175bSopenharmony_ci    unsigned char *data_unit = NULL;
333a8e1175bSopenharmony_ci    unsigned char *key = NULL;
334a8e1175bSopenharmony_ci    unsigned char *src = NULL;
335a8e1175bSopenharmony_ci    unsigned char *dst = NULL;
336a8e1175bSopenharmony_ci    unsigned char *output = NULL;
337a8e1175bSopenharmony_ci    mbedtls_aes_xts_context ctx;
338a8e1175bSopenharmony_ci    size_t key_len, src_len, dst_len, data_unit_len;
339a8e1175bSopenharmony_ci
340a8e1175bSopenharmony_ci    mbedtls_aes_xts_init(&ctx);
341a8e1175bSopenharmony_ci
342a8e1175bSopenharmony_ci    data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
343a8e1175bSopenharmony_ci                                            &data_unit_len);
344a8e1175bSopenharmony_ci    TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
345a8e1175bSopenharmony_ci
346a8e1175bSopenharmony_ci    key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
347a8e1175bSopenharmony_ci    TEST_ASSERT(key_len % 2 == 0);
348a8e1175bSopenharmony_ci
349a8e1175bSopenharmony_ci    src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
350a8e1175bSopenharmony_ci    dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
351a8e1175bSopenharmony_ci    TEST_ASSERT(src_len == dst_len);
352a8e1175bSopenharmony_ci
353a8e1175bSopenharmony_ci    output = mbedtls_test_zero_alloc(dst_len);
354a8e1175bSopenharmony_ci
355a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0);
356a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len,
357a8e1175bSopenharmony_ci                                      data_unit, src, output) == 0);
358a8e1175bSopenharmony_ci
359a8e1175bSopenharmony_ci    TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
360a8e1175bSopenharmony_ci
361a8e1175bSopenharmony_ciexit:
362a8e1175bSopenharmony_ci    mbedtls_aes_xts_free(&ctx);
363a8e1175bSopenharmony_ci    mbedtls_free(data_unit);
364a8e1175bSopenharmony_ci    mbedtls_free(key);
365a8e1175bSopenharmony_ci    mbedtls_free(src);
366a8e1175bSopenharmony_ci    mbedtls_free(dst);
367a8e1175bSopenharmony_ci    mbedtls_free(output);
368a8e1175bSopenharmony_ci}
369a8e1175bSopenharmony_ci/* END_CASE */
370a8e1175bSopenharmony_ci
371a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
372a8e1175bSopenharmony_civoid aes_crypt_xts_size(int size, int retval)
373a8e1175bSopenharmony_ci{
374a8e1175bSopenharmony_ci    mbedtls_aes_xts_context ctx;
375a8e1175bSopenharmony_ci    const unsigned char src[16] = { 0 };
376a8e1175bSopenharmony_ci    unsigned char output[16];
377a8e1175bSopenharmony_ci    unsigned char data_unit[16];
378a8e1175bSopenharmony_ci    size_t length = size;
379a8e1175bSopenharmony_ci
380a8e1175bSopenharmony_ci    mbedtls_aes_xts_init(&ctx);
381a8e1175bSopenharmony_ci    memset(data_unit, 0x00, sizeof(data_unit));
382a8e1175bSopenharmony_ci
383a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src,
384a8e1175bSopenharmony_ci                                      output) == retval);
385a8e1175bSopenharmony_ciexit:
386a8e1175bSopenharmony_ci    mbedtls_aes_xts_free(&ctx);
387a8e1175bSopenharmony_ci}
388a8e1175bSopenharmony_ci/* END_CASE */
389a8e1175bSopenharmony_ci
390a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
391a8e1175bSopenharmony_civoid aes_crypt_xts_keysize(int size, int retval)
392a8e1175bSopenharmony_ci{
393a8e1175bSopenharmony_ci    mbedtls_aes_xts_context ctx;
394a8e1175bSopenharmony_ci    const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
395a8e1175bSopenharmony_ci    size_t key_len = size;
396a8e1175bSopenharmony_ci
397a8e1175bSopenharmony_ci    mbedtls_aes_xts_init(&ctx);
398a8e1175bSopenharmony_ci
399a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval);
400a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval);
401a8e1175bSopenharmony_ciexit:
402a8e1175bSopenharmony_ci    mbedtls_aes_xts_free(&ctx);
403a8e1175bSopenharmony_ci}
404a8e1175bSopenharmony_ci/* END_CASE */
405a8e1175bSopenharmony_ci
406a8e1175bSopenharmony_ci
407a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
408a8e1175bSopenharmony_civoid aes_encrypt_cfb128(data_t *key_str, data_t *iv_str,
409a8e1175bSopenharmony_ci                        data_t *src_str, data_t *dst)
410a8e1175bSopenharmony_ci{
411a8e1175bSopenharmony_ci    unsigned char output[100];
412a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
413a8e1175bSopenharmony_ci    size_t iv_offset = 0;
414a8e1175bSopenharmony_ci
415a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
416a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
417a8e1175bSopenharmony_ci
418a8e1175bSopenharmony_ci
419a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
420a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x,
421a8e1175bSopenharmony_ci                                         src_str->x, output) == 0);
422a8e1175bSopenharmony_ci
423a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
424a8e1175bSopenharmony_ci
425a8e1175bSopenharmony_ciexit:
426a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
427a8e1175bSopenharmony_ci}
428a8e1175bSopenharmony_ci/* END_CASE */
429a8e1175bSopenharmony_ci
430a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
431a8e1175bSopenharmony_civoid aes_decrypt_cfb128(data_t *key_str, data_t *iv_str,
432a8e1175bSopenharmony_ci                        data_t *src_str, data_t *dst)
433a8e1175bSopenharmony_ci{
434a8e1175bSopenharmony_ci    unsigned char output[100];
435a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
436a8e1175bSopenharmony_ci    size_t iv_offset = 0;
437a8e1175bSopenharmony_ci
438a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
439a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
440a8e1175bSopenharmony_ci
441a8e1175bSopenharmony_ci
442a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
443a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x,
444a8e1175bSopenharmony_ci                                         src_str->x, output) == 0);
445a8e1175bSopenharmony_ci
446a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
447a8e1175bSopenharmony_ci
448a8e1175bSopenharmony_ciexit:
449a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
450a8e1175bSopenharmony_ci}
451a8e1175bSopenharmony_ci/* END_CASE */
452a8e1175bSopenharmony_ci
453a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
454a8e1175bSopenharmony_civoid aes_encrypt_cfb8(data_t *key_str, data_t *iv_str,
455a8e1175bSopenharmony_ci                      data_t *src_str, data_t *dst)
456a8e1175bSopenharmony_ci{
457a8e1175bSopenharmony_ci    unsigned char output[100];
458a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
459a8e1175bSopenharmony_ci
460a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
461a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
462a8e1175bSopenharmony_ci
463a8e1175bSopenharmony_ci
464a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
465a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
466a8e1175bSopenharmony_ci                                       src_str->x, output) == 0);
467a8e1175bSopenharmony_ci
468a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
469a8e1175bSopenharmony_ci                                    src_str->len, dst->len) == 0);
470a8e1175bSopenharmony_ci
471a8e1175bSopenharmony_ciexit:
472a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
473a8e1175bSopenharmony_ci}
474a8e1175bSopenharmony_ci/* END_CASE */
475a8e1175bSopenharmony_ci
476a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
477a8e1175bSopenharmony_civoid aes_decrypt_cfb8(data_t *key_str, data_t *iv_str,
478a8e1175bSopenharmony_ci                      data_t *src_str, data_t *dst)
479a8e1175bSopenharmony_ci{
480a8e1175bSopenharmony_ci    unsigned char output[100];
481a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
482a8e1175bSopenharmony_ci
483a8e1175bSopenharmony_ci    memset(output, 0x00, 100);
484a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
485a8e1175bSopenharmony_ci
486a8e1175bSopenharmony_ci
487a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
488a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
489a8e1175bSopenharmony_ci                                       src_str->x, output) == 0);
490a8e1175bSopenharmony_ci
491a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
492a8e1175bSopenharmony_ci                                    src_str->len, dst->len) == 0);
493a8e1175bSopenharmony_ci
494a8e1175bSopenharmony_ciexit:
495a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
496a8e1175bSopenharmony_ci}
497a8e1175bSopenharmony_ci/* END_CASE */
498a8e1175bSopenharmony_ci
499a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */
500a8e1175bSopenharmony_civoid aes_encrypt_ofb(int fragment_size, data_t *key_str,
501a8e1175bSopenharmony_ci                     data_t *iv_str, data_t *src_str,
502a8e1175bSopenharmony_ci                     data_t *expected_output)
503a8e1175bSopenharmony_ci{
504a8e1175bSopenharmony_ci    unsigned char output[32];
505a8e1175bSopenharmony_ci    mbedtls_aes_context ctx;
506a8e1175bSopenharmony_ci    size_t iv_offset = 0;
507a8e1175bSopenharmony_ci    int in_buffer_len;
508a8e1175bSopenharmony_ci    unsigned char *src_str_next;
509a8e1175bSopenharmony_ci
510a8e1175bSopenharmony_ci    memset(output, 0x00, sizeof(output));
511a8e1175bSopenharmony_ci    mbedtls_aes_init(&ctx);
512a8e1175bSopenharmony_ci
513a8e1175bSopenharmony_ci    TEST_ASSERT((size_t) fragment_size < sizeof(output));
514a8e1175bSopenharmony_ci
515a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x,
516a8e1175bSopenharmony_ci                                       key_str->len * 8) == 0);
517a8e1175bSopenharmony_ci    in_buffer_len = src_str->len;
518a8e1175bSopenharmony_ci    src_str_next = src_str->x;
519a8e1175bSopenharmony_ci
520a8e1175bSopenharmony_ci    while (in_buffer_len > 0) {
521a8e1175bSopenharmony_ci        TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset,
522a8e1175bSopenharmony_ci                                          iv_str->x, src_str_next, output) == 0);
523a8e1175bSopenharmony_ci
524a8e1175bSopenharmony_ci        TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0);
525a8e1175bSopenharmony_ci
526a8e1175bSopenharmony_ci        in_buffer_len -= fragment_size;
527a8e1175bSopenharmony_ci        expected_output->x += fragment_size;
528a8e1175bSopenharmony_ci        src_str_next += fragment_size;
529a8e1175bSopenharmony_ci
530a8e1175bSopenharmony_ci        if (in_buffer_len < fragment_size) {
531a8e1175bSopenharmony_ci            fragment_size = in_buffer_len;
532a8e1175bSopenharmony_ci        }
533a8e1175bSopenharmony_ci    }
534a8e1175bSopenharmony_ci
535a8e1175bSopenharmony_ciexit:
536a8e1175bSopenharmony_ci    mbedtls_aes_free(&ctx);
537a8e1175bSopenharmony_ci}
538a8e1175bSopenharmony_ci/* END_CASE */
539a8e1175bSopenharmony_ci
540a8e1175bSopenharmony_ci/* BEGIN_CASE */
541a8e1175bSopenharmony_civoid aes_invalid_mode()
542a8e1175bSopenharmony_ci{
543a8e1175bSopenharmony_ci    mbedtls_aes_context aes_ctx;
544a8e1175bSopenharmony_ci    const unsigned char in[16] = { 0 };
545a8e1175bSopenharmony_ci    unsigned char out[16];
546a8e1175bSopenharmony_ci    const int invalid_mode = 42;
547a8e1175bSopenharmony_ci
548a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
549a8e1175bSopenharmony_ci               mbedtls_aes_crypt_ecb(&aes_ctx, invalid_mode, in, out));
550a8e1175bSopenharmony_ci
551a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC)
552a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
553a8e1175bSopenharmony_ci               mbedtls_aes_crypt_cbc(&aes_ctx, invalid_mode, 16,
554a8e1175bSopenharmony_ci                                     out, in, out));
555a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_CBC */
556a8e1175bSopenharmony_ci
557a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_XTS)
558a8e1175bSopenharmony_ci    mbedtls_aes_xts_context xts_ctx;
559a8e1175bSopenharmony_ci
560a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
561a8e1175bSopenharmony_ci               mbedtls_aes_crypt_xts(&xts_ctx, invalid_mode, 16,
562a8e1175bSopenharmony_ci                                     in, in, out));
563a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_XTS */
564a8e1175bSopenharmony_ci
565a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CFB)
566a8e1175bSopenharmony_ci    size_t size;
567a8e1175bSopenharmony_ci
568a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
569a8e1175bSopenharmony_ci               mbedtls_aes_crypt_cfb128(&aes_ctx, invalid_mode, 16,
570a8e1175bSopenharmony_ci                                        &size, out, in, out));
571a8e1175bSopenharmony_ci    TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
572a8e1175bSopenharmony_ci               mbedtls_aes_crypt_cfb8(&aes_ctx, invalid_mode, 16,
573a8e1175bSopenharmony_ci                                      out, in, out));
574a8e1175bSopenharmony_ci#endif /* MBEDTLS_CIPHER_MODE_CFB */
575a8e1175bSopenharmony_ci}
576a8e1175bSopenharmony_ci/* END_CASE */
577a8e1175bSopenharmony_ci
578a8e1175bSopenharmony_ci/* BEGIN_CASE */
579a8e1175bSopenharmony_civoid aes_misc_params()
580a8e1175bSopenharmony_ci{
581a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
582a8e1175bSopenharmony_ci    defined(MBEDTLS_CIPHER_MODE_XTS) || \
583a8e1175bSopenharmony_ci    defined(MBEDTLS_CIPHER_MODE_CFB) || \
584a8e1175bSopenharmony_ci    defined(MBEDTLS_CIPHER_MODE_OFB)
585a8e1175bSopenharmony_ci    const unsigned char in[16] = { 0 };
586a8e1175bSopenharmony_ci    unsigned char out[16];
587a8e1175bSopenharmony_ci#endif
588a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
589a8e1175bSopenharmony_ci    defined(MBEDTLS_CIPHER_MODE_CFB) || \
590a8e1175bSopenharmony_ci    defined(MBEDTLS_CIPHER_MODE_OFB)
591a8e1175bSopenharmony_ci    mbedtls_aes_context aes_ctx;
592a8e1175bSopenharmony_ci#endif
593a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_XTS)
594a8e1175bSopenharmony_ci    mbedtls_aes_xts_context xts_ctx;
595a8e1175bSopenharmony_ci#endif
596a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CFB) || \
597a8e1175bSopenharmony_ci    defined(MBEDTLS_CIPHER_MODE_OFB)
598a8e1175bSopenharmony_ci    size_t size;
599a8e1175bSopenharmony_ci#endif
600a8e1175bSopenharmony_ci
601a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CBC)
602a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
603a8e1175bSopenharmony_ci                                      15,
604a8e1175bSopenharmony_ci                                      out, in, out)
605a8e1175bSopenharmony_ci                == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
606a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
607a8e1175bSopenharmony_ci                                      17,
608a8e1175bSopenharmony_ci                                      out, in, out)
609a8e1175bSopenharmony_ci                == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
610a8e1175bSopenharmony_ci#endif
611a8e1175bSopenharmony_ci
612a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_XTS)
613a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
614a8e1175bSopenharmony_ci                                      15,
615a8e1175bSopenharmony_ci                                      in, in, out)
616a8e1175bSopenharmony_ci                == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
617a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
618a8e1175bSopenharmony_ci                                      (1 << 24) + 1,
619a8e1175bSopenharmony_ci                                      in, in, out)
620a8e1175bSopenharmony_ci                == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
621a8e1175bSopenharmony_ci#endif
622a8e1175bSopenharmony_ci
623a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_CFB)
624a8e1175bSopenharmony_ci    size = 16;
625a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16,
626a8e1175bSopenharmony_ci                                         &size, out, in, out)
627a8e1175bSopenharmony_ci                == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
628a8e1175bSopenharmony_ci#endif
629a8e1175bSopenharmony_ci
630a8e1175bSopenharmony_ci#if defined(MBEDTLS_CIPHER_MODE_OFB)
631a8e1175bSopenharmony_ci    size = 16;
632a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out)
633a8e1175bSopenharmony_ci                == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
634a8e1175bSopenharmony_ci#endif
635a8e1175bSopenharmony_ci
636a8e1175bSopenharmony_ci/*
637a8e1175bSopenharmony_ci * The following line needs to be added to make the code compilable
638a8e1175bSopenharmony_ci * when all the conditions above will be not define in a specific
639a8e1175bSopenharmony_ci * choice of features.
640a8e1175bSopenharmony_ci */
641a8e1175bSopenharmony_ci    TEST_ASSERT(1);
642a8e1175bSopenharmony_ci/* TODO: It will be removed when the whole test will be reworked */
643a8e1175bSopenharmony_ci}
644a8e1175bSopenharmony_ci/* END_CASE */
645a8e1175bSopenharmony_ci
646a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
647a8e1175bSopenharmony_civoid aes_ecb_copy_context(data_t *key)
648a8e1175bSopenharmony_ci{
649a8e1175bSopenharmony_ci    /* We test context copying multiple times, with different alignments
650a8e1175bSopenharmony_ci     * of the original and of the copies. */
651a8e1175bSopenharmony_ci
652a8e1175bSopenharmony_ci    struct align0 {
653a8e1175bSopenharmony_ci        mbedtls_aes_context ctx;
654a8e1175bSopenharmony_ci    };
655a8e1175bSopenharmony_ci    struct align0 *src0 = NULL;
656a8e1175bSopenharmony_ci    struct align0 *enc0 = NULL;
657a8e1175bSopenharmony_ci    struct align0 *dec0 = NULL;
658a8e1175bSopenharmony_ci
659a8e1175bSopenharmony_ci    struct align1 {
660a8e1175bSopenharmony_ci        char bump;
661a8e1175bSopenharmony_ci        mbedtls_aes_context ctx;
662a8e1175bSopenharmony_ci    };
663a8e1175bSopenharmony_ci    struct align1 *src1 = NULL;
664a8e1175bSopenharmony_ci    struct align1 *enc1 = NULL;
665a8e1175bSopenharmony_ci    struct align1 *dec1 = NULL;
666a8e1175bSopenharmony_ci
667a8e1175bSopenharmony_ci    /* All peak alignment */
668a8e1175bSopenharmony_ci    TEST_CALLOC(src0, 1);
669a8e1175bSopenharmony_ci    TEST_CALLOC(enc0, 1);
670a8e1175bSopenharmony_ci    TEST_CALLOC(dec0, 1);
671a8e1175bSopenharmony_ci    if (!test_copy(key, &src0->ctx, &enc0->ctx, &dec0->ctx)) {
672a8e1175bSopenharmony_ci        goto exit;
673a8e1175bSopenharmony_ci    }
674a8e1175bSopenharmony_ci    mbedtls_free(src0);
675a8e1175bSopenharmony_ci    src0 = NULL;
676a8e1175bSopenharmony_ci    mbedtls_free(enc0);
677a8e1175bSopenharmony_ci    enc0 = NULL;
678a8e1175bSopenharmony_ci    mbedtls_free(dec0);
679a8e1175bSopenharmony_ci    dec0 = NULL;
680a8e1175bSopenharmony_ci
681a8e1175bSopenharmony_ci    /* Original shifted */
682a8e1175bSopenharmony_ci    TEST_CALLOC(src1, 1);
683a8e1175bSopenharmony_ci    TEST_CALLOC(enc0, 1);
684a8e1175bSopenharmony_ci    TEST_CALLOC(dec0, 1);
685a8e1175bSopenharmony_ci    if (!test_copy(key, &src1->ctx, &enc0->ctx, &dec0->ctx)) {
686a8e1175bSopenharmony_ci        goto exit;
687a8e1175bSopenharmony_ci    }
688a8e1175bSopenharmony_ci    mbedtls_free(src1);
689a8e1175bSopenharmony_ci    src1 = NULL;
690a8e1175bSopenharmony_ci    mbedtls_free(enc0);
691a8e1175bSopenharmony_ci    enc0 = NULL;
692a8e1175bSopenharmony_ci    mbedtls_free(dec0);
693a8e1175bSopenharmony_ci    dec0 = NULL;
694a8e1175bSopenharmony_ci
695a8e1175bSopenharmony_ci    /* Copies shifted */
696a8e1175bSopenharmony_ci    TEST_CALLOC(src0, 1);
697a8e1175bSopenharmony_ci    TEST_CALLOC(enc1, 1);
698a8e1175bSopenharmony_ci    TEST_CALLOC(dec1, 1);
699a8e1175bSopenharmony_ci    if (!test_copy(key, &src0->ctx, &enc1->ctx, &dec1->ctx)) {
700a8e1175bSopenharmony_ci        goto exit;
701a8e1175bSopenharmony_ci    }
702a8e1175bSopenharmony_ci    mbedtls_free(src0);
703a8e1175bSopenharmony_ci    src0 = NULL;
704a8e1175bSopenharmony_ci    mbedtls_free(enc1);
705a8e1175bSopenharmony_ci    enc1 = NULL;
706a8e1175bSopenharmony_ci    mbedtls_free(dec1);
707a8e1175bSopenharmony_ci    dec1 = NULL;
708a8e1175bSopenharmony_ci
709a8e1175bSopenharmony_ci    /* Source and copies shifted */
710a8e1175bSopenharmony_ci    TEST_CALLOC(src1, 1);
711a8e1175bSopenharmony_ci    TEST_CALLOC(enc1, 1);
712a8e1175bSopenharmony_ci    TEST_CALLOC(dec1, 1);
713a8e1175bSopenharmony_ci    if (!test_copy(key, &src1->ctx, &enc1->ctx, &dec1->ctx)) {
714a8e1175bSopenharmony_ci        goto exit;
715a8e1175bSopenharmony_ci    }
716a8e1175bSopenharmony_ci    mbedtls_free(src1);
717a8e1175bSopenharmony_ci    src1 = NULL;
718a8e1175bSopenharmony_ci    mbedtls_free(enc1);
719a8e1175bSopenharmony_ci    enc1 = NULL;
720a8e1175bSopenharmony_ci    mbedtls_free(dec1);
721a8e1175bSopenharmony_ci    dec1 = NULL;
722a8e1175bSopenharmony_ci
723a8e1175bSopenharmony_ciexit:
724a8e1175bSopenharmony_ci    mbedtls_free(src0);
725a8e1175bSopenharmony_ci    mbedtls_free(enc0);
726a8e1175bSopenharmony_ci    mbedtls_free(dec0);
727a8e1175bSopenharmony_ci    mbedtls_free(src1);
728a8e1175bSopenharmony_ci    mbedtls_free(enc1);
729a8e1175bSopenharmony_ci    mbedtls_free(dec1);
730a8e1175bSopenharmony_ci}
731a8e1175bSopenharmony_ci/* END_CASE */
732a8e1175bSopenharmony_ci
733a8e1175bSopenharmony_ci/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
734a8e1175bSopenharmony_civoid aes_selftest()
735a8e1175bSopenharmony_ci{
736a8e1175bSopenharmony_ci    TEST_ASSERT(mbedtls_aes_self_test(1) == 0);
737a8e1175bSopenharmony_ci}
738a8e1175bSopenharmony_ci/* END_CASE */
739