blob: ad5c172de048ae4e35deaa7bfb772ce0a78879d0 [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/cipher.h"
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +02003
k-stachowiakd8727232019-07-29 17:46:29 +02004#if defined(MBEDTLS_AES_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02005# include "mbedtls/aes.h"
k-stachowiakd8727232019-07-29 17:46:29 +02006#endif
7
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008#if defined(MBEDTLS_GCM_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02009# include "mbedtls/gcm.h"
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +020010#endif
Gilles Peskine5386f6b2019-08-01 12:47:40 +020011
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +010012#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020013# define MBEDTLS_CIPHER_AUTH_CRYPT
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +010014#endif
15
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010016#if defined(MBEDTLS_CIPHER_AUTH_CRYPT)
17/* Helper for resetting key/direction
18 *
19 * The documentation doesn't explicitly say whether calling
20 * mbedtls_cipher_setkey() twice is allowed or not. This currently works with
21 * the default software implementation, but only by accident. It isn't
22 * guaranteed to work with new ciphers or with alternative implementations of
23 * individual ciphers, and it doesn't work with the PSA wrappers. So don't do
24 * it, and instead start with a fresh context.
25 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020026static int cipher_reset_key(mbedtls_cipher_context_t *ctx,
27 int cipher_id,
28 int use_psa,
29 size_t tag_len,
30 const data_t *key,
31 int direction)
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010032{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020033 mbedtls_cipher_free(ctx);
34 mbedtls_cipher_init(ctx);
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010035
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020036# if !defined(MBEDTLS_USE_PSA_CRYPTO)
37 (void)use_psa;
38 (void)tag_len;
39# else
40 if (use_psa == 1) {
41 TEST_ASSERT(
42 0 == mbedtls_cipher_setup_psa(
43 ctx, mbedtls_cipher_info_from_type(cipher_id), tag_len));
44 } else
45# endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010046 {
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020047 TEST_ASSERT(0 == mbedtls_cipher_setup(
48 ctx, mbedtls_cipher_info_from_type(cipher_id)));
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010049 }
50
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020051 TEST_ASSERT(0 ==
52 mbedtls_cipher_setkey(ctx, key->x, 8 * key->len, direction));
53 return 1;
Gilles Peskine8a3d2342020-12-03 21:06:15 +010054
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010055exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020056 return 0;
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010057}
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010058
59/*
60 * Check if a buffer is all-0 bytes:
61 * return 1 if it is,
62 * 0 if it isn't.
63 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020064int buffer_is_all_zero(const uint8_t *buf, size_t size)
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010065{
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020066 for (size_t i = 0; i < size; i++)
67 if (buf[i] != 0)
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010068 return 0;
69 return 1;
70}
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010071#endif /* MBEDTLS_CIPHER_AUTH_CRYPT */
72
Paul Bakker33b43f12013-08-20 11:48:36 +020073/* END_HEADER */
Paul Bakker8123e9d2011-01-06 15:37:30 +000074
Paul Bakker33b43f12013-08-20 11:48:36 +020075/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076 * depends_on:MBEDTLS_CIPHER_C
Paul Bakker33b43f12013-08-20 11:48:36 +020077 * END_DEPENDENCIES
78 */
Paul Bakker5690efc2011-05-26 13:16:06 +000079
Paul Bakker33b43f12013-08-20 11:48:36 +020080/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020081void mbedtls_cipher_list()
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010082{
83 const int *cipher_type;
84
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020085 for (cipher_type = mbedtls_cipher_list(); *cipher_type != 0; cipher_type++)
86 TEST_ASSERT(mbedtls_cipher_info_from_type(*cipher_type) != NULL);
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010087}
88/* END_CASE */
89
90/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +020091void cipher_invalid_param_unconditional()
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020092{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050093 mbedtls_cipher_context_t valid_ctx;
94 mbedtls_cipher_context_t invalid_ctx;
95 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
96 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
97 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
98 int valid_size = sizeof(valid_buffer);
99 int valid_bitlen = valid_size * 8;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200100 const mbedtls_cipher_info_t *valid_info =
101 mbedtls_cipher_info_from_type(*(mbedtls_cipher_list()));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500102 size_t size_t_var;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200103
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500104 (void)valid_mode; /* In some configurations this is unused */
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200105
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200106 mbedtls_cipher_init(&valid_ctx);
107 mbedtls_cipher_setup(&valid_ctx, valid_info);
108 mbedtls_cipher_init(&invalid_ctx);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200109
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500110 /* mbedtls_cipher_setup() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200111 TEST_ASSERT(mbedtls_cipher_setup(&valid_ctx, NULL) ==
112 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200113
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500114 /* mbedtls_cipher_get_block_size() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200115 TEST_ASSERT(mbedtls_cipher_get_block_size(&invalid_ctx) == 0);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200116
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500117 /* mbedtls_cipher_get_cipher_mode() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200118 TEST_ASSERT(mbedtls_cipher_get_cipher_mode(&invalid_ctx) ==
119 MBEDTLS_MODE_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200120
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500121 /* mbedtls_cipher_get_iv_size() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200122 TEST_ASSERT(mbedtls_cipher_get_iv_size(&invalid_ctx) == 0);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200123
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500124 /* mbedtls_cipher_get_type() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200125 TEST_ASSERT(mbedtls_cipher_get_type(&invalid_ctx) == MBEDTLS_CIPHER_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200126
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500127 /* mbedtls_cipher_get_name() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200128 TEST_ASSERT(mbedtls_cipher_get_name(&invalid_ctx) == 0);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200129
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500130 /* mbedtls_cipher_get_key_bitlen() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200131 TEST_ASSERT(mbedtls_cipher_get_key_bitlen(&invalid_ctx) ==
132 MBEDTLS_KEY_LENGTH_NONE);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500133
134 /* mbedtls_cipher_get_operation() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200135 TEST_ASSERT(mbedtls_cipher_get_operation(&invalid_ctx) ==
136 MBEDTLS_OPERATION_NONE);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500137
138 /* mbedtls_cipher_setkey() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200139 TEST_ASSERT(mbedtls_cipher_setkey(&invalid_ctx, valid_buffer, valid_bitlen,
140 valid_operation) ==
141 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500142
143 /* mbedtls_cipher_set_iv() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200144 TEST_ASSERT(mbedtls_cipher_set_iv(&invalid_ctx, valid_buffer, valid_size) ==
145 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500146
147 /* mbedtls_cipher_reset() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200148 TEST_ASSERT(mbedtls_cipher_reset(&invalid_ctx) ==
149 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200150
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200151#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500152 /* mbedtls_cipher_update_ad() */
153 TEST_ASSERT(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200154 mbedtls_cipher_update_ad(&invalid_ctx, valid_buffer, valid_size) ==
155 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500156#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
157
158#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
159 /* mbedtls_cipher_set_padding_mode() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200160 TEST_ASSERT(mbedtls_cipher_set_padding_mode(&invalid_ctx, valid_mode) ==
161 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200162#endif
163
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500164 /* mbedtls_cipher_update() */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200165 TEST_ASSERT(mbedtls_cipher_update(&invalid_ctx, valid_buffer, valid_size,
166 valid_buffer, &size_t_var) ==
167 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200168
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500169 /* mbedtls_cipher_finish() */
170 TEST_ASSERT(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200171 mbedtls_cipher_finish(&invalid_ctx, valid_buffer, &size_t_var) ==
172 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200173
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200174#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500175 /* mbedtls_cipher_write_tag() */
176 TEST_ASSERT(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200177 mbedtls_cipher_write_tag(&invalid_ctx, valid_buffer, valid_size) ==
178 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200179
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500180 /* mbedtls_cipher_check_tag() */
181 TEST_ASSERT(
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200182 mbedtls_cipher_check_tag(&invalid_ctx, valid_buffer, valid_size) ==
183 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500184#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
185
186exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200187 mbedtls_cipher_free(&invalid_ctx);
188 mbedtls_cipher_free(&valid_ctx);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500189}
190/* END_CASE */
191
TRodziewicz062f3532021-05-25 15:15:57 +0200192/* BEGIN_CASE depends_on:NOT_DEFINED */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200193void cipher_invalid_param_conditional()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500194{
195 mbedtls_cipher_context_t valid_ctx;
196
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500197 mbedtls_operation_t invalid_operation = 100;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500198 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
199 int valid_size = sizeof(valid_buffer);
200 int valid_bitlen = valid_size * 8;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200201 const mbedtls_cipher_info_t *valid_info =
202 mbedtls_cipher_info_from_type(*(mbedtls_cipher_list()));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500203
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200204 TEST_EQUAL(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
205 mbedtls_cipher_setkey(&valid_ctx, valid_buffer, valid_bitlen,
206 invalid_operation));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500207
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200208exit:;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200209}
210/* END_CASE */
211
Paul Bakker6a9c7252016-07-14 13:46:10 +0100212/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200213void cipher_special_behaviours()
Paul Bakker6a9c7252016-07-14 13:46:10 +0100214{
215 const mbedtls_cipher_info_t *cipher_info;
216 mbedtls_cipher_context_t ctx;
217 unsigned char input[32];
218 unsigned char output[32];
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200219#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100220 unsigned char iv[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300221#endif
Paul Bakker6a9c7252016-07-14 13:46:10 +0100222 size_t olen = 0;
223
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200224 mbedtls_cipher_init(&ctx);
225 memset(input, 0, sizeof(input));
226 memset(output, 0, sizeof(output));
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300227#if defined(MBEDTLS_CIPHER_MODE_CBC)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200228 memset(iv, 0, sizeof(iv));
Paul Bakker6a9c7252016-07-14 13:46:10 +0100229
230 /* Check and get info structures */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200231 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CBC);
232 TEST_ASSERT(NULL != cipher_info);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100233
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200234 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
Paul Bakker6a9c7252016-07-14 13:46:10 +0100235
236 /* IV too big */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200237 TEST_ASSERT(mbedtls_cipher_set_iv(&ctx, iv, MBEDTLS_MAX_IV_LENGTH + 1) ==
238 MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100239
240 /* IV too small */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200241 TEST_ASSERT(mbedtls_cipher_set_iv(&ctx, iv, 0) ==
242 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100243
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200244 mbedtls_cipher_free(&ctx);
245 mbedtls_cipher_init(&ctx);
Ron Eldor6f90ed82017-09-26 12:08:54 +0300246#endif /* MBEDTLS_CIPHER_MODE_CBC */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200247 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB);
248 TEST_ASSERT(NULL != cipher_info);
Ron Eldor7b012442017-09-25 17:03:12 +0300249
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200250 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
Ron Eldor7b012442017-09-25 17:03:12 +0300251
Paul Bakker6a9c7252016-07-14 13:46:10 +0100252 /* Update ECB with partial block */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200253 TEST_ASSERT(mbedtls_cipher_update(&ctx, input, 1, output, &olen) ==
254 MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100255
256exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200257 mbedtls_cipher_free(&ctx);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100258}
259/* END_CASE */
260
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200261/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200262void enc_dec_buf(int cipher_id,
263 char *cipher_string,
264 int key_len,
265 int length_val,
266 int pad_mode)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200267{
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200268 size_t length = length_val, outlen, total_len, i, block_size;
Jaeden Amerod906b812018-06-08 11:03:16 +0100269 unsigned char key[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000270 unsigned char iv[16];
Manuel Pégourié-Gonnard9241be72013-08-31 17:31:03 +0200271 unsigned char ad[13];
272 unsigned char tag[16];
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200273 unsigned char inbuf[64];
274 unsigned char encbuf[64];
275 unsigned char decbuf[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000276
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200277 const mbedtls_cipher_info_t *cipher_info;
278 mbedtls_cipher_context_t ctx_dec;
279 mbedtls_cipher_context_t ctx_enc;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000280
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200281 /*
282 * Prepare contexts
283 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200284 mbedtls_cipher_init(&ctx_dec);
285 mbedtls_cipher_init(&ctx_enc);
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200286
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200287 memset(key, 0x2a, sizeof(key));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000288
289 /* Check and get info structures */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200290 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
291 TEST_ASSERT(NULL != cipher_info);
292 TEST_ASSERT(mbedtls_cipher_info_from_string(cipher_string) == cipher_info);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000293
294 /* Initialise enc and dec contexts */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200295 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
296 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_enc, cipher_info));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200297
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200298 TEST_ASSERT(0 ==
299 mbedtls_cipher_setkey(&ctx_dec, key, key_len, MBEDTLS_DECRYPT));
300 TEST_ASSERT(0 ==
301 mbedtls_cipher_setkey(&ctx_enc, key, key_len, MBEDTLS_ENCRYPT));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000302
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200304 if (-1 != pad_mode) {
305 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_dec, pad_mode));
306 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_enc, pad_mode));
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200307 }
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200308#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200309 (void)pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200310#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200311
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200312 /*
313 * Do a few encode/decode cycles
314 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200315 for (i = 0; i < 3; i++) {
316 memset(iv, 0x00 + i, sizeof(iv));
317 memset(ad, 0x10 + i, sizeof(ad));
318 memset(inbuf, 0x20 + i, sizeof(inbuf));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200319
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200320 memset(encbuf, 0, sizeof(encbuf));
321 memset(decbuf, 0, sizeof(decbuf));
322 memset(tag, 0, sizeof(tag));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200323
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200324 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_dec, iv, sizeof(iv)));
325 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_enc, iv, sizeof(iv)));
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200326
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200327 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_dec));
328 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_enc));
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200329
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200330#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200331 TEST_ASSERT(0 ==
332 mbedtls_cipher_update_ad(&ctx_dec, ad, sizeof(ad) - i));
333 TEST_ASSERT(0 ==
334 mbedtls_cipher_update_ad(&ctx_enc, ad, sizeof(ad) - i));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200335#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000336
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200337 block_size = mbedtls_cipher_get_block_size(&ctx_enc);
338 TEST_ASSERT(block_size != 0);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200339
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200340 /* encode length number of bytes from inbuf */
341 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_enc, inbuf, length, encbuf,
342 &outlen));
343 total_len = outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200344
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200345 TEST_ASSERT(total_len == length ||
346 (total_len % block_size == 0 && total_len < length &&
347 total_len + block_size > length));
Paul Bakker343a8702011-06-09 14:27:58 +0000348
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200349 TEST_ASSERT(0 ==
350 mbedtls_cipher_finish(&ctx_enc, encbuf + outlen, &outlen));
351 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000352
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200353#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200354 TEST_ASSERT(0 == mbedtls_cipher_write_tag(&ctx_enc, tag, sizeof(tag)));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200355#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200356
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200357 TEST_ASSERT(total_len == length ||
358 (total_len % block_size == 0 && total_len > length &&
359 total_len <= length + block_size));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000360
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200361 /* decode the previously encoded string */
362 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_dec, encbuf, total_len,
363 decbuf, &outlen));
364 total_len = outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200365
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200366 TEST_ASSERT(total_len == length ||
367 (total_len % block_size == 0 && total_len < length &&
368 total_len + block_size >= length));
Paul Bakker343a8702011-06-09 14:27:58 +0000369
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200370 TEST_ASSERT(0 ==
371 mbedtls_cipher_finish(&ctx_dec, decbuf + outlen, &outlen));
372 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000373
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200374#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200375 TEST_ASSERT(0 == mbedtls_cipher_check_tag(&ctx_dec, tag, sizeof(tag)));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200376#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200377
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200378 /* check result */
379 TEST_ASSERT(total_len == length);
380 TEST_ASSERT(0 == memcmp(inbuf, decbuf, length));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200381 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000382
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200383 /*
384 * Done
385 */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200386exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200387 mbedtls_cipher_free(&ctx_dec);
388 mbedtls_cipher_free(&ctx_enc);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200389}
Paul Bakker33b43f12013-08-20 11:48:36 +0200390/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000391
Paul Bakker33b43f12013-08-20 11:48:36 +0200392/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200393void enc_fail(int cipher_id, int pad_mode, int key_len, int length_val, int ret)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200394{
Paul Bakker33b43f12013-08-20 11:48:36 +0200395 size_t length = length_val;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200396 unsigned char key[32];
397 unsigned char iv[16];
398
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200399 const mbedtls_cipher_info_t *cipher_info;
400 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200401
402 unsigned char inbuf[64];
403 unsigned char encbuf[64];
404
405 size_t outlen = 0;
406
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200407 memset(key, 0, 32);
408 memset(iv, 0, 16);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200409
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200410 mbedtls_cipher_init(&ctx);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200411
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200412 memset(inbuf, 5, 64);
413 memset(encbuf, 0, 64);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200414
415 /* Check and get info structures */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200416 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
417 TEST_ASSERT(NULL != cipher_info);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200418
419 /* Initialise context */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200420 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
421 TEST_ASSERT(0 ==
422 mbedtls_cipher_setkey(&ctx, key, key_len, MBEDTLS_ENCRYPT));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200424 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200425#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200426 (void)pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200428 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx, iv, 16));
429 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx));
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200430#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200431 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx, NULL, 0));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200432#endif
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200433
434 /* encode length number of bytes from inbuf */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200435 TEST_ASSERT(0 ==
436 mbedtls_cipher_update(&ctx, inbuf, length, encbuf, &outlen));
437 TEST_ASSERT(ret == mbedtls_cipher_finish(&ctx, encbuf + outlen, &outlen));
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200438
439 /* done */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200440exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200441 mbedtls_cipher_free(&ctx);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200442}
Paul Bakker33b43f12013-08-20 11:48:36 +0200443/* END_CASE */
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200444
Paul Bakker33b43f12013-08-20 11:48:36 +0200445/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200446void dec_empty_buf(int cipher, int expected_update_ret, int expected_finish_ret)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200447{
Paul Bakker8123e9d2011-01-06 15:37:30 +0000448 unsigned char key[32];
449 unsigned char iv[16];
450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200451 mbedtls_cipher_context_t ctx_dec;
452 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000453
454 unsigned char encbuf[64];
455 unsigned char decbuf[64];
456
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000457 size_t outlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000458
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200459 memset(key, 0, 32);
460 memset(iv, 0, 16);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200461
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200462 mbedtls_cipher_init(&ctx_dec);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200463
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200464 memset(encbuf, 0, 64);
465 memset(decbuf, 0, 64);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000466
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200467 /* Initialise context */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200468 cipher_info = mbedtls_cipher_info_from_type(cipher);
469 TEST_ASSERT(NULL != cipher_info);
470 TEST_ASSERT(sizeof(key) * 8 >= cipher_info->key_bitlen);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200471
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200472 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000473
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200474 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx_dec, key,
475 cipher_info->key_bitlen,
476 MBEDTLS_DECRYPT));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000477
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200478 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_dec, iv, 16));
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200479
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200480 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_dec));
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200481
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200482#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200483 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_dec, NULL, 0));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200484#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000485
486 /* decode 0-byte string */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200487 TEST_ASSERT(expected_update_ret ==
488 mbedtls_cipher_update(&ctx_dec, encbuf, 0, decbuf, &outlen));
489 TEST_ASSERT(0 == outlen);
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100490
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200491 if (expected_finish_ret == 0 && (cipher_info->mode == MBEDTLS_MODE_CBC ||
492 cipher_info->mode == MBEDTLS_MODE_ECB)) {
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100493 /* Non-CBC and non-ECB ciphers are OK with decrypting empty buffers and
494 * return success, not MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED, when
k-stachowiakd8727232019-07-29 17:46:29 +0200495 * decrypting an empty buffer.
496 * On the other hand, CBC and ECB ciphers need a full block of input.
497 */
498 expected_finish_ret = MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED;
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100499 }
500
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200501 TEST_ASSERT(expected_finish_ret ==
502 mbedtls_cipher_finish(&ctx_dec, decbuf + outlen, &outlen));
503 TEST_ASSERT(0 == outlen);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000504
Paul Bakkerbd51b262014-07-10 15:26:12 +0200505exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200506 mbedtls_cipher_free(&ctx_dec);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200507}
Paul Bakker33b43f12013-08-20 11:48:36 +0200508/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000509
Paul Bakker33b43f12013-08-20 11:48:36 +0200510/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200511void enc_dec_buf_multipart(int cipher_id,
512 int key_len,
513 int first_length_val,
514 int second_length_val,
515 int pad_mode,
516 int first_encrypt_output_len,
517 int second_encrypt_output_len,
518 int first_decrypt_output_len,
519 int second_decrypt_output_len)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200520{
Paul Bakker33b43f12013-08-20 11:48:36 +0200521 size_t first_length = first_length_val;
522 size_t second_length = second_length_val;
Paul Bakker23986e52011-04-24 08:57:21 +0000523 size_t length = first_length + second_length;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200524 size_t block_size;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000525 unsigned char key[32];
526 unsigned char iv[16];
527
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200528 mbedtls_cipher_context_t ctx_dec;
529 mbedtls_cipher_context_t ctx_enc;
530 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000531
532 unsigned char inbuf[64];
533 unsigned char encbuf[64];
534 unsigned char decbuf[64];
535
Paul Bakker23986e52011-04-24 08:57:21 +0000536 size_t outlen = 0;
537 size_t totaloutlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000538
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200539 memset(key, 0, 32);
540 memset(iv, 0, 16);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200541
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200542 mbedtls_cipher_init(&ctx_dec);
543 mbedtls_cipher_init(&ctx_enc);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200544
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200545 memset(inbuf, 5, 64);
546 memset(encbuf, 0, 64);
547 memset(decbuf, 0, 64);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000548
549 /* Initialise enc and dec contexts */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200550 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
551 TEST_ASSERT(NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200552
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200553 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
554 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_enc, cipher_info));
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200555
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200556 TEST_ASSERT(0 ==
557 mbedtls_cipher_setkey(&ctx_dec, key, key_len, MBEDTLS_DECRYPT));
558 TEST_ASSERT(0 ==
559 mbedtls_cipher_setkey(&ctx_enc, key, key_len, MBEDTLS_ENCRYPT));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000560
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700561#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200562 if (-1 != pad_mode) {
563 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_dec, pad_mode));
564 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_enc, pad_mode));
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700565 }
566#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200567 (void)pad_mode;
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700568#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
569
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200570 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_dec, iv, 16));
571 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_enc, iv, 16));
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200572
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200573 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_dec));
574 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_enc));
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200575
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200576#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200577 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_dec, NULL, 0));
578 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_enc, NULL, 0));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200579#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000580
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200581 block_size = mbedtls_cipher_get_block_size(&ctx_enc);
582 TEST_ASSERT(block_size != 0);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200583
Paul Bakker8123e9d2011-01-06 15:37:30 +0000584 /* encode length number of bytes from inbuf */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200585 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_enc, inbuf, first_length,
586 encbuf, &outlen));
587 TEST_ASSERT((size_t)first_encrypt_output_len == outlen);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000588 totaloutlen = outlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200589 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_enc, inbuf + first_length,
590 second_length, encbuf + totaloutlen,
591 &outlen));
592 TEST_ASSERT((size_t)second_encrypt_output_len == outlen);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000593 totaloutlen += outlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200594 TEST_ASSERT(totaloutlen == length ||
595 (totaloutlen % block_size == 0 && totaloutlen < length &&
596 totaloutlen + block_size > length));
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200597
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200598 TEST_ASSERT(0 ==
599 mbedtls_cipher_finish(&ctx_enc, encbuf + totaloutlen, &outlen));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000600 totaloutlen += outlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200601 TEST_ASSERT(totaloutlen == length ||
602 (totaloutlen % block_size == 0 && totaloutlen > length &&
603 totaloutlen <= length + block_size));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000604
605 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700606 second_length = totaloutlen - first_length;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200607 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_dec, encbuf, first_length,
608 decbuf, &outlen));
609 TEST_ASSERT((size_t)first_decrypt_output_len == outlen);
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200610 totaloutlen = outlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200611 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_dec, encbuf + first_length,
612 second_length, decbuf + totaloutlen,
613 &outlen));
614 TEST_ASSERT((size_t)second_decrypt_output_len == outlen);
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700615 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200616
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200617 TEST_ASSERT(totaloutlen == length ||
618 (totaloutlen % block_size == 0 && totaloutlen < length &&
619 totaloutlen + block_size >= length));
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200620
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200621 TEST_ASSERT(0 ==
622 mbedtls_cipher_finish(&ctx_dec, decbuf + totaloutlen, &outlen));
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200623 totaloutlen += outlen;
624
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200625 TEST_ASSERT(totaloutlen == length);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000626
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200627 TEST_ASSERT(0 == memcmp(inbuf, decbuf, length));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000628
Paul Bakkerbd51b262014-07-10 15:26:12 +0200629exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200630 mbedtls_cipher_free(&ctx_dec);
631 mbedtls_cipher_free(&ctx_enc);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200632}
Paul Bakker33b43f12013-08-20 11:48:36 +0200633/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000634
Paul Bakker33b43f12013-08-20 11:48:36 +0200635/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200636void decrypt_test_vec(int cipher_id,
637 int pad_mode,
638 data_t *key,
639 data_t *iv,
640 data_t *cipher,
641 data_t *clear,
642 data_t *ad,
643 data_t *tag,
644 int finish_result,
645 int tag_result)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200646{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +0200647 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200649 size_t outlen, total_len;
650
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200651 mbedtls_cipher_init(&ctx);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200652
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200653 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200654
Azim Khanf1aaec92017-05-30 14:23:15 +0100655#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200656 ((void)ad);
657 ((void)tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +0200658#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200659
660 /* Prepare context */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200661 TEST_ASSERT(0 == mbedtls_cipher_setup(
662 &ctx, mbedtls_cipher_info_from_type(cipher_id)));
663 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx, key->x, 8 * key->len,
664 MBEDTLS_DECRYPT));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200665#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200666 if (pad_mode != -1)
667 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200668#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200669 (void)pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200670#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200671 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx, iv->x, iv->len));
672 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx));
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200673#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200674 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx, ad->x, ad->len));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200675#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200676
Azim Khand30ca132017-06-09 04:32:58 +0100677 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200678 total_len = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200679 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx, cipher->x, cipher->len, output,
680 &outlen));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200681 total_len += outlen;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200682 TEST_ASSERT(finish_result ==
683 mbedtls_cipher_finish(&ctx, output + outlen, &outlen));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200684 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200685#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200686 TEST_ASSERT(tag_result == mbedtls_cipher_check_tag(&ctx, tag->x, tag->len));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200687#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200688
689 /* check plaintext only if everything went fine */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200690 if (0 == finish_result && 0 == tag_result) {
691 TEST_ASSERT(total_len == clear->len);
692 TEST_ASSERT(0 == memcmp(output, clear->x, clear->len));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200693 }
694
Paul Bakkerbd51b262014-07-10 15:26:12 +0200695exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200696 mbedtls_cipher_free(&ctx);
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200697}
698/* END_CASE */
699
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100700/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_AUTH_CRYPT */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200701void auth_crypt_tv(int cipher_id,
702 data_t *key,
703 data_t *iv,
704 data_t *ad,
705 data_t *cipher,
706 data_t *tag,
707 char *result,
708 data_t *clear,
709 int use_psa)
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200710{
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100711 /*
712 * Take an AEAD ciphertext + tag and perform a pair
713 * of AEAD decryption and AEAD encryption. Check that
Hanno Beckera13272d2018-11-12 16:27:30 +0000714 * this results in the expected plaintext, and that
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100715 * decryption and encryption are inverse to one another.
716 */
Hanno Beckera13272d2018-11-12 16:27:30 +0000717
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200718 int ret;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100719 int using_nist_kw, using_nist_kw_padding;
Hanno Beckera13272d2018-11-12 16:27:30 +0000720
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200722 size_t outlen;
723
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100724 unsigned char *cipher_plus_tag = NULL;
725 size_t cipher_plus_tag_len;
726 unsigned char *decrypt_buf = NULL;
727 size_t decrypt_buf_len = 0;
728 unsigned char *encrypt_buf = NULL;
729 size_t encrypt_buf_len = 0;
730
Gilles Peskine70edd682020-12-03 20:27:27 +0100731 /* Null pointers are documented as valid for inputs of length 0.
732 * The test framework passes non-null pointers, so set them to NULL.
733 * key, cipher and tag can't be empty. */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200734 if (iv->len == 0)
Gilles Peskine70edd682020-12-03 20:27:27 +0100735 iv->x = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200736 if (ad->len == 0)
Gilles Peskine70edd682020-12-03 20:27:27 +0100737 ad->x = NULL;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200738 if (clear->len == 0)
Gilles Peskine70edd682020-12-03 20:27:27 +0100739 clear->x = NULL;
740
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200741 mbedtls_cipher_init(&ctx);
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200742
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100743 /* Initialize PSA Crypto */
744#if defined(MBEDTLS_USE_PSA_CRYPTO)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200745 if (use_psa == 1)
746 PSA_ASSERT(psa_crypto_init());
Hanno Beckera13272d2018-11-12 16:27:30 +0000747#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200748 (void)use_psa;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100749#endif
750
751 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100752 * Are we using NIST_KW? with padding?
753 */
754 using_nist_kw_padding = cipher_id == MBEDTLS_CIPHER_AES_128_KWP ||
755 cipher_id == MBEDTLS_CIPHER_AES_192_KWP ||
756 cipher_id == MBEDTLS_CIPHER_AES_256_KWP;
757 using_nist_kw = cipher_id == MBEDTLS_CIPHER_AES_128_KW ||
758 cipher_id == MBEDTLS_CIPHER_AES_192_KW ||
759 cipher_id == MBEDTLS_CIPHER_AES_256_KW ||
760 using_nist_kw_padding;
761
762 /*
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100763 * Prepare context for decryption
764 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200765 if (!cipher_reset_key(&ctx, cipher_id, use_psa, tag->len, key,
766 MBEDTLS_DECRYPT))
Gilles Peskine8a3d2342020-12-03 21:06:15 +0100767 goto exit;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200768
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +0100769 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100770 * prepare buffer for decryption
771 * (we need the tag appended to the ciphertext)
772 */
773 cipher_plus_tag_len = cipher->len + tag->len;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200774 ASSERT_ALLOC(cipher_plus_tag, cipher_plus_tag_len);
775 memcpy(cipher_plus_tag, cipher->x, cipher->len);
776 memcpy(cipher_plus_tag + cipher->len, tag->x, tag->len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100777
778 /*
779 * Compute length of output buffer according to the documentation
780 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200781 if (using_nist_kw)
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100782 decrypt_buf_len = cipher_plus_tag_len - 8;
783 else
784 decrypt_buf_len = cipher_plus_tag_len - tag->len;
785
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100786 /*
787 * Try decrypting to a buffer that's 1B too small
788 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200789 if (decrypt_buf_len != 0) {
790 ASSERT_ALLOC(decrypt_buf, decrypt_buf_len - 1);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100791
792 outlen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200793 ret = mbedtls_cipher_auth_decrypt_ext(&ctx, iv->x, iv->len, ad->x,
794 ad->len, cipher_plus_tag,
795 cipher_plus_tag_len, decrypt_buf,
796 decrypt_buf_len - 1, &outlen,
797 tag->len);
798 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100799
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200800 mbedtls_free(decrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100801 decrypt_buf = NULL;
802 }
803
804 /*
805 * Authenticate and decrypt, and check result
806 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200807 ASSERT_ALLOC(decrypt_buf, decrypt_buf_len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100808
809 outlen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200810 ret = mbedtls_cipher_auth_decrypt_ext(&ctx, iv->x, iv->len, ad->x, ad->len,
811 cipher_plus_tag, cipher_plus_tag_len,
812 decrypt_buf, decrypt_buf_len, &outlen,
813 tag->len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100814
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200815 if (strcmp(result, "FAIL") == 0) {
816 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED);
817 TEST_ASSERT(buffer_is_all_zero(decrypt_buf, decrypt_buf_len));
818 } else {
819 TEST_ASSERT(ret == 0);
820 ASSERT_COMPARE(decrypt_buf, outlen, clear->x, clear->len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100821 }
822
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200823 mbedtls_free(decrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100824 decrypt_buf = NULL;
825
826 /*
827 * Encrypt back if test data was authentic
828 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200829 if (strcmp(result, "FAIL") != 0) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100830 /* prepare context for encryption */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200831 if (!cipher_reset_key(&ctx, cipher_id, use_psa, tag->len, key,
832 MBEDTLS_ENCRYPT))
Gilles Peskine8a3d2342020-12-03 21:06:15 +0100833 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100834
835 /*
836 * Compute size of output buffer according to documentation
837 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200838 if (using_nist_kw) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100839 encrypt_buf_len = clear->len + 8;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200840 if (using_nist_kw_padding && encrypt_buf_len % 8 != 0)
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100841 encrypt_buf_len += 8 - encrypt_buf_len % 8;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200842 } else {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100843 encrypt_buf_len = clear->len + tag->len;
844 }
845
846 /*
847 * Try encrypting with an output buffer that's 1B too small
848 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200849 ASSERT_ALLOC(encrypt_buf, encrypt_buf_len - 1);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100850
851 outlen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200852 ret = mbedtls_cipher_auth_encrypt_ext(&ctx, iv->x, iv->len, ad->x,
853 ad->len, clear->x, clear->len,
854 encrypt_buf, encrypt_buf_len - 1,
855 &outlen, tag->len);
856 TEST_ASSERT(ret != 0);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100857
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200858 mbedtls_free(encrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100859 encrypt_buf = NULL;
860
861 /*
862 * Encrypt and check the result
863 */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200864 ASSERT_ALLOC(encrypt_buf, encrypt_buf_len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100865
866 outlen = 0;
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200867 ret = mbedtls_cipher_auth_encrypt_ext(&ctx, iv->x, iv->len, ad->x,
868 ad->len, clear->x, clear->len,
869 encrypt_buf, encrypt_buf_len,
870 &outlen, tag->len);
871 TEST_ASSERT(ret == 0);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100872
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200873 TEST_ASSERT(outlen == cipher->len + tag->len);
874 TEST_ASSERT(memcmp(encrypt_buf, cipher->x, cipher->len) == 0);
875 TEST_ASSERT(memcmp(encrypt_buf + cipher->len, tag->x, tag->len) == 0);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100876
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200877 mbedtls_free(encrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +0100878 encrypt_buf = NULL;
879 }
880
Paul Bakkerbd51b262014-07-10 15:26:12 +0200881exit:
Hanno Beckera13272d2018-11-12 16:27:30 +0000882
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200883 mbedtls_cipher_free(&ctx);
884 mbedtls_free(decrypt_buf);
885 mbedtls_free(encrypt_buf);
886 mbedtls_free(cipher_plus_tag);
Gilles Peskine5386f6b2019-08-01 12:47:40 +0200887
Hanno Beckera13272d2018-11-12 16:27:30 +0000888#if defined(MBEDTLS_USE_PSA_CRYPTO)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200889 if (use_psa == 1)
890 PSA_DONE();
Hanno Beckera13272d2018-11-12 16:27:30 +0000891#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200892}
893/* END_CASE */
894
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200895/* BEGIN_CASE */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200896void test_vec_ecb(int cipher_id,
897 int operation,
898 data_t *key,
899 data_t *input,
900 data_t *result,
901 int finish_result)
Paul Bakker5e0efa72013-09-08 23:04:04 +0200902{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200903 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +0200904 unsigned char output[32];
905 size_t outlen;
906
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200907 mbedtls_cipher_init(&ctx);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200908
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200909 memset(output, 0x00, sizeof(output));
Paul Bakker5e0efa72013-09-08 23:04:04 +0200910
911 /* Prepare context */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200912 TEST_ASSERT(0 == mbedtls_cipher_setup(
913 &ctx, mbedtls_cipher_info_from_type(cipher_id)));
Paul Bakker5e0efa72013-09-08 23:04:04 +0200914
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200915 TEST_ASSERT(0 ==
916 mbedtls_cipher_setkey(&ctx, key->x, 8 * key->len, operation));
Paul Bakker5e0efa72013-09-08 23:04:04 +0200917
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200918 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx, input->x,
919 mbedtls_cipher_get_block_size(&ctx),
920 output, &outlen));
921 TEST_ASSERT(outlen == mbedtls_cipher_get_block_size(&ctx));
922 TEST_ASSERT(finish_result ==
923 mbedtls_cipher_finish(&ctx, output + outlen, &outlen));
924 TEST_ASSERT(0 == outlen);
Paul Bakker5e0efa72013-09-08 23:04:04 +0200925
926 /* check plaintext only if everything went fine */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200927 if (0 == finish_result)
928 TEST_ASSERT(0 == memcmp(output, result->x,
929 mbedtls_cipher_get_block_size(&ctx)));
Paul Bakker5e0efa72013-09-08 23:04:04 +0200930
Paul Bakkerbd51b262014-07-10 15:26:12 +0200931exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200932 mbedtls_cipher_free(&ctx);
Paul Bakker5e0efa72013-09-08 23:04:04 +0200933}
934/* END_CASE */
935
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200936/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200937void test_vec_crypt(int cipher_id,
938 int operation,
939 data_t *key,
940 data_t *iv,
941 data_t *input,
942 data_t *result,
943 int finish_result,
944 int use_psa)
Ron Eldor7b012442017-09-25 17:03:12 +0300945{
Ron Eldor7b012442017-09-25 17:03:12 +0300946 mbedtls_cipher_context_t ctx;
947 unsigned char output[32];
948 size_t outlen;
949
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200950 mbedtls_cipher_init(&ctx);
Ron Eldor7b012442017-09-25 17:03:12 +0300951
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200952 memset(output, 0x00, sizeof(output));
Ron Eldor7b012442017-09-25 17:03:12 +0300953
954 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +0000955#if !defined(MBEDTLS_USE_PSA_CRYPTO)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200956 (void)use_psa;
Hanno Beckere43164e2018-11-12 12:46:35 +0000957#else
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200958 if (use_psa == 1) {
959 PSA_ASSERT(psa_crypto_init());
960 TEST_ASSERT(0 ==
961 mbedtls_cipher_setup_psa(
962 &ctx, mbedtls_cipher_info_from_type(cipher_id), 0));
963 } else
Hanno Beckere43164e2018-11-12 12:46:35 +0000964#endif /* MBEDTLS_USE_PSA_CRYPTO */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200965 TEST_ASSERT(0 == mbedtls_cipher_setup(
966 &ctx, mbedtls_cipher_info_from_type(cipher_id)));
Ron Eldor7b012442017-09-25 17:03:12 +0300967
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200968 TEST_ASSERT(0 ==
969 mbedtls_cipher_setkey(&ctx, key->x, 8 * key->len, operation));
970 if (MBEDTLS_MODE_CBC == ctx.cipher_info->mode)
971 TEST_ASSERT(
972 0 == mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE));
Ron Eldor7b012442017-09-25 17:03:12 +0300973
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200974 TEST_ASSERT(finish_result ==
975 mbedtls_cipher_crypt(&ctx, iv->len ? iv->x : NULL, iv->len,
976 input->x, input->len, output, &outlen));
977 TEST_ASSERT(result->len == outlen);
Ron Eldor7b012442017-09-25 17:03:12 +0300978 /* check plaintext only if everything went fine */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200979 if (0 == finish_result)
980 TEST_ASSERT(0 == memcmp(output, result->x, outlen));
Ron Eldor7b012442017-09-25 17:03:12 +0300981
982exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200983 mbedtls_cipher_free(&ctx);
Gilles Peskine5386f6b2019-08-01 12:47:40 +0200984#if defined(MBEDTLS_USE_PSA_CRYPTO)
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200985 PSA_DONE();
Gilles Peskine5386f6b2019-08-01 12:47:40 +0200986#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +0300987}
988/* END_CASE */
989
990/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200991void set_padding(int cipher_id, int pad_mode, int ret)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200992{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 const mbedtls_cipher_info_t *cipher_info;
994 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +0200995
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200996 mbedtls_cipher_init(&ctx);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200997
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +0200998 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
999 TEST_ASSERT(NULL != cipher_info);
1000 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001001
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001002 TEST_ASSERT(ret == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001003
Paul Bakkerbd51b262014-07-10 15:26:12 +02001004exit:
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001005 mbedtls_cipher_free(&ctx);
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001006}
Paul Bakker33b43f12013-08-20 11:48:36 +02001007/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001008
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001009/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001010void check_padding(int pad_mode, data_t *input, int ret, int dlen_check)
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001011{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001012 mbedtls_cipher_info_t cipher_info;
1013 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001014 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001015
1016 /* build a fake context just for getting access to get_padding */
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001017 mbedtls_cipher_init(&ctx);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001018 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001019 ctx.cipher_info = &cipher_info;
1020
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001021 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001022
Mateusz Starzykc0eabdc2021-08-03 14:09:02 +02001023 TEST_ASSERT(ret == ctx.get_padding(input->x, input->len, &dlen));
1024 if (0 == ret)
1025 TEST_ASSERT(dlen == (size_t)dlen_check);
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001026}
Paul Bakker33b43f12013-08-20 11:48:36 +02001027/* END_CASE */