blob: 9118a98655e254026c8a15d91af0689c00820810 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/aes.h"
Gilles Peskine5fcdf492023-03-16 14:38:29 +01003
4/* Test AES with a copied context.
5 *
6 * master, enc and dec must be AES context objects. They don't need to
7 * be initialized, and are left freed.
8 */
Yanray Wangb67b4742023-10-31 17:10:32 +08009#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
Gilles Peskine5fcdf492023-03-16 14:38:29 +010010static int test_copy(const data_t *key,
11 mbedtls_aes_context *master,
12 mbedtls_aes_context *enc,
13 mbedtls_aes_context *dec)
14{
15 unsigned char plaintext[16] = {
16 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
17 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
18 };
19 unsigned char ciphertext[16];
20 unsigned char output[16];
21
22 // Set key and encrypt with original context
23 mbedtls_aes_init(master);
24 TEST_ASSERT(mbedtls_aes_setkey_enc(master, key->x,
25 key->len * 8) == 0);
26 TEST_ASSERT(mbedtls_aes_crypt_ecb(master, MBEDTLS_AES_ENCRYPT,
27 plaintext, ciphertext) == 0);
28 *enc = *master;
29
30 // Set key for decryption with original context
31 mbedtls_aes_init(master);
32 TEST_ASSERT(mbedtls_aes_setkey_dec(master, key->x,
33 key->len * 8) == 0);
34 *dec = *master;
35
36 // Wipe the original context to make sure nothing from it is used
37 memset(master, 0, sizeof(*master));
38
39 // Encrypt with copied context
40 TEST_ASSERT(mbedtls_aes_crypt_ecb(enc, MBEDTLS_AES_ENCRYPT,
41 plaintext, output) == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010042 TEST_MEMORY_COMPARE(ciphertext, 16, output, 16);
Gilles Peskine5fcdf492023-03-16 14:38:29 +010043 mbedtls_aes_free(enc);
44
45 // Decrypt with copied context
46 TEST_ASSERT(mbedtls_aes_crypt_ecb(dec, MBEDTLS_AES_DECRYPT,
47 ciphertext, output) == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010048 TEST_MEMORY_COMPARE(plaintext, 16, output, 16);
Gilles Peskine5fcdf492023-03-16 14:38:29 +010049 mbedtls_aes_free(dec);
50
51 return 1;
52
53exit:
54 /* Bug: we may be leaving something unfreed. This is harmless
55 * in our built-in implementations, but might cause a memory leak
56 * with alternative implementations. */
57 return 0;
58}
Yanray Wang85c30232023-05-16 10:07:56 +080059#endif
Gilles Peskine5fcdf492023-03-16 14:38:29 +010060
Paul Bakker33b43f12013-08-20 11:48:36 +020061/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +000062
Paul Bakker33b43f12013-08-20 11:48:36 +020063/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064 * depends_on:MBEDTLS_AES_C
Paul Bakker33b43f12013-08-20 11:48:36 +020065 * END_DEPENDENCIES
66 */
Paul Bakker5690efc2011-05-26 13:16:06 +000067
Paul Bakker33b43f12013-08-20 11:48:36 +020068/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010069void aes_encrypt_ecb(data_t *key_str, data_t *src_str,
70 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000071{
Paul Bakker367dae42009-06-28 21:50:27 +000072 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000074
Paul Bakker367dae42009-06-28 21:50:27 +000075 memset(output, 0x00, 100);
76
Gilles Peskine449bd832023-01-11 14:50:10 +010077 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000078
Gilles Peskine449bd832023-01-11 14:50:10 +010079 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == setkey_result);
80 if (setkey_result == 0) {
81 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +000082
Gilles Peskine449bd832023-01-11 14:50:10 +010083 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +000084 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020085
Paul Bakkerbd51b262014-07-10 15:26:12 +020086exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010087 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000088}
Paul Bakker33b43f12013-08-20 11:48:36 +020089/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +000090
Dave Rodgman4cc6fb92024-01-14 18:13:05 +000091/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CTR */
Dave Rodgman24ad1b52024-01-14 23:52:27 +000092void aes_ctr(data_t *key, data_t *ictr, data_t *pt, data_t *ct, int expected)
93{
94 unsigned char *output = NULL;
95 unsigned char ctr[16];
96 unsigned char stream_block[16];
97 mbedtls_aes_context ctx;
98
99 // sanity checks on test input
100 TEST_ASSERT(pt->len == ct->len);
101 TEST_ASSERT(key->len == 16 || key->len == 24 || key->len == 32);
102
103 TEST_CALLOC(output, pt->len);
104
105 // expected result is always success on zero-length input, so skip len == 0 if expecting failure
106 for (size_t len = (expected == 0 ? 0 : 1); len <= pt->len; len++) {
107 for (int i = 0; i < 2; i++) {
108 mbedtls_aes_init(&ctx);
109 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key->x, key->len * 8) == 0);
110
111 memcpy(ctr, ictr->x, 16);
112 memset(stream_block, 0, 16);
113 memset(output, 0, pt->len);
114
115 size_t nc_off = 0;
116
117 if (i == 0) {
118 // encrypt
119 TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, ctr,
120 stream_block, pt->x, output), 0);
121 TEST_ASSERT(!!memcmp(output, ct->x, len) == expected);
122 } else {
123 // decrypt
124 TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, len, &nc_off, ctr,
125 stream_block, ct->x, output), 0);
126 TEST_ASSERT(!!memcmp(output, pt->x, len) == expected);
127 }
128 }
129 }
130
131exit:
132 mbedtls_free(output);
133 mbedtls_aes_free(&ctx);
134}
135/* END_CASE */
136
137/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CTR */
Dave Rodgman4cc6fb92024-01-14 18:13:05 +0000138void aes_encrypt_ctr_multipart(int length, int step_size)
139{
140 unsigned char key[16];
141 unsigned char ctr_a[16];
142 unsigned char ctr_b[16];
143 unsigned char stream_block_a[16];
144 unsigned char stream_block_b[16];
145 unsigned char *input = NULL;
146 unsigned char *output_a = NULL;
147 unsigned char *output_b = NULL;
148 mbedtls_aes_context ctx;
149 size_t nc_off_a, nc_off_b;
150
151 TEST_ASSERT(length >= 0);
152 TEST_ASSERT(step_size > 0);
153
154 TEST_CALLOC(input, length);
155 TEST_CALLOC(output_a, length);
156 TEST_CALLOC(output_b, length);
157
158 // set up a random key
159 mbedtls_test_rnd_std_rand(NULL, key, sizeof(key));
160
161 // random input
Dave Rodgmanb7778b22024-01-16 16:27:34 +0000162 mbedtls_test_rnd_std_rand(NULL, input, length);
Dave Rodgman4cc6fb92024-01-14 18:13:05 +0000163
164
165 // complete encryption in one call
166 mbedtls_aes_init(&ctx);
167 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key, sizeof(key) * 8) == 0);
168 memset(ctr_a, 0, sizeof(ctr_a));
169 memset(stream_block_a, 0, sizeof(stream_block_a));
170 nc_off_a = 0;
171 TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, length, &nc_off_a, ctr_a,
172 stream_block_a, input, output_a), 0);
173 mbedtls_aes_free(&ctx);
174
175
176 // encrypt in multiple steps of varying size
177 mbedtls_aes_init(&ctx);
178 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key, sizeof(key) * 8) == 0);
179 memset(ctr_b, 0, sizeof(ctr_b));
180 memset(stream_block_b, 0, sizeof(stream_block_b));
181 nc_off_b = 0;
182 size_t remaining = length;
183 unsigned char *ip = input, *op = output_b;
184 while (remaining != 0) {
185 size_t l = MIN(remaining, (size_t) step_size);
186 step_size *= 2;
187 remaining -= l;
188 TEST_EQUAL(mbedtls_aes_crypt_ctr(&ctx, l, &nc_off_b, ctr_b, stream_block_b, ip, op), 0);
189 ip += l;
190 op += l;
191 }
192
193 // finally, validate that multiple steps produced same result as single-pass
194 TEST_MEMORY_COMPARE(output_a, length, output_b, length);
195 TEST_MEMORY_COMPARE(ctr_a, sizeof(ctr_a), ctr_b, sizeof(ctr_b));
196 TEST_MEMORY_COMPARE(stream_block_a, sizeof(stream_block_a),
197 stream_block_b, sizeof(stream_block_b));
198 TEST_EQUAL(nc_off_a, nc_off_b);
199
200exit:
201 mbedtls_free(input);
202 mbedtls_free(output_a);
203 mbedtls_free(output_b);
204
205 mbedtls_aes_free(&ctx);
206}
207/* END_CASE */
208
Yanray Wangb67b4742023-10-31 17:10:32 +0800209/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
Gilles Peskine449bd832023-01-11 14:50:10 +0100210void aes_decrypt_ecb(data_t *key_str, data_t *src_str,
211 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000212{
Paul Bakker367dae42009-06-28 21:50:27 +0000213 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000215
Paul Bakker367dae42009-06-28 21:50:27 +0000216 memset(output, 0x00, 100);
217
Gilles Peskine449bd832023-01-11 14:50:10 +0100218 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000219
Gilles Peskine449bd832023-01-11 14:50:10 +0100220 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result);
221 if (setkey_result == 0) {
222 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000223
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +0000225 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200226
Paul Bakkerbd51b262014-07-10 15:26:12 +0200227exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000229}
Paul Bakker33b43f12013-08-20 11:48:36 +0200230/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +0100233void aes_encrypt_cbc(data_t *key_str, data_t *iv_str,
234 data_t *src_str, data_t *dst,
235 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000236{
Paul Bakker367dae42009-06-28 21:50:27 +0000237 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200238 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000239
Paul Bakker367dae42009-06-28 21:50:27 +0000240 memset(output, 0x00, 100);
241
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000243
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
245 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
246 src_str->x, output) == cbc_result);
247 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000248
Gilles Peskine449bd832023-01-11 14:50:10 +0100249 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
250 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000251 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200252
Paul Bakkerbd51b262014-07-10 15:26:12 +0200253exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100254 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000255}
Paul Bakker33b43f12013-08-20 11:48:36 +0200256/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200258/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +0100259void aes_decrypt_cbc(data_t *key_str, data_t *iv_str,
260 data_t *src_str, data_t *dst,
261 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000262{
Paul Bakker367dae42009-06-28 21:50:27 +0000263 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200264 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000265
Paul Bakker367dae42009-06-28 21:50:27 +0000266 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100267 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000268
Gilles Peskine449bd832023-01-11 14:50:10 +0100269 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0);
270 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
271 src_str->x, output) == cbc_result);
272 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000273
Gilles Peskine449bd832023-01-11 14:50:10 +0100274 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
275 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000276 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200277
Paul Bakkerbd51b262014-07-10 15:26:12 +0200278exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000280}
Paul Bakker33b43f12013-08-20 11:48:36 +0200281/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000282
Aorimn5f778012016-06-09 23:22:58 +0200283/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100284void aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string,
285 char *hex_src_string, char *hex_dst_string)
Aorimn5f778012016-06-09 23:22:58 +0200286{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100287 enum { AES_BLOCK_SIZE = 16 };
288 unsigned char *data_unit = NULL;
289 unsigned char *key = NULL;
290 unsigned char *src = NULL;
291 unsigned char *dst = NULL;
292 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100293 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100294 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200295
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200297
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
299 &data_unit_len);
300 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200301
Gilles Peskine449bd832023-01-11 14:50:10 +0100302 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
303 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
306 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
307 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200308
Gilles Peskine449bd832023-01-11 14:50:10 +0100309 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100310
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0);
312 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len,
313 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100314
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200316
317exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100318 mbedtls_aes_xts_free(&ctx);
319 mbedtls_free(data_unit);
320 mbedtls_free(key);
321 mbedtls_free(src);
322 mbedtls_free(dst);
323 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200324}
325/* END_CASE */
326
327/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100328void aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string,
329 char *hex_dst_string, char *hex_src_string)
Aorimn5f778012016-06-09 23:22:58 +0200330{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100331 enum { AES_BLOCK_SIZE = 16 };
332 unsigned char *data_unit = NULL;
333 unsigned char *key = NULL;
334 unsigned char *src = NULL;
335 unsigned char *dst = NULL;
336 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100337 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100338 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200339
Gilles Peskine449bd832023-01-11 14:50:10 +0100340 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200341
Gilles Peskine449bd832023-01-11 14:50:10 +0100342 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
343 &data_unit_len);
344 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200345
Gilles Peskine449bd832023-01-11 14:50:10 +0100346 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
347 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200348
Gilles Peskine449bd832023-01-11 14:50:10 +0100349 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
350 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
351 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200352
Gilles Peskine449bd832023-01-11 14:50:10 +0100353 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100354
Gilles Peskine449bd832023-01-11 14:50:10 +0100355 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0);
356 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len,
357 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100358
Gilles Peskine449bd832023-01-11 14:50:10 +0100359 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200360
361exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100362 mbedtls_aes_xts_free(&ctx);
363 mbedtls_free(data_unit);
364 mbedtls_free(key);
365 mbedtls_free(src);
366 mbedtls_free(dst);
367 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200368}
369/* END_CASE */
370
Jaeden Amero425382d2018-04-28 17:26:25 +0100371/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100372void aes_crypt_xts_size(int size, int retval)
Jaeden Amero425382d2018-04-28 17:26:25 +0100373{
374 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500375 const unsigned char src[16] = { 0 };
376 unsigned char output[16];
Jaeden Amero425382d2018-04-28 17:26:25 +0100377 unsigned char data_unit[16];
378 size_t length = size;
379
Gilles Peskine449bd832023-01-11 14:50:10 +0100380 mbedtls_aes_xts_init(&ctx);
381 memset(data_unit, 0x00, sizeof(data_unit));
Jaeden Amero425382d2018-04-28 17:26:25 +0100382
Gilles Peskine449bd832023-01-11 14:50:10 +0100383 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src,
384 output) == retval);
JoeSubbiani57face22021-06-17 15:00:01 +0100385exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100386 mbedtls_aes_xts_free(&ctx);
Jaeden Amero425382d2018-04-28 17:26:25 +0100387}
388/* END_CASE */
389
Jaeden Amero142383e2018-05-31 10:40:34 +0100390/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100391void aes_crypt_xts_keysize(int size, int retval)
Jaeden Amero142383e2018-05-31 10:40:34 +0100392{
393 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500394 const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Jaeden Amero142383e2018-05-31 10:40:34 +0100395 size_t key_len = size;
396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 mbedtls_aes_xts_init(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100398
Gilles Peskine449bd832023-01-11 14:50:10 +0100399 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval);
400 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval);
Jaeden Amero142383e2018-05-31 10:40:34 +0100401exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 mbedtls_aes_xts_free(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100403}
404/* END_CASE */
Jaeden Amero425382d2018-04-28 17:26:25 +0100405
406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100408void aes_encrypt_cfb128(data_t *key_str, data_t *iv_str,
409 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000410{
Paul Bakker367dae42009-06-28 21:50:27 +0000411 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200412 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000413 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000414
Paul Bakker367dae42009-06-28 21:50:27 +0000415 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000417
Paul Bakker367dae42009-06-28 21:50:27 +0000418
Gilles Peskine449bd832023-01-11 14:50:10 +0100419 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
420 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x,
421 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000422
Gilles Peskine449bd832023-01-11 14:50:10 +0100423 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200424
Paul Bakkerbd51b262014-07-10 15:26:12 +0200425exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000427}
Paul Bakker33b43f12013-08-20 11:48:36 +0200428/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200430/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100431void aes_decrypt_cfb128(data_t *key_str, data_t *iv_str,
432 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000433{
Paul Bakker367dae42009-06-28 21:50:27 +0000434 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200435 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000436 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000437
Paul Bakker367dae42009-06-28 21:50:27 +0000438 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100439 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000440
Paul Bakker367dae42009-06-28 21:50:27 +0000441
Gilles Peskine449bd832023-01-11 14:50:10 +0100442 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
443 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x,
444 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000445
Gilles Peskine449bd832023-01-11 14:50:10 +0100446 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200447
Paul Bakkerbd51b262014-07-10 15:26:12 +0200448exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100449 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000450}
Paul Bakker33b43f12013-08-20 11:48:36 +0200451/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000452
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100454void aes_encrypt_cfb8(data_t *key_str, data_t *iv_str,
455 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100456{
Paul Bakker556efba2014-01-24 15:38:12 +0100457 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200458 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100459
Paul Bakker556efba2014-01-24 15:38:12 +0100460 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100461 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100462
Paul Bakker556efba2014-01-24 15:38:12 +0100463
Gilles Peskine449bd832023-01-11 14:50:10 +0100464 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
465 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
466 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100467
Gilles Peskine449bd832023-01-11 14:50:10 +0100468 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
469 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200470
Paul Bakkerbd51b262014-07-10 15:26:12 +0200471exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100472 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100473}
474/* END_CASE */
475
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100477void aes_decrypt_cfb8(data_t *key_str, data_t *iv_str,
478 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100479{
Paul Bakker556efba2014-01-24 15:38:12 +0100480 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200481 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100482
Paul Bakker556efba2014-01-24 15:38:12 +0100483 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100485
Paul Bakker556efba2014-01-24 15:38:12 +0100486
Gilles Peskine449bd832023-01-11 14:50:10 +0100487 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
488 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
489 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100490
Gilles Peskine449bd832023-01-11 14:50:10 +0100491 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
492 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200493
Paul Bakkerbd51b262014-07-10 15:26:12 +0200494exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100496}
497/* END_CASE */
498
Simon Butcher03018842018-04-22 22:57:58 +0100499/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100500void aes_encrypt_ofb(int fragment_size, data_t *key_str,
501 data_t *iv_str, data_t *src_str,
502 data_t *expected_output)
Simon Butcher03018842018-04-22 22:57:58 +0100503{
Simon Butchere416bf92018-06-02 18:28:32 +0100504 unsigned char output[32];
Simon Butcher03018842018-04-22 22:57:58 +0100505 mbedtls_aes_context ctx;
506 size_t iv_offset = 0;
507 int in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100508 unsigned char *src_str_next;
Simon Butcher03018842018-04-22 22:57:58 +0100509
Gilles Peskine449bd832023-01-11 14:50:10 +0100510 memset(output, 0x00, sizeof(output));
511 mbedtls_aes_init(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100512
Gilles Peskine449bd832023-01-11 14:50:10 +0100513 TEST_ASSERT((size_t) fragment_size < sizeof(output));
Simon Butchere416bf92018-06-02 18:28:32 +0100514
Gilles Peskine449bd832023-01-11 14:50:10 +0100515 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x,
516 key_str->len * 8) == 0);
Ronald Cron9ed40732020-06-25 09:03:34 +0200517 in_buffer_len = src_str->len;
518 src_str_next = src_str->x;
Simon Butcher03018842018-04-22 22:57:58 +0100519
Gilles Peskine449bd832023-01-11 14:50:10 +0100520 while (in_buffer_len > 0) {
521 TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset,
522 iv_str->x, src_str_next, output) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100523
Gilles Peskine449bd832023-01-11 14:50:10 +0100524 TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100525
526 in_buffer_len -= fragment_size;
Ronald Cron55d97f22020-06-26 17:00:30 +0200527 expected_output->x += fragment_size;
Simon Butcher03018842018-04-22 22:57:58 +0100528 src_str_next += fragment_size;
529
Gilles Peskine449bd832023-01-11 14:50:10 +0100530 if (in_buffer_len < fragment_size) {
Simon Butcher03018842018-04-22 22:57:58 +0100531 fragment_size = in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100532 }
Simon Butcher03018842018-04-22 22:57:58 +0100533 }
534
535exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100536 mbedtls_aes_free(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100537}
538/* END_CASE */
539
Tuvshinzaya Erdenekhuuc855bf52022-07-29 14:43:51 +0100540/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100541void aes_invalid_mode()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500542{
543 mbedtls_aes_context aes_ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500544 const unsigned char in[16] = { 0 };
545 unsigned char out[16];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500546 const int invalid_mode = 42;
547
Gilles Peskine449bd832023-01-11 14:50:10 +0100548 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
549 mbedtls_aes_crypt_ecb(&aes_ctx, invalid_mode, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500550
551#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100552 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
553 mbedtls_aes_crypt_cbc(&aes_ctx, invalid_mode, 16,
554 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500555#endif /* MBEDTLS_CIPHER_MODE_CBC */
556
557#if defined(MBEDTLS_CIPHER_MODE_XTS)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200558 mbedtls_aes_xts_context xts_ctx;
559
Gilles Peskine449bd832023-01-11 14:50:10 +0100560 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
561 mbedtls_aes_crypt_xts(&xts_ctx, invalid_mode, 16,
562 in, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500563#endif /* MBEDTLS_CIPHER_MODE_XTS */
564
565#if defined(MBEDTLS_CIPHER_MODE_CFB)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200566 size_t size;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500567
Gilles Peskine449bd832023-01-11 14:50:10 +0100568 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
569 mbedtls_aes_crypt_cfb128(&aes_ctx, invalid_mode, 16,
570 &size, out, in, out));
571 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
572 mbedtls_aes_crypt_cfb8(&aes_ctx, invalid_mode, 16,
573 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500574#endif /* MBEDTLS_CIPHER_MODE_CFB */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500575}
576/* END_CASE */
577
578/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100579void aes_misc_params()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500580{
581#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
582 defined(MBEDTLS_CIPHER_MODE_XTS) || \
583 defined(MBEDTLS_CIPHER_MODE_CFB) || \
584 defined(MBEDTLS_CIPHER_MODE_OFB)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500585 const unsigned char in[16] = { 0 };
586 unsigned char out[16];
587#endif
Andrzej Kurek252283f2022-09-27 07:54:16 -0400588#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
589 defined(MBEDTLS_CIPHER_MODE_CFB) || \
590 defined(MBEDTLS_CIPHER_MODE_OFB)
Gilles Peskine449bd832023-01-11 14:50:10 +0100591 mbedtls_aes_context aes_ctx;
Andrzej Kurek252283f2022-09-27 07:54:16 -0400592#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500593#if defined(MBEDTLS_CIPHER_MODE_XTS)
594 mbedtls_aes_xts_context xts_ctx;
595#endif
596#if defined(MBEDTLS_CIPHER_MODE_CFB) || \
597 defined(MBEDTLS_CIPHER_MODE_OFB)
598 size_t size;
599#endif
600
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500601#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100602 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
603 15,
604 out, in, out)
605 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
606 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
607 17,
608 out, in, out)
609 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500610#endif
611
612#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100613 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
614 15,
615 in, in, out)
616 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
617 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
618 (1 << 24) + 1,
619 in, in, out)
620 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500621#endif
622
623#if defined(MBEDTLS_CIPHER_MODE_CFB)
624 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100625 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16,
626 &size, out, in, out)
627 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500628#endif
629
630#if defined(MBEDTLS_CIPHER_MODE_OFB)
631 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100632 TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out)
633 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500634#endif
TRodziewicz358e5882021-05-28 12:58:46 +0200635
636/*
637 * The following line needs to be added to make the code compilable
638 * when all the conditions above will be not define in a specific
639 * choice of features.
640 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100641 TEST_ASSERT(1);
TRodziewicz358e5882021-05-28 12:58:46 +0200642/* TODO: It will be removed when the whole test will be reworked */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500643}
644/* END_CASE */
645
Yanray Wangb67b4742023-10-31 17:10:32 +0800646/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
Gilles Peskine5fcdf492023-03-16 14:38:29 +0100647void aes_ecb_copy_context(data_t *key)
Werner Lewisdd76ef32022-05-30 12:00:21 +0100648{
Gilles Peskine844f65d2023-03-16 14:54:48 +0100649 /* We test context copying multiple times, with different alignments
650 * of the original and of the copies. */
651
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100652 struct align0 {
653 mbedtls_aes_context ctx;
654 };
655 struct align0 *src0 = NULL;
656 struct align0 *enc0 = NULL;
657 struct align0 *dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100658
659 struct align1 {
660 char bump;
661 mbedtls_aes_context ctx;
662 };
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100663 struct align1 *src1 = NULL;
664 struct align1 *enc1 = NULL;
665 struct align1 *dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100666
667 /* All peak alignment */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100668 TEST_CALLOC(src0, 1);
669 TEST_CALLOC(enc0, 1);
670 TEST_CALLOC(dec0, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100671 if (!test_copy(key, &src0->ctx, &enc0->ctx, &dec0->ctx)) {
Gilles Peskine5fcdf492023-03-16 14:38:29 +0100672 goto exit;
673 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100674 mbedtls_free(src0);
675 src0 = NULL;
676 mbedtls_free(enc0);
677 enc0 = NULL;
678 mbedtls_free(dec0);
679 dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100680
681 /* Original shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100682 TEST_CALLOC(src1, 1);
683 TEST_CALLOC(enc0, 1);
684 TEST_CALLOC(dec0, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100685 if (!test_copy(key, &src1->ctx, &enc0->ctx, &dec0->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100686 goto exit;
687 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100688 mbedtls_free(src1);
689 src1 = NULL;
690 mbedtls_free(enc0);
691 enc0 = NULL;
692 mbedtls_free(dec0);
693 dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100694
695 /* Copies shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100696 TEST_CALLOC(src0, 1);
697 TEST_CALLOC(enc1, 1);
698 TEST_CALLOC(dec1, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100699 if (!test_copy(key, &src0->ctx, &enc1->ctx, &dec1->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100700 goto exit;
701 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100702 mbedtls_free(src0);
703 src0 = NULL;
704 mbedtls_free(enc1);
705 enc1 = NULL;
706 mbedtls_free(dec1);
707 dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100708
709 /* Source and copies shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100710 TEST_CALLOC(src1, 1);
711 TEST_CALLOC(enc1, 1);
712 TEST_CALLOC(dec1, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100713 if (!test_copy(key, &src1->ctx, &enc1->ctx, &dec1->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100714 goto exit;
715 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100716 mbedtls_free(src1);
717 src1 = NULL;
718 mbedtls_free(enc1);
719 enc1 = NULL;
720 mbedtls_free(dec1);
721 dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100722
723exit:
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100724 mbedtls_free(src0);
725 mbedtls_free(enc0);
726 mbedtls_free(dec0);
727 mbedtls_free(src1);
728 mbedtls_free(enc1);
729 mbedtls_free(dec1);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100730}
731/* END_CASE */
732
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200733/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Gilles Peskine449bd832023-01-11 14:50:10 +0100734void aes_selftest()
Paul Bakker3d360822009-07-05 11:29:38 +0000735{
Gilles Peskine449bd832023-01-11 14:50:10 +0100736 TEST_ASSERT(mbedtls_aes_self_test(1) == 0);
Paul Bakker3d360822009-07-05 11:29:38 +0000737}
Paul Bakker33b43f12013-08-20 11:48:36 +0200738/* END_CASE */