blob: a87b12b0cef5cf4887d826cd55df4fd86061c988 [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 Stekiel802353c2022-10-06 12:10:53 +020013#if defined(MBEDTLS_CIPHER_AUTH_CRYPT) && defined(MBEDTLS_CIPHER_MODE_AEAD)
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 Peskine8a3d2342020-12-03 21:06:15 +010023static int cipher_reset_key( mbedtls_cipher_context_t *ctx, int cipher_id,
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010024 int use_psa, size_t tag_len, const data_t *key, int direction )
25{
26 mbedtls_cipher_free( ctx );
27 mbedtls_cipher_init( ctx );
28
29#if !defined(MBEDTLS_USE_PSA_CRYPTO)
30 (void) use_psa;
31 (void) tag_len;
32#else
33 if( use_psa == 1 )
34 {
35 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( ctx,
36 mbedtls_cipher_info_from_type( cipher_id ),
37 tag_len ) );
38 }
39 else
40#endif /* MBEDTLS_USE_PSA_CRYPTO */
41 {
42 TEST_ASSERT( 0 == mbedtls_cipher_setup( ctx,
43 mbedtls_cipher_info_from_type( cipher_id ) ) );
44 }
45
46 TEST_ASSERT( 0 == mbedtls_cipher_setkey( ctx, key->x, 8 * key->len,
47 direction ) );
Gilles Peskine8a3d2342020-12-03 21:06:15 +010048 return( 1 );
49
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010050exit:
Gilles Peskine8a3d2342020-12-03 21:06:15 +010051 return( 0 );
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010052}
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010053
54/*
55 * Check if a buffer is all-0 bytes:
56 * return 1 if it is,
57 * 0 if it isn't.
58 */
59int buffer_is_all_zero( const uint8_t *buf, size_t size )
60{
61 for( size_t i = 0; i < size; i++ )
62 if( buf[i] != 0 )
63 return 0;
64 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 */
Azim Khanf1aaec92017-05-30 14:23:15 +010076void mbedtls_cipher_list( )
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010077{
78 const int *cipher_type;
79
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080 for( cipher_type = mbedtls_cipher_list(); *cipher_type != 0; cipher_type++ )
81 TEST_ASSERT( mbedtls_cipher_info_from_type( *cipher_type ) != NULL );
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010082}
83/* END_CASE */
84
85/* BEGIN_CASE */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050086void cipher_invalid_param_unconditional( )
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020087{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050088 mbedtls_cipher_context_t valid_ctx;
89 mbedtls_cipher_context_t invalid_ctx;
90 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
91 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
92 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
93 int valid_size = sizeof(valid_buffer);
94 int valid_bitlen = valid_size * 8;
95 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
96 *( mbedtls_cipher_list() ) );
97 size_t size_t_var;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020098
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050099 (void)valid_mode; /* In some configurations this is unused */
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200100
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500101 mbedtls_cipher_init( &valid_ctx );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500102 mbedtls_cipher_init( &invalid_ctx );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200103
Gilles Peskine3fc0d302021-12-10 14:28:31 +0100104 TEST_ASSERT( mbedtls_cipher_setup( &valid_ctx, valid_info ) == 0 );
105
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500106 /* mbedtls_cipher_setup() */
107 TEST_ASSERT( mbedtls_cipher_setup( &valid_ctx, NULL ) ==
108 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200109
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500110 /* mbedtls_cipher_get_block_size() */
111 TEST_ASSERT( mbedtls_cipher_get_block_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200112
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500113 /* mbedtls_cipher_get_cipher_mode() */
114 TEST_ASSERT( mbedtls_cipher_get_cipher_mode( &invalid_ctx ) ==
115 MBEDTLS_MODE_NONE );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200116
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500117 /* mbedtls_cipher_get_iv_size() */
118 TEST_ASSERT( mbedtls_cipher_get_iv_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200119
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500120 /* mbedtls_cipher_get_type() */
121 TEST_ASSERT(
122 mbedtls_cipher_get_type( &invalid_ctx ) ==
123 MBEDTLS_CIPHER_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200124
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500125 /* mbedtls_cipher_get_name() */
126 TEST_ASSERT( mbedtls_cipher_get_name( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200127
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500128 /* mbedtls_cipher_get_key_bitlen() */
129 TEST_ASSERT( mbedtls_cipher_get_key_bitlen( &invalid_ctx ) ==
130 MBEDTLS_KEY_LENGTH_NONE );
131
132 /* mbedtls_cipher_get_operation() */
133 TEST_ASSERT( mbedtls_cipher_get_operation( &invalid_ctx ) ==
134 MBEDTLS_OPERATION_NONE );
135
136 /* mbedtls_cipher_setkey() */
137 TEST_ASSERT(
138 mbedtls_cipher_setkey( &invalid_ctx,
139 valid_buffer,
140 valid_bitlen,
141 valid_operation ) ==
142 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
143
144 /* mbedtls_cipher_set_iv() */
145 TEST_ASSERT(
146 mbedtls_cipher_set_iv( &invalid_ctx,
147 valid_buffer,
148 valid_size ) ==
149 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
150
151 /* mbedtls_cipher_reset() */
152 TEST_ASSERT( mbedtls_cipher_reset( &invalid_ctx ) ==
153 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200154
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200155#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500156 /* mbedtls_cipher_update_ad() */
157 TEST_ASSERT(
158 mbedtls_cipher_update_ad( &invalid_ctx,
159 valid_buffer,
160 valid_size ) ==
161 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
162#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
163
164#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
165 /* mbedtls_cipher_set_padding_mode() */
166 TEST_ASSERT( mbedtls_cipher_set_padding_mode( &invalid_ctx, valid_mode ) ==
167 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200168#endif
169
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500170 /* mbedtls_cipher_update() */
171 TEST_ASSERT(
172 mbedtls_cipher_update( &invalid_ctx,
173 valid_buffer,
174 valid_size,
175 valid_buffer,
176 &size_t_var ) ==
177 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200178
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500179 /* mbedtls_cipher_finish() */
180 TEST_ASSERT(
181 mbedtls_cipher_finish( &invalid_ctx,
182 valid_buffer,
183 &size_t_var ) ==
184 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200185
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200186#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500187 /* mbedtls_cipher_write_tag() */
188 TEST_ASSERT(
189 mbedtls_cipher_write_tag( &invalid_ctx,
190 valid_buffer,
191 valid_size ) ==
192 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200193
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500194 /* mbedtls_cipher_check_tag() */
195 TEST_ASSERT(
196 mbedtls_cipher_check_tag( &invalid_ctx,
197 valid_buffer,
198 valid_size ) ==
199 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
200#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
201
202exit:
203 mbedtls_cipher_free( &invalid_ctx );
204 mbedtls_cipher_free( &valid_ctx );
205}
206/* END_CASE */
207
208/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
209void cipher_invalid_param_conditional( )
210{
211 mbedtls_cipher_context_t valid_ctx;
212
213 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
214 mbedtls_operation_t invalid_operation = 100;
215 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
216 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
217 int valid_size = sizeof(valid_buffer);
218 int valid_bitlen = valid_size * 8;
219 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
220 *( mbedtls_cipher_list() ) );
221
222 size_t size_t_var;
223
224 (void)valid_mode; /* In some configurations this is unused */
225
226 /* mbedtls_cipher_init() */
227 TEST_VALID_PARAM( mbedtls_cipher_init( &valid_ctx ) );
228 TEST_INVALID_PARAM( mbedtls_cipher_init( NULL ) );
229
230 /* mbedtls_cipher_setup() */
231 TEST_VALID_PARAM( mbedtls_cipher_setup( &valid_ctx, valid_info ) );
232 TEST_INVALID_PARAM_RET(
233 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
234 mbedtls_cipher_setup( NULL, valid_info ) );
235
236 /* mbedtls_cipher_get_block_size() */
237 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_block_size( NULL ) );
238
239 /* mbedtls_cipher_get_cipher_mode() */
240 TEST_INVALID_PARAM_RET(
241 MBEDTLS_MODE_NONE,
242 mbedtls_cipher_get_cipher_mode( NULL ) );
243
244 /* mbedtls_cipher_get_iv_size() */
245 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_iv_size( NULL ) );
246
247 /* mbedtls_cipher_get_type() */
248 TEST_INVALID_PARAM_RET(
249 MBEDTLS_CIPHER_NONE,
250 mbedtls_cipher_get_type( NULL ) );
251
252 /* mbedtls_cipher_get_name() */
253 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_name( NULL ) );
254
255 /* mbedtls_cipher_get_key_bitlen() */
256 TEST_INVALID_PARAM_RET(
257 MBEDTLS_KEY_LENGTH_NONE,
258 mbedtls_cipher_get_key_bitlen( NULL ) );
259
260 /* mbedtls_cipher_get_operation() */
261 TEST_INVALID_PARAM_RET(
262 MBEDTLS_OPERATION_NONE,
263 mbedtls_cipher_get_operation( NULL ) );
264
265 /* mbedtls_cipher_setkey() */
266 TEST_INVALID_PARAM_RET(
267 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
268 mbedtls_cipher_setkey( NULL,
269 valid_buffer,
270 valid_bitlen,
271 valid_operation ) );
272 TEST_INVALID_PARAM_RET(
273 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
274 mbedtls_cipher_setkey( &valid_ctx,
275 NULL,
276 valid_bitlen,
277 valid_operation ) );
278 TEST_INVALID_PARAM_RET(
279 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
280 mbedtls_cipher_setkey( &valid_ctx,
281 valid_buffer,
282 valid_bitlen,
283 invalid_operation ) );
284
285 /* mbedtls_cipher_set_iv() */
286 TEST_INVALID_PARAM_RET(
287 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
288 mbedtls_cipher_set_iv( NULL,
289 valid_buffer,
290 valid_size ) );
291 TEST_INVALID_PARAM_RET(
292 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
293 mbedtls_cipher_set_iv( &valid_ctx,
294 NULL,
295 valid_size ) );
296
297 /* mbedtls_cipher_reset() */
298 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
299 mbedtls_cipher_reset( NULL ) );
300
301#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
302 /* mbedtls_cipher_update_ad() */
303 TEST_INVALID_PARAM_RET(
304 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
305 mbedtls_cipher_update_ad( NULL,
306 valid_buffer,
307 valid_size ) );
308 TEST_INVALID_PARAM_RET(
309 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
310 mbedtls_cipher_update_ad( &valid_ctx,
311 NULL,
312 valid_size ) );
313#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
314
315#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
316 /* mbedtls_cipher_set_padding_mode() */
317 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
318 mbedtls_cipher_set_padding_mode( NULL, valid_mode ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200319#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500320
321 /* mbedtls_cipher_update() */
322 TEST_INVALID_PARAM_RET(
323 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
324 mbedtls_cipher_update( NULL,
325 valid_buffer,
326 valid_size,
327 valid_buffer,
328 &size_t_var ) );
329 TEST_INVALID_PARAM_RET(
330 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
331 mbedtls_cipher_update( &valid_ctx,
332 NULL, valid_size,
333 valid_buffer,
334 &size_t_var ) );
335 TEST_INVALID_PARAM_RET(
336 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
337 mbedtls_cipher_update( &valid_ctx,
338 valid_buffer, valid_size,
339 NULL,
340 &size_t_var ) );
341 TEST_INVALID_PARAM_RET(
342 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
343 mbedtls_cipher_update( &valid_ctx,
344 valid_buffer, valid_size,
345 valid_buffer,
346 NULL ) );
347
348 /* mbedtls_cipher_finish() */
349 TEST_INVALID_PARAM_RET(
350 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
351 mbedtls_cipher_finish( NULL,
352 valid_buffer,
353 &size_t_var ) );
354 TEST_INVALID_PARAM_RET(
355 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
356 mbedtls_cipher_finish( &valid_ctx,
357 NULL,
358 &size_t_var ) );
359 TEST_INVALID_PARAM_RET(
360 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
361 mbedtls_cipher_finish( &valid_ctx,
362 valid_buffer,
363 NULL ) );
364
365#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
366 /* mbedtls_cipher_write_tag() */
367 TEST_INVALID_PARAM_RET(
368 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
369 mbedtls_cipher_write_tag( NULL,
370 valid_buffer,
371 valid_size ) );
372 TEST_INVALID_PARAM_RET(
373 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
374 mbedtls_cipher_write_tag( &valid_ctx,
375 NULL,
376 valid_size ) );
377
378 /* mbedtls_cipher_check_tag() */
379 TEST_INVALID_PARAM_RET(
380 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
381 mbedtls_cipher_check_tag( NULL,
382 valid_buffer,
383 valid_size ) );
384 TEST_INVALID_PARAM_RET(
385 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
386 mbedtls_cipher_check_tag( &valid_ctx,
387 NULL,
388 valid_size ) );
389#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
390
391 /* mbedtls_cipher_crypt() */
392 TEST_INVALID_PARAM_RET(
393 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
394 mbedtls_cipher_crypt( NULL,
395 valid_buffer, valid_size,
396 valid_buffer, valid_size,
397 valid_buffer, &size_t_var ) );
398 TEST_INVALID_PARAM_RET(
399 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
400 mbedtls_cipher_crypt( &valid_ctx,
401 NULL, valid_size,
402 valid_buffer, valid_size,
403 valid_buffer, &size_t_var ) );
404 TEST_INVALID_PARAM_RET(
405 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
406 mbedtls_cipher_crypt( &valid_ctx,
407 valid_buffer, valid_size,
408 NULL, valid_size,
409 valid_buffer, &size_t_var ) );
410 TEST_INVALID_PARAM_RET(
411 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
412 mbedtls_cipher_crypt( &valid_ctx,
413 valid_buffer, valid_size,
414 valid_buffer, valid_size,
415 NULL, &size_t_var ) );
416 TEST_INVALID_PARAM_RET(
417 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
418 mbedtls_cipher_crypt( &valid_ctx,
419 valid_buffer, valid_size,
420 valid_buffer, valid_size,
421 valid_buffer, NULL ) );
422
423#if defined(MBEDTLS_CIPHER_MODE_AEAD)
424 /* mbedtls_cipher_auth_encrypt() */
425 TEST_INVALID_PARAM_RET(
426 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
427 mbedtls_cipher_auth_encrypt( NULL,
428 valid_buffer, valid_size,
429 valid_buffer, valid_size,
430 valid_buffer, valid_size,
431 valid_buffer, &size_t_var,
432 valid_buffer, valid_size ) );
433 TEST_INVALID_PARAM_RET(
434 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
435 mbedtls_cipher_auth_encrypt( &valid_ctx,
436 NULL, valid_size,
437 valid_buffer, valid_size,
438 valid_buffer, valid_size,
439 valid_buffer, &size_t_var,
440 valid_buffer, valid_size ) );
441 TEST_INVALID_PARAM_RET(
442 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
443 mbedtls_cipher_auth_encrypt( &valid_ctx,
444 valid_buffer, valid_size,
445 NULL, valid_size,
446 valid_buffer, valid_size,
447 valid_buffer, &size_t_var,
448 valid_buffer, valid_size ) );
449 TEST_INVALID_PARAM_RET(
450 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
451 mbedtls_cipher_auth_encrypt( &valid_ctx,
452 valid_buffer, valid_size,
453 valid_buffer, valid_size,
454 NULL, valid_size,
455 valid_buffer, &size_t_var,
456 valid_buffer, valid_size ) );
457 TEST_INVALID_PARAM_RET(
458 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
459 mbedtls_cipher_auth_encrypt( &valid_ctx,
460 valid_buffer, valid_size,
461 valid_buffer, valid_size,
462 valid_buffer, valid_size,
463 NULL, &size_t_var,
464 valid_buffer, valid_size ) );
465 TEST_INVALID_PARAM_RET(
466 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
467 mbedtls_cipher_auth_encrypt( &valid_ctx,
468 valid_buffer, valid_size,
469 valid_buffer, valid_size,
470 valid_buffer, valid_size,
471 valid_buffer, NULL,
472 valid_buffer, valid_size ) );
473 TEST_INVALID_PARAM_RET(
474 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
475 mbedtls_cipher_auth_encrypt( &valid_ctx,
476 valid_buffer, valid_size,
477 valid_buffer, valid_size,
478 valid_buffer, valid_size,
479 valid_buffer, &size_t_var,
480 NULL, valid_size ) );
481
482 /* mbedtls_cipher_auth_decrypt() */
483 TEST_INVALID_PARAM_RET(
484 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
485 mbedtls_cipher_auth_decrypt( NULL,
486 valid_buffer, valid_size,
487 valid_buffer, valid_size,
488 valid_buffer, valid_size,
489 valid_buffer, &size_t_var,
490 valid_buffer, valid_size ) );
491 TEST_INVALID_PARAM_RET(
492 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
493 mbedtls_cipher_auth_decrypt( &valid_ctx,
494 NULL, valid_size,
495 valid_buffer, valid_size,
496 valid_buffer, valid_size,
497 valid_buffer, &size_t_var,
498 valid_buffer, valid_size ) );
499 TEST_INVALID_PARAM_RET(
500 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
501 mbedtls_cipher_auth_decrypt( &valid_ctx,
502 valid_buffer, valid_size,
503 NULL, valid_size,
504 valid_buffer, valid_size,
505 valid_buffer, &size_t_var,
506 valid_buffer, valid_size ) );
507 TEST_INVALID_PARAM_RET(
508 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
509 mbedtls_cipher_auth_decrypt( &valid_ctx,
510 valid_buffer, valid_size,
511 valid_buffer, valid_size,
512 NULL, valid_size,
513 valid_buffer, &size_t_var,
514 valid_buffer, valid_size ) );
515 TEST_INVALID_PARAM_RET(
516 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
517 mbedtls_cipher_auth_decrypt( &valid_ctx,
518 valid_buffer, valid_size,
519 valid_buffer, valid_size,
520 valid_buffer, valid_size,
521 NULL, &size_t_var,
522 valid_buffer, valid_size ) );
523 TEST_INVALID_PARAM_RET(
524 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
525 mbedtls_cipher_auth_decrypt( &valid_ctx,
526 valid_buffer, valid_size,
527 valid_buffer, valid_size,
528 valid_buffer, valid_size,
529 valid_buffer, NULL,
530 valid_buffer, valid_size ) );
531 TEST_INVALID_PARAM_RET(
532 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
533 mbedtls_cipher_auth_decrypt( &valid_ctx,
534 valid_buffer, valid_size,
535 valid_buffer, valid_size,
536 valid_buffer, valid_size,
537 valid_buffer, &size_t_var,
538 NULL, valid_size ) );
539#endif /* defined(MBEDTLS_CIPHER_MODE_AEAD) */
540
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100541#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
542 /* mbedtls_cipher_auth_encrypt_ext */
543 TEST_INVALID_PARAM_RET(
544 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
545 mbedtls_cipher_auth_encrypt_ext( NULL,
546 valid_buffer, valid_size,
547 valid_buffer, valid_size,
548 valid_buffer, valid_size,
549 valid_buffer, valid_size, &size_t_var,
550 valid_size ) );
551 TEST_INVALID_PARAM_RET(
552 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
553 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
554 NULL, valid_size,
555 valid_buffer, valid_size,
556 valid_buffer, valid_size,
557 valid_buffer, valid_size, &size_t_var,
558 valid_size ) );
559 TEST_INVALID_PARAM_RET(
560 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
561 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
562 valid_buffer, valid_size,
563 NULL, valid_size,
564 valid_buffer, valid_size,
565 valid_buffer, valid_size, &size_t_var,
566 valid_size ) );
567 TEST_INVALID_PARAM_RET(
568 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
569 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
570 valid_buffer, valid_size,
571 valid_buffer, valid_size,
572 NULL, valid_size,
573 valid_buffer, valid_size, &size_t_var,
574 valid_size ) );
575 TEST_INVALID_PARAM_RET(
576 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
577 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
578 valid_buffer, valid_size,
579 valid_buffer, valid_size,
580 valid_buffer, valid_size,
581 NULL, valid_size, &size_t_var,
582 valid_size ) );
583 TEST_INVALID_PARAM_RET(
584 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
585 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
586 valid_buffer, valid_size,
587 valid_buffer, valid_size,
588 valid_buffer, valid_size,
589 valid_buffer, valid_size, NULL,
590 valid_size ) );
591
592 /* mbedtls_cipher_auth_decrypt_ext */
593 TEST_INVALID_PARAM_RET(
594 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
595 mbedtls_cipher_auth_decrypt_ext( NULL,
596 valid_buffer, valid_size,
597 valid_buffer, valid_size,
598 valid_buffer, valid_size,
599 valid_buffer, valid_size, &size_t_var,
600 valid_size ) );
601 TEST_INVALID_PARAM_RET(
602 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
603 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
604 NULL, valid_size,
605 valid_buffer, valid_size,
606 valid_buffer, valid_size,
607 valid_buffer, valid_size, &size_t_var,
608 valid_size ) );
609 TEST_INVALID_PARAM_RET(
610 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
611 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
612 valid_buffer, valid_size,
613 NULL, valid_size,
614 valid_buffer, valid_size,
615 valid_buffer, valid_size, &size_t_var,
616 valid_size ) );
617 TEST_INVALID_PARAM_RET(
618 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
619 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
620 valid_buffer, valid_size,
621 valid_buffer, valid_size,
622 NULL, valid_size,
623 valid_buffer, valid_size, &size_t_var,
624 valid_size ) );
625 TEST_INVALID_PARAM_RET(
626 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
627 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
628 valid_buffer, valid_size,
629 valid_buffer, valid_size,
630 valid_buffer, valid_size,
631 NULL, valid_size, &size_t_var,
632 valid_size ) );
633 TEST_INVALID_PARAM_RET(
634 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
635 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
636 valid_buffer, valid_size,
637 valid_buffer, valid_size,
638 valid_buffer, valid_size,
639 valid_buffer, valid_size, NULL,
640 valid_size ) );
641#endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */
642
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500643 /* mbedtls_cipher_free() */
644 TEST_VALID_PARAM( mbedtls_cipher_free( NULL ) );
645exit:
646 TEST_VALID_PARAM( mbedtls_cipher_free( &valid_ctx ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200647}
648/* END_CASE */
649
Paul Bakker6a9c7252016-07-14 13:46:10 +0100650/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Azim Khanf1aaec92017-05-30 14:23:15 +0100651void cipher_special_behaviours( )
Paul Bakker6a9c7252016-07-14 13:46:10 +0100652{
653 const mbedtls_cipher_info_t *cipher_info;
654 mbedtls_cipher_context_t ctx;
655 unsigned char input[32];
656 unsigned char output[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300657#if defined (MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100658 unsigned char iv[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300659#endif
Paul Bakker6a9c7252016-07-14 13:46:10 +0100660 size_t olen = 0;
661
662 mbedtls_cipher_init( &ctx );
663 memset( input, 0, sizeof( input ) );
664 memset( output, 0, sizeof( output ) );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300665#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100666 memset( iv, 0, sizeof( iv ) );
667
668 /* Check and get info structures */
Ron Eldor7b012442017-09-25 17:03:12 +0300669 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_CBC );
Paul Bakker6a9c7252016-07-14 13:46:10 +0100670 TEST_ASSERT( NULL != cipher_info );
671
672 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
673
674 /* IV too big */
675 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, MBEDTLS_MAX_IV_LENGTH + 1 )
676 == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
677
678 /* IV too small */
679 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, 0 )
680 == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
681
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300682 mbedtls_cipher_free( &ctx );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300683 mbedtls_cipher_init( &ctx );
Ron Eldor6f90ed82017-09-26 12:08:54 +0300684#endif /* MBEDTLS_CIPHER_MODE_CBC */
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300685 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
Ron Eldor7b012442017-09-25 17:03:12 +0300686 TEST_ASSERT( NULL != cipher_info );
687
688 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
689
Paul Bakker6a9c7252016-07-14 13:46:10 +0100690 /* Update ECB with partial block */
691 TEST_ASSERT( mbedtls_cipher_update( &ctx, input, 1, output, &olen )
692 == MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
693
694exit:
695 mbedtls_cipher_free( &ctx );
696}
697/* END_CASE */
698
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200699/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100700void enc_dec_buf( int cipher_id, char * cipher_string, int key_len,
Paul Bakker33b43f12013-08-20 11:48:36 +0200701 int length_val, int pad_mode )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200702{
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100703 size_t length = length_val, outlen, total_len, i, block_size, iv_len;
Jaeden Amerod906b812018-06-08 11:03:16 +0100704 unsigned char key[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000705 unsigned char iv[16];
Manuel Pégourié-Gonnard9241be72013-08-31 17:31:03 +0200706 unsigned char ad[13];
707 unsigned char tag[16];
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200708 unsigned char inbuf[64];
709 unsigned char encbuf[64];
710 unsigned char decbuf[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000711
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 const mbedtls_cipher_info_t *cipher_info;
713 mbedtls_cipher_context_t ctx_dec;
714 mbedtls_cipher_context_t ctx_enc;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000715
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200716 /*
717 * Prepare contexts
718 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200719 mbedtls_cipher_init( &ctx_dec );
720 mbedtls_cipher_init( &ctx_enc );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200721
722 memset( key, 0x2a, sizeof( key ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000723
724 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200725 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000726 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727 TEST_ASSERT( mbedtls_cipher_info_from_string( cipher_string ) == cipher_info );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000728
729 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200730 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
731 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200732
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200733 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
734 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000735
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Paul Bakker33b43f12013-08-20 11:48:36 +0200737 if( -1 != pad_mode )
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200738 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739 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 */
749 for( i = 0; i < 3; i++ )
750 {
751 memset( iv , 0x00 + i, sizeof( iv ) );
752 memset( ad, 0x10 + i, sizeof( ad ) );
753 memset( inbuf, 0x20 + i, sizeof( inbuf ) );
754
755 memset( encbuf, 0, sizeof( encbuf ) );
756 memset( decbuf, 0, sizeof( decbuf ) );
757 memset( tag, 0, sizeof( tag ) );
758
Andrzej Kurekd3530432021-12-02 09:31:58 +0100759 if( cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ||
760 cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 )
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100761 iv_len = 12;
762 else
763 iv_len = sizeof(iv);
764
765 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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768 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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200772 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
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200776 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
777 TEST_ASSERT( block_size != 0 );
778
Paul Bakker8123e9d2011-01-06 15:37:30 +0000779 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200780 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200781 total_len = outlen;
782
783 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200784 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200785 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200786 total_len + block_size > length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000787
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200788 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200789 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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200792 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
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200795 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200796 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200797 total_len > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200798 total_len <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000799
800 /* decode the previously encoded string */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200801 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, total_len, decbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200802 total_len = outlen;
803
804 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200805 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200806 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200807 total_len + block_size >= length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000808
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200810 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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200813 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
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200816 /* check result */
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200817 TEST_ASSERT( total_len == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000818 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:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200825 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 */
Azim Khanf1aaec92017-05-30 14:23:15 +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
846 memset( key, 0, 32 );
847 memset( iv , 0, 16 );
848
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200850
851 memset( inbuf, 5, 64 );
852 memset( encbuf, 0, 64 );
853
854 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200855 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200856 TEST_ASSERT( NULL != cipher_info );
857
858 /* Initialise context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200859 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200860 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, key_len, MBEDTLS_ENCRYPT ) );
861#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
862 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 */
866 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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869 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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 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:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200878 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 */
k-stachowiakd8727232019-07-29 17:46:29 +0200883void 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
899 memset( key, 0, 32 );
900 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200901
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200902 mbedtls_cipher_init( &ctx_dec );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200903
Paul Bakker8123e9d2011-01-06 15:37:30 +0000904 memset( encbuf, 0, 64 );
905 memset( decbuf, 0, 64 );
906
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200907 /* Initialise context */
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100908 cipher_info = mbedtls_cipher_info_from_type( cipher );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000909 TEST_ASSERT( NULL != cipher_info);
Andrzej Kurekd3530432021-12-02 09:31:58 +0100910
911 if( cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ||
912 cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 )
913 iv_len = 12;
914
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100915 TEST_ASSERT( sizeof(key) * 8 >= cipher_info->key_bitlen );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200916
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200917 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000918
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100919 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec,
920 key, cipher_info->key_bitlen,
921 MBEDTLS_DECRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000922
Andrzej Kurekd3530432021-12-02 09:31:58 +0100923 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, iv_len ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200924
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200925 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200926
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200927#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200929#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000930
931 /* decode 0-byte string */
k-stachowiakd8727232019-07-29 17:46:29 +0200932 TEST_ASSERT( expected_update_ret ==
933 mbedtls_cipher_update( &ctx_dec, encbuf, 0, decbuf, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000934 TEST_ASSERT( 0 == outlen );
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100935
k-stachowiakd8727232019-07-29 17:46:29 +0200936 if ( expected_finish_ret == 0 &&
937 ( cipher_info->mode == MBEDTLS_MODE_CBC ||
938 cipher_info->mode == MBEDTLS_MODE_ECB ) )
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100939 {
940 /* 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
k-stachowiakd8727232019-07-29 17:46:29 +0200948 TEST_ASSERT( expected_finish_ret == mbedtls_cipher_finish(
949 &ctx_dec, decbuf + outlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000950 TEST_ASSERT( 0 == outlen );
951
Paul Bakkerbd51b262014-07-10 15:26:12 +0200952exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 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 */
958void enc_dec_buf_multipart( int cipher_id, int key_len, int first_length_val,
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700959 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
981 memset( key, 0, 32 );
982 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200983
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200984 mbedtls_cipher_init( &ctx_dec );
985 mbedtls_cipher_init( &ctx_enc );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200986
Paul Bakker8123e9d2011-01-06 15:37:30 +0000987 memset( inbuf, 5, 64 );
988 memset( encbuf, 0, 64 );
989 memset( decbuf, 0, 64 );
990
991 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000993 TEST_ASSERT( NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200994
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200995 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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200998 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)
1002 if( -1 != pad_mode )
1003 {
1004 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
1005 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
1006 }
1007#else
1008 (void) pad_mode;
1009#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
1010
Andrzej Kurekd3530432021-12-02 09:31:58 +01001011 if( cipher_info->type == MBEDTLS_CIPHER_CHACHA20 ||
1012 cipher_info->type == MBEDTLS_CIPHER_CHACHA20_POLY1305 )
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001013 iv_len = 12;
1014 else
1015 iv_len = sizeof(iv);
1016
1017 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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001020 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)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001024 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
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001028 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
1029 TEST_ASSERT( block_size != 0 );
1030
Paul Bakker8123e9d2011-01-06 15:37:30 +00001031 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, first_length, encbuf, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001033 TEST_ASSERT( (size_t)first_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001034 totaloutlen = outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf + first_length, second_length, encbuf + totaloutlen, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001036 TEST_ASSERT( (size_t)second_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001037 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001038 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001039 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001040 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001041 totaloutlen + block_size > length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001042
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + totaloutlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001044 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001045 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001046 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001047 totaloutlen > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001048 totaloutlen <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001049
1050 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001051 second_length = totaloutlen - first_length;
1052 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, first_length, decbuf, &outlen ) );
1053 TEST_ASSERT( (size_t)first_decrypt_output_len == outlen );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001054 totaloutlen = outlen;
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001055 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf + first_length, second_length, decbuf + totaloutlen, &outlen ) );
1056 TEST_ASSERT( (size_t)second_decrypt_output_len == outlen );
1057 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001058
1059 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001060 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001061 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001062 totaloutlen + block_size >= length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001063
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001064 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + totaloutlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001065 totaloutlen += outlen;
1066
1067 TEST_ASSERT( totaloutlen == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001068
1069 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
1070
Paul Bakkerbd51b262014-07-10 15:26:12 +02001071exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001072 mbedtls_cipher_free( &ctx_dec );
1073 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001074}
Paul Bakker33b43f12013-08-20 11:48:36 +02001075/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001076
Paul Bakker33b43f12013-08-20 11:48:36 +02001077/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001078void decrypt_test_vec( int cipher_id, int pad_mode, data_t * key,
1079 data_t * iv, data_t * cipher,
1080 data_t * clear, data_t * ad, data_t * tag,
Azim Khand30ca132017-06-09 04:32:58 +01001081 int finish_result, int tag_result )
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001082{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +02001083 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001084 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001085 size_t outlen, total_len;
1086
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001087 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001088
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001089 memset( output, 0x00, sizeof( output ) );
1090
Azim Khanf1aaec92017-05-30 14:23:15 +01001091#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mohammad Azim Khancf32c452017-06-13 14:55:58 +01001092 ((void) ad);
1093 ((void) tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +02001094#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001095
1096 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001097 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098 mbedtls_cipher_info_from_type( cipher_id ) ) );
Azim Khand30ca132017-06-09 04:32:58 +01001099 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001100#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001101 if( pad_mode != -1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +02001103#else
1104 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001105#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Azim Khand30ca132017-06-09 04:32:58 +01001106 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv->x, iv->len ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001108#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +01001109 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, ad->x, ad->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001110#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001111
Azim Khand30ca132017-06-09 04:32:58 +01001112 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001113 total_len = 0;
Azim Khand30ca132017-06-09 04:32:58 +01001114 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, cipher->x, cipher->len, output, &outlen ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001115 total_len += outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001116 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001117 &outlen ) );
1118 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001119#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +01001120 TEST_ASSERT( tag_result == mbedtls_cipher_check_tag( &ctx, tag->x, tag->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001121#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001122
1123 /* check plaintext only if everything went fine */
1124 if( 0 == finish_result && 0 == tag_result )
1125 {
Azim Khand30ca132017-06-09 04:32:58 +01001126 TEST_ASSERT( total_len == clear->len );
1127 TEST_ASSERT( 0 == memcmp( output, clear->x, clear->len ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001128 }
1129
Paul Bakkerbd51b262014-07-10 15:26:12 +02001130exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001131 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001132}
1133/* END_CASE */
1134
Przemek Stekiel802353c2022-10-06 12:10:53 +02001135/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_AUTH_CRYPT:MBEDTLS_CIPHER_MODE_AEAD */
Azim Khan5fcca462018-06-29 11:05:32 +01001136void auth_crypt_tv( int cipher_id, data_t * key, data_t * iv,
1137 data_t * ad, data_t * cipher, data_t * tag,
Hanno Beckera13272d2018-11-12 16:27:30 +00001138 char * result, data_t * clear, int use_psa )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001139{
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001140 /*
1141 * Take an AEAD ciphertext + tag and perform a pair
1142 * of AEAD decryption and AEAD encryption. Check that
Hanno Beckera13272d2018-11-12 16:27:30 +00001143 * this results in the expected plaintext, and that
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001144 * decryption and encryption are inverse to one another.
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001145 *
1146 * Do that twice:
1147 * - once with legacy functions auth_decrypt/auth_encrypt
1148 * - once with new functions auth_decrypt_ext/auth_encrypt_ext
1149 * This allows testing both without duplicating test cases.
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001150 */
Hanno Beckera13272d2018-11-12 16:27:30 +00001151
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001152 int ret;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001153 int using_nist_kw, using_nist_kw_padding;
Hanno Beckera13272d2018-11-12 16:27:30 +00001154
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001155 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001156 size_t outlen;
1157
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001158 unsigned char *cipher_plus_tag = NULL;
1159 size_t cipher_plus_tag_len;
1160 unsigned char *decrypt_buf = NULL;
1161 size_t decrypt_buf_len = 0;
1162 unsigned char *encrypt_buf = NULL;
1163 size_t encrypt_buf_len = 0;
1164
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001165#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1166 !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001167 unsigned char *tmp_tag = NULL;
1168 unsigned char *tmp_cipher = NULL;
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001169 unsigned char *tag_buf = NULL;
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001170#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1171
Gilles Peskine70edd682020-12-03 20:27:27 +01001172 /* Null pointers are documented as valid for inputs of length 0.
1173 * The test framework passes non-null pointers, so set them to NULL.
1174 * key, cipher and tag can't be empty. */
1175 if( iv->len == 0 )
1176 iv->x = NULL;
1177 if( ad->len == 0 )
1178 ad->x = NULL;
1179 if( clear->len == 0 )
1180 clear->x = NULL;
1181
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001182 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001183
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001184 /* Initialize PSA Crypto */
1185#if defined(MBEDTLS_USE_PSA_CRYPTO)
1186 if( use_psa == 1 )
1187 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckera13272d2018-11-12 16:27:30 +00001188#else
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001189 (void) use_psa;
1190#endif
1191
1192 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001193 * Are we using NIST_KW? with padding?
1194 */
1195 using_nist_kw_padding = cipher_id == MBEDTLS_CIPHER_AES_128_KWP ||
1196 cipher_id == MBEDTLS_CIPHER_AES_192_KWP ||
1197 cipher_id == MBEDTLS_CIPHER_AES_256_KWP;
1198 using_nist_kw = cipher_id == MBEDTLS_CIPHER_AES_128_KW ||
1199 cipher_id == MBEDTLS_CIPHER_AES_192_KW ||
1200 cipher_id == MBEDTLS_CIPHER_AES_256_KW ||
1201 using_nist_kw_padding;
1202
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001203 /****************************************************************
1204 * *
1205 * Part 1: non-deprecated API *
1206 * *
1207 ****************************************************************/
1208
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001209 /*
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001210 * Prepare context for decryption
1211 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001212 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1213 MBEDTLS_DECRYPT ) )
1214 goto exit;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001215
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001216 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001217 * prepare buffer for decryption
1218 * (we need the tag appended to the ciphertext)
1219 */
1220 cipher_plus_tag_len = cipher->len + tag->len;
1221 ASSERT_ALLOC( cipher_plus_tag, cipher_plus_tag_len );
1222 memcpy( cipher_plus_tag, cipher->x, cipher->len );
1223 memcpy( cipher_plus_tag + cipher->len, tag->x, tag->len );
1224
1225 /*
1226 * Compute length of output buffer according to the documentation
1227 */
1228 if( using_nist_kw )
1229 decrypt_buf_len = cipher_plus_tag_len - 8;
1230 else
1231 decrypt_buf_len = cipher_plus_tag_len - tag->len;
1232
1233
1234 /*
1235 * Try decrypting to a buffer that's 1B too small
1236 */
1237 if( decrypt_buf_len != 0 )
1238 {
1239 ASSERT_ALLOC( decrypt_buf, decrypt_buf_len - 1 );
1240
1241 outlen = 0;
1242 ret = mbedtls_cipher_auth_decrypt_ext( &ctx, iv->x, iv->len,
1243 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1244 decrypt_buf, decrypt_buf_len - 1, &outlen, tag->len );
1245 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1246
1247 mbedtls_free( decrypt_buf );
1248 decrypt_buf = NULL;
1249 }
1250
1251 /*
1252 * Authenticate and decrypt, and check result
1253 */
1254 ASSERT_ALLOC( decrypt_buf, decrypt_buf_len );
1255
1256 outlen = 0;
1257 ret = mbedtls_cipher_auth_decrypt_ext( &ctx, iv->x, iv->len,
1258 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1259 decrypt_buf, decrypt_buf_len, &outlen, tag->len );
1260
1261 if( strcmp( result, "FAIL" ) == 0 )
1262 {
1263 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +01001264 TEST_ASSERT( buffer_is_all_zero( decrypt_buf, decrypt_buf_len ) );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001265 }
1266 else
1267 {
1268 TEST_ASSERT( ret == 0 );
Gilles Peskinea2971ea2020-12-03 20:36:02 +01001269 ASSERT_COMPARE( decrypt_buf, outlen, clear->x, clear->len );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001270 }
1271
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001272 /* Free this, but keep cipher_plus_tag for deprecated function with PSA */
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001273 mbedtls_free( decrypt_buf );
1274 decrypt_buf = NULL;
1275
1276 /*
1277 * Encrypt back if test data was authentic
1278 */
1279 if( strcmp( result, "FAIL" ) != 0 )
1280 {
1281 /* prepare context for encryption */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001282 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1283 MBEDTLS_ENCRYPT ) )
1284 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001285
1286 /*
1287 * Compute size of output buffer according to documentation
1288 */
1289 if( using_nist_kw )
1290 {
1291 encrypt_buf_len = clear->len + 8;
1292 if( using_nist_kw_padding && encrypt_buf_len % 8 != 0 )
1293 encrypt_buf_len += 8 - encrypt_buf_len % 8;
1294 }
1295 else
1296 {
1297 encrypt_buf_len = clear->len + tag->len;
1298 }
1299
1300 /*
1301 * Try encrypting with an output buffer that's 1B too small
1302 */
1303 ASSERT_ALLOC( encrypt_buf, encrypt_buf_len - 1 );
1304
1305 outlen = 0;
1306 ret = mbedtls_cipher_auth_encrypt_ext( &ctx, iv->x, iv->len,
1307 ad->x, ad->len, clear->x, clear->len,
1308 encrypt_buf, encrypt_buf_len - 1, &outlen, tag->len );
1309 TEST_ASSERT( ret != 0 );
1310
1311 mbedtls_free( encrypt_buf );
1312 encrypt_buf = NULL;
1313
1314 /*
1315 * Encrypt and check the result
1316 */
1317 ASSERT_ALLOC( encrypt_buf, encrypt_buf_len );
1318
1319 outlen = 0;
1320 ret = mbedtls_cipher_auth_encrypt_ext( &ctx, iv->x, iv->len,
1321 ad->x, ad->len, clear->x, clear->len,
1322 encrypt_buf, encrypt_buf_len, &outlen, tag->len );
1323 TEST_ASSERT( ret == 0 );
1324
1325 TEST_ASSERT( outlen == cipher->len + tag->len );
1326 TEST_ASSERT( memcmp( encrypt_buf, cipher->x, cipher->len ) == 0 );
1327 TEST_ASSERT( memcmp( encrypt_buf + cipher->len,
1328 tag->x, tag->len ) == 0 );
1329
1330 mbedtls_free( encrypt_buf );
1331 encrypt_buf = NULL;
1332 }
1333
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001334 /****************************************************************
1335 * *
1336 * Part 2: deprecated API *
1337 * *
1338 ****************************************************************/
1339
1340#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1341 !defined(MBEDTLS_DEPRECATED_REMOVED)
1342
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001343 /*
1344 * Prepare context for decryption
1345 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001346 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1347 MBEDTLS_DECRYPT ) )
1348 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001349
1350 /*
1351 * Prepare pointers for decryption
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001352 */
1353#if defined(MBEDTLS_USE_PSA_CRYPTO)
1354 if( use_psa == 1 )
1355 {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001356 /* PSA requires that the tag immediately follows the ciphertext.
1357 * Fortunately, we already have that from testing the new API. */
1358 tmp_cipher = cipher_plus_tag;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001359 tmp_tag = tmp_cipher + cipher->len;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001360 }
1361 else
1362#endif /* MBEDTLS_USE_PSA_CRYPTO */
1363 {
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001364 tmp_cipher = cipher->x;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001365 tmp_tag = tag->x;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001366 }
1367
1368 /*
1369 * Authenticate and decrypt, and check result
1370 */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001371
Gilles Peskine70edd682020-12-03 20:27:27 +01001372 ASSERT_ALLOC( decrypt_buf, cipher->len );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001373 outlen = 0;
Hanno Beckera13272d2018-11-12 16:27:30 +00001374 ret = mbedtls_cipher_auth_decrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001375 tmp_cipher, cipher->len, decrypt_buf, &outlen,
Hanno Beckera13272d2018-11-12 16:27:30 +00001376 tmp_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001377
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001378 if( using_nist_kw )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001379 {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001380 /* NIST_KW with legacy API */
1381 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
1382 }
1383 else if( strcmp( result, "FAIL" ) == 0 )
1384 {
1385 /* unauthentic message */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001386 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +01001387 TEST_ASSERT( buffer_is_all_zero( decrypt_buf, cipher->len ) );
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001388 }
1389 else
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001390 {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001391 /* authentic message: is the plaintext correct? */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001392 TEST_ASSERT( ret == 0 );
Gilles Peskinea2971ea2020-12-03 20:36:02 +01001393 ASSERT_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
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001396 mbedtls_free( decrypt_buf );
1397 decrypt_buf = NULL;
1398 mbedtls_free( cipher_plus_tag );
1399 cipher_plus_tag = NULL;
1400
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001401 /*
1402 * Encrypt back if test data was authentic
1403 */
1404 if( strcmp( result, "FAIL" ) != 0 )
1405 {
1406 /* prepare context for encryption */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001407 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1408 MBEDTLS_ENCRYPT ) )
1409 goto exit;
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)
1413 if( use_psa )
1414 {
1415 ASSERT_ALLOC( cipher_plus_tag, cipher->len + tag->len );
1416 tmp_cipher = cipher_plus_tag;
1417 tmp_tag = cipher_plus_tag + cipher->len;
1418 }
1419 else
1420#endif /* MBEDTLS_USE_PSA_CRYPTO */
1421 {
Gilles Peskine70edd682020-12-03 20:27:27 +01001422 ASSERT_ALLOC( encrypt_buf, cipher->len );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001423 ASSERT_ALLOC( tag_buf, tag->len );
1424 tmp_cipher = encrypt_buf;
1425 tmp_tag = tag_buf;
1426 }
1427
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001428 /*
1429 * Encrypt and check the result
1430 */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001431 outlen = 0;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001432 ret = mbedtls_cipher_auth_encrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001433 clear->x, clear->len, tmp_cipher, &outlen,
1434 tmp_tag, tag->len );
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001435
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001436 if( using_nist_kw )
1437 {
1438 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
1439 }
1440 else
1441 {
1442 TEST_ASSERT( ret == 0 );
1443
1444 TEST_ASSERT( outlen == cipher->len );
Gilles Peskine70edd682020-12-03 20:27:27 +01001445 if( cipher->len != 0 )
1446 TEST_ASSERT( memcmp( tmp_cipher, cipher->x, cipher->len ) == 0 );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001447 TEST_ASSERT( memcmp( tmp_tag, tag->x, tag->len ) == 0 );
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001448 }
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001449 }
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001450
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001451#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1452
Paul Bakkerbd51b262014-07-10 15:26:12 +02001453exit:
Hanno Beckera13272d2018-11-12 16:27:30 +00001454
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001455 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001456 mbedtls_free( decrypt_buf );
1457 mbedtls_free( encrypt_buf );
1458 mbedtls_free( cipher_plus_tag );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001459#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1460 !defined(MBEDTLS_DEPRECATED_REMOVED)
1461 mbedtls_free( tag_buf );
1462#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001463
Hanno Beckera13272d2018-11-12 16:27:30 +00001464#if defined(MBEDTLS_USE_PSA_CRYPTO)
1465 if( use_psa == 1 )
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001466 PSA_DONE( );
Hanno Beckera13272d2018-11-12 16:27:30 +00001467#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001468}
1469/* END_CASE */
1470
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001471/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001472void test_vec_ecb( int cipher_id, int operation, data_t * key,
1473 data_t * input, data_t * result, int finish_result
Azim Khand30ca132017-06-09 04:32:58 +01001474 )
Paul Bakker5e0efa72013-09-08 23:04:04 +02001475{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001476 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +02001477 unsigned char output[32];
1478 size_t outlen;
1479
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001480 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001481
Paul Bakker5e0efa72013-09-08 23:04:04 +02001482 memset( output, 0x00, sizeof( output ) );
1483
1484 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001485 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001486 mbedtls_cipher_info_from_type( cipher_id ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001487
Paul Bakker5e0efa72013-09-08 23:04:04 +02001488
Azim Khand30ca132017-06-09 04:32:58 +01001489 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001490
Azim Khand30ca132017-06-09 04:32:58 +01001491 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, input->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492 mbedtls_cipher_get_block_size( &ctx ),
Paul Bakker5e0efa72013-09-08 23:04:04 +02001493 output, &outlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001494 TEST_ASSERT( outlen == mbedtls_cipher_get_block_size( &ctx ) );
1495 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001496 &outlen ) );
1497 TEST_ASSERT( 0 == outlen );
1498
1499 /* check plaintext only if everything went fine */
1500 if( 0 == finish_result )
Azim Khand30ca132017-06-09 04:32:58 +01001501 TEST_ASSERT( 0 == memcmp( output, result->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001502 mbedtls_cipher_get_block_size( &ctx ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001503
Paul Bakkerbd51b262014-07-10 15:26:12 +02001504exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001505 mbedtls_cipher_free( &ctx );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001506}
1507/* END_CASE */
1508
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001509/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Ronald Cron9ed40732020-06-25 09:03:34 +02001510void test_vec_crypt( int cipher_id, int operation, data_t *key,
1511 data_t *iv, data_t *input, data_t *result,
Hanno Beckere43164e2018-11-12 12:46:35 +00001512 int finish_result, int use_psa )
Ron Eldor7b012442017-09-25 17:03:12 +03001513{
Ron Eldor7b012442017-09-25 17:03:12 +03001514 mbedtls_cipher_context_t ctx;
1515 unsigned char output[32];
1516 size_t outlen;
1517
1518 mbedtls_cipher_init( &ctx );
1519
Ron Eldor7b012442017-09-25 17:03:12 +03001520 memset( output, 0x00, sizeof( output ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001521
1522 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +00001523#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1524 (void) use_psa;
1525#else
1526 if( use_psa == 1 )
1527 {
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001528 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001529 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001530 mbedtls_cipher_info_from_type( cipher_id ), 0 ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001531 }
1532 else
1533#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001534 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001535 mbedtls_cipher_info_from_type( cipher_id ) ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001536
Ronald Cron9ed40732020-06-25 09:03:34 +02001537 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001538 if( MBEDTLS_MODE_CBC == ctx.cipher_info->mode )
1539 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, MBEDTLS_PADDING_NONE ) );
1540
Ronald Cron9ed40732020-06-25 09:03:34 +02001541 TEST_ASSERT( finish_result == mbedtls_cipher_crypt( &ctx, iv->len ? iv->x : NULL,
1542 iv->len, input->x, input->len,
Ron Eldor7b012442017-09-25 17:03:12 +03001543 output, &outlen ) );
Ronald Cron9ed40732020-06-25 09:03:34 +02001544 TEST_ASSERT( result->len == outlen );
Ron Eldor7b012442017-09-25 17:03:12 +03001545 /* check plaintext only if everything went fine */
1546 if( 0 == finish_result )
Ronald Cron9ed40732020-06-25 09:03:34 +02001547 TEST_ASSERT( 0 == memcmp( output, result->x, outlen ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001548
1549exit:
1550 mbedtls_cipher_free( &ctx );
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001551#if defined(MBEDTLS_USE_PSA_CRYPTO)
1552 PSA_DONE( );
1553#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001554}
1555/* END_CASE */
1556
1557/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Paul Bakker33b43f12013-08-20 11:48:36 +02001558void set_padding( int cipher_id, int pad_mode, int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001559{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001560 const mbedtls_cipher_info_t *cipher_info;
1561 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001562
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001563 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001564
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001565 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001566 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001567 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001568
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001569 TEST_ASSERT( ret == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001570
Paul Bakkerbd51b262014-07-10 15:26:12 +02001571exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001572 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001573}
Paul Bakker33b43f12013-08-20 11:48:36 +02001574/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001576/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Azim Khan5fcca462018-06-29 11:05:32 +01001577void check_padding( int pad_mode, data_t * input, int ret, int dlen_check
Azim Khand30ca132017-06-09 04:32:58 +01001578 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001579{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001580 mbedtls_cipher_info_t cipher_info;
1581 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001582 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001583
1584 /* build a fake context just for getting access to get_padding */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001585 mbedtls_cipher_init( &ctx );
1586 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001587 ctx.cipher_info = &cipher_info;
1588
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001589 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001590
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001591
Azim Khand30ca132017-06-09 04:32:58 +01001592 TEST_ASSERT( ret == ctx.get_padding( input->x, input->len, &dlen ) );
Paul Bakker33b43f12013-08-20 11:48:36 +02001593 if( 0 == ret )
1594 TEST_ASSERT( dlen == (size_t) dlen_check );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001595}
Paul Bakker33b43f12013-08-20 11:48:36 +02001596/* END_CASE */
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001597
1598/* BEGIN_CASE */
Thomas Daubney755cb9b2022-03-02 16:49:38 +00001599void iv_len_validity( int cipher_id, char * cipher_string,
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001600 int iv_len_val, int ret )
1601{
1602 size_t iv_len = iv_len_val;
1603 unsigned char iv[16];
1604
Thomas Daubneyac72f9c2022-03-02 16:44:51 +00001605 /* Initialise iv buffer */
1606 memset( iv, 0, sizeof( iv ) );
1607
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001608 const mbedtls_cipher_info_t *cipher_info;
1609 mbedtls_cipher_context_t ctx_dec;
1610 mbedtls_cipher_context_t ctx_enc;
1611
1612 /*
1613 * Prepare contexts
1614 */
1615 mbedtls_cipher_init( &ctx_dec );
1616 mbedtls_cipher_init( &ctx_enc );
1617
1618 /* Check and get info structures */
1619 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
1620 TEST_ASSERT( NULL != cipher_info );
1621 TEST_ASSERT( mbedtls_cipher_info_from_string( cipher_string ) == cipher_info );
1622
1623 /* Initialise enc and dec contexts */
1624 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
1625 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
1626
1627 TEST_ASSERT( ret == mbedtls_cipher_set_iv( &ctx_dec, iv, iv_len ) );
1628 TEST_ASSERT( ret == mbedtls_cipher_set_iv( &ctx_enc, iv, iv_len ) );
1629
1630exit:
1631 mbedtls_cipher_free( &ctx_dec );
1632 mbedtls_cipher_free( &ctx_enc );
1633}
1634/* END_CASE */