blob: 2ca3f7f20f5312dd7e7a9f2f860cc53d4fba10d7 [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
Yanray Wangb67b4742023-10-31 17:10:32 +080091/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
Gilles Peskine449bd832023-01-11 14:50:10 +010092void aes_decrypt_ecb(data_t *key_str, data_t *src_str,
93 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000094{
Paul Bakker367dae42009-06-28 21:50:27 +000095 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020096 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000097
Paul Bakker367dae42009-06-28 21:50:27 +000098 memset(output, 0x00, 100);
99
Gilles Peskine449bd832023-01-11 14:50:10 +0100100 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000101
Gilles Peskine449bd832023-01-11 14:50:10 +0100102 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result);
103 if (setkey_result == 0) {
104 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000105
Gilles Peskine449bd832023-01-11 14:50:10 +0100106 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +0000107 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200108
Paul Bakkerbd51b262014-07-10 15:26:12 +0200109exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100110 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000111}
Paul Bakker33b43f12013-08-20 11:48:36 +0200112/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +0100115void aes_encrypt_cbc(data_t *key_str, data_t *iv_str,
116 data_t *src_str, data_t *dst,
117 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000118{
Paul Bakker367dae42009-06-28 21:50:27 +0000119 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000121
Paul Bakker367dae42009-06-28 21:50:27 +0000122 memset(output, 0x00, 100);
123
Gilles Peskine449bd832023-01-11 14:50:10 +0100124 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000125
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
127 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
128 src_str->x, output) == cbc_result);
129 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000130
Gilles Peskine449bd832023-01-11 14:50:10 +0100131 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
132 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000133 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200134
Paul Bakkerbd51b262014-07-10 15:26:12 +0200135exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100136 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000137}
Paul Bakker33b43f12013-08-20 11:48:36 +0200138/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000139
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200140/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +0100141void aes_decrypt_cbc(data_t *key_str, data_t *iv_str,
142 data_t *src_str, data_t *dst,
143 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +0000144{
Paul Bakker367dae42009-06-28 21:50:27 +0000145 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +0000147
Paul Bakker367dae42009-06-28 21:50:27 +0000148 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100149 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000150
Gilles Peskine449bd832023-01-11 14:50:10 +0100151 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0);
152 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
153 src_str->x, output) == cbc_result);
154 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +0000155
Gilles Peskine449bd832023-01-11 14:50:10 +0100156 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
157 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000158 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200159
Paul Bakkerbd51b262014-07-10 15:26:12 +0200160exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100161 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000162}
Paul Bakker33b43f12013-08-20 11:48:36 +0200163/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000164
Aorimn5f778012016-06-09 23:22:58 +0200165/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100166void aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string,
167 char *hex_src_string, char *hex_dst_string)
Aorimn5f778012016-06-09 23:22:58 +0200168{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100169 enum { AES_BLOCK_SIZE = 16 };
170 unsigned char *data_unit = NULL;
171 unsigned char *key = NULL;
172 unsigned char *src = NULL;
173 unsigned char *dst = NULL;
174 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100175 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100176 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200177
Gilles Peskine449bd832023-01-11 14:50:10 +0100178 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200179
Gilles Peskine449bd832023-01-11 14:50:10 +0100180 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
181 &data_unit_len);
182 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200183
Gilles Peskine449bd832023-01-11 14:50:10 +0100184 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
185 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200186
Gilles Peskine449bd832023-01-11 14:50:10 +0100187 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
188 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
189 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200190
Gilles Peskine449bd832023-01-11 14:50:10 +0100191 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100192
Gilles Peskine449bd832023-01-11 14:50:10 +0100193 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0);
194 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len,
195 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100196
Gilles Peskine449bd832023-01-11 14:50:10 +0100197 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200198
199exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100200 mbedtls_aes_xts_free(&ctx);
201 mbedtls_free(data_unit);
202 mbedtls_free(key);
203 mbedtls_free(src);
204 mbedtls_free(dst);
205 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200206}
207/* END_CASE */
208
209/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100210void aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string,
211 char *hex_dst_string, char *hex_src_string)
Aorimn5f778012016-06-09 23:22:58 +0200212{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100213 enum { AES_BLOCK_SIZE = 16 };
214 unsigned char *data_unit = NULL;
215 unsigned char *key = NULL;
216 unsigned char *src = NULL;
217 unsigned char *dst = NULL;
218 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100219 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100220 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200221
Gilles Peskine449bd832023-01-11 14:50:10 +0100222 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200223
Gilles Peskine449bd832023-01-11 14:50:10 +0100224 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
225 &data_unit_len);
226 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200227
Gilles Peskine449bd832023-01-11 14:50:10 +0100228 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
229 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200230
Gilles Peskine449bd832023-01-11 14:50:10 +0100231 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
232 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
233 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200234
Gilles Peskine449bd832023-01-11 14:50:10 +0100235 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100236
Gilles Peskine449bd832023-01-11 14:50:10 +0100237 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0);
238 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len,
239 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100240
Gilles Peskine449bd832023-01-11 14:50:10 +0100241 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200242
243exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100244 mbedtls_aes_xts_free(&ctx);
245 mbedtls_free(data_unit);
246 mbedtls_free(key);
247 mbedtls_free(src);
248 mbedtls_free(dst);
249 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200250}
251/* END_CASE */
252
Jaeden Amero425382d2018-04-28 17:26:25 +0100253/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100254void aes_crypt_xts_size(int size, int retval)
Jaeden Amero425382d2018-04-28 17:26:25 +0100255{
256 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500257 const unsigned char src[16] = { 0 };
258 unsigned char output[16];
Jaeden Amero425382d2018-04-28 17:26:25 +0100259 unsigned char data_unit[16];
260 size_t length = size;
261
Gilles Peskine449bd832023-01-11 14:50:10 +0100262 mbedtls_aes_xts_init(&ctx);
263 memset(data_unit, 0x00, sizeof(data_unit));
Jaeden Amero425382d2018-04-28 17:26:25 +0100264
Gilles Peskine449bd832023-01-11 14:50:10 +0100265 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src,
266 output) == retval);
JoeSubbiani57face22021-06-17 15:00:01 +0100267exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100268 mbedtls_aes_xts_free(&ctx);
Jaeden Amero425382d2018-04-28 17:26:25 +0100269}
270/* END_CASE */
271
Jaeden Amero142383e2018-05-31 10:40:34 +0100272/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100273void aes_crypt_xts_keysize(int size, int retval)
Jaeden Amero142383e2018-05-31 10:40:34 +0100274{
275 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500276 const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Jaeden Amero142383e2018-05-31 10:40:34 +0100277 size_t key_len = size;
278
Gilles Peskine449bd832023-01-11 14:50:10 +0100279 mbedtls_aes_xts_init(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100280
Gilles Peskine449bd832023-01-11 14:50:10 +0100281 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval);
282 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval);
Jaeden Amero142383e2018-05-31 10:40:34 +0100283exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100284 mbedtls_aes_xts_free(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100285}
286/* END_CASE */
Jaeden Amero425382d2018-04-28 17:26:25 +0100287
288
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200289/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100290void aes_encrypt_cfb128(data_t *key_str, data_t *iv_str,
291 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000292{
Paul Bakker367dae42009-06-28 21:50:27 +0000293 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000295 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000296
Paul Bakker367dae42009-06-28 21:50:27 +0000297 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100298 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000299
Paul Bakker367dae42009-06-28 21:50:27 +0000300
Gilles Peskine449bd832023-01-11 14:50:10 +0100301 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
302 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x,
303 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000304
Gilles Peskine449bd832023-01-11 14:50:10 +0100305 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200306
Paul Bakkerbd51b262014-07-10 15:26:12 +0200307exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000309}
Paul Bakker33b43f12013-08-20 11:48:36 +0200310/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100313void aes_decrypt_cfb128(data_t *key_str, data_t *iv_str,
314 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000315{
Paul Bakker367dae42009-06-28 21:50:27 +0000316 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200317 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000318 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000319
Paul Bakker367dae42009-06-28 21:50:27 +0000320 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100321 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000322
Paul Bakker367dae42009-06-28 21:50:27 +0000323
Gilles Peskine449bd832023-01-11 14:50:10 +0100324 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
325 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x,
326 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000327
Gilles Peskine449bd832023-01-11 14:50:10 +0100328 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200329
Paul Bakkerbd51b262014-07-10 15:26:12 +0200330exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100331 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000332}
Paul Bakker33b43f12013-08-20 11:48:36 +0200333/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000334
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200335/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100336void aes_encrypt_cfb8(data_t *key_str, data_t *iv_str,
337 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100338{
Paul Bakker556efba2014-01-24 15:38:12 +0100339 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200340 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100341
Paul Bakker556efba2014-01-24 15:38:12 +0100342 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100343 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100344
Paul Bakker556efba2014-01-24 15:38:12 +0100345
Gilles Peskine449bd832023-01-11 14:50:10 +0100346 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
347 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
348 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100349
Gilles Peskine449bd832023-01-11 14:50:10 +0100350 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
351 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200352
Paul Bakkerbd51b262014-07-10 15:26:12 +0200353exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100354 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100355}
356/* END_CASE */
357
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100359void aes_decrypt_cfb8(data_t *key_str, data_t *iv_str,
360 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100361{
Paul Bakker556efba2014-01-24 15:38:12 +0100362 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100364
Paul Bakker556efba2014-01-24 15:38:12 +0100365 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100366 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100367
Paul Bakker556efba2014-01-24 15:38:12 +0100368
Gilles Peskine449bd832023-01-11 14:50:10 +0100369 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
370 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
371 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100372
Gilles Peskine449bd832023-01-11 14:50:10 +0100373 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
374 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200375
Paul Bakkerbd51b262014-07-10 15:26:12 +0200376exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100377 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100378}
379/* END_CASE */
380
Simon Butcher03018842018-04-22 22:57:58 +0100381/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100382void aes_encrypt_ofb(int fragment_size, data_t *key_str,
383 data_t *iv_str, data_t *src_str,
384 data_t *expected_output)
Simon Butcher03018842018-04-22 22:57:58 +0100385{
Simon Butchere416bf92018-06-02 18:28:32 +0100386 unsigned char output[32];
Simon Butcher03018842018-04-22 22:57:58 +0100387 mbedtls_aes_context ctx;
388 size_t iv_offset = 0;
389 int in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100390 unsigned char *src_str_next;
Simon Butcher03018842018-04-22 22:57:58 +0100391
Gilles Peskine449bd832023-01-11 14:50:10 +0100392 memset(output, 0x00, sizeof(output));
393 mbedtls_aes_init(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100394
Gilles Peskine449bd832023-01-11 14:50:10 +0100395 TEST_ASSERT((size_t) fragment_size < sizeof(output));
Simon Butchere416bf92018-06-02 18:28:32 +0100396
Gilles Peskine449bd832023-01-11 14:50:10 +0100397 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x,
398 key_str->len * 8) == 0);
Ronald Cron9ed40732020-06-25 09:03:34 +0200399 in_buffer_len = src_str->len;
400 src_str_next = src_str->x;
Simon Butcher03018842018-04-22 22:57:58 +0100401
Gilles Peskine449bd832023-01-11 14:50:10 +0100402 while (in_buffer_len > 0) {
403 TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset,
404 iv_str->x, src_str_next, output) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100405
Gilles Peskine449bd832023-01-11 14:50:10 +0100406 TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100407
408 in_buffer_len -= fragment_size;
Ronald Cron55d97f22020-06-26 17:00:30 +0200409 expected_output->x += fragment_size;
Simon Butcher03018842018-04-22 22:57:58 +0100410 src_str_next += fragment_size;
411
Gilles Peskine449bd832023-01-11 14:50:10 +0100412 if (in_buffer_len < fragment_size) {
Simon Butcher03018842018-04-22 22:57:58 +0100413 fragment_size = in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100414 }
Simon Butcher03018842018-04-22 22:57:58 +0100415 }
416
417exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100418 mbedtls_aes_free(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100419}
420/* END_CASE */
421
Tuvshinzaya Erdenekhuuc855bf52022-07-29 14:43:51 +0100422/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100423void aes_invalid_mode()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500424{
425 mbedtls_aes_context aes_ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500426 const unsigned char in[16] = { 0 };
427 unsigned char out[16];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500428 const int invalid_mode = 42;
429
Gilles Peskine449bd832023-01-11 14:50:10 +0100430 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
431 mbedtls_aes_crypt_ecb(&aes_ctx, invalid_mode, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500432
433#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100434 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
435 mbedtls_aes_crypt_cbc(&aes_ctx, invalid_mode, 16,
436 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500437#endif /* MBEDTLS_CIPHER_MODE_CBC */
438
439#if defined(MBEDTLS_CIPHER_MODE_XTS)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200440 mbedtls_aes_xts_context xts_ctx;
441
Gilles Peskine449bd832023-01-11 14:50:10 +0100442 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
443 mbedtls_aes_crypt_xts(&xts_ctx, invalid_mode, 16,
444 in, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500445#endif /* MBEDTLS_CIPHER_MODE_XTS */
446
447#if defined(MBEDTLS_CIPHER_MODE_CFB)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200448 size_t size;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500449
Gilles Peskine449bd832023-01-11 14:50:10 +0100450 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
451 mbedtls_aes_crypt_cfb128(&aes_ctx, invalid_mode, 16,
452 &size, out, in, out));
453 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
454 mbedtls_aes_crypt_cfb8(&aes_ctx, invalid_mode, 16,
455 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500456#endif /* MBEDTLS_CIPHER_MODE_CFB */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500457}
458/* END_CASE */
459
460/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100461void aes_misc_params()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500462{
463#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
464 defined(MBEDTLS_CIPHER_MODE_XTS) || \
465 defined(MBEDTLS_CIPHER_MODE_CFB) || \
466 defined(MBEDTLS_CIPHER_MODE_OFB)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500467 const unsigned char in[16] = { 0 };
468 unsigned char out[16];
469#endif
Andrzej Kurek252283f2022-09-27 07:54:16 -0400470#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
471 defined(MBEDTLS_CIPHER_MODE_CFB) || \
472 defined(MBEDTLS_CIPHER_MODE_OFB)
Gilles Peskine449bd832023-01-11 14:50:10 +0100473 mbedtls_aes_context aes_ctx;
Andrzej Kurek252283f2022-09-27 07:54:16 -0400474#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500475#if defined(MBEDTLS_CIPHER_MODE_XTS)
476 mbedtls_aes_xts_context xts_ctx;
477#endif
478#if defined(MBEDTLS_CIPHER_MODE_CFB) || \
479 defined(MBEDTLS_CIPHER_MODE_OFB)
480 size_t size;
481#endif
482
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500483#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100484 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
485 15,
486 out, in, out)
487 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
488 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
489 17,
490 out, in, out)
491 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500492#endif
493
494#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
496 15,
497 in, in, out)
498 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
499 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
500 (1 << 24) + 1,
501 in, in, out)
502 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500503#endif
504
505#if defined(MBEDTLS_CIPHER_MODE_CFB)
506 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100507 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16,
508 &size, out, in, out)
509 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500510#endif
511
512#if defined(MBEDTLS_CIPHER_MODE_OFB)
513 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100514 TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out)
515 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500516#endif
TRodziewicz358e5882021-05-28 12:58:46 +0200517
518/*
519 * The following line needs to be added to make the code compilable
520 * when all the conditions above will be not define in a specific
521 * choice of features.
522 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100523 TEST_ASSERT(1);
TRodziewicz358e5882021-05-28 12:58:46 +0200524/* TODO: It will be removed when the whole test will be reworked */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500525}
526/* END_CASE */
527
Yanray Wangb67b4742023-10-31 17:10:32 +0800528/* BEGIN_CASE depends_on:!MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */
Gilles Peskine5fcdf492023-03-16 14:38:29 +0100529void aes_ecb_copy_context(data_t *key)
Werner Lewisdd76ef32022-05-30 12:00:21 +0100530{
Gilles Peskine844f65d2023-03-16 14:54:48 +0100531 /* We test context copying multiple times, with different alignments
532 * of the original and of the copies. */
533
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100534 struct align0 {
535 mbedtls_aes_context ctx;
536 };
537 struct align0 *src0 = NULL;
538 struct align0 *enc0 = NULL;
539 struct align0 *dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100540
541 struct align1 {
542 char bump;
543 mbedtls_aes_context ctx;
544 };
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100545 struct align1 *src1 = NULL;
546 struct align1 *enc1 = NULL;
547 struct align1 *dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100548
549 /* All peak alignment */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100550 TEST_CALLOC(src0, 1);
551 TEST_CALLOC(enc0, 1);
552 TEST_CALLOC(dec0, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100553 if (!test_copy(key, &src0->ctx, &enc0->ctx, &dec0->ctx)) {
Gilles Peskine5fcdf492023-03-16 14:38:29 +0100554 goto exit;
555 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100556 mbedtls_free(src0);
557 src0 = NULL;
558 mbedtls_free(enc0);
559 enc0 = NULL;
560 mbedtls_free(dec0);
561 dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100562
563 /* Original shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100564 TEST_CALLOC(src1, 1);
565 TEST_CALLOC(enc0, 1);
566 TEST_CALLOC(dec0, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100567 if (!test_copy(key, &src1->ctx, &enc0->ctx, &dec0->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100568 goto exit;
569 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100570 mbedtls_free(src1);
571 src1 = NULL;
572 mbedtls_free(enc0);
573 enc0 = NULL;
574 mbedtls_free(dec0);
575 dec0 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100576
577 /* Copies shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100578 TEST_CALLOC(src0, 1);
579 TEST_CALLOC(enc1, 1);
580 TEST_CALLOC(dec1, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100581 if (!test_copy(key, &src0->ctx, &enc1->ctx, &dec1->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100582 goto exit;
583 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100584 mbedtls_free(src0);
585 src0 = NULL;
586 mbedtls_free(enc1);
587 enc1 = NULL;
588 mbedtls_free(dec1);
589 dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100590
591 /* Source and copies shifted */
Tom Cosgrove05b2a872023-07-21 11:31:13 +0100592 TEST_CALLOC(src1, 1);
593 TEST_CALLOC(enc1, 1);
594 TEST_CALLOC(dec1, 1);
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100595 if (!test_copy(key, &src1->ctx, &enc1->ctx, &dec1->ctx)) {
Gilles Peskine844f65d2023-03-16 14:54:48 +0100596 goto exit;
597 }
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100598 mbedtls_free(src1);
599 src1 = NULL;
600 mbedtls_free(enc1);
601 enc1 = NULL;
602 mbedtls_free(dec1);
603 dec1 = NULL;
Gilles Peskine844f65d2023-03-16 14:54:48 +0100604
605exit:
Gilles Peskine28e4dc12023-03-16 21:39:47 +0100606 mbedtls_free(src0);
607 mbedtls_free(enc0);
608 mbedtls_free(dec0);
609 mbedtls_free(src1);
610 mbedtls_free(enc1);
611 mbedtls_free(dec1);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100612}
613/* END_CASE */
614
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Gilles Peskine449bd832023-01-11 14:50:10 +0100616void aes_selftest()
Paul Bakker3d360822009-07-05 11:29:38 +0000617{
Gilles Peskine449bd832023-01-11 14:50:10 +0100618 TEST_ASSERT(mbedtls_aes_self_test(1) == 0);
Paul Bakker3d360822009-07-05 11:29:38 +0000619}
Paul Bakker33b43f12013-08-20 11:48:36 +0200620/* END_CASE */