blob: 332b9a7948ceb1b09ac7a628688cc28ef84055f4 [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"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker367dae42009-06-28 21:50:27 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_AES_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010011void aes_encrypt_ecb(data_t *key_str, data_t *src_str,
12 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000013{
Paul Bakker367dae42009-06-28 21:50:27 +000014 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020015 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000016
Paul Bakker367dae42009-06-28 21:50:27 +000017 memset(output, 0x00, 100);
18
Gilles Peskine449bd832023-01-11 14:50:10 +010019 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000020
Gilles Peskine449bd832023-01-11 14:50:10 +010021 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == setkey_result);
22 if (setkey_result == 0) {
23 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +000024
Gilles Peskine449bd832023-01-11 14:50:10 +010025 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +000026 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020027
Paul Bakkerbd51b262014-07-10 15:26:12 +020028exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010029 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000030}
Paul Bakker33b43f12013-08-20 11:48:36 +020031/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +000032
Paul Bakker33b43f12013-08-20 11:48:36 +020033/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +010034void aes_decrypt_ecb(data_t *key_str, data_t *src_str,
35 data_t *dst, int setkey_result)
Paul Bakker367dae42009-06-28 21:50:27 +000036{
Paul Bakker367dae42009-06-28 21:50:27 +000037 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020038 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000039
Paul Bakker367dae42009-06-28 21:50:27 +000040 memset(output, 0x00, 100);
41
Gilles Peskine449bd832023-01-11 14:50:10 +010042 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000043
Gilles Peskine449bd832023-01-11 14:50:10 +010044 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == setkey_result);
45 if (setkey_result == 0) {
46 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +000047
Gilles Peskine449bd832023-01-11 14:50:10 +010048 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker2b222c82009-07-27 21:03:45 +000049 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020050
Paul Bakkerbd51b262014-07-10 15:26:12 +020051exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010052 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000053}
Paul Bakker33b43f12013-08-20 11:48:36 +020054/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +000055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +010057void aes_encrypt_cbc(data_t *key_str, data_t *iv_str,
58 data_t *src_str, data_t *dst,
59 int cbc_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 Peskine449bd832023-01-11 14:50:10 +010066 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000067
Gilles Peskine449bd832023-01-11 14:50:10 +010068 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
69 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
70 src_str->x, output) == cbc_result);
71 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +000072
Gilles Peskine449bd832023-01-11 14:50:10 +010073 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
74 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +000075 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +020076
Paul Bakkerbd51b262014-07-10 15:26:12 +020077exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010078 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000079}
Paul Bakker33b43f12013-08-20 11:48:36 +020080/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +000081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020082/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine449bd832023-01-11 14:50:10 +010083void aes_decrypt_cbc(data_t *key_str, data_t *iv_str,
84 data_t *src_str, data_t *dst,
85 int cbc_result)
Paul Bakker367dae42009-06-28 21:50:27 +000086{
Paul Bakker367dae42009-06-28 21:50:27 +000087 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020088 mbedtls_aes_context ctx;
Paul Bakker367dae42009-06-28 21:50:27 +000089
Paul Bakker367dae42009-06-28 21:50:27 +000090 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +010091 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +000092
Gilles Peskine449bd832023-01-11 14:50:10 +010093 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx, key_str->x, key_str->len * 8) == 0);
94 TEST_ASSERT(mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
95 src_str->x, output) == cbc_result);
96 if (cbc_result == 0) {
Paul Bakker367dae42009-06-28 21:50:27 +000097
Gilles Peskine449bd832023-01-11 14:50:10 +010098 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
99 src_str->len, dst->len) == 0);
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000100 }
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200101
Paul Bakkerbd51b262014-07-10 15:26:12 +0200102exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100103 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000104}
Paul Bakker33b43f12013-08-20 11:48:36 +0200105/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000106
Aorimn5f778012016-06-09 23:22:58 +0200107/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100108void aes_encrypt_xts(char *hex_key_string, char *hex_data_unit_string,
109 char *hex_src_string, char *hex_dst_string)
Aorimn5f778012016-06-09 23:22:58 +0200110{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100111 enum { AES_BLOCK_SIZE = 16 };
112 unsigned char *data_unit = NULL;
113 unsigned char *key = NULL;
114 unsigned char *src = NULL;
115 unsigned char *dst = NULL;
116 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100117 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100118 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200119
Gilles Peskine449bd832023-01-11 14:50:10 +0100120 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200121
Gilles Peskine449bd832023-01-11 14:50:10 +0100122 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
123 &data_unit_len);
124 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200125
Gilles Peskine449bd832023-01-11 14:50:10 +0100126 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
127 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200128
Gilles Peskine449bd832023-01-11 14:50:10 +0100129 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
130 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
131 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200132
Gilles Peskine449bd832023-01-11 14:50:10 +0100133 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100134
Gilles Peskine449bd832023-01-11 14:50:10 +0100135 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == 0);
136 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, src_len,
137 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100138
Gilles Peskine449bd832023-01-11 14:50:10 +0100139 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200140
141exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100142 mbedtls_aes_xts_free(&ctx);
143 mbedtls_free(data_unit);
144 mbedtls_free(key);
145 mbedtls_free(src);
146 mbedtls_free(dst);
147 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200148}
149/* END_CASE */
150
151/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100152void aes_decrypt_xts(char *hex_key_string, char *hex_data_unit_string,
153 char *hex_dst_string, char *hex_src_string)
Aorimn5f778012016-06-09 23:22:58 +0200154{
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100155 enum { AES_BLOCK_SIZE = 16 };
156 unsigned char *data_unit = NULL;
157 unsigned char *key = NULL;
158 unsigned char *src = NULL;
159 unsigned char *dst = NULL;
160 unsigned char *output = NULL;
Jaeden Amero9366feb2018-05-29 18:55:17 +0100161 mbedtls_aes_xts_context ctx;
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100162 size_t key_len, src_len, dst_len, data_unit_len;
Aorimn5f778012016-06-09 23:22:58 +0200163
Gilles Peskine449bd832023-01-11 14:50:10 +0100164 mbedtls_aes_xts_init(&ctx);
Aorimn5f778012016-06-09 23:22:58 +0200165
Gilles Peskine449bd832023-01-11 14:50:10 +0100166 data_unit = mbedtls_test_unhexify_alloc(hex_data_unit_string,
167 &data_unit_len);
168 TEST_ASSERT(data_unit_len == AES_BLOCK_SIZE);
Aorimn5f778012016-06-09 23:22:58 +0200169
Gilles Peskine449bd832023-01-11 14:50:10 +0100170 key = mbedtls_test_unhexify_alloc(hex_key_string, &key_len);
171 TEST_ASSERT(key_len % 2 == 0);
Aorimn5f778012016-06-09 23:22:58 +0200172
Gilles Peskine449bd832023-01-11 14:50:10 +0100173 src = mbedtls_test_unhexify_alloc(hex_src_string, &src_len);
174 dst = mbedtls_test_unhexify_alloc(hex_dst_string, &dst_len);
175 TEST_ASSERT(src_len == dst_len);
Aorimn5f778012016-06-09 23:22:58 +0200176
Gilles Peskine449bd832023-01-11 14:50:10 +0100177 output = mbedtls_test_zero_alloc(dst_len);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100178
Gilles Peskine449bd832023-01-11 14:50:10 +0100179 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == 0);
180 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_DECRYPT, src_len,
181 data_unit, src, output) == 0);
Jaeden Ameroe5c4b072018-04-28 17:26:25 +0100182
Gilles Peskine449bd832023-01-11 14:50:10 +0100183 TEST_ASSERT(memcmp(output, dst, dst_len) == 0);
Aorimn5f778012016-06-09 23:22:58 +0200184
185exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100186 mbedtls_aes_xts_free(&ctx);
187 mbedtls_free(data_unit);
188 mbedtls_free(key);
189 mbedtls_free(src);
190 mbedtls_free(dst);
191 mbedtls_free(output);
Aorimn5f778012016-06-09 23:22:58 +0200192}
193/* END_CASE */
194
Jaeden Amero425382d2018-04-28 17:26:25 +0100195/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100196void aes_crypt_xts_size(int size, int retval)
Jaeden Amero425382d2018-04-28 17:26:25 +0100197{
198 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500199 const unsigned char src[16] = { 0 };
200 unsigned char output[16];
Jaeden Amero425382d2018-04-28 17:26:25 +0100201 unsigned char data_unit[16];
202 size_t length = size;
203
Gilles Peskine449bd832023-01-11 14:50:10 +0100204 mbedtls_aes_xts_init(&ctx);
205 memset(data_unit, 0x00, sizeof(data_unit));
Jaeden Amero425382d2018-04-28 17:26:25 +0100206
Gilles Peskine449bd832023-01-11 14:50:10 +0100207 TEST_ASSERT(mbedtls_aes_crypt_xts(&ctx, MBEDTLS_AES_ENCRYPT, length, data_unit, src,
208 output) == retval);
JoeSubbiani57face22021-06-17 15:00:01 +0100209exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100210 mbedtls_aes_xts_free(&ctx);
Jaeden Amero425382d2018-04-28 17:26:25 +0100211}
212/* END_CASE */
213
Jaeden Amero142383e2018-05-31 10:40:34 +0100214/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_XTS */
Gilles Peskine449bd832023-01-11 14:50:10 +0100215void aes_crypt_xts_keysize(int size, int retval)
Jaeden Amero142383e2018-05-31 10:40:34 +0100216{
217 mbedtls_aes_xts_context ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500218 const unsigned char key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Jaeden Amero142383e2018-05-31 10:40:34 +0100219 size_t key_len = size;
220
Gilles Peskine449bd832023-01-11 14:50:10 +0100221 mbedtls_aes_xts_init(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100222
Gilles Peskine449bd832023-01-11 14:50:10 +0100223 TEST_ASSERT(mbedtls_aes_xts_setkey_enc(&ctx, key, key_len * 8) == retval);
224 TEST_ASSERT(mbedtls_aes_xts_setkey_dec(&ctx, key, key_len * 8) == retval);
Jaeden Amero142383e2018-05-31 10:40:34 +0100225exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100226 mbedtls_aes_xts_free(&ctx);
Jaeden Amero142383e2018-05-31 10:40:34 +0100227}
228/* END_CASE */
Jaeden Amero425382d2018-04-28 17:26:25 +0100229
230
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200231/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100232void aes_encrypt_cfb128(data_t *key_str, data_t *iv_str,
233 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000234{
Paul Bakker367dae42009-06-28 21:50:27 +0000235 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000237 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000238
Paul Bakker367dae42009-06-28 21:50:27 +0000239 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100240 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000241
Paul Bakker367dae42009-06-28 21:50:27 +0000242
Gilles Peskine449bd832023-01-11 14:50:10 +0100243 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
244 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_ENCRYPT, 16, &iv_offset, iv_str->x,
245 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000246
Gilles Peskine449bd832023-01-11 14:50:10 +0100247 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200248
Paul Bakkerbd51b262014-07-10 15:26:12 +0200249exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100250 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000251}
Paul Bakker33b43f12013-08-20 11:48:36 +0200252/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200254/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100255void aes_decrypt_cfb128(data_t *key_str, data_t *iv_str,
256 data_t *src_str, data_t *dst)
Paul Bakker367dae42009-06-28 21:50:27 +0000257{
Paul Bakker367dae42009-06-28 21:50:27 +0000258 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 mbedtls_aes_context ctx;
Paul Bakkercd43a0b2011-06-09 13:55:44 +0000260 size_t iv_offset = 0;
Paul Bakker367dae42009-06-28 21:50:27 +0000261
Paul Bakker367dae42009-06-28 21:50:27 +0000262 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100263 mbedtls_aes_init(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000264
Paul Bakker367dae42009-06-28 21:50:27 +0000265
Gilles Peskine449bd832023-01-11 14:50:10 +0100266 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
267 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&ctx, MBEDTLS_AES_DECRYPT, 16, &iv_offset, iv_str->x,
268 src_str->x, output) == 0);
Paul Bakker367dae42009-06-28 21:50:27 +0000269
Gilles Peskine449bd832023-01-11 14:50:10 +0100270 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x, 16, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200271
Paul Bakkerbd51b262014-07-10 15:26:12 +0200272exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100273 mbedtls_aes_free(&ctx);
Paul Bakker367dae42009-06-28 21:50:27 +0000274}
Paul Bakker33b43f12013-08-20 11:48:36 +0200275/* END_CASE */
Paul Bakker367dae42009-06-28 21:50:27 +0000276
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200277/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100278void aes_encrypt_cfb8(data_t *key_str, data_t *iv_str,
279 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100280{
Paul Bakker556efba2014-01-24 15:38:12 +0100281 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100283
Paul Bakker556efba2014-01-24 15:38:12 +0100284 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100285 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100286
Paul Bakker556efba2014-01-24 15:38:12 +0100287
Gilles Peskine449bd832023-01-11 14:50:10 +0100288 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
289 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_ENCRYPT, src_str->len, iv_str->x,
290 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100291
Gilles Peskine449bd832023-01-11 14:50:10 +0100292 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
293 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200294
Paul Bakkerbd51b262014-07-10 15:26:12 +0200295exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100296 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100297}
298/* END_CASE */
299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100301void aes_decrypt_cfb8(data_t *key_str, data_t *iv_str,
302 data_t *src_str, data_t *dst)
Paul Bakker556efba2014-01-24 15:38:12 +0100303{
Paul Bakker556efba2014-01-24 15:38:12 +0100304 unsigned char output[100];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200305 mbedtls_aes_context ctx;
Paul Bakker556efba2014-01-24 15:38:12 +0100306
Paul Bakker556efba2014-01-24 15:38:12 +0100307 memset(output, 0x00, 100);
Gilles Peskine449bd832023-01-11 14:50:10 +0100308 mbedtls_aes_init(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100309
Paul Bakker556efba2014-01-24 15:38:12 +0100310
Gilles Peskine449bd832023-01-11 14:50:10 +0100311 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x, key_str->len * 8) == 0);
312 TEST_ASSERT(mbedtls_aes_crypt_cfb8(&ctx, MBEDTLS_AES_DECRYPT, src_str->len, iv_str->x,
313 src_str->x, output) == 0);
Paul Bakker556efba2014-01-24 15:38:12 +0100314
Gilles Peskine449bd832023-01-11 14:50:10 +0100315 TEST_ASSERT(mbedtls_test_hexcmp(output, dst->x,
316 src_str->len, dst->len) == 0);
Paul Bakker8cfd9d82014-06-18 11:16:11 +0200317
Paul Bakkerbd51b262014-07-10 15:26:12 +0200318exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100319 mbedtls_aes_free(&ctx);
Paul Bakker556efba2014-01-24 15:38:12 +0100320}
321/* END_CASE */
322
Simon Butcher03018842018-04-22 22:57:58 +0100323/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_OFB */
Gilles Peskine449bd832023-01-11 14:50:10 +0100324void aes_encrypt_ofb(int fragment_size, data_t *key_str,
325 data_t *iv_str, data_t *src_str,
326 data_t *expected_output)
Simon Butcher03018842018-04-22 22:57:58 +0100327{
Simon Butchere416bf92018-06-02 18:28:32 +0100328 unsigned char output[32];
Simon Butcher03018842018-04-22 22:57:58 +0100329 mbedtls_aes_context ctx;
330 size_t iv_offset = 0;
331 int in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100332 unsigned char *src_str_next;
Simon Butcher03018842018-04-22 22:57:58 +0100333
Gilles Peskine449bd832023-01-11 14:50:10 +0100334 memset(output, 0x00, sizeof(output));
335 mbedtls_aes_init(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100336
Gilles Peskine449bd832023-01-11 14:50:10 +0100337 TEST_ASSERT((size_t) fragment_size < sizeof(output));
Simon Butchere416bf92018-06-02 18:28:32 +0100338
Gilles Peskine449bd832023-01-11 14:50:10 +0100339 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx, key_str->x,
340 key_str->len * 8) == 0);
Ronald Cron9ed40732020-06-25 09:03:34 +0200341 in_buffer_len = src_str->len;
342 src_str_next = src_str->x;
Simon Butcher03018842018-04-22 22:57:58 +0100343
Gilles Peskine449bd832023-01-11 14:50:10 +0100344 while (in_buffer_len > 0) {
345 TEST_ASSERT(mbedtls_aes_crypt_ofb(&ctx, fragment_size, &iv_offset,
346 iv_str->x, src_str_next, output) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100347
Gilles Peskine449bd832023-01-11 14:50:10 +0100348 TEST_ASSERT(memcmp(output, expected_output->x, fragment_size) == 0);
Simon Butcher03018842018-04-22 22:57:58 +0100349
350 in_buffer_len -= fragment_size;
Ronald Cron55d97f22020-06-26 17:00:30 +0200351 expected_output->x += fragment_size;
Simon Butcher03018842018-04-22 22:57:58 +0100352 src_str_next += fragment_size;
353
Gilles Peskine449bd832023-01-11 14:50:10 +0100354 if (in_buffer_len < fragment_size) {
Simon Butcher03018842018-04-22 22:57:58 +0100355 fragment_size = in_buffer_len;
Gilles Peskine449bd832023-01-11 14:50:10 +0100356 }
Simon Butcher03018842018-04-22 22:57:58 +0100357 }
358
359exit:
Gilles Peskine449bd832023-01-11 14:50:10 +0100360 mbedtls_aes_free(&ctx);
Simon Butcher03018842018-04-22 22:57:58 +0100361}
362/* END_CASE */
363
Tuvshinzaya Erdenekhuuc855bf52022-07-29 14:43:51 +0100364/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100365void aes_invalid_mode()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500366{
367 mbedtls_aes_context aes_ctx;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500368 const unsigned char in[16] = { 0 };
369 unsigned char out[16];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500370 const int invalid_mode = 42;
371
Gilles Peskine449bd832023-01-11 14:50:10 +0100372 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
373 mbedtls_aes_crypt_ecb(&aes_ctx, invalid_mode, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500374
375#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100376 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
377 mbedtls_aes_crypt_cbc(&aes_ctx, invalid_mode, 16,
378 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500379#endif /* MBEDTLS_CIPHER_MODE_CBC */
380
381#if defined(MBEDTLS_CIPHER_MODE_XTS)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200382 mbedtls_aes_xts_context xts_ctx;
383
Gilles Peskine449bd832023-01-11 14:50:10 +0100384 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
385 mbedtls_aes_crypt_xts(&xts_ctx, invalid_mode, 16,
386 in, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500387#endif /* MBEDTLS_CIPHER_MODE_XTS */
388
389#if defined(MBEDTLS_CIPHER_MODE_CFB)
Ronald Cron875b5fb2021-05-21 08:50:00 +0200390 size_t size;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500391
Gilles Peskine449bd832023-01-11 14:50:10 +0100392 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
393 mbedtls_aes_crypt_cfb128(&aes_ctx, invalid_mode, 16,
394 &size, out, in, out));
395 TEST_EQUAL(MBEDTLS_ERR_AES_BAD_INPUT_DATA,
396 mbedtls_aes_crypt_cfb8(&aes_ctx, invalid_mode, 16,
397 out, in, out));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500398#endif /* MBEDTLS_CIPHER_MODE_CFB */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500399}
400/* END_CASE */
401
402/* BEGIN_CASE */
Gilles Peskine449bd832023-01-11 14:50:10 +0100403void aes_misc_params()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500404{
405#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
406 defined(MBEDTLS_CIPHER_MODE_XTS) || \
407 defined(MBEDTLS_CIPHER_MODE_CFB) || \
408 defined(MBEDTLS_CIPHER_MODE_OFB)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500409 const unsigned char in[16] = { 0 };
410 unsigned char out[16];
411#endif
Andrzej Kurek252283f2022-09-27 07:54:16 -0400412#if defined(MBEDTLS_CIPHER_MODE_CBC) || \
413 defined(MBEDTLS_CIPHER_MODE_CFB) || \
414 defined(MBEDTLS_CIPHER_MODE_OFB)
Gilles Peskine449bd832023-01-11 14:50:10 +0100415 mbedtls_aes_context aes_ctx;
Andrzej Kurek252283f2022-09-27 07:54:16 -0400416#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500417#if defined(MBEDTLS_CIPHER_MODE_XTS)
418 mbedtls_aes_xts_context xts_ctx;
419#endif
420#if defined(MBEDTLS_CIPHER_MODE_CFB) || \
421 defined(MBEDTLS_CIPHER_MODE_OFB)
422 size_t size;
423#endif
424
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500425#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine449bd832023-01-11 14:50:10 +0100426 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
427 15,
428 out, in, out)
429 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
430 TEST_ASSERT(mbedtls_aes_crypt_cbc(&aes_ctx, MBEDTLS_AES_ENCRYPT,
431 17,
432 out, in, out)
433 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500434#endif
435
436#if defined(MBEDTLS_CIPHER_MODE_XTS)
Gilles Peskine449bd832023-01-11 14:50:10 +0100437 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
438 15,
439 in, in, out)
440 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
441 TEST_ASSERT(mbedtls_aes_crypt_xts(&xts_ctx, MBEDTLS_AES_ENCRYPT,
442 (1 << 24) + 1,
443 in, in, out)
444 == MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500445#endif
446
447#if defined(MBEDTLS_CIPHER_MODE_CFB)
448 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100449 TEST_ASSERT(mbedtls_aes_crypt_cfb128(&aes_ctx, MBEDTLS_AES_ENCRYPT, 16,
450 &size, out, in, out)
451 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500452#endif
453
454#if defined(MBEDTLS_CIPHER_MODE_OFB)
455 size = 16;
Gilles Peskine449bd832023-01-11 14:50:10 +0100456 TEST_ASSERT(mbedtls_aes_crypt_ofb(&aes_ctx, 16, &size, out, in, out)
457 == MBEDTLS_ERR_AES_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500458#endif
TRodziewicz358e5882021-05-28 12:58:46 +0200459
460/*
461 * The following line needs to be added to make the code compilable
462 * when all the conditions above will be not define in a specific
463 * choice of features.
464 */
Gilles Peskine449bd832023-01-11 14:50:10 +0100465 TEST_ASSERT(1);
TRodziewicz358e5882021-05-28 12:58:46 +0200466/* TODO: It will be removed when the whole test will be reworked */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500467}
468/* END_CASE */
469
Werner Lewisdd76ef32022-05-30 12:00:21 +0100470/* BEGIN_CASE */
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100471void aes_ecb_copy_context(data_t *key, data_t *src)
Werner Lewisdd76ef32022-05-30 12:00:21 +0100472{
473 unsigned char output1[16], output2[16], plain[16];
Werner Lewisec0193d2022-06-13 12:28:25 +0100474 mbedtls_aes_context ctx1, ctx2, ctx3;
Werner Lewisdd76ef32022-05-30 12:00:21 +0100475
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100476 TEST_EQUAL(src->len, 16);
477
Werner Lewisdd76ef32022-05-30 12:00:21 +0100478 // Set key and encrypt with original context
Gilles Peskine449bd832023-01-11 14:50:10 +0100479 mbedtls_aes_init(&ctx1);
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100480 TEST_ASSERT(mbedtls_aes_setkey_enc(&ctx1, key->x,
481 key->len * 8) == 0);
Gilles Peskine449bd832023-01-11 14:50:10 +0100482 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx1, MBEDTLS_AES_ENCRYPT,
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100483 src->x, output1) == 0);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100484 ctx2 = ctx1;
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100485
486 // Set key for decryption with original context
487 TEST_ASSERT(mbedtls_aes_setkey_dec(&ctx1, key->x,
488 key->len * 8) == 0);
Werner Lewisec0193d2022-06-13 12:28:25 +0100489 ctx3 = ctx1;
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100490
491 // Wipe the original context to make sure nothing from it is used
Gilles Peskine449bd832023-01-11 14:50:10 +0100492 memset(&ctx1, 0, sizeof(ctx1));
Werner Lewisdd76ef32022-05-30 12:00:21 +0100493
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100494 // Encrypt with copied context
Gilles Peskine449bd832023-01-11 14:50:10 +0100495 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx2, MBEDTLS_AES_ENCRYPT,
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100496 src->x, output2) == 0);
497 ASSERT_COMPARE(output1, 16, output2, 16);
498
499 // Decrypt with copied context
Gilles Peskine449bd832023-01-11 14:50:10 +0100500 TEST_ASSERT(mbedtls_aes_crypt_ecb(&ctx3, MBEDTLS_AES_DECRYPT,
501 output1, plain) == 0);
Gilles Peskined50cfdd2023-03-16 14:25:58 +0100502 ASSERT_COMPARE(src->x, 16, plain, 16);
Werner Lewisdd76ef32022-05-30 12:00:21 +0100503}
504/* END_CASE */
505
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200506/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Gilles Peskine449bd832023-01-11 14:50:10 +0100507void aes_selftest()
Paul Bakker3d360822009-07-05 11:29:38 +0000508{
Gilles Peskine449bd832023-01-11 14:50:10 +0100509 TEST_ASSERT(mbedtls_aes_self_test(1) == 0);
Paul Bakker3d360822009-07-05 11:29:38 +0000510}
Paul Bakker33b43f12013-08-20 11:48:36 +0200511/* END_CASE */