blob: b159e1a15c1313f65a80c06b005401f84df8873e [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"
Tom Cosgroveb5eb8312023-03-20 10:57:42 +00003
4/* Test AES with a copied context.
5 *
6 * enc and dec must be AES context objects. They don't need to
7 * be initialized, and are left freed.
8 */
9static int test_ctx_alignment(const data_t *key,
10 mbedtls_aes_context *enc,
11 mbedtls_aes_context *dec)
12{
13 unsigned char plaintext[16] = {
14 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
15 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
16 };
17 unsigned char ciphertext[16];
18 unsigned char output[16];
19
20 // Set key and encrypt with original context
21 mbedtls_aes_init(enc);
22 TEST_ASSERT(mbedtls_aes_setkey_enc(enc, key->x, key->len * 8) == 0);
23 TEST_ASSERT(mbedtls_aes_crypt_ecb(enc, MBEDTLS_AES_ENCRYPT,
24 plaintext, ciphertext) == 0);
25
26 // Set key for decryption with original context
27 mbedtls_aes_init(dec);
28 TEST_ASSERT(mbedtls_aes_setkey_dec(dec, key->x, key->len * 8) == 0);
29
30 // Wipe the original context to make sure nothing from it is used
31 memset(enc, 0, sizeof(*enc));
32 mbedtls_aes_free(enc);
33
34 // Decrypt
35 TEST_ASSERT(mbedtls_aes_crypt_ecb(dec, MBEDTLS_AES_DECRYPT,
36 ciphertext, output) == 0);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +010037 TEST_MEMORY_COMPARE(plaintext, 16, output, 16);
Tom Cosgroveb5eb8312023-03-20 10:57:42 +000038
39 mbedtls_aes_free(dec);
40
41 return 1;
42
43exit:
44 /* Bug: we may be leaving something unfreed. This is harmless
45 * in our built-in implementations, but might cause a memory leak
46 * with alternative implementations. */
47 return 0;
48}
49
Paul Bakker33b43f12013-08-20 11:48:36 +020050/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +000051
Paul Bakker33b43f12013-08-20 11:48:36 +020052/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053 * depends_on:MBEDTLS_AES_C
Paul Bakker33b43f12013-08-20 11:48:36 +020054 * END_DEPENDENCIES
55 */
Paul Bakker5690efc2011-05-26 13:16:06 +000056
Paul Bakker33b43f12013-08-20 11:48:36 +020057/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010058void aes_encrypt_ecb(data_t *key_str, data_t *src_str,
59 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000060{
Paul Bakker367dae42009-06-28 21:50:27 +000061 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000063
Paul Bakker367dae42009-06-28 21:50:27 +000064 memset(output, 0x00, 100);
65
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010066 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000067
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010068 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == setkey_result);
69 if (setkey_result == 0) {
70 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +000071
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010072 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +000073 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020074
Paul Bakkerbd51b262014-07-10 15:26:12 +020075exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010076 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000077}
Paul Bakker33b43f12013-08-20 11:48:36 +020078/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +000079
Paul Bakker33b43f12013-08-20 11:48:36 +020080/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010081void aes_decrypt_ecb(data_t *key_str, data_t *src_str,
82 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000083{
Paul Bakker367dae42009-06-28 21:50:27 +000084 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020085 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000086
Paul Bakker367dae42009-06-28 21:50:27 +000087 memset(output, 0x00, 100);
88
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010089 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000090
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010091 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result);
92 if (setkey_result == 0) {
93 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +000094
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010095 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +000096 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020097
Paul Bakkerbd51b262014-07-10 15:26:12 +020098exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010099 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000100}
Paul Bakker33b43f12013-08-20 11:48:36 +0200101/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000102
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200103/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100104void aes_encrypt_cbc(data_t *key_str, data_t *iv_str,
105 data_t *src_str, data_t *dst,
106 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000107{
Paul Bakker367dae42009-06-28 21:50:27 +0000108 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000110
Paul Bakker367dae42009-06-28 21:50:27 +0000111 memset(output, 0x00, 100);
112
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100113 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000114
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100115 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
116 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
117 src_str->x, output) == cbc_result);
118 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000119
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100120 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
121 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000122 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200123
Paul Bakkerbd51b262014-07-10 15:26:12 +0200124exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100125 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000126}
Paul Bakker33b43f12013-08-20 11:48:36 +0200127/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000128
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200129/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130void aes_decrypt_cbc(data_t *key_str, data_t *iv_str,
131 data_t *src_str, data_t *dst,
132 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000133{
Paul Bakker367dae42009-06-28 21:50:27 +0000134 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000136
Paul Bakker367dae42009-06-28 21:50:27 +0000137 memset(output, 0x00, 100);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100138 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000139
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100140 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0);
141 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
142 src_str->x, output) == cbc_result);
143 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000144
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100145 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
146 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000147 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200148
Paul Bakkerbd51b262014-07-10 15:26:12 +0200149exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100150 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000151}
Paul Bakker33b43f12013-08-20 11:48:36 +0200152/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000153
Aorimn5f778012016-06-09 23:22:58 +0200154/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100155void aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string,
156 char *hex_src_string, char *hex_dst_string)
Aorimn5f778012016-06-09 23:22:58 +0200157{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100158 enum { AES_BLOCK_SIZE = 16 };
159 unsigned char *data_unit = NULL;
160 unsigned char *key = NULL;
161 unsigned char *src = NULL;
162 unsigned char *dst = NULL;
163 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100164 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100165 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200166
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100167 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200168
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100169 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
170 &data_unit_len);
171 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200172
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100173 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
174 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200175
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100176 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
177 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
178 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200179
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100180 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100181
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100182 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0);
183 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len,
184 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100185
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100186 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200187
188exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100189 mbedtls_aes_xts_free(&ctx);
190 mbedtls_free(data_unit);
191 mbedtls_free(key);
192 mbedtls_free(src);
193 mbedtls_free(dst);
194 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200195}
196/* END_CASE */
197
198/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100199void aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string,
200 char *hex_dst_string, char *hex_src_string)
Aorimn5f778012016-06-09 23:22:58 +0200201{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100202 enum { AES_BLOCK_SIZE = 16 };
203 unsigned char *data_unit = NULL;
204 unsigned char *key = NULL;
205 unsigned char *src = NULL;
206 unsigned char *dst = NULL;
207 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100208 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100209 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200210
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100211 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200212
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100213 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
214 &data_unit_len);
215 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200216
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100217 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
218 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200219
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100220 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
221 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
222 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200223
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100224 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100225
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100226 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0);
227 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len,
228 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100229
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100230 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200231
232exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100233 mbedtls_aes_xts_free(&ctx);
234 mbedtls_free(data_unit);
235 mbedtls_free(key);
236 mbedtls_free(src);
237 mbedtls_free(dst);
238 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200239}
240/* END_CASE */
241
Jaeden Amero425382d2018-04-28 17:26:25 +0100242/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100243void aes_crypt_xts_size(int size, int retval)
Jaeden Amero425382d2018-04-28 17:26:25 +0100244{
245 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500246 const unsigned char src[16] = { 0 };
247 unsigned char output[16];
Jaeden Amero425382d2018-04-28 17:26:25 +0100248 unsigned char data_unit[16];
249 size_t length = size;
250
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100251 mbedtls_aes_xts_init(&ctx);
252 memset(data_unit, 0x00, sizeof(data_unit));
Jaeden Amero425382d2018-04-28 17:26:25 +0100253
254
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500255 /* Valid pointers are passed for builds with MBEDTLS_CHECK_PARAMS, as
256 * otherwise we wouldn't get to the size check we're interested in. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100257 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src,
258 output) == retval);
JoeSubbiani67889a52021-06-17 16:12:23 +0100259exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100260 mbedtls_aes_xts_free(&ctx);
Jaeden Amero425382d2018-04-28 17:26:25 +0100261}
262/* END_CASE */
263
Jaeden Amero142383e2018-05-31 10:40:34 +0100264/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100265void aes_crypt_xts_keysize(int size, int retval)
Jaeden Amero142383e2018-05-31 10:40:34 +0100266{
267 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500268 const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Jaeden Amero142383e2018-05-31 10:40:34 +0100269 size_t key_len = size;
270
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100271 mbedtls_aes_xts_init(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100272
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100273 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval);
274 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval);
Jaeden Amero142383e2018-05-31 10:40:34 +0100275exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100276 mbedtls_aes_xts_free(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100277}
278/* END_CASE */
Jaeden Amero425382d2018-04-28 17:26:25 +0100279
280
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200281/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100282void aes_encrypt_cfb128(data_t *key_str, data_t *iv_str,
283 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000284{
Paul Bakker367dae42009-06-28 21:50:27 +0000285 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000287 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000288
Paul Bakker367dae42009-06-28 21:50:27 +0000289 memset(output, 0x00, 100);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100290 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000291
Paul Bakker367dae42009-06-28 21:50:27 +0000292
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100293 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
294 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x,
295 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000296
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100297 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200298
Paul Bakkerbd51b262014-07-10 15:26:12 +0200299exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100300 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000301}
Paul Bakker33b43f12013-08-20 11:48:36 +0200302/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000303
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100305void aes_decrypt_cfb128(data_t *key_str, data_t *iv_str,
306 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000307{
Paul Bakker367dae42009-06-28 21:50:27 +0000308 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000310 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000311
Paul Bakker367dae42009-06-28 21:50:27 +0000312 memset(output, 0x00, 100);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100313 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000314
Paul Bakker367dae42009-06-28 21:50:27 +0000315
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100316 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
317 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x,
318 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000319
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100320 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200321
Paul Bakkerbd51b262014-07-10 15:26:12 +0200322exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100323 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000324}
Paul Bakker33b43f12013-08-20 11:48:36 +0200325/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000326
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200327/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100328void aes_encrypt_cfb8(data_t *key_str, data_t *iv_str,
329 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100330{
Paul Bakker556efba2014-01-24 15:38:12 +0100331 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100333
Paul Bakker556efba2014-01-24 15:38:12 +0100334 memset(output, 0x00, 100);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100335 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100336
Paul Bakker556efba2014-01-24 15:38:12 +0100337
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100338 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
339 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
340 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100341
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100342 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
343 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200344
Paul Bakkerbd51b262014-07-10 15:26:12 +0200345exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100346 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100347}
348/* END_CASE */
349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200350/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100351void aes_decrypt_cfb8(data_t *key_str, data_t *iv_str,
352 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100353{
Paul Bakker556efba2014-01-24 15:38:12 +0100354 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100356
Paul Bakker556efba2014-01-24 15:38:12 +0100357 memset(output, 0x00, 100);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100358 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100359
Paul Bakker556efba2014-01-24 15:38:12 +0100360
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100361 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
362 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
363 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100364
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100365 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
366 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200367
Paul Bakkerbd51b262014-07-10 15:26:12 +0200368exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100369 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100370}
371/* END_CASE */
372
Simon Butcher03018842018-04-22 22:57:58 +0100373/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100374void aes_encrypt_ofb(int fragment_size, data_t *key_str,
375 data_t *iv_str, data_t *src_str,
376 data_t *expected_output)
Simon Butcher03018842018-04-22 22:57:58 +0100377{
Simon Butchere416bf92018-06-02 18:28:32 +0100378 unsigned char output[32];
Simon Butcher03018842018-04-22 22:57:58 +0100379 mbedtls_aes_context ctx;
380 size_t iv_offset = 0;
381 int in_buffer_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100382 unsigned char *src_str_next;
Simon Butcher03018842018-04-22 22:57:58 +0100383
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100384 memset(output, 0x00, sizeof(output));
385 mbedtls_aes_init(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100386
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100387 TEST_ASSERT((size_t) fragment_size < sizeof(output));
Simon Butchere416bf92018-06-02 18:28:32 +0100388
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100389 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x,
390 key_str->len * 8) == 0);
Ronald Cron9ed40732020-06-25 09:03:34 +0200391 in_buffer_len = src_str->len;
392 src_str_next = src_str->x;
Simon Butcher03018842018-04-22 22:57:58 +0100393
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100394 while (in_buffer_len > 0) {
395 TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset,
396 iv_str->x, src_str_next, output) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100397
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100398 TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100399
400 in_buffer_len -= fragment_size;
Ronald Cron55d97f22020-06-26 17:00:30 +0200401 expected_output->x += fragment_size;
Simon Butcher03018842018-04-22 22:57:58 +0100402 src_str_next += fragment_size;
403
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100404 if (in_buffer_len < fragment_size) {
Simon Butcher03018842018-04-22 22:57:58 +0100405 fragment_size = in_buffer_len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100406 }
Simon Butcher03018842018-04-22 22:57:58 +0100407 }
408
409exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100410 mbedtls_aes_free(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100411}
412/* END_CASE */
413
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500414/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100415void aes_check_params()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500416{
417 mbedtls_aes_context aes_ctx;
418#if defined(MBEDTLS_CIPHER_MODE_XTS)
419 mbedtls_aes_xts_context xts_ctx;
420#endif
421 const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
422 const unsigned char in[16] = { 0 };
423 unsigned char out[16];
424 size_t size;
425 const int valid_mode = MBEDTLS_AES_ENCRYPT;
426 const int invalid_mode = 42;
427
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100428 TEST_INVALID_PARAM(mbedtls_aes_init(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500429#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100430 TEST_INVALID_PARAM(mbedtls_aes_xts_init(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500431#endif
432
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100433 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
434 mbedtls_aes_setkey_enc(NULL, key, 128));
435 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
436 mbedtls_aes_setkey_enc(&aes_ctx, NULL, 128));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500437
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100438 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
439 mbedtls_aes_setkey_dec(NULL, key, 128));
440 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
441 mbedtls_aes_setkey_dec(&aes_ctx, NULL, 128));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500442
443#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100444 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
445 mbedtls_aes_xts_setkey_enc(NULL, key, 128));
446 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
447 mbedtls_aes_xts_setkey_enc(&xts_ctx, NULL, 128));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500448
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100449 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
450 mbedtls_aes_xts_setkey_dec(NULL, key, 128));
451 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
452 mbedtls_aes_xts_setkey_dec(&xts_ctx, NULL, 128));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500453#endif
454
455
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100456 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
457 mbedtls_aes_crypt_ecb(NULL,
458 valid_mode, in, out));
459 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
460 mbedtls_aes_crypt_ecb(&aes_ctx,
461 invalid_mode, in, out));
462 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
463 mbedtls_aes_crypt_ecb(&aes_ctx,
464 valid_mode, NULL, out));
465 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
466 mbedtls_aes_crypt_ecb(&aes_ctx,
467 valid_mode, in, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500468
469#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100470 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
471 mbedtls_aes_crypt_cbc(NULL,
472 valid_mode, 16,
473 out, in, out));
474 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
475 mbedtls_aes_crypt_cbc(&aes_ctx,
476 invalid_mode, 16,
477 out, in, out));
478 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
479 mbedtls_aes_crypt_cbc(&aes_ctx,
480 valid_mode, 16,
481 NULL, in, out));
482 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
483 mbedtls_aes_crypt_cbc(&aes_ctx,
484 valid_mode, 16,
485 out, NULL, out));
486 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
487 mbedtls_aes_crypt_cbc(&aes_ctx,
488 valid_mode, 16,
489 out, in, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500490#endif /* MBEDTLS_CIPHER_MODE_CBC */
491
492#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100493 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
494 mbedtls_aes_crypt_xts(NULL,
495 valid_mode, 16,
496 in, in, out));
497 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
498 mbedtls_aes_crypt_xts(&xts_ctx,
499 invalid_mode, 16,
500 in, in, out));
501 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
502 mbedtls_aes_crypt_xts(&xts_ctx,
503 valid_mode, 16,
504 NULL, in, out));
505 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
506 mbedtls_aes_crypt_xts(&xts_ctx,
507 valid_mode, 16,
508 in, NULL, out));
509 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
510 mbedtls_aes_crypt_xts(&xts_ctx,
511 valid_mode, 16,
512 in, in, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500513#endif /* MBEDTLS_CIPHER_MODE_XTS */
514
515#if defined(MBEDTLS_CIPHER_MODE_CFB)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100516 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
517 mbedtls_aes_crypt_cfb128(NULL,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500518 valid_mode, 16,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100519 &size, out, in, out));
520 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
521 mbedtls_aes_crypt_cfb128(&aes_ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500522 invalid_mode, 16,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100523 &size, out, in, out));
524 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
525 mbedtls_aes_crypt_cfb128(&aes_ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500526 valid_mode, 16,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100527 NULL, out, in, out));
528 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
529 mbedtls_aes_crypt_cfb128(&aes_ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500530 valid_mode, 16,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100531 &size, NULL, in, out));
532 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
533 mbedtls_aes_crypt_cfb128(&aes_ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500534 valid_mode, 16,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100535 &size, out, NULL, out));
536 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
537 mbedtls_aes_crypt_cfb128(&aes_ctx,
538 valid_mode, 16,
539 &size, out, in, NULL));
540
541
542 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
543 mbedtls_aes_crypt_cfb8(NULL,
544 valid_mode, 16,
545 out, in, out));
546 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
547 mbedtls_aes_crypt_cfb8(&aes_ctx,
548 invalid_mode, 16,
549 out, in, out));
550 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
551 mbedtls_aes_crypt_cfb8(&aes_ctx,
552 valid_mode, 16,
553 NULL, in, out));
554 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
555 mbedtls_aes_crypt_cfb8(&aes_ctx,
556 valid_mode, 16,
557 out, NULL, out));
558 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
559 mbedtls_aes_crypt_cfb8(&aes_ctx,
560 valid_mode, 16,
561 out, in, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500562#endif /* MBEDTLS_CIPHER_MODE_CFB */
563
564#if defined(MBEDTLS_CIPHER_MODE_OFB)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100565 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
566 mbedtls_aes_crypt_ofb(NULL, 16,
567 &size, out, in, out));
568 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
569 mbedtls_aes_crypt_ofb(&aes_ctx, 16,
570 NULL, out, in, out));
571 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
572 mbedtls_aes_crypt_ofb(&aes_ctx, 16,
573 &size, NULL, in, out));
574 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
575 mbedtls_aes_crypt_ofb(&aes_ctx, 16,
576 &size, out, NULL, out));
577 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
578 mbedtls_aes_crypt_ofb(&aes_ctx, 16,
579 &size, out, in, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500580#endif /* MBEDTLS_CIPHER_MODE_OFB */
581
582#if defined(MBEDTLS_CIPHER_MODE_CTR)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100583 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
584 mbedtls_aes_crypt_ctr(NULL, 16, &size, out,
585 out, in, out));
586 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
587 mbedtls_aes_crypt_ctr(&aes_ctx, 16, NULL, out,
588 out, in, out));
589 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
590 mbedtls_aes_crypt_ctr(&aes_ctx, 16, &size, NULL,
591 out, in, out));
592 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
593 mbedtls_aes_crypt_ctr(&aes_ctx, 16, &size, out,
594 NULL, in, out));
595 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
596 mbedtls_aes_crypt_ctr(&aes_ctx, 16, &size, out,
597 out, NULL, out));
598 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
599 mbedtls_aes_crypt_ctr(&aes_ctx, 16, &size, out,
600 out, in, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500601#endif /* MBEDTLS_CIPHER_MODE_CTR */
602}
603/* END_CASE */
604
605/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100606void aes_misc_params()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500607{
608#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
609 defined(MBEDTLS_CIPHER_MODE_XTS) || \
610 defined(MBEDTLS_CIPHER_MODE_CFB) || \
611 defined(MBEDTLS_CIPHER_MODE_OFB)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500612 const unsigned char in[16] = { 0 };
613 unsigned char out[16];
614#endif
Andrzej Kurek8ffd8a62022-09-27 07:54:16 -0400615#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
616 defined(MBEDTLS_CIPHER_MODE_CFB) || \
617 defined(MBEDTLS_CIPHER_MODE_OFB)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100618 mbedtls_aes_context aes_ctx;
Andrzej Kurek8ffd8a62022-09-27 07:54:16 -0400619#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500620#if defined(MBEDTLS_CIPHER_MODE_XTS)
621 mbedtls_aes_xts_context xts_ctx;
622#endif
623#if defined(MBEDTLS_CIPHER_MODE_CFB) || \
624 defined(MBEDTLS_CIPHER_MODE_OFB)
625 size_t size;
626#endif
627
628 /* These calls accept NULL */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100629 TEST_VALID_PARAM(mbedtls_aes_free(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500630#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100631 TEST_VALID_PARAM(mbedtls_aes_xts_free(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500632#endif
633
634#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100635 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
636 15,
637 out, in, out)
638 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
639 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
640 17,
641 out, in, out)
642 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500643#endif
644
645#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100646 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
647 15,
648 in, in, out)
649 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
650 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
651 (1 << 24) + 1,
652 in, in, out)
653 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500654#endif
655
656#if defined(MBEDTLS_CIPHER_MODE_CFB)
657 size = 16;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100658 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16,
659 &size, out, in, out)
660 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500661#endif
662
663#if defined(MBEDTLS_CIPHER_MODE_OFB)
664 size = 16;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100665 TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out)
666 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500667#endif
668}
669/* END_CASE */
670
Tom Cosgroveb5eb8312023-03-20 10:57:42 +0000671/* BEGIN_CASE */
672void aes_ecb_context_alignment(data_t *key)
673{
674 /* We test alignment multiple times, with different alignments
675 * of the context and of the plaintext/ciphertext. */
676
677 struct align0 {
678 mbedtls_aes_context ctx;
679 };
680 struct align0 *enc0 = NULL;
681 struct align0 *dec0 = NULL;
682
683 struct align1 {
684 char bump;
685 mbedtls_aes_context ctx;
686 };
687 struct align1 *enc1 = NULL;
688 struct align1 *dec1 = NULL;
689
690 /* All peak alignment */
Tom Cosgrove30ceb232023-09-04 11:20:19 +0100691 TEST_CALLOC(enc0, 1);
692 TEST_CALLOC(dec0, 1);
Tom Cosgroveb5eb8312023-03-20 10:57:42 +0000693 if (!test_ctx_alignment(key, &enc0->ctx, &dec0->ctx)) {
694 goto exit;
695 }
696 mbedtls_free(enc0);
697 enc0 = NULL;
698 mbedtls_free(dec0);
699 dec0 = NULL;
700
701 /* Enc aligned, dec not */
Tom Cosgrove30ceb232023-09-04 11:20:19 +0100702 TEST_CALLOC(enc0, 1);
703 TEST_CALLOC(dec1, 1);
Tom Cosgroveb5eb8312023-03-20 10:57:42 +0000704 if (!test_ctx_alignment(key, &enc0->ctx, &dec1->ctx)) {
705 goto exit;
706 }
707 mbedtls_free(enc0);
708 enc0 = NULL;
709 mbedtls_free(dec1);
710 dec1 = NULL;
711
712 /* Dec aligned, enc not */
Tom Cosgrove30ceb232023-09-04 11:20:19 +0100713 TEST_CALLOC(enc1, 1);
714 TEST_CALLOC(dec0, 1);
Tom Cosgroveb5eb8312023-03-20 10:57:42 +0000715 if (!test_ctx_alignment(key, &enc1->ctx, &dec0->ctx)) {
716 goto exit;
717 }
718 mbedtls_free(enc1);
719 enc1 = NULL;
720 mbedtls_free(dec0);
721 dec0 = NULL;
722
723 /* Both shifted */
Tom Cosgrove30ceb232023-09-04 11:20:19 +0100724 TEST_CALLOC(enc1, 1);
725 TEST_CALLOC(dec1, 1);
Tom Cosgroveb5eb8312023-03-20 10:57:42 +0000726 if (!test_ctx_alignment(key, &enc1->ctx, &dec1->ctx)) {
727 goto exit;
728 }
729 mbedtls_free(enc1);
730 enc1 = NULL;
731 mbedtls_free(dec1);
732 dec1 = NULL;
733
734exit:
735 mbedtls_free(enc0);
736 mbedtls_free(dec0);
737 mbedtls_free(enc1);
738 mbedtls_free(dec1);
739}
740/* END_CASE */
741
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200742/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100743void aes_selftest()
Paul Bakker3d360822009-07-05 11:29:38 +0000744{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100745 TEST_ASSERT(mbedtls_aes_self_test(1) == 0);
Paul Bakker3d360822009-07-05 11:29:38 +0000746}
Paul Bakker33b43f12013-08-20 11:48:36 +0200747/* END_CASE */