blob: 9235e3db6a54b17829187a12e30b96d60892bb69 [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"
k-stachowiakd8727232019-07-29 17:46:29 +02003#include "mbedtls/aes.h"
k-stachowiakd8727232019-07-29 17:46:29 +02004
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02005#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00006#include "mbedtls/gcm.h"
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +02007#endif
Gilles Peskine5386f6b2019-08-01 12:47:40 +02008
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01009#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
10#define MBEDTLS_CIPHER_AUTH_CRYPT
11#endif
12
Przemek Stekiel0d721412022-10-10 14:41:13 +020013#if defined(MBEDTLS_CIPHER_AUTH_CRYPT)
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010014/* Helper for resetting key/direction
15 *
16 * The documentation doesn't explicitly say whether calling
17 * mbedtls_cipher_setkey() twice is allowed or not. This currently works with
18 * the default software implementation, but only by accident. It isn't
19 * guaranteed to work with new ciphers or with alternative implementations of
20 * individual ciphers, and it doesn't work with the PSA wrappers. So don't do
21 * it, and instead start with a fresh context.
22 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010023static int cipher_reset_key(mbedtls_cipher_context_t *ctx, int cipher_id,
24 int use_psa, size_t tag_len, const data_t *key, int direction)
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010025{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010026 mbedtls_cipher_free(ctx);
27 mbedtls_cipher_init(ctx);
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010028
29#if !defined(MBEDTLS_USE_PSA_CRYPTO)
30 (void) use_psa;
31 (void) tag_len;
32#else
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010033 if (use_psa == 1) {
34 TEST_ASSERT(0 == mbedtls_cipher_setup_psa(ctx,
35 mbedtls_cipher_info_from_type(cipher_id),
36 tag_len));
37 } else
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010038#endif /* MBEDTLS_USE_PSA_CRYPTO */
39 {
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010040 TEST_ASSERT(0 == mbedtls_cipher_setup(ctx,
41 mbedtls_cipher_info_from_type(cipher_id)));
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010042 }
43
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010044 TEST_ASSERT(0 == mbedtls_cipher_setkey(ctx, key->x, 8 * key->len,
45 direction));
46 return 1;
Gilles Peskine8a3d2342020-12-03 21:06:15 +010047
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010048exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010049 return 0;
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010050}
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010051
52/*
53 * Check if a buffer is all-0 bytes:
54 * return 1 if it is,
55 * 0 if it isn't.
56 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010057int buffer_is_all_zero(const uint8_t *buf, size_t size)
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010058{
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010059 for (size_t i = 0; i < size; i++) {
60 if (buf[i] != 0) {
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010061 return 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010062 }
63 }
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010064 return 1;
65}
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010066#endif /* MBEDTLS_CIPHER_AUTH_CRYPT */
67
Paul Bakker33b43f12013-08-20 11:48:36 +020068/* END_HEADER */
Paul Bakker8123e9d2011-01-06 15:37:30 +000069
Paul Bakker33b43f12013-08-20 11:48:36 +020070/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020071 * depends_on:MBEDTLS_CIPHER_C
Paul Bakker33b43f12013-08-20 11:48:36 +020072 * END_DEPENDENCIES
73 */
Paul Bakker5690efc2011-05-26 13:16:06 +000074
Paul Bakker33b43f12013-08-20 11:48:36 +020075/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010076void mbedtls_cipher_list()
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010077{
78 const int *cipher_type;
79
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010080 for (cipher_type = mbedtls_cipher_list(); *cipher_type != 0; cipher_type++) {
81 TEST_ASSERT(mbedtls_cipher_info_from_type(*cipher_type) != NULL);
82 }
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010083}
84/* END_CASE */
85
86/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010087void cipher_invalid_param_unconditional()
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020088{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050089 mbedtls_cipher_context_t valid_ctx;
90 mbedtls_cipher_context_t invalid_ctx;
91 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
92 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
93 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
94 int valid_size = sizeof(valid_buffer);
95 int valid_bitlen = valid_size * 8;
96 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +010097 *(mbedtls_cipher_list()));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050098 size_t size_t_var;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020099
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100100 (void) valid_mode; /* In some configurations this is unused */
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200101
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100102 mbedtls_cipher_init(&valid_ctx);
103 mbedtls_cipher_init(&invalid_ctx);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200104
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100105 TEST_ASSERT(mbedtls_cipher_setup(&valid_ctx, valid_info) == 0);
Gilles Peskine3fc0d302021-12-10 14:28:31 +0100106
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500107 /* mbedtls_cipher_setup() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100108 TEST_ASSERT(mbedtls_cipher_setup(&valid_ctx, NULL) ==
109 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200110
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500111 /* mbedtls_cipher_get_block_size() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100112 TEST_ASSERT(mbedtls_cipher_get_block_size(&invalid_ctx) == 0);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200113
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500114 /* mbedtls_cipher_get_cipher_mode() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100115 TEST_ASSERT(mbedtls_cipher_get_cipher_mode(&invalid_ctx) ==
116 MBEDTLS_MODE_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200117
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500118 /* mbedtls_cipher_get_iv_size() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100119 TEST_ASSERT(mbedtls_cipher_get_iv_size(&invalid_ctx) == 0);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200120
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500121 /* mbedtls_cipher_get_type() */
122 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100123 mbedtls_cipher_get_type(&invalid_ctx) ==
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500124 MBEDTLS_CIPHER_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200125
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500126 /* mbedtls_cipher_get_name() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100127 TEST_ASSERT(mbedtls_cipher_get_name(&invalid_ctx) == 0);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200128
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500129 /* mbedtls_cipher_get_key_bitlen() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100130 TEST_ASSERT(mbedtls_cipher_get_key_bitlen(&invalid_ctx) ==
131 MBEDTLS_KEY_LENGTH_NONE);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500132
133 /* mbedtls_cipher_get_operation() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100134 TEST_ASSERT(mbedtls_cipher_get_operation(&invalid_ctx) ==
135 MBEDTLS_OPERATION_NONE);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500136
137 /* mbedtls_cipher_setkey() */
138 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100139 mbedtls_cipher_setkey(&invalid_ctx,
140 valid_buffer,
141 valid_bitlen,
142 valid_operation) ==
143 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500144
145 /* mbedtls_cipher_set_iv() */
146 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100147 mbedtls_cipher_set_iv(&invalid_ctx,
148 valid_buffer,
149 valid_size) ==
150 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500151
152 /* mbedtls_cipher_reset() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100153 TEST_ASSERT(mbedtls_cipher_reset(&invalid_ctx) ==
154 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200155
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200156#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500157 /* mbedtls_cipher_update_ad() */
158 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100159 mbedtls_cipher_update_ad(&invalid_ctx,
160 valid_buffer,
161 valid_size) ==
162 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500163#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
164
165#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
166 /* mbedtls_cipher_set_padding_mode() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100167 TEST_ASSERT(mbedtls_cipher_set_padding_mode(&invalid_ctx, valid_mode) ==
168 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200169#endif
170
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500171 /* mbedtls_cipher_update() */
172 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100173 mbedtls_cipher_update(&invalid_ctx,
174 valid_buffer,
175 valid_size,
176 valid_buffer,
177 &size_t_var) ==
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_finish() */
181 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100182 mbedtls_cipher_finish(&invalid_ctx,
183 valid_buffer,
184 &size_t_var) ==
185 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200186
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200187#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500188 /* mbedtls_cipher_write_tag() */
189 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100190 mbedtls_cipher_write_tag(&invalid_ctx,
191 valid_buffer,
192 valid_size) ==
193 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200194
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500195 /* mbedtls_cipher_check_tag() */
196 TEST_ASSERT(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100197 mbedtls_cipher_check_tag(&invalid_ctx,
198 valid_buffer,
199 valid_size) ==
200 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500201#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
202
203exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100204 mbedtls_cipher_free(&invalid_ctx);
205 mbedtls_cipher_free(&valid_ctx);
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500206}
207/* END_CASE */
208
209/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100210void cipher_invalid_param_conditional()
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500211{
212 mbedtls_cipher_context_t valid_ctx;
213
214 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
215 mbedtls_operation_t invalid_operation = 100;
216 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
217 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
218 int valid_size = sizeof(valid_buffer);
219 int valid_bitlen = valid_size * 8;
220 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100221 *(mbedtls_cipher_list()));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500222
223 size_t size_t_var;
224
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100225 (void) valid_mode; /* In some configurations this is unused */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500226
227 /* mbedtls_cipher_init() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100228 TEST_VALID_PARAM(mbedtls_cipher_init(&valid_ctx));
229 TEST_INVALID_PARAM(mbedtls_cipher_init(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500230
231 /* mbedtls_cipher_setup() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100232 TEST_VALID_PARAM(mbedtls_cipher_setup(&valid_ctx, valid_info));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500233 TEST_INVALID_PARAM_RET(
234 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100235 mbedtls_cipher_setup(NULL, valid_info));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500236
237 /* mbedtls_cipher_get_block_size() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100238 TEST_INVALID_PARAM_RET(0, mbedtls_cipher_get_block_size(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500239
240 /* mbedtls_cipher_get_cipher_mode() */
241 TEST_INVALID_PARAM_RET(
242 MBEDTLS_MODE_NONE,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100243 mbedtls_cipher_get_cipher_mode(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500244
245 /* mbedtls_cipher_get_iv_size() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100246 TEST_INVALID_PARAM_RET(0, mbedtls_cipher_get_iv_size(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500247
248 /* mbedtls_cipher_get_type() */
249 TEST_INVALID_PARAM_RET(
250 MBEDTLS_CIPHER_NONE,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100251 mbedtls_cipher_get_type(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500252
253 /* mbedtls_cipher_get_name() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100254 TEST_INVALID_PARAM_RET(0, mbedtls_cipher_get_name(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500255
256 /* mbedtls_cipher_get_key_bitlen() */
257 TEST_INVALID_PARAM_RET(
258 MBEDTLS_KEY_LENGTH_NONE,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100259 mbedtls_cipher_get_key_bitlen(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500260
261 /* mbedtls_cipher_get_operation() */
262 TEST_INVALID_PARAM_RET(
263 MBEDTLS_OPERATION_NONE,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100264 mbedtls_cipher_get_operation(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500265
266 /* mbedtls_cipher_setkey() */
267 TEST_INVALID_PARAM_RET(
268 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100269 mbedtls_cipher_setkey(NULL,
270 valid_buffer,
271 valid_bitlen,
272 valid_operation));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500273 TEST_INVALID_PARAM_RET(
274 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100275 mbedtls_cipher_setkey(&valid_ctx,
276 NULL,
277 valid_bitlen,
278 valid_operation));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500279 TEST_INVALID_PARAM_RET(
280 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100281 mbedtls_cipher_setkey(&valid_ctx,
282 valid_buffer,
283 valid_bitlen,
284 invalid_operation));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500285
286 /* mbedtls_cipher_set_iv() */
287 TEST_INVALID_PARAM_RET(
288 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100289 mbedtls_cipher_set_iv(NULL,
290 valid_buffer,
291 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500292 TEST_INVALID_PARAM_RET(
293 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100294 mbedtls_cipher_set_iv(&valid_ctx,
295 NULL,
296 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500297
298 /* mbedtls_cipher_reset() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100299 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
300 mbedtls_cipher_reset(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500301
302#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
303 /* mbedtls_cipher_update_ad() */
304 TEST_INVALID_PARAM_RET(
305 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100306 mbedtls_cipher_update_ad(NULL,
307 valid_buffer,
308 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500309 TEST_INVALID_PARAM_RET(
310 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100311 mbedtls_cipher_update_ad(&valid_ctx,
312 NULL,
313 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500314#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
315
316#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
317 /* mbedtls_cipher_set_padding_mode() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100318 TEST_INVALID_PARAM_RET(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
319 mbedtls_cipher_set_padding_mode(NULL, valid_mode));
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200320#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500321
322 /* mbedtls_cipher_update() */
323 TEST_INVALID_PARAM_RET(
324 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100325 mbedtls_cipher_update(NULL,
326 valid_buffer,
327 valid_size,
328 valid_buffer,
329 &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500330 TEST_INVALID_PARAM_RET(
331 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100332 mbedtls_cipher_update(&valid_ctx,
333 NULL, valid_size,
334 valid_buffer,
335 &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500336 TEST_INVALID_PARAM_RET(
337 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100338 mbedtls_cipher_update(&valid_ctx,
339 valid_buffer, valid_size,
340 NULL,
341 &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500342 TEST_INVALID_PARAM_RET(
343 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100344 mbedtls_cipher_update(&valid_ctx,
345 valid_buffer, valid_size,
346 valid_buffer,
347 NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500348
349 /* mbedtls_cipher_finish() */
350 TEST_INVALID_PARAM_RET(
351 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100352 mbedtls_cipher_finish(NULL,
353 valid_buffer,
354 &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500355 TEST_INVALID_PARAM_RET(
356 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100357 mbedtls_cipher_finish(&valid_ctx,
358 NULL,
359 &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500360 TEST_INVALID_PARAM_RET(
361 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100362 mbedtls_cipher_finish(&valid_ctx,
363 valid_buffer,
364 NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500365
366#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
367 /* mbedtls_cipher_write_tag() */
368 TEST_INVALID_PARAM_RET(
369 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100370 mbedtls_cipher_write_tag(NULL,
371 valid_buffer,
372 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500373 TEST_INVALID_PARAM_RET(
374 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100375 mbedtls_cipher_write_tag(&valid_ctx,
376 NULL,
377 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500378
379 /* mbedtls_cipher_check_tag() */
380 TEST_INVALID_PARAM_RET(
381 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100382 mbedtls_cipher_check_tag(NULL,
383 valid_buffer,
384 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500385 TEST_INVALID_PARAM_RET(
386 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100387 mbedtls_cipher_check_tag(&valid_ctx,
388 NULL,
389 valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500390#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
391
392 /* mbedtls_cipher_crypt() */
393 TEST_INVALID_PARAM_RET(
394 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100395 mbedtls_cipher_crypt(NULL,
396 valid_buffer, valid_size,
397 valid_buffer, valid_size,
398 valid_buffer, &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500399 TEST_INVALID_PARAM_RET(
400 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100401 mbedtls_cipher_crypt(&valid_ctx,
402 NULL, valid_size,
403 valid_buffer, valid_size,
404 valid_buffer, &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500405 TEST_INVALID_PARAM_RET(
406 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100407 mbedtls_cipher_crypt(&valid_ctx,
408 valid_buffer, valid_size,
409 NULL, valid_size,
410 valid_buffer, &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500411 TEST_INVALID_PARAM_RET(
412 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100413 mbedtls_cipher_crypt(&valid_ctx,
414 valid_buffer, valid_size,
415 valid_buffer, valid_size,
416 NULL, &size_t_var));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500417 TEST_INVALID_PARAM_RET(
418 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100419 mbedtls_cipher_crypt(&valid_ctx,
420 valid_buffer, valid_size,
421 valid_buffer, valid_size,
422 valid_buffer, NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500423
424#if defined(MBEDTLS_CIPHER_MODE_AEAD)
425 /* mbedtls_cipher_auth_encrypt() */
426 TEST_INVALID_PARAM_RET(
427 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100428 mbedtls_cipher_auth_encrypt(NULL,
429 valid_buffer, valid_size,
430 valid_buffer, valid_size,
431 valid_buffer, valid_size,
432 valid_buffer, &size_t_var,
433 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500434 TEST_INVALID_PARAM_RET(
435 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100436 mbedtls_cipher_auth_encrypt(&valid_ctx,
437 NULL, valid_size,
438 valid_buffer, valid_size,
439 valid_buffer, valid_size,
440 valid_buffer, &size_t_var,
441 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500442 TEST_INVALID_PARAM_RET(
443 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100444 mbedtls_cipher_auth_encrypt(&valid_ctx,
445 valid_buffer, valid_size,
446 NULL, valid_size,
447 valid_buffer, valid_size,
448 valid_buffer, &size_t_var,
449 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500450 TEST_INVALID_PARAM_RET(
451 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100452 mbedtls_cipher_auth_encrypt(&valid_ctx,
453 valid_buffer, valid_size,
454 valid_buffer, valid_size,
455 NULL, valid_size,
456 valid_buffer, &size_t_var,
457 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500458 TEST_INVALID_PARAM_RET(
459 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100460 mbedtls_cipher_auth_encrypt(&valid_ctx,
461 valid_buffer, valid_size,
462 valid_buffer, valid_size,
463 valid_buffer, valid_size,
464 NULL, &size_t_var,
465 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500466 TEST_INVALID_PARAM_RET(
467 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100468 mbedtls_cipher_auth_encrypt(&valid_ctx,
469 valid_buffer, valid_size,
470 valid_buffer, valid_size,
471 valid_buffer, valid_size,
472 valid_buffer, NULL,
473 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500474 TEST_INVALID_PARAM_RET(
475 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100476 mbedtls_cipher_auth_encrypt(&valid_ctx,
477 valid_buffer, valid_size,
478 valid_buffer, valid_size,
479 valid_buffer, valid_size,
480 valid_buffer, &size_t_var,
481 NULL, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500482
483 /* mbedtls_cipher_auth_decrypt() */
484 TEST_INVALID_PARAM_RET(
485 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100486 mbedtls_cipher_auth_decrypt(NULL,
487 valid_buffer, valid_size,
488 valid_buffer, valid_size,
489 valid_buffer, valid_size,
490 valid_buffer, &size_t_var,
491 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500492 TEST_INVALID_PARAM_RET(
493 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100494 mbedtls_cipher_auth_decrypt(&valid_ctx,
495 NULL, valid_size,
496 valid_buffer, valid_size,
497 valid_buffer, valid_size,
498 valid_buffer, &size_t_var,
499 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500500 TEST_INVALID_PARAM_RET(
501 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100502 mbedtls_cipher_auth_decrypt(&valid_ctx,
503 valid_buffer, valid_size,
504 NULL, valid_size,
505 valid_buffer, valid_size,
506 valid_buffer, &size_t_var,
507 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500508 TEST_INVALID_PARAM_RET(
509 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100510 mbedtls_cipher_auth_decrypt(&valid_ctx,
511 valid_buffer, valid_size,
512 valid_buffer, valid_size,
513 NULL, valid_size,
514 valid_buffer, &size_t_var,
515 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500516 TEST_INVALID_PARAM_RET(
517 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100518 mbedtls_cipher_auth_decrypt(&valid_ctx,
519 valid_buffer, valid_size,
520 valid_buffer, valid_size,
521 valid_buffer, valid_size,
522 NULL, &size_t_var,
523 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500524 TEST_INVALID_PARAM_RET(
525 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100526 mbedtls_cipher_auth_decrypt(&valid_ctx,
527 valid_buffer, valid_size,
528 valid_buffer, valid_size,
529 valid_buffer, valid_size,
530 valid_buffer, NULL,
531 valid_buffer, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500532 TEST_INVALID_PARAM_RET(
533 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100534 mbedtls_cipher_auth_decrypt(&valid_ctx,
535 valid_buffer, valid_size,
536 valid_buffer, valid_size,
537 valid_buffer, valid_size,
538 valid_buffer, &size_t_var,
539 NULL, valid_size));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500540#endif /* defined(MBEDTLS_CIPHER_MODE_AEAD) */
541
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100542#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
543 /* mbedtls_cipher_auth_encrypt_ext */
544 TEST_INVALID_PARAM_RET(
545 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100546 mbedtls_cipher_auth_encrypt_ext(NULL,
547 valid_buffer, valid_size,
548 valid_buffer, valid_size,
549 valid_buffer, valid_size,
550 valid_buffer, valid_size, &size_t_var,
551 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100552 TEST_INVALID_PARAM_RET(
553 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100554 mbedtls_cipher_auth_encrypt_ext(&valid_ctx,
555 NULL, valid_size,
556 valid_buffer, valid_size,
557 valid_buffer, valid_size,
558 valid_buffer, valid_size, &size_t_var,
559 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100560 TEST_INVALID_PARAM_RET(
561 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100562 mbedtls_cipher_auth_encrypt_ext(&valid_ctx,
563 valid_buffer, valid_size,
564 NULL, valid_size,
565 valid_buffer, valid_size,
566 valid_buffer, valid_size, &size_t_var,
567 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100568 TEST_INVALID_PARAM_RET(
569 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100570 mbedtls_cipher_auth_encrypt_ext(&valid_ctx,
571 valid_buffer, valid_size,
572 valid_buffer, valid_size,
573 NULL, valid_size,
574 valid_buffer, valid_size, &size_t_var,
575 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100576 TEST_INVALID_PARAM_RET(
577 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100578 mbedtls_cipher_auth_encrypt_ext(&valid_ctx,
579 valid_buffer, valid_size,
580 valid_buffer, valid_size,
581 valid_buffer, valid_size,
582 NULL, valid_size, &size_t_var,
583 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100584 TEST_INVALID_PARAM_RET(
585 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100586 mbedtls_cipher_auth_encrypt_ext(&valid_ctx,
587 valid_buffer, valid_size,
588 valid_buffer, valid_size,
589 valid_buffer, valid_size,
590 valid_buffer, valid_size, NULL,
591 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100592
593 /* mbedtls_cipher_auth_decrypt_ext */
594 TEST_INVALID_PARAM_RET(
595 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100596 mbedtls_cipher_auth_decrypt_ext(NULL,
597 valid_buffer, valid_size,
598 valid_buffer, valid_size,
599 valid_buffer, valid_size,
600 valid_buffer, valid_size, &size_t_var,
601 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100602 TEST_INVALID_PARAM_RET(
603 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100604 mbedtls_cipher_auth_decrypt_ext(&valid_ctx,
605 NULL, valid_size,
606 valid_buffer, valid_size,
607 valid_buffer, valid_size,
608 valid_buffer, valid_size, &size_t_var,
609 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100610 TEST_INVALID_PARAM_RET(
611 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100612 mbedtls_cipher_auth_decrypt_ext(&valid_ctx,
613 valid_buffer, valid_size,
614 NULL, valid_size,
615 valid_buffer, valid_size,
616 valid_buffer, valid_size, &size_t_var,
617 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100618 TEST_INVALID_PARAM_RET(
619 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100620 mbedtls_cipher_auth_decrypt_ext(&valid_ctx,
621 valid_buffer, valid_size,
622 valid_buffer, valid_size,
623 NULL, valid_size,
624 valid_buffer, valid_size, &size_t_var,
625 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100626 TEST_INVALID_PARAM_RET(
627 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100628 mbedtls_cipher_auth_decrypt_ext(&valid_ctx,
629 valid_buffer, valid_size,
630 valid_buffer, valid_size,
631 valid_buffer, valid_size,
632 NULL, valid_size, &size_t_var,
633 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100634 TEST_INVALID_PARAM_RET(
635 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100636 mbedtls_cipher_auth_decrypt_ext(&valid_ctx,
637 valid_buffer, valid_size,
638 valid_buffer, valid_size,
639 valid_buffer, valid_size,
640 valid_buffer, valid_size, NULL,
641 valid_size));
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100642#endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */
643
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500644 /* mbedtls_cipher_free() */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100645 TEST_VALID_PARAM(mbedtls_cipher_free(NULL));
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500646exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100647 TEST_VALID_PARAM(mbedtls_cipher_free(&valid_ctx));
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200648}
649/* END_CASE */
650
Paul Bakker6a9c7252016-07-14 13:46:10 +0100651/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100652void cipher_special_behaviours()
Paul Bakker6a9c7252016-07-14 13:46:10 +0100653{
654 const mbedtls_cipher_info_t *cipher_info;
655 mbedtls_cipher_context_t ctx;
656 unsigned char input[32];
657 unsigned char output[32];
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100658#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100659 unsigned char iv[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300660#endif
Paul Bakker6a9c7252016-07-14 13:46:10 +0100661 size_t olen = 0;
662
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100663 mbedtls_cipher_init(&ctx);
664 memset(input, 0, sizeof(input));
665 memset(output, 0, sizeof(output));
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300666#if defined(MBEDTLS_CIPHER_MODE_CBC)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100667 memset(iv, 0, sizeof(iv));
Paul Bakker6a9c7252016-07-14 13:46:10 +0100668
669 /* Check and get info structures */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100670 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CBC);
671 TEST_ASSERT(NULL != cipher_info);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100672
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100673 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
Paul Bakker6a9c7252016-07-14 13:46:10 +0100674
675 /* IV too big */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100676 TEST_ASSERT(mbedtls_cipher_set_iv(&ctx, iv, MBEDTLS_MAX_IV_LENGTH + 1)
677 == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100678
679 /* IV too small */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100680 TEST_ASSERT(mbedtls_cipher_set_iv(&ctx, iv, 0)
681 == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100682
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100683 mbedtls_cipher_free(&ctx);
684 mbedtls_cipher_init(&ctx);
Ron Eldor6f90ed82017-09-26 12:08:54 +0300685#endif /* MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100686 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_ECB);
687 TEST_ASSERT(NULL != cipher_info);
Ron Eldor7b012442017-09-25 17:03:12 +0300688
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100689 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
Ron Eldor7b012442017-09-25 17:03:12 +0300690
Paul Bakker6a9c7252016-07-14 13:46:10 +0100691 /* Update ECB with partial block */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100692 TEST_ASSERT(mbedtls_cipher_update(&ctx, input, 1, output, &olen)
693 == MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100694
695exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100696 mbedtls_cipher_free(&ctx);
Paul Bakker6a9c7252016-07-14 13:46:10 +0100697}
698/* END_CASE */
699
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200700/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100701void enc_dec_buf(int cipher_id, char *cipher_string, int key_len,
702 int length_val, int pad_mode)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200703{
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100704 size_t length = length_val, outlen, total_len, i, block_size, iv_len;
Jaeden Amerod906b812018-06-08 11:03:16 +0100705 unsigned char key[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000706 unsigned char iv[16];
Manuel Pégourié-Gonnard9241be72013-08-31 17:31:03 +0200707 unsigned char ad[13];
708 unsigned char tag[16];
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200709 unsigned char inbuf[64];
710 unsigned char encbuf[64];
711 unsigned char decbuf[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000712
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713 const mbedtls_cipher_info_t *cipher_info;
714 mbedtls_cipher_context_t ctx_dec;
715 mbedtls_cipher_context_t ctx_enc;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000716
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200717 /*
718 * Prepare contexts
719 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100720 mbedtls_cipher_init(&ctx_dec);
721 mbedtls_cipher_init(&ctx_enc);
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200722
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100723 memset(key, 0x2a, sizeof(key));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000724
725 /* Check and get info structures */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100726 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
727 TEST_ASSERT(NULL != cipher_info);
728 TEST_ASSERT(mbedtls_cipher_info_from_string(cipher_string) == cipher_info);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000729
730 /* Initialise enc and dec contexts */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100731 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
732 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_enc, cipher_info));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200733
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100734 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx_dec, key, key_len, MBEDTLS_DECRYPT));
735 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx_enc, key, key_len, MBEDTLS_ENCRYPT));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000736
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200737#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100738 if (-1 != pad_mode) {
739 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_dec, pad_mode));
740 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_enc, pad_mode));
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200741 }
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200742#else
743 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200745
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200746 /*
747 * Do a few encode/decode cycles
748 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100749 for (i = 0; i < 3; i++) {
750 memset(iv, 0x00 + i, sizeof(iv));
751 memset(ad, 0x10 + i, sizeof(ad));
752 memset(inbuf, 0x20 + i, sizeof(inbuf));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200753
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100754 memset(encbuf, 0, sizeof(encbuf));
755 memset(decbuf, 0, sizeof(decbuf));
756 memset(tag, 0, sizeof(tag));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200757
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100758 if (cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ||
759 cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305) {
760 iv_len = 12;
761 } else {
762 iv_len = sizeof(iv);
763 }
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100764
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100765 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_dec, iv, iv_len));
766 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_enc, iv, iv_len));
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200767
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100768 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_dec));
769 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_enc));
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200770
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200771#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100772 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_dec, ad, sizeof(ad) - i));
773 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_enc, ad, sizeof(ad) - i));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200774#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000775
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100776 block_size = mbedtls_cipher_get_block_size(&ctx_enc);
777 TEST_ASSERT(block_size != 0);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200778
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100779 /* encode length number of bytes from inbuf */
780 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_enc, inbuf, length, encbuf, &outlen));
781 total_len = outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200782
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100783 TEST_ASSERT(total_len == length ||
784 (total_len % block_size == 0 &&
785 total_len < length &&
786 total_len + block_size > length));
Paul Bakker343a8702011-06-09 14:27:58 +0000787
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100788 TEST_ASSERT(0 == mbedtls_cipher_finish(&ctx_enc, encbuf + outlen, &outlen));
789 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000790
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200791#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100792 TEST_ASSERT(0 == mbedtls_cipher_write_tag(&ctx_enc, tag, sizeof(tag)));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200793#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200794
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100795 TEST_ASSERT(total_len == length ||
796 (total_len % block_size == 0 &&
797 total_len > length &&
798 total_len <= length + block_size));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000799
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100800 /* decode the previously encoded string */
801 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_dec, encbuf, total_len, decbuf, &outlen));
802 total_len = outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200803
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100804 TEST_ASSERT(total_len == length ||
805 (total_len % block_size == 0 &&
806 total_len < length &&
807 total_len + block_size >= length));
Paul Bakker343a8702011-06-09 14:27:58 +0000808
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100809 TEST_ASSERT(0 == mbedtls_cipher_finish(&ctx_dec, decbuf + outlen, &outlen));
810 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000811
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200812#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100813 TEST_ASSERT(0 == mbedtls_cipher_check_tag(&ctx_dec, tag, sizeof(tag)));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200814#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200815
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100816 /* check result */
817 TEST_ASSERT(total_len == length);
818 TEST_ASSERT(0 == memcmp(inbuf, decbuf, length));
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200819 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000820
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200821 /*
822 * Done
823 */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200824exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100825 mbedtls_cipher_free(&ctx_dec);
826 mbedtls_cipher_free(&ctx_enc);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200827}
Paul Bakker33b43f12013-08-20 11:48:36 +0200828/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000829
Paul Bakker33b43f12013-08-20 11:48:36 +0200830/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100831void enc_fail(int cipher_id, int pad_mode, int key_len, int length_val,
832 int ret)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200833{
Paul Bakker33b43f12013-08-20 11:48:36 +0200834 size_t length = length_val;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200835 unsigned char key[32];
836 unsigned char iv[16];
837
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200838 const mbedtls_cipher_info_t *cipher_info;
839 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200840
841 unsigned char inbuf[64];
842 unsigned char encbuf[64];
843
844 size_t outlen = 0;
845
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100846 memset(key, 0, 32);
847 memset(iv, 0, 16);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200848
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100849 mbedtls_cipher_init(&ctx);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200850
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100851 memset(inbuf, 5, 64);
852 memset(encbuf, 0, 64);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200853
854 /* Check and get info structures */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100855 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
856 TEST_ASSERT(NULL != cipher_info);
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200857
858 /* Initialise context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100859 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
860 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx, key, key_len, MBEDTLS_ENCRYPT));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100862 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200863#else
864 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100866 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx, iv, 16));
867 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx));
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200868#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100869 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx, NULL, 0));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200870#endif
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200871
872 /* encode length number of bytes from inbuf */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100873 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx, inbuf, length, encbuf, &outlen));
874 TEST_ASSERT(ret == mbedtls_cipher_finish(&ctx, encbuf + outlen, &outlen));
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200875
876 /* done */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200877exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100878 mbedtls_cipher_free(&ctx);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200879}
Paul Bakker33b43f12013-08-20 11:48:36 +0200880/* END_CASE */
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200881
Paul Bakker33b43f12013-08-20 11:48:36 +0200882/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100883void dec_empty_buf(int cipher,
884 int expected_update_ret,
885 int expected_finish_ret)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200886{
Paul Bakker8123e9d2011-01-06 15:37:30 +0000887 unsigned char key[32];
888 unsigned char iv[16];
Andrzej Kurekd3530432021-12-02 09:31:58 +0100889 size_t iv_len = sizeof(iv);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000890
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200891 mbedtls_cipher_context_t ctx_dec;
892 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000893
894 unsigned char encbuf[64];
895 unsigned char decbuf[64];
896
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000897 size_t outlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000898
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100899 memset(key, 0, 32);
900 memset(iv, 0, 16);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200901
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100902 mbedtls_cipher_init(&ctx_dec);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200903
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100904 memset(encbuf, 0, 64);
905 memset(decbuf, 0, 64);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000906
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200907 /* Initialise context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100908 cipher_info = mbedtls_cipher_info_from_type(cipher);
909 TEST_ASSERT(NULL != cipher_info);
Andrzej Kurekd3530432021-12-02 09:31:58 +0100910
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100911 if (cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ||
912 cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305) {
Andrzej Kurekd3530432021-12-02 09:31:58 +0100913 iv_len = 12;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100914 }
Andrzej Kurekd3530432021-12-02 09:31:58 +0100915
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100916 TEST_ASSERT(sizeof(key) * 8 >= cipher_info->key_bitlen);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200917
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100918 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000919
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100920 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx_dec,
921 key, cipher_info->key_bitlen,
922 MBEDTLS_DECRYPT));
Paul Bakker8123e9d2011-01-06 15:37:30 +0000923
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100924 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_dec, iv, iv_len));
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200925
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100926 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_dec));
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200927
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200928#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100929 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_dec, NULL, 0));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200930#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000931
932 /* decode 0-byte string */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100933 TEST_ASSERT(expected_update_ret ==
934 mbedtls_cipher_update(&ctx_dec, encbuf, 0, decbuf, &outlen));
935 TEST_ASSERT(0 == outlen);
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100936
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100937 if (expected_finish_ret == 0 &&
938 (cipher_info->mode == MBEDTLS_MODE_CBC ||
939 cipher_info->mode == MBEDTLS_MODE_ECB)) {
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100940 /* Non-CBC and non-ECB ciphers are OK with decrypting empty buffers and
941 * return success, not MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED, when
k-stachowiakd8727232019-07-29 17:46:29 +0200942 * decrypting an empty buffer.
943 * On the other hand, CBC and ECB ciphers need a full block of input.
944 */
945 expected_finish_ret = MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED;
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100946 }
947
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100948 TEST_ASSERT(expected_finish_ret == mbedtls_cipher_finish(
949 &ctx_dec, decbuf + outlen, &outlen));
950 TEST_ASSERT(0 == outlen);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000951
Paul Bakkerbd51b262014-07-10 15:26:12 +0200952exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100953 mbedtls_cipher_free(&ctx_dec);
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200954}
Paul Bakker33b43f12013-08-20 11:48:36 +0200955/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000956
Paul Bakker33b43f12013-08-20 11:48:36 +0200957/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100958void enc_dec_buf_multipart(int cipher_id, int key_len, int first_length_val,
959 int second_length_val, int pad_mode,
960 int first_encrypt_output_len, int second_encrypt_output_len,
961 int first_decrypt_output_len, int second_decrypt_output_len)
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200962{
Paul Bakker33b43f12013-08-20 11:48:36 +0200963 size_t first_length = first_length_val;
964 size_t second_length = second_length_val;
Paul Bakker23986e52011-04-24 08:57:21 +0000965 size_t length = first_length + second_length;
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100966 size_t block_size, iv_len;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000967 unsigned char key[32];
968 unsigned char iv[16];
969
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200970 mbedtls_cipher_context_t ctx_dec;
971 mbedtls_cipher_context_t ctx_enc;
972 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000973
974 unsigned char inbuf[64];
975 unsigned char encbuf[64];
976 unsigned char decbuf[64];
977
Paul Bakker23986e52011-04-24 08:57:21 +0000978 size_t outlen = 0;
979 size_t totaloutlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000980
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100981 memset(key, 0, 32);
982 memset(iv, 0, 16);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200983
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100984 mbedtls_cipher_init(&ctx_dec);
985 mbedtls_cipher_init(&ctx_enc);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200986
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100987 memset(inbuf, 5, 64);
988 memset(encbuf, 0, 64);
989 memset(decbuf, 0, 64);
Paul Bakker8123e9d2011-01-06 15:37:30 +0000990
991 /* Initialise enc and dec contexts */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100992 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
993 TEST_ASSERT(NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200994
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100995 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
996 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_enc, cipher_info));
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200997
Gilles Peskine1b6c09a2023-01-11 14:52:35 +0100998 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx_dec, key, key_len, MBEDTLS_DECRYPT));
999 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx_enc, key, key_len, MBEDTLS_ENCRYPT));
Paul Bakker8123e9d2011-01-06 15:37:30 +00001000
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001001#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001002 if (-1 != pad_mode) {
1003 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_dec, pad_mode));
1004 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx_enc, pad_mode));
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001005 }
1006#else
1007 (void) pad_mode;
1008#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
1009
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001010 if (cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ||
1011 cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305) {
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001012 iv_len = 12;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001013 } else {
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001014 iv_len = sizeof(iv);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001015 }
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001016
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001017 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_dec, iv, iv_len));
1018 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx_enc, iv, iv_len));
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +02001019
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001020 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_dec));
1021 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx_enc));
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +02001022
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001023#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001024 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_dec, NULL, 0));
1025 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx_enc, NULL, 0));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001026#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +00001027
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001028 block_size = mbedtls_cipher_get_block_size(&ctx_enc);
1029 TEST_ASSERT(block_size != 0);
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001030
Paul Bakker8123e9d2011-01-06 15:37:30 +00001031 /* encode length number of bytes from inbuf */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001032 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_enc, inbuf, first_length, encbuf, &outlen));
1033 TEST_ASSERT((size_t) first_encrypt_output_len == outlen);
Paul Bakker8123e9d2011-01-06 15:37:30 +00001034 totaloutlen = outlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001035 TEST_ASSERT(0 ==
1036 mbedtls_cipher_update(&ctx_enc, inbuf + first_length, second_length,
1037 encbuf + totaloutlen,
1038 &outlen));
1039 TEST_ASSERT((size_t) second_encrypt_output_len == outlen);
Paul Bakker8123e9d2011-01-06 15:37:30 +00001040 totaloutlen += outlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001041 TEST_ASSERT(totaloutlen == length ||
1042 (totaloutlen % block_size == 0 &&
1043 totaloutlen < length &&
1044 totaloutlen + block_size > length));
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001045
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001046 TEST_ASSERT(0 == mbedtls_cipher_finish(&ctx_enc, encbuf + totaloutlen, &outlen));
Paul Bakker8123e9d2011-01-06 15:37:30 +00001047 totaloutlen += outlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001048 TEST_ASSERT(totaloutlen == length ||
1049 (totaloutlen % block_size == 0 &&
1050 totaloutlen > length &&
1051 totaloutlen <= length + block_size));
Paul Bakker8123e9d2011-01-06 15:37:30 +00001052
1053 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001054 second_length = totaloutlen - first_length;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001055 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx_dec, encbuf, first_length, decbuf, &outlen));
1056 TEST_ASSERT((size_t) first_decrypt_output_len == outlen);
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001057 totaloutlen = outlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001058 TEST_ASSERT(0 ==
1059 mbedtls_cipher_update(&ctx_dec, encbuf + first_length, second_length,
1060 decbuf + totaloutlen,
1061 &outlen));
1062 TEST_ASSERT((size_t) second_decrypt_output_len == outlen);
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001063 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001064
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001065 TEST_ASSERT(totaloutlen == length ||
1066 (totaloutlen % block_size == 0 &&
1067 totaloutlen < length &&
1068 totaloutlen + block_size >= length));
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001069
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001070 TEST_ASSERT(0 == mbedtls_cipher_finish(&ctx_dec, decbuf + totaloutlen, &outlen));
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001071 totaloutlen += outlen;
1072
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001073 TEST_ASSERT(totaloutlen == length);
Paul Bakker8123e9d2011-01-06 15:37:30 +00001074
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001075 TEST_ASSERT(0 == memcmp(inbuf, decbuf, length));
Paul Bakker8123e9d2011-01-06 15:37:30 +00001076
Paul Bakkerbd51b262014-07-10 15:26:12 +02001077exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001078 mbedtls_cipher_free(&ctx_dec);
1079 mbedtls_cipher_free(&ctx_enc);
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001080}
Paul Bakker33b43f12013-08-20 11:48:36 +02001081/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001082
Paul Bakker33b43f12013-08-20 11:48:36 +02001083/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001084void decrypt_test_vec(int cipher_id, int pad_mode, data_t *key,
1085 data_t *iv, data_t *cipher,
1086 data_t *clear, data_t *ad, data_t *tag,
1087 int finish_result, int tag_result)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001088{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +02001089 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001090 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001091 size_t outlen, total_len;
1092
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001093 mbedtls_cipher_init(&ctx);
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001094
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001095 memset(output, 0x00, sizeof(output));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001096
Azim Khanf1aaec92017-05-30 14:23:15 +01001097#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mohammad Azim Khancf32c452017-06-13 14:55:58 +01001098 ((void) ad);
1099 ((void) tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +02001100#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001101
1102 /* Prepare context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001103 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx,
1104 mbedtls_cipher_info_from_type(cipher_id)));
1105 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx, key->x, 8 * key->len, MBEDTLS_DECRYPT));
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001107 if (pad_mode != -1) {
1108 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
1109 }
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +02001110#else
1111 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001112#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001113 TEST_ASSERT(0 == mbedtls_cipher_set_iv(&ctx, iv->x, iv->len));
1114 TEST_ASSERT(0 == mbedtls_cipher_reset(&ctx));
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001115#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001116 TEST_ASSERT(0 == mbedtls_cipher_update_ad(&ctx, ad->x, ad->len));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001117#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001118
Azim Khand30ca132017-06-09 04:32:58 +01001119 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001120 total_len = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001121 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx, cipher->x, cipher->len, output, &outlen));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001122 total_len += outlen;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001123 TEST_ASSERT(finish_result == mbedtls_cipher_finish(&ctx, output + outlen,
1124 &outlen));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001125 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001126#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001127 TEST_ASSERT(tag_result == mbedtls_cipher_check_tag(&ctx, tag->x, tag->len));
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001128#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001129
1130 /* check plaintext only if everything went fine */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001131 if (0 == finish_result && 0 == tag_result) {
1132 TEST_ASSERT(total_len == clear->len);
1133 TEST_ASSERT(0 == memcmp(output, clear->x, clear->len));
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001134 }
1135
Paul Bakkerbd51b262014-07-10 15:26:12 +02001136exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001137 mbedtls_cipher_free(&ctx);
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001138}
1139/* END_CASE */
1140
Przemek Stekiel0d721412022-10-10 14:41:13 +02001141/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_AUTH_CRYPT */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001142void auth_crypt_tv(int cipher_id, data_t *key, data_t *iv,
1143 data_t *ad, data_t *cipher, data_t *tag,
1144 char *result, data_t *clear, int use_psa)
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001145{
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001146 /*
1147 * Take an AEAD ciphertext + tag and perform a pair
1148 * of AEAD decryption and AEAD encryption. Check that
Hanno Beckera13272d2018-11-12 16:27:30 +00001149 * this results in the expected plaintext, and that
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001150 * decryption and encryption are inverse to one another.
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001151 *
1152 * Do that twice:
1153 * - once with legacy functions auth_decrypt/auth_encrypt
1154 * - once with new functions auth_decrypt_ext/auth_encrypt_ext
1155 * This allows testing both without duplicating test cases.
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001156 */
Hanno Beckera13272d2018-11-12 16:27:30 +00001157
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001158 int ret;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001159 int using_nist_kw, using_nist_kw_padding;
Hanno Beckera13272d2018-11-12 16:27:30 +00001160
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001161 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001162 size_t outlen;
1163
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001164 unsigned char *cipher_plus_tag = NULL;
1165 size_t cipher_plus_tag_len;
1166 unsigned char *decrypt_buf = NULL;
1167 size_t decrypt_buf_len = 0;
1168 unsigned char *encrypt_buf = NULL;
1169 size_t encrypt_buf_len = 0;
1170
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001171#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1172 !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001173 unsigned char *tmp_tag = NULL;
1174 unsigned char *tmp_cipher = NULL;
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001175 unsigned char *tag_buf = NULL;
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001176#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1177
Gilles Peskine70edd682020-12-03 20:27:27 +01001178 /* Null pointers are documented as valid for inputs of length 0.
1179 * The test framework passes non-null pointers, so set them to NULL.
1180 * key, cipher and tag can't be empty. */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001181 if (iv->len == 0) {
Gilles Peskine70edd682020-12-03 20:27:27 +01001182 iv->x = NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001183 }
1184 if (ad->len == 0) {
Gilles Peskine70edd682020-12-03 20:27:27 +01001185 ad->x = NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001186 }
1187 if (clear->len == 0) {
Gilles Peskine70edd682020-12-03 20:27:27 +01001188 clear->x = NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001189 }
Gilles Peskine70edd682020-12-03 20:27:27 +01001190
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001191 mbedtls_cipher_init(&ctx);
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001192
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001193 /* Initialize PSA Crypto */
1194#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001195 if (use_psa == 1) {
1196 PSA_ASSERT(psa_crypto_init());
1197 }
Hanno Beckera13272d2018-11-12 16:27:30 +00001198#else
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001199 (void) use_psa;
1200#endif
1201
1202 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001203 * Are we using NIST_KW? with padding?
1204 */
1205 using_nist_kw_padding = cipher_id == MBEDTLS_CIPHER_AES_128_KWP ||
1206 cipher_id == MBEDTLS_CIPHER_AES_192_KWP ||
1207 cipher_id == MBEDTLS_CIPHER_AES_256_KWP;
1208 using_nist_kw = cipher_id == MBEDTLS_CIPHER_AES_128_KW ||
1209 cipher_id == MBEDTLS_CIPHER_AES_192_KW ||
1210 cipher_id == MBEDTLS_CIPHER_AES_256_KW ||
1211 using_nist_kw_padding;
1212
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001213 /****************************************************************
1214 * *
1215 * Part 1: non-deprecated API *
1216 * *
1217 ****************************************************************/
1218
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001219 /*
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001220 * Prepare context for decryption
1221 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001222 if (!cipher_reset_key(&ctx, cipher_id, use_psa, tag->len, key,
1223 MBEDTLS_DECRYPT)) {
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001224 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001225 }
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001226
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001227 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001228 * prepare buffer for decryption
1229 * (we need the tag appended to the ciphertext)
1230 */
1231 cipher_plus_tag_len = cipher->len + tag->len;
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001232 TEST_CALLOC(cipher_plus_tag, cipher_plus_tag_len);
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001233 memcpy(cipher_plus_tag, cipher->x, cipher->len);
1234 memcpy(cipher_plus_tag + cipher->len, tag->x, tag->len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001235
1236 /*
1237 * Compute length of output buffer according to the documentation
1238 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001239 if (using_nist_kw) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001240 decrypt_buf_len = cipher_plus_tag_len - 8;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001241 } else {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001242 decrypt_buf_len = cipher_plus_tag_len - tag->len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001243 }
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001244
1245
1246 /*
1247 * Try decrypting to a buffer that's 1B too small
1248 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001249 if (decrypt_buf_len != 0) {
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001250 TEST_CALLOC(decrypt_buf, decrypt_buf_len - 1);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001251
1252 outlen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001253 ret = mbedtls_cipher_auth_decrypt_ext(&ctx, iv->x, iv->len,
1254 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1255 decrypt_buf, decrypt_buf_len - 1, &outlen, tag->len);
1256 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001257
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001258 mbedtls_free(decrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001259 decrypt_buf = NULL;
1260 }
1261
1262 /*
1263 * Authenticate and decrypt, and check result
1264 */
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001265 TEST_CALLOC(decrypt_buf, decrypt_buf_len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001266
1267 outlen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001268 ret = mbedtls_cipher_auth_decrypt_ext(&ctx, iv->x, iv->len,
1269 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1270 decrypt_buf, decrypt_buf_len, &outlen, tag->len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001271
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001272 if (strcmp(result, "FAIL") == 0) {
1273 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED);
1274 TEST_ASSERT(buffer_is_all_zero(decrypt_buf, decrypt_buf_len));
1275 } else {
1276 TEST_ASSERT(ret == 0);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001277 TEST_MEMORY_COMPARE(decrypt_buf, outlen, clear->x, clear->len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001278 }
1279
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001280 /* Free this, but keep cipher_plus_tag for deprecated function with PSA */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001281 mbedtls_free(decrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001282 decrypt_buf = NULL;
1283
1284 /*
1285 * Encrypt back if test data was authentic
1286 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001287 if (strcmp(result, "FAIL") != 0) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001288 /* prepare context for encryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001289 if (!cipher_reset_key(&ctx, cipher_id, use_psa, tag->len, key,
1290 MBEDTLS_ENCRYPT)) {
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001291 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001292 }
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001293
1294 /*
1295 * Compute size of output buffer according to documentation
1296 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001297 if (using_nist_kw) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001298 encrypt_buf_len = clear->len + 8;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001299 if (using_nist_kw_padding && encrypt_buf_len % 8 != 0) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001300 encrypt_buf_len += 8 - encrypt_buf_len % 8;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001301 }
1302 } else {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001303 encrypt_buf_len = clear->len + tag->len;
1304 }
1305
1306 /*
1307 * Try encrypting with an output buffer that's 1B too small
1308 */
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001309 TEST_CALLOC(encrypt_buf, encrypt_buf_len - 1);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001310
1311 outlen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001312 ret = mbedtls_cipher_auth_encrypt_ext(&ctx, iv->x, iv->len,
1313 ad->x, ad->len, clear->x, clear->len,
1314 encrypt_buf, encrypt_buf_len - 1, &outlen, tag->len);
1315 TEST_ASSERT(ret != 0);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001316
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001317 mbedtls_free(encrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001318 encrypt_buf = NULL;
1319
1320 /*
1321 * Encrypt and check the result
1322 */
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001323 TEST_CALLOC(encrypt_buf, encrypt_buf_len);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001324
1325 outlen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001326 ret = mbedtls_cipher_auth_encrypt_ext(&ctx, iv->x, iv->len,
1327 ad->x, ad->len, clear->x, clear->len,
1328 encrypt_buf, encrypt_buf_len, &outlen, tag->len);
1329 TEST_ASSERT(ret == 0);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001330
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001331 TEST_ASSERT(outlen == cipher->len + tag->len);
1332 TEST_ASSERT(memcmp(encrypt_buf, cipher->x, cipher->len) == 0);
1333 TEST_ASSERT(memcmp(encrypt_buf + cipher->len,
1334 tag->x, tag->len) == 0);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001335
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001336 mbedtls_free(encrypt_buf);
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001337 encrypt_buf = NULL;
1338 }
1339
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001340 /****************************************************************
1341 * *
1342 * Part 2: deprecated API *
1343 * *
1344 ****************************************************************/
1345
1346#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1347 !defined(MBEDTLS_DEPRECATED_REMOVED)
1348
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001349 /*
1350 * Prepare context for decryption
1351 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001352 if (!cipher_reset_key(&ctx, cipher_id, use_psa, tag->len, key,
1353 MBEDTLS_DECRYPT)) {
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001354 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001355 }
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001356
1357 /*
1358 * Prepare pointers for decryption
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001359 */
1360#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001361 if (use_psa == 1) {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001362 /* PSA requires that the tag immediately follows the ciphertext.
1363 * Fortunately, we already have that from testing the new API. */
1364 tmp_cipher = cipher_plus_tag;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001365 tmp_tag = tmp_cipher + cipher->len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001366 } else
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001367#endif /* MBEDTLS_USE_PSA_CRYPTO */
1368 {
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001369 tmp_cipher = cipher->x;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001370 tmp_tag = tag->x;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001371 }
1372
1373 /*
1374 * Authenticate and decrypt, and check result
1375 */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001376
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001377 TEST_CALLOC(decrypt_buf, cipher->len);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001378 outlen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001379 ret = mbedtls_cipher_auth_decrypt(&ctx, iv->x, iv->len, ad->x, ad->len,
1380 tmp_cipher, cipher->len, decrypt_buf, &outlen,
1381 tmp_tag, tag->len);
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001382
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001383 if (using_nist_kw) {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001384 /* NIST_KW with legacy API */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001385 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE);
1386 } else if (strcmp(result, "FAIL") == 0) {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001387 /* unauthentic message */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001388 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED);
1389 TEST_ASSERT(buffer_is_all_zero(decrypt_buf, cipher->len));
1390 } else {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001391 /* authentic message: is the plaintext correct? */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001392 TEST_ASSERT(ret == 0);
Tom Cosgroveba3b14d2023-09-04 11:23:02 +01001393 TEST_MEMORY_COMPARE(decrypt_buf, outlen, clear->x, clear->len);
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001394 }
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001395
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001396 mbedtls_free(decrypt_buf);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001397 decrypt_buf = NULL;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001398 mbedtls_free(cipher_plus_tag);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001399 cipher_plus_tag = NULL;
1400
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001401 /*
1402 * Encrypt back if test data was authentic
1403 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001404 if (strcmp(result, "FAIL") != 0) {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001405 /* prepare context for encryption */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001406 if (!cipher_reset_key(&ctx, cipher_id, use_psa, tag->len, key,
1407 MBEDTLS_ENCRYPT)) {
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001408 goto exit;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001409 }
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001410
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001411 /* prepare buffers for encryption */
1412#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001413 if (use_psa) {
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001414 TEST_CALLOC(cipher_plus_tag, cipher->len + tag->len);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001415 tmp_cipher = cipher_plus_tag;
1416 tmp_tag = cipher_plus_tag + cipher->len;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001417 } else
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001418#endif /* MBEDTLS_USE_PSA_CRYPTO */
1419 {
Tom Cosgrove30ceb232023-09-04 11:20:19 +01001420 TEST_CALLOC(encrypt_buf, cipher->len);
1421 TEST_CALLOC(tag_buf, tag->len);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001422 tmp_cipher = encrypt_buf;
1423 tmp_tag = tag_buf;
1424 }
1425
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001426 /*
1427 * Encrypt and check the result
1428 */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001429 outlen = 0;
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001430 ret = mbedtls_cipher_auth_encrypt(&ctx, iv->x, iv->len, ad->x, ad->len,
1431 clear->x, clear->len, tmp_cipher, &outlen,
1432 tmp_tag, tag->len);
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001433
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001434 if (using_nist_kw) {
1435 TEST_ASSERT(ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE);
1436 } else {
1437 TEST_ASSERT(ret == 0);
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001438
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001439 TEST_ASSERT(outlen == cipher->len);
1440 if (cipher->len != 0) {
1441 TEST_ASSERT(memcmp(tmp_cipher, cipher->x, cipher->len) == 0);
1442 }
1443 TEST_ASSERT(memcmp(tmp_tag, tag->x, tag->len) == 0);
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001444 }
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001445 }
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001446
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001447#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1448
Paul Bakkerbd51b262014-07-10 15:26:12 +02001449exit:
Hanno Beckera13272d2018-11-12 16:27:30 +00001450
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001451 mbedtls_cipher_free(&ctx);
1452 mbedtls_free(decrypt_buf);
1453 mbedtls_free(encrypt_buf);
1454 mbedtls_free(cipher_plus_tag);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001455#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1456 !defined(MBEDTLS_DEPRECATED_REMOVED)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001457 mbedtls_free(tag_buf);
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001458#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001459
Hanno Beckera13272d2018-11-12 16:27:30 +00001460#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001461 if (use_psa == 1) {
1462 PSA_DONE();
1463 }
Hanno Beckera13272d2018-11-12 16:27:30 +00001464#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001465}
1466/* END_CASE */
1467
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001468/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001469void test_vec_ecb(int cipher_id, int operation, data_t *key,
1470 data_t *input, data_t *result, int finish_result
1471 )
Paul Bakker5e0efa72013-09-08 23:04:04 +02001472{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001473 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +02001474 unsigned char output[32];
1475 size_t outlen;
1476
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001477 mbedtls_cipher_init(&ctx);
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001478
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001479 memset(output, 0x00, sizeof(output));
Paul Bakker5e0efa72013-09-08 23:04:04 +02001480
1481 /* Prepare context */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001482 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx,
1483 mbedtls_cipher_info_from_type(cipher_id)));
Paul Bakker5e0efa72013-09-08 23:04:04 +02001484
Paul Bakker5e0efa72013-09-08 23:04:04 +02001485
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001486 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx, key->x, 8 * key->len, operation));
Paul Bakker5e0efa72013-09-08 23:04:04 +02001487
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001488 TEST_ASSERT(0 == mbedtls_cipher_update(&ctx, input->x,
1489 mbedtls_cipher_get_block_size(&ctx),
1490 output, &outlen));
1491 TEST_ASSERT(outlen == mbedtls_cipher_get_block_size(&ctx));
1492 TEST_ASSERT(finish_result == mbedtls_cipher_finish(&ctx, output + outlen,
1493 &outlen));
1494 TEST_ASSERT(0 == outlen);
Paul Bakker5e0efa72013-09-08 23:04:04 +02001495
1496 /* check plaintext only if everything went fine */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001497 if (0 == finish_result) {
1498 TEST_ASSERT(0 == memcmp(output, result->x,
1499 mbedtls_cipher_get_block_size(&ctx)));
1500 }
Paul Bakker5e0efa72013-09-08 23:04:04 +02001501
Paul Bakkerbd51b262014-07-10 15:26:12 +02001502exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001503 mbedtls_cipher_free(&ctx);
Paul Bakker5e0efa72013-09-08 23:04:04 +02001504}
1505/* END_CASE */
1506
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001507/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001508void test_vec_crypt(int cipher_id, int operation, data_t *key,
1509 data_t *iv, data_t *input, data_t *result,
1510 int finish_result, int use_psa)
Ron Eldor7b012442017-09-25 17:03:12 +03001511{
Ron Eldor7b012442017-09-25 17:03:12 +03001512 mbedtls_cipher_context_t ctx;
1513 unsigned char output[32];
1514 size_t outlen;
1515
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001516 mbedtls_cipher_init(&ctx);
Ron Eldor7b012442017-09-25 17:03:12 +03001517
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001518 memset(output, 0x00, sizeof(output));
Ron Eldor7b012442017-09-25 17:03:12 +03001519
1520 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +00001521#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1522 (void) use_psa;
1523#else
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001524 if (use_psa == 1) {
1525 PSA_ASSERT(psa_crypto_init());
1526 TEST_ASSERT(0 == mbedtls_cipher_setup_psa(&ctx,
1527 mbedtls_cipher_info_from_type(cipher_id), 0));
1528 } else
Hanno Beckere43164e2018-11-12 12:46:35 +00001529#endif /* MBEDTLS_USE_PSA_CRYPTO */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001530 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx,
1531 mbedtls_cipher_info_from_type(cipher_id)));
Ron Eldor7b012442017-09-25 17:03:12 +03001532
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001533 TEST_ASSERT(0 == mbedtls_cipher_setkey(&ctx, key->x, 8 * key->len, operation));
1534 if (MBEDTLS_MODE_CBC == ctx.cipher_info->mode) {
1535 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE));
1536 }
Ron Eldor7b012442017-09-25 17:03:12 +03001537
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001538 TEST_ASSERT(finish_result == mbedtls_cipher_crypt(&ctx, iv->len ? iv->x : NULL,
1539 iv->len, input->x, input->len,
1540 output, &outlen));
1541 TEST_ASSERT(result->len == outlen);
Ron Eldor7b012442017-09-25 17:03:12 +03001542 /* check plaintext only if everything went fine */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001543 if (0 == finish_result) {
1544 TEST_ASSERT(0 == memcmp(output, result->x, outlen));
1545 }
Ron Eldor7b012442017-09-25 17:03:12 +03001546
1547exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001548 mbedtls_cipher_free(&ctx);
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001549#if defined(MBEDTLS_USE_PSA_CRYPTO)
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001550 PSA_DONE();
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001551#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001552}
1553/* END_CASE */
1554
1555/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001556void set_padding(int cipher_id, int pad_mode, int ret)
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001557{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001558 const mbedtls_cipher_info_t *cipher_info;
1559 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001560
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001561 mbedtls_cipher_init(&ctx);
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001562
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001563 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
1564 TEST_ASSERT(NULL != cipher_info);
1565 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx, cipher_info));
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001566
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001567 TEST_ASSERT(ret == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001568
Paul Bakkerbd51b262014-07-10 15:26:12 +02001569exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001570 mbedtls_cipher_free(&ctx);
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001571}
Paul Bakker33b43f12013-08-20 11:48:36 +02001572/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001574/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001575void check_padding(int pad_mode, data_t *input, int ret, int dlen_check
1576 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001577{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001578 mbedtls_cipher_info_t cipher_info;
1579 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001580 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001581
1582 /* build a fake context just for getting access to get_padding */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001583 mbedtls_cipher_init(&ctx);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001584 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001585 ctx.cipher_info = &cipher_info;
1586
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001587 TEST_ASSERT(0 == mbedtls_cipher_set_padding_mode(&ctx, pad_mode));
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001588
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001589
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001590 TEST_ASSERT(ret == ctx.get_padding(input->x, input->len, &dlen));
1591 if (0 == ret) {
1592 TEST_ASSERT(dlen == (size_t) dlen_check);
1593 }
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001594}
Paul Bakker33b43f12013-08-20 11:48:36 +02001595/* END_CASE */
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001596
1597/* BEGIN_CASE */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001598void iv_len_validity(int cipher_id, char *cipher_string,
1599 int iv_len_val, int ret)
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001600{
1601 size_t iv_len = iv_len_val;
1602 unsigned char iv[16];
1603
Thomas Daubneyac72f9c2022-03-02 16:44:51 +00001604 /* Initialise iv buffer */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001605 memset(iv, 0, sizeof(iv));
Thomas Daubneyac72f9c2022-03-02 16:44:51 +00001606
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001607 const mbedtls_cipher_info_t *cipher_info;
1608 mbedtls_cipher_context_t ctx_dec;
1609 mbedtls_cipher_context_t ctx_enc;
1610
1611 /*
1612 * Prepare contexts
1613 */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001614 mbedtls_cipher_init(&ctx_dec);
1615 mbedtls_cipher_init(&ctx_enc);
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001616
1617 /* Check and get info structures */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001618 cipher_info = mbedtls_cipher_info_from_type(cipher_id);
1619 TEST_ASSERT(NULL != cipher_info);
1620 TEST_ASSERT(mbedtls_cipher_info_from_string(cipher_string) == cipher_info);
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001621
1622 /* Initialise enc and dec contexts */
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001623 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_dec, cipher_info));
1624 TEST_ASSERT(0 == mbedtls_cipher_setup(&ctx_enc, cipher_info));
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001625
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001626 TEST_ASSERT(ret == mbedtls_cipher_set_iv(&ctx_dec, iv, iv_len));
1627 TEST_ASSERT(ret == mbedtls_cipher_set_iv(&ctx_enc, iv, iv_len));
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001628
1629exit:
Gilles Peskine1b6c09a2023-01-11 14:52:35 +01001630 mbedtls_cipher_free(&ctx_dec);
1631 mbedtls_cipher_free(&ctx_enc);
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001632}
1633/* END_CASE */