blob: d495b49ed1365d3280518ae829250d899f602f10 [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 */
9static int test_copy(const data_t *key,
10 mbedtls_aes_context *master,
11 mbedtls_aes_context *enc,
12 mbedtls_aes_context *dec)
13{
14 unsigned char plaintext[16] = {
15 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
16 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
17 };
18 unsigned char ciphertext[16];
19 unsigned char output[16];
20
21 // Set key and encrypt with original context
22 mbedtls_aes_init(master);
23 TEST_ASSERT(mbedtls_aes_setkey_enc(master, key->x,
24 key->len * 8) == 0);
25 TEST_ASSERT(mbedtls_aes_crypt_ecb(master, MBEDTLS_AES_ENCRYPT,
26 plaintext, ciphertext) == 0);
27 *enc = *master;
28
29 // Set key for decryption with original context
30 mbedtls_aes_init(master);
31 TEST_ASSERT(mbedtls_aes_setkey_dec(master, key->x,
32 key->len * 8) == 0);
33 *dec = *master;
34
35 // Wipe the original context to make sure nothing from it is used
36 memset(master, 0, sizeof(*master));
37
38 // Encrypt with copied context
39 TEST_ASSERT(mbedtls_aes_crypt_ecb(enc, MBEDTLS_AES_ENCRYPT,
40 plaintext, output) == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010041 TEST_MEMORY_COMPARE(ciphertext, 16, output, 16);
Gilles Peskine5fcdf492023-03-16 14:38:29 +010042 mbedtls_aes_free(enc);
43
44 // Decrypt with copied context
45 TEST_ASSERT(mbedtls_aes_crypt_ecb(dec, MBEDTLS_AES_DECRYPT,
46 ciphertext, output) == 0);
Tom Cosgrovee4e9e7d2023-07-21 11:40:20 +010047 TEST_MEMORY_COMPARE(plaintext, 16, output, 16);
Gilles Peskine5fcdf492023-03-16 14:38:29 +010048 mbedtls_aes_free(dec);
49
50 return 1;
51
52exit:
53 /* Bug: we may be leaving something unfreed. This is harmless
54 * in our built-in implementations, but might cause a memory leak
55 * with alternative implementations. */
56 return 0;
57}
58
Paul Bakker33b43f12013-08-20 11:48:36 +020059/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +000060
Paul Bakker33b43f12013-08-20 11:48:36 +020061/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020062 * depends_on:MBEDTLS_AES_C
Paul Bakker33b43f12013-08-20 11:48:36 +020063 * END_DEPENDENCIES
64 */
Paul Bakker5690efc2011-05-26 13:16:06 +000065
Paul Bakker33b43f12013-08-20 11:48:36 +020066/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010067void aes_encrypt_ecb(data_t *key_str, data_t *src_str,
68 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000069{
Paul Bakker367dae42009-06-28 21:50:27 +000070 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020071 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000072
Paul Bakker367dae42009-06-28 21:50:27 +000073 memset(output, 0x00, 100);
74
Gilles Peskine449bd832023-01-11 14:50:10 +010075 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000076
Gilles Peskine449bd832023-01-11 14:50:10 +010077 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == setkey_result);
78 if (setkey_result == 0) {
79 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +000080
Gilles Peskine449bd832023-01-11 14:50:10 +010081 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +000082 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020083
Paul Bakkerbd51b262014-07-10 15:26:12 +020084exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010085 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000086}
Paul Bakker33b43f12013-08-20 11:48:36 +020087/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +000088
Paul Bakker33b43f12013-08-20 11:48:36 +020089/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010090void aes_decrypt_ecb(data_t *key_str, data_t *src_str,
91 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000092{
Paul Bakker367dae42009-06-28 21:50:27 +000093 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000095
Paul Bakker367dae42009-06-28 21:50:27 +000096 memset(output, 0x00, 100);
97
Gilles Peskine449bd832023-01-11 14:50:10 +010098 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000099
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result);
101 if (setkey_result == 0) {
102 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000103
Gilles Peskine449bd832023-01-11 14:50:10 +0100104 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +0000105 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200106
Paul Bakkerbd51b262014-07-10 15:26:12 +0200107exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100108 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000109}
Paul Bakker33b43f12013-08-20 11:48:36 +0200110/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +0100113void aes_encrypt_cbc(data_t *key_str, data_t *iv_str,
114 data_t *src_str, data_t *dst,
115 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000116{
Paul Bakker367dae42009-06-28 21:50:27 +0000117 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000119
Paul Bakker367dae42009-06-28 21:50:27 +0000120 memset(output, 0x00, 100);
121
Gilles Peskine449bd832023-01-11 14:50:10 +0100122 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000123
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
125 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
126 src_str->x, output) == cbc_result);
127 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000128
Gilles Peskine449bd832023-01-11 14:50:10 +0100129 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
130 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000131 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200132
Paul Bakkerbd51b262014-07-10 15:26:12 +0200133exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100134 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000135}
Paul Bakker33b43f12013-08-20 11:48:36 +0200136/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000137
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200138/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +0100139void aes_decrypt_cbc(data_t *key_str, data_t *iv_str,
140 data_t *src_str, data_t *dst,
141 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000142{
Paul Bakker367dae42009-06-28 21:50:27 +0000143 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200144 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000145
Paul Bakker367dae42009-06-28 21:50:27 +0000146 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100147 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000148
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0);
150 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
151 src_str->x, output) == cbc_result);
152 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000153
Gilles Peskine449bd832023-01-11 14:50:10 +0100154 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
155 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000156 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200157
Paul Bakkerbd51b262014-07-10 15:26:12 +0200158exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100159 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000160}
Paul Bakker33b43f12013-08-20 11:48:36 +0200161/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000162
Aorimn5f778012016-06-09 23:22:58 +0200163/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100164void aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string,
165 char *hex_src_string, char *hex_dst_string)
Aorimn5f778012016-06-09 23:22:58 +0200166{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100167 enum { AES_BLOCK_SIZE = 16 };
168 unsigned char *data_unit = NULL;
169 unsigned char *key = NULL;
170 unsigned char *src = NULL;
171 unsigned char *dst = NULL;
172 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100173 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100174 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200175
Gilles Peskine449bd832023-01-11 14:50:10 +0100176 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
179 &data_unit_len);
180 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200181
Gilles Peskine449bd832023-01-11 14:50:10 +0100182 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
183 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200184
Gilles Peskine449bd832023-01-11 14:50:10 +0100185 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
186 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
187 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200188
Gilles Peskine449bd832023-01-11 14:50:10 +0100189 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100190
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0);
192 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len,
193 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100194
Gilles Peskine449bd832023-01-11 14:50:10 +0100195 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200196
197exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100198 mbedtls_aes_xts_free(&ctx);
199 mbedtls_free(data_unit);
200 mbedtls_free(key);
201 mbedtls_free(src);
202 mbedtls_free(dst);
203 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200204}
205/* END_CASE */
206
207/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100208void aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string,
209 char *hex_dst_string, char *hex_src_string)
Aorimn5f778012016-06-09 23:22:58 +0200210{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100211 enum { AES_BLOCK_SIZE = 16 };
212 unsigned char *data_unit = NULL;
213 unsigned char *key = NULL;
214 unsigned char *src = NULL;
215 unsigned char *dst = NULL;
216 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100217 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100218 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200219
Gilles Peskine449bd832023-01-11 14:50:10 +0100220 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200221
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
223 &data_unit_len);
224 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200225
Gilles Peskine449bd832023-01-11 14:50:10 +0100226 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
227 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200228
Gilles Peskine449bd832023-01-11 14:50:10 +0100229 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
230 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
231 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200232
Gilles Peskine449bd832023-01-11 14:50:10 +0100233 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100234
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0);
236 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len,
237 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100238
Gilles Peskine449bd832023-01-11 14:50:10 +0100239 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200240
241exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100242 mbedtls_aes_xts_free(&ctx);
243 mbedtls_free(data_unit);
244 mbedtls_free(key);
245 mbedtls_free(src);
246 mbedtls_free(dst);
247 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200248}
249/* END_CASE */
250
Jaeden Amero425382d2018-04-28 17:26:25 +0100251/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100252void aes_crypt_xts_size(int size, int retval)
Jaeden Amero425382d2018-04-28 17:26:25 +0100253{
254 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500255 const unsigned char src[16] = { 0 };
256 unsigned char output[16];
Jaeden Amero425382d2018-04-28 17:26:25 +0100257 unsigned char data_unit[16];
258 size_t length = size;
259
Gilles Peskine449bd832023-01-11 14:50:10 +0100260 mbedtls_aes_xts_init(&ctx);
261 memset(data_unit, 0x00, sizeof(data_unit));
Jaeden Amero425382d2018-04-28 17:26:25 +0100262
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src,
264 output) == retval);
JoeSubbiani57face22021-06-17 15:00:01 +0100265exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 mbedtls_aes_xts_free(&ctx);
Jaeden Amero425382d2018-04-28 17:26:25 +0100267}
268/* END_CASE */
269
Jaeden Amero142383e2018-05-31 10:40:34 +0100270/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100271void aes_crypt_xts_keysize(int size, int retval)
Jaeden Amero142383e2018-05-31 10:40:34 +0100272{
273 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500274 const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Jaeden Amero142383e2018-05-31 10:40:34 +0100275 size_t key_len = size;
276
Gilles Peskine449bd832023-01-11 14:50:10 +0100277 mbedtls_aes_xts_init(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100278
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval);
280 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval);
Jaeden Amero142383e2018-05-31 10:40:34 +0100281exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100282 mbedtls_aes_xts_free(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100283}
284/* END_CASE */
Jaeden Amero425382d2018-04-28 17:26:25 +0100285
286
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200287/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100288void aes_encrypt_cfb128(data_t *key_str, data_t *iv_str,
289 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000290{
Paul Bakker367dae42009-06-28 21:50:27 +0000291 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000293 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000294
Paul Bakker367dae42009-06-28 21:50:27 +0000295 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000297
Paul Bakker367dae42009-06-28 21:50:27 +0000298
Gilles Peskine449bd832023-01-11 14:50:10 +0100299 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
300 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x,
301 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000302
Gilles Peskine449bd832023-01-11 14:50:10 +0100303 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200304
Paul Bakkerbd51b262014-07-10 15:26:12 +0200305exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100306 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000307}
Paul Bakker33b43f12013-08-20 11:48:36 +0200308/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000309
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200310/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100311void aes_decrypt_cfb128(data_t *key_str, data_t *iv_str,
312 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000313{
Paul Bakker367dae42009-06-28 21:50:27 +0000314 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000316 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000317
Paul Bakker367dae42009-06-28 21:50:27 +0000318 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000320
Paul Bakker367dae42009-06-28 21:50:27 +0000321
Gilles Peskine449bd832023-01-11 14:50:10 +0100322 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
323 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x,
324 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000325
Gilles Peskine449bd832023-01-11 14:50:10 +0100326 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200327
Paul Bakkerbd51b262014-07-10 15:26:12 +0200328exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100329 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000330}
Paul Bakker33b43f12013-08-20 11:48:36 +0200331/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000332
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100334void aes_encrypt_cfb8(data_t *key_str, data_t *iv_str,
335 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100336{
Paul Bakker556efba2014-01-24 15:38:12 +0100337 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100339
Paul Bakker556efba2014-01-24 15:38:12 +0100340 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100341 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100342
Paul Bakker556efba2014-01-24 15:38:12 +0100343
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
345 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
346 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100347
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
349 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200350
Paul Bakkerbd51b262014-07-10 15:26:12 +0200351exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100352 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100353}
354/* END_CASE */
355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200356/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100357void aes_decrypt_cfb8(data_t *key_str, data_t *iv_str,
358 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100359{
Paul Bakker556efba2014-01-24 15:38:12 +0100360 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100362
Paul Bakker556efba2014-01-24 15:38:12 +0100363 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100364 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100365
Paul Bakker556efba2014-01-24 15:38:12 +0100366
Gilles Peskine449bd832023-01-11 14:50:10 +0100367 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
368 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
369 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100370
Gilles Peskine449bd832023-01-11 14:50:10 +0100371 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
372 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200373
Paul Bakkerbd51b262014-07-10 15:26:12 +0200374exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100375 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100376}
377/* END_CASE */
378
Simon Butcher03018842018-04-22 22:57:58 +0100379/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100380void aes_encrypt_ofb(int fragment_size, data_t *key_str,
381 data_t *iv_str, data_t *src_str,
382 data_t *expected_output)
Simon Butcher03018842018-04-22 22:57:58 +0100383{
Simon Butchere416bf92018-06-02 18:28:32 +0100384 unsigned char output[32];
Simon Butcher03018842018-04-22 22:57:58 +0100385 mbedtls_aes_context ctx;
386 size_t iv_offset = 0;
387 int in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100388 unsigned char *src_str_next;
Simon Butcher03018842018-04-22 22:57:58 +0100389
Gilles Peskine449bd832023-01-11 14:50:10 +0100390 memset(output, 0x00, sizeof(output));
391 mbedtls_aes_init(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100392
Gilles Peskine449bd832023-01-11 14:50:10 +0100393 TEST_ASSERT((size_t) fragment_size < sizeof(output));
Simon Butchere416bf92018-06-02 18:28:32 +0100394
Gilles Peskine449bd832023-01-11 14:50:10 +0100395 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x,
396 key_str->len * 8) == 0);
Ronald Cron9ed40732020-06-25 09:03:34 +0200397 in_buffer_len = src_str->len;
398 src_str_next = src_str->x;
Simon Butcher03018842018-04-22 22:57:58 +0100399
Gilles Peskine449bd832023-01-11 14:50:10 +0100400 while (in_buffer_len > 0) {
401 TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset,
402 iv_str->x, src_str_next, output) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100403
Gilles Peskine449bd832023-01-11 14:50:10 +0100404 TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100405
406 in_buffer_len -= fragment_size;
Ronald Cron55d97f22020-06-26 17:00:30 +0200407 expected_output->x += fragment_size;
Simon Butcher03018842018-04-22 22:57:58 +0100408 src_str_next += fragment_size;
409
Gilles Peskine449bd832023-01-11 14:50:10 +0100410 if (in_buffer_len < fragment_size) {
Simon Butcher03018842018-04-22 22:57:58 +0100411 fragment_size = in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 }
Simon Butcher03018842018-04-22 22:57:58 +0100413 }
414
415exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100416 mbedtls_aes_free(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100417}
418/* END_CASE */
419
Tuvshinzaya Erdenekhuuc855bf52022-07-29 14:43:51 +0100420/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100421void aes_invalid_mode()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500422{
423 mbedtls_aes_context aes_ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500424 const unsigned char in[16] = { 0 };
425 unsigned char out[16];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500426 const int invalid_mode = 42;
427
Gilles Peskine449bd832023-01-11 14:50:10 +0100428 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
429 mbedtls_aes_crypt_ecb(&aes_ctx, invalid_mode, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500430
431#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100432 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
433 mbedtls_aes_crypt_cbc(&aes_ctx, invalid_mode, 16,
434 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500435#endif /* MBEDTLS_CIPHER_MODE_CBC */
436
437#if defined(MBEDTLS_CIPHER_MODE_XTS)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200438 mbedtls_aes_xts_context xts_ctx;
439
Gilles Peskine449bd832023-01-11 14:50:10 +0100440 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
441 mbedtls_aes_crypt_xts(&xts_ctx, invalid_mode, 16,
442 in, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500443#endif /* MBEDTLS_CIPHER_MODE_XTS */
444
445#if defined(MBEDTLS_CIPHER_MODE_CFB)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200446 size_t size;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500447
Gilles Peskine449bd832023-01-11 14:50:10 +0100448 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
449 mbedtls_aes_crypt_cfb128(&aes_ctx, invalid_mode, 16,
450 &size, out, in, out));
451 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
452 mbedtls_aes_crypt_cfb8(&aes_ctx, invalid_mode, 16,
453 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500454#endif /* MBEDTLS_CIPHER_MODE_CFB */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500455}
456/* END_CASE */
457
458/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100459void aes_misc_params()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500460{
461#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
462 defined(MBEDTLS_CIPHER_MODE_XTS) || \
463 defined(MBEDTLS_CIPHER_MODE_CFB) || \
464 defined(MBEDTLS_CIPHER_MODE_OFB)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500465 const unsigned char in[16] = { 0 };
466 unsigned char out[16];
467#endif
Andrzej Kurek252283f2022-09-27 07:54:16 -0400468#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
469 defined(MBEDTLS_CIPHER_MODE_CFB) || \
470 defined(MBEDTLS_CIPHER_MODE_OFB)
Gilles Peskine449bd832023-01-11 14:50:10 +0100471 mbedtls_aes_context aes_ctx;
Andrzej Kurek252283f2022-09-27 07:54:16 -0400472#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500473#if defined(MBEDTLS_CIPHER_MODE_XTS)
474 mbedtls_aes_xts_context xts_ctx;
475#endif
476#if defined(MBEDTLS_CIPHER_MODE_CFB) || \
477 defined(MBEDTLS_CIPHER_MODE_OFB)
478 size_t size;
479#endif
480
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500481#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
483 15,
484 out, in, out)
485 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
486 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
487 17,
488 out, in, out)
489 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500490#endif
491
492#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100493 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
494 15,
495 in, in, out)
496 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
497 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
498 (1 << 24) + 1,
499 in, in, out)
500 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500501#endif
502
503#if defined(MBEDTLS_CIPHER_MODE_CFB)
504 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100505 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16,
506 &size, out, in, out)
507 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500508#endif
509
510#if defined(MBEDTLS_CIPHER_MODE_OFB)
511 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100512 TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out)
513 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500514#endif
TRodziewicz358e5882021-05-28 12:58:46 +0200515
516/*
517 * The following line needs to be added to make the code compilable
518 * when all the conditions above will be not define in a specific
519 * choice of features.
520 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100521 TEST_ASSERT(1);
TRodziewicz358e5882021-05-28 12:58:46 +0200522/* TODO: It will be removed when the whole test will be reworked */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500523}
524/* END_CASE */
525
Werner Lewisdd76ef32022-05-30 12:00:21 +0100526/* BEGIN_CASE */
Gilles Peskine5fcdf492023-03-16 14:38:29 +0100527void aes_ecb_copy_context(data_t *key)
Werner Lewisdd76ef32022-05-30 12:00:21 +0100528{
Gilles Peskine844f65d2023-03-16 14:54:48 +0100529 /* We test context copying multiple times, with different alignments
530 * of the original and of the copies. */
531
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100532 struct align0 {
533 mbedtls_aes_context ctx;
534 };
535 struct align0 *src0 = NULL;
536 struct align0 *enc0 = NULL;
537 struct align0 *dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100538
539 struct align1 {
540 char bump;
541 mbedtls_aes_context ctx;
542 };
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100543 struct align1 *src1 = NULL;
544 struct align1 *enc1 = NULL;
545 struct align1 *dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100546
547 /* All peak alignment */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100548 TEST_CALLOC(src0, 1);
549 TEST_CALLOC(enc0, 1);
550 TEST_CALLOC(dec0, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100551 if (!test_copy(key, &src0->ctx, &enc0->ctx, &dec0->ctx)) {
Gilles Peskine5fcdf492023-03-16 14:38:29 +0100552 goto exit;
553 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100554 mbedtls_free(src0);
555 src0 = NULL;
556 mbedtls_free(enc0);
557 enc0 = NULL;
558 mbedtls_free(dec0);
559 dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100560
561 /* Original shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100562 TEST_CALLOC(src1, 1);
563 TEST_CALLOC(enc0, 1);
564 TEST_CALLOC(dec0, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100565 if (!test_copy(key, &src1->ctx, &enc0->ctx, &dec0->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100566 goto exit;
567 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100568 mbedtls_free(src1);
569 src1 = NULL;
570 mbedtls_free(enc0);
571 enc0 = NULL;
572 mbedtls_free(dec0);
573 dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100574
575 /* Copies shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100576 TEST_CALLOC(src0, 1);
577 TEST_CALLOC(enc1, 1);
578 TEST_CALLOC(dec1, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100579 if (!test_copy(key, &src0->ctx, &enc1->ctx, &dec1->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100580 goto exit;
581 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100582 mbedtls_free(src0);
583 src0 = NULL;
584 mbedtls_free(enc1);
585 enc1 = NULL;
586 mbedtls_free(dec1);
587 dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100588
589 /* Source and copies shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100590 TEST_CALLOC(src1, 1);
591 TEST_CALLOC(enc1, 1);
592 TEST_CALLOC(dec1, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100593 if (!test_copy(key, &src1->ctx, &enc1->ctx, &dec1->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100594 goto exit;
595 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100596 mbedtls_free(src1);
597 src1 = NULL;
598 mbedtls_free(enc1);
599 enc1 = NULL;
600 mbedtls_free(dec1);
601 dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100602
603exit:
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100604 mbedtls_free(src0);
605 mbedtls_free(enc0);
606 mbedtls_free(dec0);
607 mbedtls_free(src1);
608 mbedtls_free(enc1);
609 mbedtls_free(dec1);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100610}
611/* END_CASE */
612
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200613/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Gilles Peskine449bd832023-01-11 14:50:10 +0100614void aes_selftest()
Paul Bakker3d360822009-07-05 11:29:38 +0000615{
Gilles Peskine449bd832023-01-11 14:50:10 +0100616 TEST_ASSERT(mbedtls_aes_self_test(1) == 0);
Paul Bakker3d360822009-07-05 11:29:38 +0000617}
Paul Bakker33b43f12013-08-20 11:48:36 +0200618/* END_CASE */