blob: 73e548de5de01c098a461b449130844c4889a095 [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/cipher.h"
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +02003
k-stachowiakd8727232019-07-29 17:46:29 +02004#if defined(MBEDTLS_AES_C)
5#include "mbedtls/aes.h"
6#endif
7
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02008#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00009#include "mbedtls/gcm.h"
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +020010#endif
Gilles Peskine5386f6b2019-08-01 12:47:40 +020011
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +010012#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
13#define MBEDTLS_CIPHER_AUTH_CRYPT
14#endif
15
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010016#if defined(MBEDTLS_CIPHER_AUTH_CRYPT)
17/* Helper for resetting key/direction
18 *
19 * The documentation doesn't explicitly say whether calling
20 * mbedtls_cipher_setkey() twice is allowed or not. This currently works with
21 * the default software implementation, but only by accident. It isn't
22 * guaranteed to work with new ciphers or with alternative implementations of
23 * individual ciphers, and it doesn't work with the PSA wrappers. So don't do
24 * it, and instead start with a fresh context.
25 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +010026static int cipher_reset_key( mbedtls_cipher_context_t *ctx, int cipher_id,
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010027 int use_psa, size_t tag_len, const data_t *key, int direction )
28{
29 mbedtls_cipher_free( ctx );
30 mbedtls_cipher_init( ctx );
31
32#if !defined(MBEDTLS_USE_PSA_CRYPTO)
33 (void) use_psa;
34 (void) tag_len;
35#else
36 if( use_psa == 1 )
37 {
38 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( ctx,
39 mbedtls_cipher_info_from_type( cipher_id ),
40 tag_len ) );
41 }
42 else
43#endif /* MBEDTLS_USE_PSA_CRYPTO */
44 {
45 TEST_ASSERT( 0 == mbedtls_cipher_setup( ctx,
46 mbedtls_cipher_info_from_type( cipher_id ) ) );
47 }
48
49 TEST_ASSERT( 0 == mbedtls_cipher_setkey( ctx, key->x, 8 * key->len,
50 direction ) );
Gilles Peskine8a3d2342020-12-03 21:06:15 +010051 return( 1 );
52
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010053exit:
Gilles Peskine8a3d2342020-12-03 21:06:15 +010054 return( 0 );
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010055}
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +010056
57/*
58 * Check if a buffer is all-0 bytes:
59 * return 1 if it is,
60 * 0 if it isn't.
61 */
62int buffer_is_all_zero( const uint8_t *buf, size_t size )
63{
64 for( size_t i = 0; i < size; i++ )
65 if( buf[i] != 0 )
66 return 0;
67 return 1;
68}
Manuel Pégourié-Gonnard89a8fe52020-11-27 09:32:55 +010069#endif /* MBEDTLS_CIPHER_AUTH_CRYPT */
70
Paul Bakker33b43f12013-08-20 11:48:36 +020071/* END_HEADER */
Paul Bakker8123e9d2011-01-06 15:37:30 +000072
Paul Bakker33b43f12013-08-20 11:48:36 +020073/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074 * depends_on:MBEDTLS_CIPHER_C
Paul Bakker33b43f12013-08-20 11:48:36 +020075 * END_DEPENDENCIES
76 */
Paul Bakker5690efc2011-05-26 13:16:06 +000077
Paul Bakker33b43f12013-08-20 11:48:36 +020078/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +010079void mbedtls_cipher_list( )
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010080{
81 const int *cipher_type;
82
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020083 for( cipher_type = mbedtls_cipher_list(); *cipher_type != 0; cipher_type++ )
84 TEST_ASSERT( mbedtls_cipher_info_from_type( *cipher_type ) != NULL );
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010085}
86/* END_CASE */
87
88/* BEGIN_CASE */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050089void cipher_invalid_param_unconditional( )
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020090{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050091 mbedtls_cipher_context_t valid_ctx;
92 mbedtls_cipher_context_t invalid_ctx;
93 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
94 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
95 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
96 int valid_size = sizeof(valid_buffer);
97 int valid_bitlen = valid_size * 8;
98 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
99 *( mbedtls_cipher_list() ) );
100 size_t size_t_var;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200101
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500102 (void)valid_mode; /* In some configurations this is unused */
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200103
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500104 mbedtls_cipher_init( &valid_ctx );
105 mbedtls_cipher_setup( &valid_ctx, valid_info );
106 mbedtls_cipher_init( &invalid_ctx );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200107
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500108 /* mbedtls_cipher_setup() */
109 TEST_ASSERT( mbedtls_cipher_setup( &valid_ctx, NULL ) ==
110 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200111
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500112 /* mbedtls_cipher_get_block_size() */
113 TEST_ASSERT( mbedtls_cipher_get_block_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200114
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500115 /* mbedtls_cipher_get_cipher_mode() */
116 TEST_ASSERT( mbedtls_cipher_get_cipher_mode( &invalid_ctx ) ==
117 MBEDTLS_MODE_NONE );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200118
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500119 /* mbedtls_cipher_get_iv_size() */
120 TEST_ASSERT( mbedtls_cipher_get_iv_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200121
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500122 /* mbedtls_cipher_get_type() */
123 TEST_ASSERT(
124 mbedtls_cipher_get_type( &invalid_ctx ) ==
125 MBEDTLS_CIPHER_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200126
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500127 /* mbedtls_cipher_get_name() */
128 TEST_ASSERT( mbedtls_cipher_get_name( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200129
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500130 /* mbedtls_cipher_get_key_bitlen() */
131 TEST_ASSERT( mbedtls_cipher_get_key_bitlen( &invalid_ctx ) ==
132 MBEDTLS_KEY_LENGTH_NONE );
133
134 /* mbedtls_cipher_get_operation() */
135 TEST_ASSERT( mbedtls_cipher_get_operation( &invalid_ctx ) ==
136 MBEDTLS_OPERATION_NONE );
137
138 /* mbedtls_cipher_setkey() */
139 TEST_ASSERT(
140 mbedtls_cipher_setkey( &invalid_ctx,
141 valid_buffer,
142 valid_bitlen,
143 valid_operation ) ==
144 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
145
146 /* mbedtls_cipher_set_iv() */
147 TEST_ASSERT(
148 mbedtls_cipher_set_iv( &invalid_ctx,
149 valid_buffer,
150 valid_size ) ==
151 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
152
153 /* mbedtls_cipher_reset() */
154 TEST_ASSERT( mbedtls_cipher_reset( &invalid_ctx ) ==
155 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200156
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200157#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500158 /* mbedtls_cipher_update_ad() */
159 TEST_ASSERT(
160 mbedtls_cipher_update_ad( &invalid_ctx,
161 valid_buffer,
162 valid_size ) ==
163 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
164#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
165
166#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
167 /* mbedtls_cipher_set_padding_mode() */
168 TEST_ASSERT( mbedtls_cipher_set_padding_mode( &invalid_ctx, valid_mode ) ==
169 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200170#endif
171
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500172 /* mbedtls_cipher_update() */
173 TEST_ASSERT(
174 mbedtls_cipher_update( &invalid_ctx,
175 valid_buffer,
176 valid_size,
177 valid_buffer,
178 &size_t_var ) ==
179 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200180
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500181 /* mbedtls_cipher_finish() */
182 TEST_ASSERT(
183 mbedtls_cipher_finish( &invalid_ctx,
184 valid_buffer,
185 &size_t_var ) ==
186 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200187
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200188#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500189 /* mbedtls_cipher_write_tag() */
190 TEST_ASSERT(
191 mbedtls_cipher_write_tag( &invalid_ctx,
192 valid_buffer,
193 valid_size ) ==
194 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200195
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500196 /* mbedtls_cipher_check_tag() */
197 TEST_ASSERT(
198 mbedtls_cipher_check_tag( &invalid_ctx,
199 valid_buffer,
200 valid_size ) ==
201 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
202#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
203
204exit:
205 mbedtls_cipher_free( &invalid_ctx );
206 mbedtls_cipher_free( &valid_ctx );
207}
208/* END_CASE */
209
210/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
211void cipher_invalid_param_conditional( )
212{
213 mbedtls_cipher_context_t valid_ctx;
214
215 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
216 mbedtls_operation_t invalid_operation = 100;
217 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
218 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
219 int valid_size = sizeof(valid_buffer);
220 int valid_bitlen = valid_size * 8;
221 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
222 *( mbedtls_cipher_list() ) );
223
224 size_t size_t_var;
225
226 (void)valid_mode; /* In some configurations this is unused */
227
228 /* mbedtls_cipher_init() */
229 TEST_VALID_PARAM( mbedtls_cipher_init( &valid_ctx ) );
230 TEST_INVALID_PARAM( mbedtls_cipher_init( NULL ) );
231
232 /* mbedtls_cipher_setup() */
233 TEST_VALID_PARAM( mbedtls_cipher_setup( &valid_ctx, valid_info ) );
234 TEST_INVALID_PARAM_RET(
235 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
236 mbedtls_cipher_setup( NULL, valid_info ) );
237
238 /* mbedtls_cipher_get_block_size() */
239 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_block_size( NULL ) );
240
241 /* mbedtls_cipher_get_cipher_mode() */
242 TEST_INVALID_PARAM_RET(
243 MBEDTLS_MODE_NONE,
244 mbedtls_cipher_get_cipher_mode( NULL ) );
245
246 /* mbedtls_cipher_get_iv_size() */
247 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_iv_size( NULL ) );
248
249 /* mbedtls_cipher_get_type() */
250 TEST_INVALID_PARAM_RET(
251 MBEDTLS_CIPHER_NONE,
252 mbedtls_cipher_get_type( NULL ) );
253
254 /* mbedtls_cipher_get_name() */
255 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_name( NULL ) );
256
257 /* mbedtls_cipher_get_key_bitlen() */
258 TEST_INVALID_PARAM_RET(
259 MBEDTLS_KEY_LENGTH_NONE,
260 mbedtls_cipher_get_key_bitlen( NULL ) );
261
262 /* mbedtls_cipher_get_operation() */
263 TEST_INVALID_PARAM_RET(
264 MBEDTLS_OPERATION_NONE,
265 mbedtls_cipher_get_operation( NULL ) );
266
267 /* mbedtls_cipher_setkey() */
268 TEST_INVALID_PARAM_RET(
269 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
270 mbedtls_cipher_setkey( NULL,
271 valid_buffer,
272 valid_bitlen,
273 valid_operation ) );
274 TEST_INVALID_PARAM_RET(
275 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
276 mbedtls_cipher_setkey( &valid_ctx,
277 NULL,
278 valid_bitlen,
279 valid_operation ) );
280 TEST_INVALID_PARAM_RET(
281 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
282 mbedtls_cipher_setkey( &valid_ctx,
283 valid_buffer,
284 valid_bitlen,
285 invalid_operation ) );
286
287 /* mbedtls_cipher_set_iv() */
288 TEST_INVALID_PARAM_RET(
289 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
290 mbedtls_cipher_set_iv( NULL,
291 valid_buffer,
292 valid_size ) );
293 TEST_INVALID_PARAM_RET(
294 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
295 mbedtls_cipher_set_iv( &valid_ctx,
296 NULL,
297 valid_size ) );
298
299 /* mbedtls_cipher_reset() */
300 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
301 mbedtls_cipher_reset( NULL ) );
302
303#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
304 /* mbedtls_cipher_update_ad() */
305 TEST_INVALID_PARAM_RET(
306 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
307 mbedtls_cipher_update_ad( NULL,
308 valid_buffer,
309 valid_size ) );
310 TEST_INVALID_PARAM_RET(
311 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
312 mbedtls_cipher_update_ad( &valid_ctx,
313 NULL,
314 valid_size ) );
315#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
316
317#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
318 /* mbedtls_cipher_set_padding_mode() */
319 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
320 mbedtls_cipher_set_padding_mode( NULL, valid_mode ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200321#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500322
323 /* mbedtls_cipher_update() */
324 TEST_INVALID_PARAM_RET(
325 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
326 mbedtls_cipher_update( NULL,
327 valid_buffer,
328 valid_size,
329 valid_buffer,
330 &size_t_var ) );
331 TEST_INVALID_PARAM_RET(
332 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
333 mbedtls_cipher_update( &valid_ctx,
334 NULL, valid_size,
335 valid_buffer,
336 &size_t_var ) );
337 TEST_INVALID_PARAM_RET(
338 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
339 mbedtls_cipher_update( &valid_ctx,
340 valid_buffer, valid_size,
341 NULL,
342 &size_t_var ) );
343 TEST_INVALID_PARAM_RET(
344 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
345 mbedtls_cipher_update( &valid_ctx,
346 valid_buffer, valid_size,
347 valid_buffer,
348 NULL ) );
349
350 /* mbedtls_cipher_finish() */
351 TEST_INVALID_PARAM_RET(
352 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
353 mbedtls_cipher_finish( NULL,
354 valid_buffer,
355 &size_t_var ) );
356 TEST_INVALID_PARAM_RET(
357 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
358 mbedtls_cipher_finish( &valid_ctx,
359 NULL,
360 &size_t_var ) );
361 TEST_INVALID_PARAM_RET(
362 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
363 mbedtls_cipher_finish( &valid_ctx,
364 valid_buffer,
365 NULL ) );
366
367#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
368 /* mbedtls_cipher_write_tag() */
369 TEST_INVALID_PARAM_RET(
370 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
371 mbedtls_cipher_write_tag( NULL,
372 valid_buffer,
373 valid_size ) );
374 TEST_INVALID_PARAM_RET(
375 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
376 mbedtls_cipher_write_tag( &valid_ctx,
377 NULL,
378 valid_size ) );
379
380 /* mbedtls_cipher_check_tag() */
381 TEST_INVALID_PARAM_RET(
382 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
383 mbedtls_cipher_check_tag( NULL,
384 valid_buffer,
385 valid_size ) );
386 TEST_INVALID_PARAM_RET(
387 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
388 mbedtls_cipher_check_tag( &valid_ctx,
389 NULL,
390 valid_size ) );
391#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
392
393 /* mbedtls_cipher_crypt() */
394 TEST_INVALID_PARAM_RET(
395 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
396 mbedtls_cipher_crypt( NULL,
397 valid_buffer, valid_size,
398 valid_buffer, valid_size,
399 valid_buffer, &size_t_var ) );
400 TEST_INVALID_PARAM_RET(
401 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
402 mbedtls_cipher_crypt( &valid_ctx,
403 NULL, valid_size,
404 valid_buffer, valid_size,
405 valid_buffer, &size_t_var ) );
406 TEST_INVALID_PARAM_RET(
407 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
408 mbedtls_cipher_crypt( &valid_ctx,
409 valid_buffer, valid_size,
410 NULL, valid_size,
411 valid_buffer, &size_t_var ) );
412 TEST_INVALID_PARAM_RET(
413 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
414 mbedtls_cipher_crypt( &valid_ctx,
415 valid_buffer, valid_size,
416 valid_buffer, valid_size,
417 NULL, &size_t_var ) );
418 TEST_INVALID_PARAM_RET(
419 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
420 mbedtls_cipher_crypt( &valid_ctx,
421 valid_buffer, valid_size,
422 valid_buffer, valid_size,
423 valid_buffer, NULL ) );
424
425#if defined(MBEDTLS_CIPHER_MODE_AEAD)
426 /* mbedtls_cipher_auth_encrypt() */
427 TEST_INVALID_PARAM_RET(
428 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
429 mbedtls_cipher_auth_encrypt( NULL,
430 valid_buffer, valid_size,
431 valid_buffer, valid_size,
432 valid_buffer, valid_size,
433 valid_buffer, &size_t_var,
434 valid_buffer, valid_size ) );
435 TEST_INVALID_PARAM_RET(
436 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
437 mbedtls_cipher_auth_encrypt( &valid_ctx,
438 NULL, valid_size,
439 valid_buffer, valid_size,
440 valid_buffer, valid_size,
441 valid_buffer, &size_t_var,
442 valid_buffer, valid_size ) );
443 TEST_INVALID_PARAM_RET(
444 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
445 mbedtls_cipher_auth_encrypt( &valid_ctx,
446 valid_buffer, valid_size,
447 NULL, valid_size,
448 valid_buffer, valid_size,
449 valid_buffer, &size_t_var,
450 valid_buffer, valid_size ) );
451 TEST_INVALID_PARAM_RET(
452 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
453 mbedtls_cipher_auth_encrypt( &valid_ctx,
454 valid_buffer, valid_size,
455 valid_buffer, valid_size,
456 NULL, valid_size,
457 valid_buffer, &size_t_var,
458 valid_buffer, valid_size ) );
459 TEST_INVALID_PARAM_RET(
460 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
461 mbedtls_cipher_auth_encrypt( &valid_ctx,
462 valid_buffer, valid_size,
463 valid_buffer, valid_size,
464 valid_buffer, valid_size,
465 NULL, &size_t_var,
466 valid_buffer, valid_size ) );
467 TEST_INVALID_PARAM_RET(
468 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
469 mbedtls_cipher_auth_encrypt( &valid_ctx,
470 valid_buffer, valid_size,
471 valid_buffer, valid_size,
472 valid_buffer, valid_size,
473 valid_buffer, NULL,
474 valid_buffer, valid_size ) );
475 TEST_INVALID_PARAM_RET(
476 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
477 mbedtls_cipher_auth_encrypt( &valid_ctx,
478 valid_buffer, valid_size,
479 valid_buffer, valid_size,
480 valid_buffer, valid_size,
481 valid_buffer, &size_t_var,
482 NULL, valid_size ) );
483
484 /* mbedtls_cipher_auth_decrypt() */
485 TEST_INVALID_PARAM_RET(
486 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
487 mbedtls_cipher_auth_decrypt( NULL,
488 valid_buffer, valid_size,
489 valid_buffer, valid_size,
490 valid_buffer, valid_size,
491 valid_buffer, &size_t_var,
492 valid_buffer, valid_size ) );
493 TEST_INVALID_PARAM_RET(
494 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
495 mbedtls_cipher_auth_decrypt( &valid_ctx,
496 NULL, valid_size,
497 valid_buffer, valid_size,
498 valid_buffer, valid_size,
499 valid_buffer, &size_t_var,
500 valid_buffer, valid_size ) );
501 TEST_INVALID_PARAM_RET(
502 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
503 mbedtls_cipher_auth_decrypt( &valid_ctx,
504 valid_buffer, valid_size,
505 NULL, valid_size,
506 valid_buffer, valid_size,
507 valid_buffer, &size_t_var,
508 valid_buffer, valid_size ) );
509 TEST_INVALID_PARAM_RET(
510 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
511 mbedtls_cipher_auth_decrypt( &valid_ctx,
512 valid_buffer, valid_size,
513 valid_buffer, valid_size,
514 NULL, valid_size,
515 valid_buffer, &size_t_var,
516 valid_buffer, valid_size ) );
517 TEST_INVALID_PARAM_RET(
518 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
519 mbedtls_cipher_auth_decrypt( &valid_ctx,
520 valid_buffer, valid_size,
521 valid_buffer, valid_size,
522 valid_buffer, valid_size,
523 NULL, &size_t_var,
524 valid_buffer, valid_size ) );
525 TEST_INVALID_PARAM_RET(
526 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
527 mbedtls_cipher_auth_decrypt( &valid_ctx,
528 valid_buffer, valid_size,
529 valid_buffer, valid_size,
530 valid_buffer, valid_size,
531 valid_buffer, NULL,
532 valid_buffer, valid_size ) );
533 TEST_INVALID_PARAM_RET(
534 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
535 mbedtls_cipher_auth_decrypt( &valid_ctx,
536 valid_buffer, valid_size,
537 valid_buffer, valid_size,
538 valid_buffer, valid_size,
539 valid_buffer, &size_t_var,
540 NULL, valid_size ) );
541#endif /* defined(MBEDTLS_CIPHER_MODE_AEAD) */
542
Manuel Pégourié-Gonnard86796bc2020-12-03 11:29:22 +0100543#if defined(MBEDTLS_CIPHER_MODE_AEAD) || defined(MBEDTLS_NIST_KW_C)
544 /* mbedtls_cipher_auth_encrypt_ext */
545 TEST_INVALID_PARAM_RET(
546 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
547 mbedtls_cipher_auth_encrypt_ext( NULL,
548 valid_buffer, valid_size,
549 valid_buffer, valid_size,
550 valid_buffer, valid_size,
551 valid_buffer, valid_size, &size_t_var,
552 valid_size ) );
553 TEST_INVALID_PARAM_RET(
554 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
555 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
556 NULL, valid_size,
557 valid_buffer, valid_size,
558 valid_buffer, valid_size,
559 valid_buffer, valid_size, &size_t_var,
560 valid_size ) );
561 TEST_INVALID_PARAM_RET(
562 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
563 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
564 valid_buffer, valid_size,
565 NULL, valid_size,
566 valid_buffer, valid_size,
567 valid_buffer, valid_size, &size_t_var,
568 valid_size ) );
569 TEST_INVALID_PARAM_RET(
570 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
571 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
572 valid_buffer, valid_size,
573 valid_buffer, valid_size,
574 NULL, valid_size,
575 valid_buffer, valid_size, &size_t_var,
576 valid_size ) );
577 TEST_INVALID_PARAM_RET(
578 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
579 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
580 valid_buffer, valid_size,
581 valid_buffer, valid_size,
582 valid_buffer, valid_size,
583 NULL, valid_size, &size_t_var,
584 valid_size ) );
585 TEST_INVALID_PARAM_RET(
586 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
587 mbedtls_cipher_auth_encrypt_ext( &valid_ctx,
588 valid_buffer, valid_size,
589 valid_buffer, valid_size,
590 valid_buffer, valid_size,
591 valid_buffer, valid_size, NULL,
592 valid_size ) );
593
594 /* mbedtls_cipher_auth_decrypt_ext */
595 TEST_INVALID_PARAM_RET(
596 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
597 mbedtls_cipher_auth_decrypt_ext( NULL,
598 valid_buffer, valid_size,
599 valid_buffer, valid_size,
600 valid_buffer, valid_size,
601 valid_buffer, valid_size, &size_t_var,
602 valid_size ) );
603 TEST_INVALID_PARAM_RET(
604 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
605 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
606 NULL, valid_size,
607 valid_buffer, valid_size,
608 valid_buffer, valid_size,
609 valid_buffer, valid_size, &size_t_var,
610 valid_size ) );
611 TEST_INVALID_PARAM_RET(
612 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
613 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
614 valid_buffer, valid_size,
615 NULL, valid_size,
616 valid_buffer, valid_size,
617 valid_buffer, valid_size, &size_t_var,
618 valid_size ) );
619 TEST_INVALID_PARAM_RET(
620 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
621 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
622 valid_buffer, valid_size,
623 valid_buffer, valid_size,
624 NULL, valid_size,
625 valid_buffer, valid_size, &size_t_var,
626 valid_size ) );
627 TEST_INVALID_PARAM_RET(
628 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
629 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
630 valid_buffer, valid_size,
631 valid_buffer, valid_size,
632 valid_buffer, valid_size,
633 NULL, valid_size, &size_t_var,
634 valid_size ) );
635 TEST_INVALID_PARAM_RET(
636 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
637 mbedtls_cipher_auth_decrypt_ext( &valid_ctx,
638 valid_buffer, valid_size,
639 valid_buffer, valid_size,
640 valid_buffer, valid_size,
641 valid_buffer, valid_size, NULL,
642 valid_size ) );
643#endif /* MBEDTLS_CIPHER_MODE_AEAD || MBEDTLS_NIST_KW_C */
644
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500645 /* mbedtls_cipher_free() */
646 TEST_VALID_PARAM( mbedtls_cipher_free( NULL ) );
647exit:
648 TEST_VALID_PARAM( mbedtls_cipher_free( &valid_ctx ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200649}
650/* END_CASE */
651
Paul Bakker6a9c7252016-07-14 13:46:10 +0100652/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Azim Khanf1aaec92017-05-30 14:23:15 +0100653void cipher_special_behaviours( )
Paul Bakker6a9c7252016-07-14 13:46:10 +0100654{
655 const mbedtls_cipher_info_t *cipher_info;
656 mbedtls_cipher_context_t ctx;
657 unsigned char input[32];
658 unsigned char output[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300659#if defined (MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100660 unsigned char iv[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300661#endif
Paul Bakker6a9c7252016-07-14 13:46:10 +0100662 size_t olen = 0;
663
664 mbedtls_cipher_init( &ctx );
665 memset( input, 0, sizeof( input ) );
666 memset( output, 0, sizeof( output ) );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300667#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100668 memset( iv, 0, sizeof( iv ) );
669
670 /* Check and get info structures */
Ron Eldor7b012442017-09-25 17:03:12 +0300671 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_CBC );
Paul Bakker6a9c7252016-07-14 13:46:10 +0100672 TEST_ASSERT( NULL != cipher_info );
673
674 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
675
676 /* IV too big */
677 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, MBEDTLS_MAX_IV_LENGTH + 1 )
678 == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
679
680 /* IV too small */
681 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, 0 )
682 == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
683
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300684 mbedtls_cipher_free( &ctx );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300685 mbedtls_cipher_init( &ctx );
Ron Eldor6f90ed82017-09-26 12:08:54 +0300686#endif /* MBEDTLS_CIPHER_MODE_CBC */
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300687 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
Ron Eldor7b012442017-09-25 17:03:12 +0300688 TEST_ASSERT( NULL != cipher_info );
689
690 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
691
Paul Bakker6a9c7252016-07-14 13:46:10 +0100692 /* Update ECB with partial block */
693 TEST_ASSERT( mbedtls_cipher_update( &ctx, input, 1, output, &olen )
694 == MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
695
696exit:
697 mbedtls_cipher_free( &ctx );
698}
699/* END_CASE */
700
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200701/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100702void enc_dec_buf( int cipher_id, char * cipher_string, int key_len,
Paul Bakker33b43f12013-08-20 11:48:36 +0200703 int length_val, int pad_mode )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200704{
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100705 size_t length = length_val, outlen, total_len, i, block_size, iv_len;
Jaeden Amerod906b812018-06-08 11:03:16 +0100706 unsigned char key[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000707 unsigned char iv[16];
Manuel Pégourié-Gonnard9241be72013-08-31 17:31:03 +0200708 unsigned char ad[13];
709 unsigned char tag[16];
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200710 unsigned char inbuf[64];
711 unsigned char encbuf[64];
712 unsigned char decbuf[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000713
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714 const mbedtls_cipher_info_t *cipher_info;
715 mbedtls_cipher_context_t ctx_dec;
716 mbedtls_cipher_context_t ctx_enc;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000717
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200718 /*
719 * Prepare contexts
720 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721 mbedtls_cipher_init( &ctx_dec );
722 mbedtls_cipher_init( &ctx_enc );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200723
724 memset( key, 0x2a, sizeof( key ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000725
726 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000728 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200729 TEST_ASSERT( mbedtls_cipher_info_from_string( cipher_string ) == cipher_info );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000730
731 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200732 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
733 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
736 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000737
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200738#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Paul Bakker33b43f12013-08-20 11:48:36 +0200739 if( -1 != pad_mode )
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200740 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200741 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
742 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200743 }
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200744#else
745 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200746#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200747
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200748 /*
749 * Do a few encode/decode cycles
750 */
751 for( i = 0; i < 3; i++ )
752 {
753 memset( iv , 0x00 + i, sizeof( iv ) );
754 memset( ad, 0x10 + i, sizeof( ad ) );
755 memset( inbuf, 0x20 + i, sizeof( inbuf ) );
756
757 memset( encbuf, 0, sizeof( encbuf ) );
758 memset( decbuf, 0, sizeof( decbuf ) );
759 memset( tag, 0, sizeof( tag ) );
760
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100761 if( cipher_info->type == MBEDTLS_CIPHER_CHACHA20 )
762 iv_len = 12;
763 else
764 iv_len = sizeof(iv);
765
766 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, iv_len ) );
767 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, iv_len ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200768
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200769 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
770 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200771
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200772#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200773 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, ad, sizeof( ad ) - i ) );
774 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, ad, sizeof( ad ) - i ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200775#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000776
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200777 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
778 TEST_ASSERT( block_size != 0 );
779
Paul Bakker8123e9d2011-01-06 15:37:30 +0000780 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200782 total_len = outlen;
783
784 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200785 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200786 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200787 total_len + block_size > length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000788
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200789 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200790 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000791
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200792#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793 TEST_ASSERT( 0 == mbedtls_cipher_write_tag( &ctx_enc, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200794#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200795
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200796 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200797 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200798 total_len > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200799 total_len <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000800
801 /* decode the previously encoded string */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200802 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, total_len, decbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200803 total_len = outlen;
804
805 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200806 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200807 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200808 total_len + block_size >= length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000809
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200811 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000812
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200813#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814 TEST_ASSERT( 0 == mbedtls_cipher_check_tag( &ctx_dec, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200815#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200816
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200817 /* check result */
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200818 TEST_ASSERT( total_len == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000819 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200820 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000821
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200822 /*
823 * Done
824 */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200825exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826 mbedtls_cipher_free( &ctx_dec );
827 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200828}
Paul Bakker33b43f12013-08-20 11:48:36 +0200829/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000830
Paul Bakker33b43f12013-08-20 11:48:36 +0200831/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100832void enc_fail( int cipher_id, int pad_mode, int key_len, int length_val,
833 int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200834{
Paul Bakker33b43f12013-08-20 11:48:36 +0200835 size_t length = length_val;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200836 unsigned char key[32];
837 unsigned char iv[16];
838
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200839 const mbedtls_cipher_info_t *cipher_info;
840 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200841
842 unsigned char inbuf[64];
843 unsigned char encbuf[64];
844
845 size_t outlen = 0;
846
847 memset( key, 0, 32 );
848 memset( iv , 0, 16 );
849
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200851
852 memset( inbuf, 5, 64 );
853 memset( encbuf, 0, 64 );
854
855 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200857 TEST_ASSERT( NULL != cipher_info );
858
859 /* Initialise context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200860 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, key_len, MBEDTLS_ENCRYPT ) );
862#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
863 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200864#else
865 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200866#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
867 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv, 16 ) );
868 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200869#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200870 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200871#endif
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200872
873 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, inbuf, length, encbuf, &outlen ) );
875 TEST_ASSERT( ret == mbedtls_cipher_finish( &ctx, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200876
877 /* done */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200878exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200879 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200880}
Paul Bakker33b43f12013-08-20 11:48:36 +0200881/* END_CASE */
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200882
Paul Bakker33b43f12013-08-20 11:48:36 +0200883/* BEGIN_CASE */
k-stachowiakd8727232019-07-29 17:46:29 +0200884void dec_empty_buf( int cipher,
885 int expected_update_ret,
886 int expected_finish_ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200887{
Paul Bakker8123e9d2011-01-06 15:37:30 +0000888 unsigned char key[32];
889 unsigned char iv[16];
890
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);
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100910 TEST_ASSERT( sizeof(key) * 8 >= cipher_info->key_bitlen );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200911
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200912 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000913
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100914 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec,
915 key, cipher_info->key_bitlen,
916 MBEDTLS_DECRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000917
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200919
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200921
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200922#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200923 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200924#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000925
926 /* decode 0-byte string */
k-stachowiakd8727232019-07-29 17:46:29 +0200927 TEST_ASSERT( expected_update_ret ==
928 mbedtls_cipher_update( &ctx_dec, encbuf, 0, decbuf, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000929 TEST_ASSERT( 0 == outlen );
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100930
k-stachowiakd8727232019-07-29 17:46:29 +0200931 if ( expected_finish_ret == 0 &&
932 ( cipher_info->mode == MBEDTLS_MODE_CBC ||
933 cipher_info->mode == MBEDTLS_MODE_ECB ) )
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100934 {
935 /* Non-CBC and non-ECB ciphers are OK with decrypting empty buffers and
936 * return success, not MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED, when
k-stachowiakd8727232019-07-29 17:46:29 +0200937 * decrypting an empty buffer.
938 * On the other hand, CBC and ECB ciphers need a full block of input.
939 */
940 expected_finish_ret = MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED;
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100941 }
942
k-stachowiakd8727232019-07-29 17:46:29 +0200943 TEST_ASSERT( expected_finish_ret == mbedtls_cipher_finish(
944 &ctx_dec, decbuf + outlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000945 TEST_ASSERT( 0 == outlen );
946
Paul Bakkerbd51b262014-07-10 15:26:12 +0200947exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948 mbedtls_cipher_free( &ctx_dec );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200949}
Paul Bakker33b43f12013-08-20 11:48:36 +0200950/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000951
Paul Bakker33b43f12013-08-20 11:48:36 +0200952/* BEGIN_CASE */
953void enc_dec_buf_multipart( int cipher_id, int key_len, int first_length_val,
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700954 int second_length_val, int pad_mode,
955 int first_encrypt_output_len, int second_encrypt_output_len,
956 int first_decrypt_output_len, int second_decrypt_output_len )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200957{
Paul Bakker33b43f12013-08-20 11:48:36 +0200958 size_t first_length = first_length_val;
959 size_t second_length = second_length_val;
Paul Bakker23986e52011-04-24 08:57:21 +0000960 size_t length = first_length + second_length;
Andrzej Kurek5375fd92021-12-02 09:29:49 +0100961 size_t block_size, iv_len;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000962 unsigned char key[32];
963 unsigned char iv[16];
964
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200965 mbedtls_cipher_context_t ctx_dec;
966 mbedtls_cipher_context_t ctx_enc;
967 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000968
969 unsigned char inbuf[64];
970 unsigned char encbuf[64];
971 unsigned char decbuf[64];
972
Paul Bakker23986e52011-04-24 08:57:21 +0000973 size_t outlen = 0;
974 size_t totaloutlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000975
976 memset( key, 0, 32 );
977 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200978
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979 mbedtls_cipher_init( &ctx_dec );
980 mbedtls_cipher_init( &ctx_enc );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200981
Paul Bakker8123e9d2011-01-06 15:37:30 +0000982 memset( inbuf, 5, 64 );
983 memset( encbuf, 0, 64 );
984 memset( decbuf, 0, 64 );
985
986 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200987 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000988 TEST_ASSERT( NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200989
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200990 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
991 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
994 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000995
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700996#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
997 if( -1 != pad_mode )
998 {
999 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
1000 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
1001 }
1002#else
1003 (void) pad_mode;
1004#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
1005
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001006 if( cipher_info->type == MBEDTLS_CIPHER_CHACHA20 )
1007 iv_len = 12;
1008 else
1009 iv_len = sizeof(iv);
1010
1011 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, iv_len ) );
1012 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, iv_len ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +02001013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
1015 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +02001016
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001017#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001018 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
1019 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001020#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +00001021
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001022 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
1023 TEST_ASSERT( block_size != 0 );
1024
Paul Bakker8123e9d2011-01-06 15:37:30 +00001025 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001026 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, first_length, encbuf, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001027 TEST_ASSERT( (size_t)first_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001028 totaloutlen = outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001029 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf + first_length, second_length, encbuf + totaloutlen, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001030 TEST_ASSERT( (size_t)second_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001031 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001032 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001033 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001034 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001035 totaloutlen + block_size > length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + totaloutlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001038 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001039 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001040 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001041 totaloutlen > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001042 totaloutlen <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001043
1044 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001045 second_length = totaloutlen - first_length;
1046 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, first_length, decbuf, &outlen ) );
1047 TEST_ASSERT( (size_t)first_decrypt_output_len == outlen );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001048 totaloutlen = outlen;
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001049 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf + first_length, second_length, decbuf + totaloutlen, &outlen ) );
1050 TEST_ASSERT( (size_t)second_decrypt_output_len == outlen );
1051 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001052
1053 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001054 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001055 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001056 totaloutlen + block_size >= length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001057
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001058 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + totaloutlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001059 totaloutlen += outlen;
1060
1061 TEST_ASSERT( totaloutlen == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001062
1063 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
1064
Paul Bakkerbd51b262014-07-10 15:26:12 +02001065exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066 mbedtls_cipher_free( &ctx_dec );
1067 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001068}
Paul Bakker33b43f12013-08-20 11:48:36 +02001069/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001070
Paul Bakker33b43f12013-08-20 11:48:36 +02001071/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001072void decrypt_test_vec( int cipher_id, int pad_mode, data_t * key,
1073 data_t * iv, data_t * cipher,
1074 data_t * clear, data_t * ad, data_t * tag,
Azim Khand30ca132017-06-09 04:32:58 +01001075 int finish_result, int tag_result )
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001076{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +02001077 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001078 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001079 size_t outlen, total_len;
1080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001082
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001083 memset( output, 0x00, sizeof( output ) );
1084
Azim Khanf1aaec92017-05-30 14:23:15 +01001085#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mohammad Azim Khancf32c452017-06-13 14:55:58 +01001086 ((void) ad);
1087 ((void) tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +02001088#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001089
1090 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001091 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001092 mbedtls_cipher_info_from_type( cipher_id ) ) );
Azim Khand30ca132017-06-09 04:32:58 +01001093 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001095 if( pad_mode != -1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001096 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +02001097#else
1098 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Azim Khand30ca132017-06-09 04:32:58 +01001100 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv->x, iv->len ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001102#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +01001103 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, ad->x, ad->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001104#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001105
Azim Khand30ca132017-06-09 04:32:58 +01001106 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001107 total_len = 0;
Azim Khand30ca132017-06-09 04:32:58 +01001108 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, cipher->x, cipher->len, output, &outlen ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001109 total_len += outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001110 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001111 &outlen ) );
1112 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001113#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +01001114 TEST_ASSERT( tag_result == mbedtls_cipher_check_tag( &ctx, tag->x, tag->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001115#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001116
1117 /* check plaintext only if everything went fine */
1118 if( 0 == finish_result && 0 == tag_result )
1119 {
Azim Khand30ca132017-06-09 04:32:58 +01001120 TEST_ASSERT( total_len == clear->len );
1121 TEST_ASSERT( 0 == memcmp( output, clear->x, clear->len ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001122 }
1123
Paul Bakkerbd51b262014-07-10 15:26:12 +02001124exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001125 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001126}
1127/* END_CASE */
1128
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001129/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_AUTH_CRYPT */
Azim Khan5fcca462018-06-29 11:05:32 +01001130void auth_crypt_tv( int cipher_id, data_t * key, data_t * iv,
1131 data_t * ad, data_t * cipher, data_t * tag,
Hanno Beckera13272d2018-11-12 16:27:30 +00001132 char * result, data_t * clear, int use_psa )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001133{
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001134 /*
1135 * Take an AEAD ciphertext + tag and perform a pair
1136 * of AEAD decryption and AEAD encryption. Check that
Hanno Beckera13272d2018-11-12 16:27:30 +00001137 * this results in the expected plaintext, and that
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001138 * decryption and encryption are inverse to one another.
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001139 *
1140 * Do that twice:
1141 * - once with legacy functions auth_decrypt/auth_encrypt
1142 * - once with new functions auth_decrypt_ext/auth_encrypt_ext
1143 * This allows testing both without duplicating test cases.
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001144 */
Hanno Beckera13272d2018-11-12 16:27:30 +00001145
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001146 int ret;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001147 int using_nist_kw, using_nist_kw_padding;
Hanno Beckera13272d2018-11-12 16:27:30 +00001148
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001149 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001150 size_t outlen;
1151
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001152 unsigned char *cipher_plus_tag = NULL;
1153 size_t cipher_plus_tag_len;
1154 unsigned char *decrypt_buf = NULL;
1155 size_t decrypt_buf_len = 0;
1156 unsigned char *encrypt_buf = NULL;
1157 size_t encrypt_buf_len = 0;
1158
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001159#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1160 !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001161 unsigned char *tmp_tag = NULL;
1162 unsigned char *tmp_cipher = NULL;
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001163 unsigned char *tag_buf = NULL;
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001164#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1165
Gilles Peskine70edd682020-12-03 20:27:27 +01001166 /* Null pointers are documented as valid for inputs of length 0.
1167 * The test framework passes non-null pointers, so set them to NULL.
1168 * key, cipher and tag can't be empty. */
1169 if( iv->len == 0 )
1170 iv->x = NULL;
1171 if( ad->len == 0 )
1172 ad->x = NULL;
1173 if( clear->len == 0 )
1174 clear->x = NULL;
1175
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001176 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001177
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001178 /* Initialize PSA Crypto */
1179#if defined(MBEDTLS_USE_PSA_CRYPTO)
1180 if( use_psa == 1 )
1181 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckera13272d2018-11-12 16:27:30 +00001182#else
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001183 (void) use_psa;
1184#endif
1185
1186 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001187 * Are we using NIST_KW? with padding?
1188 */
1189 using_nist_kw_padding = cipher_id == MBEDTLS_CIPHER_AES_128_KWP ||
1190 cipher_id == MBEDTLS_CIPHER_AES_192_KWP ||
1191 cipher_id == MBEDTLS_CIPHER_AES_256_KWP;
1192 using_nist_kw = cipher_id == MBEDTLS_CIPHER_AES_128_KW ||
1193 cipher_id == MBEDTLS_CIPHER_AES_192_KW ||
1194 cipher_id == MBEDTLS_CIPHER_AES_256_KW ||
1195 using_nist_kw_padding;
1196
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001197 /****************************************************************
1198 * *
1199 * Part 1: non-deprecated API *
1200 * *
1201 ****************************************************************/
1202
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001203 /*
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001204 * Prepare context for decryption
1205 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001206 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1207 MBEDTLS_DECRYPT ) )
1208 goto exit;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001209
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001210 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001211 * prepare buffer for decryption
1212 * (we need the tag appended to the ciphertext)
1213 */
1214 cipher_plus_tag_len = cipher->len + tag->len;
1215 ASSERT_ALLOC( cipher_plus_tag, cipher_plus_tag_len );
1216 memcpy( cipher_plus_tag, cipher->x, cipher->len );
1217 memcpy( cipher_plus_tag + cipher->len, tag->x, tag->len );
1218
1219 /*
1220 * Compute length of output buffer according to the documentation
1221 */
1222 if( using_nist_kw )
1223 decrypt_buf_len = cipher_plus_tag_len - 8;
1224 else
1225 decrypt_buf_len = cipher_plus_tag_len - tag->len;
1226
1227
1228 /*
1229 * Try decrypting to a buffer that's 1B too small
1230 */
1231 if( decrypt_buf_len != 0 )
1232 {
1233 ASSERT_ALLOC( decrypt_buf, decrypt_buf_len - 1 );
1234
1235 outlen = 0;
1236 ret = mbedtls_cipher_auth_decrypt_ext( &ctx, iv->x, iv->len,
1237 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1238 decrypt_buf, decrypt_buf_len - 1, &outlen, tag->len );
1239 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1240
1241 mbedtls_free( decrypt_buf );
1242 decrypt_buf = NULL;
1243 }
1244
1245 /*
1246 * Authenticate and decrypt, and check result
1247 */
1248 ASSERT_ALLOC( decrypt_buf, decrypt_buf_len );
1249
1250 outlen = 0;
1251 ret = mbedtls_cipher_auth_decrypt_ext( &ctx, iv->x, iv->len,
1252 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1253 decrypt_buf, decrypt_buf_len, &outlen, tag->len );
1254
1255 if( strcmp( result, "FAIL" ) == 0 )
1256 {
1257 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +01001258 TEST_ASSERT( buffer_is_all_zero( decrypt_buf, decrypt_buf_len ) );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001259 }
1260 else
1261 {
1262 TEST_ASSERT( ret == 0 );
Gilles Peskinea2971ea2020-12-03 20:36:02 +01001263 ASSERT_COMPARE( decrypt_buf, outlen, clear->x, clear->len );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001264 }
1265
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001266 /* Free this, but keep cipher_plus_tag for deprecated function with PSA */
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001267 mbedtls_free( decrypt_buf );
1268 decrypt_buf = NULL;
1269
1270 /*
1271 * Encrypt back if test data was authentic
1272 */
1273 if( strcmp( result, "FAIL" ) != 0 )
1274 {
1275 /* prepare context for encryption */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001276 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1277 MBEDTLS_ENCRYPT ) )
1278 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001279
1280 /*
1281 * Compute size of output buffer according to documentation
1282 */
1283 if( using_nist_kw )
1284 {
1285 encrypt_buf_len = clear->len + 8;
1286 if( using_nist_kw_padding && encrypt_buf_len % 8 != 0 )
1287 encrypt_buf_len += 8 - encrypt_buf_len % 8;
1288 }
1289 else
1290 {
1291 encrypt_buf_len = clear->len + tag->len;
1292 }
1293
1294 /*
1295 * Try encrypting with an output buffer that's 1B too small
1296 */
1297 ASSERT_ALLOC( encrypt_buf, encrypt_buf_len - 1 );
1298
1299 outlen = 0;
1300 ret = mbedtls_cipher_auth_encrypt_ext( &ctx, iv->x, iv->len,
1301 ad->x, ad->len, clear->x, clear->len,
1302 encrypt_buf, encrypt_buf_len - 1, &outlen, tag->len );
1303 TEST_ASSERT( ret != 0 );
1304
1305 mbedtls_free( encrypt_buf );
1306 encrypt_buf = NULL;
1307
1308 /*
1309 * Encrypt and check the result
1310 */
1311 ASSERT_ALLOC( encrypt_buf, encrypt_buf_len );
1312
1313 outlen = 0;
1314 ret = mbedtls_cipher_auth_encrypt_ext( &ctx, iv->x, iv->len,
1315 ad->x, ad->len, clear->x, clear->len,
1316 encrypt_buf, encrypt_buf_len, &outlen, tag->len );
1317 TEST_ASSERT( ret == 0 );
1318
1319 TEST_ASSERT( outlen == cipher->len + tag->len );
1320 TEST_ASSERT( memcmp( encrypt_buf, cipher->x, cipher->len ) == 0 );
1321 TEST_ASSERT( memcmp( encrypt_buf + cipher->len,
1322 tag->x, tag->len ) == 0 );
1323
1324 mbedtls_free( encrypt_buf );
1325 encrypt_buf = NULL;
1326 }
1327
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001328 /****************************************************************
1329 * *
1330 * Part 2: deprecated API *
1331 * *
1332 ****************************************************************/
1333
1334#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1335 !defined(MBEDTLS_DEPRECATED_REMOVED)
1336
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001337 /*
1338 * Prepare context for decryption
1339 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001340 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1341 MBEDTLS_DECRYPT ) )
1342 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001343
1344 /*
1345 * Prepare pointers for decryption
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001346 */
1347#if defined(MBEDTLS_USE_PSA_CRYPTO)
1348 if( use_psa == 1 )
1349 {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001350 /* PSA requires that the tag immediately follows the ciphertext.
1351 * Fortunately, we already have that from testing the new API. */
1352 tmp_cipher = cipher_plus_tag;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001353 tmp_tag = tmp_cipher + cipher->len;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001354 }
1355 else
1356#endif /* MBEDTLS_USE_PSA_CRYPTO */
1357 {
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001358 tmp_cipher = cipher->x;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001359 tmp_tag = tag->x;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001360 }
1361
1362 /*
1363 * Authenticate and decrypt, and check result
1364 */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001365
Gilles Peskine70edd682020-12-03 20:27:27 +01001366 ASSERT_ALLOC( decrypt_buf, cipher->len );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001367 outlen = 0;
Hanno Beckera13272d2018-11-12 16:27:30 +00001368 ret = mbedtls_cipher_auth_decrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001369 tmp_cipher, cipher->len, decrypt_buf, &outlen,
Hanno Beckera13272d2018-11-12 16:27:30 +00001370 tmp_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001371
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001372 if( using_nist_kw )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001373 {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001374 /* NIST_KW with legacy API */
1375 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
1376 }
1377 else if( strcmp( result, "FAIL" ) == 0 )
1378 {
1379 /* unauthentic message */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +01001381 TEST_ASSERT( buffer_is_all_zero( decrypt_buf, cipher->len ) );
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001382 }
1383 else
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001384 {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001385 /* authentic message: is the plaintext correct? */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001386 TEST_ASSERT( ret == 0 );
Gilles Peskinea2971ea2020-12-03 20:36:02 +01001387 ASSERT_COMPARE( decrypt_buf, outlen, clear->x, clear->len );
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001388 }
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001389
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001390 mbedtls_free( decrypt_buf );
1391 decrypt_buf = NULL;
1392 mbedtls_free( cipher_plus_tag );
1393 cipher_plus_tag = NULL;
1394
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001395 /*
1396 * Encrypt back if test data was authentic
1397 */
1398 if( strcmp( result, "FAIL" ) != 0 )
1399 {
1400 /* prepare context for encryption */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001401 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1402 MBEDTLS_ENCRYPT ) )
1403 goto exit;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001404
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001405 /* prepare buffers for encryption */
1406#if defined(MBEDTLS_USE_PSA_CRYPTO)
1407 if( use_psa )
1408 {
1409 ASSERT_ALLOC( cipher_plus_tag, cipher->len + tag->len );
1410 tmp_cipher = cipher_plus_tag;
1411 tmp_tag = cipher_plus_tag + cipher->len;
1412 }
1413 else
1414#endif /* MBEDTLS_USE_PSA_CRYPTO */
1415 {
Gilles Peskine70edd682020-12-03 20:27:27 +01001416 ASSERT_ALLOC( encrypt_buf, cipher->len );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001417 ASSERT_ALLOC( tag_buf, tag->len );
1418 tmp_cipher = encrypt_buf;
1419 tmp_tag = tag_buf;
1420 }
1421
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001422 /*
1423 * Encrypt and check the result
1424 */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001425 outlen = 0;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001426 ret = mbedtls_cipher_auth_encrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001427 clear->x, clear->len, tmp_cipher, &outlen,
1428 tmp_tag, tag->len );
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001429
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001430 if( using_nist_kw )
1431 {
1432 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
1433 }
1434 else
1435 {
1436 TEST_ASSERT( ret == 0 );
1437
1438 TEST_ASSERT( outlen == cipher->len );
Gilles Peskine70edd682020-12-03 20:27:27 +01001439 if( cipher->len != 0 )
1440 TEST_ASSERT( memcmp( tmp_cipher, cipher->x, cipher->len ) == 0 );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001441 TEST_ASSERT( memcmp( tmp_tag, tag->x, tag->len ) == 0 );
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001442 }
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001443 }
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001444
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001445#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1446
Paul Bakkerbd51b262014-07-10 15:26:12 +02001447exit:
Hanno Beckera13272d2018-11-12 16:27:30 +00001448
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001449 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001450 mbedtls_free( decrypt_buf );
1451 mbedtls_free( encrypt_buf );
1452 mbedtls_free( cipher_plus_tag );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001453#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1454 !defined(MBEDTLS_DEPRECATED_REMOVED)
1455 mbedtls_free( tag_buf );
1456#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001457
Hanno Beckera13272d2018-11-12 16:27:30 +00001458#if defined(MBEDTLS_USE_PSA_CRYPTO)
1459 if( use_psa == 1 )
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001460 PSA_DONE( );
Hanno Beckera13272d2018-11-12 16:27:30 +00001461#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001462}
1463/* END_CASE */
1464
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001465/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001466void test_vec_ecb( int cipher_id, int operation, data_t * key,
1467 data_t * input, data_t * result, int finish_result
Azim Khand30ca132017-06-09 04:32:58 +01001468 )
Paul Bakker5e0efa72013-09-08 23:04:04 +02001469{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +02001471 unsigned char output[32];
1472 size_t outlen;
1473
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001474 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001475
Paul Bakker5e0efa72013-09-08 23:04:04 +02001476 memset( output, 0x00, sizeof( output ) );
1477
1478 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001479 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001480 mbedtls_cipher_info_from_type( cipher_id ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001481
Paul Bakker5e0efa72013-09-08 23:04:04 +02001482
Azim Khand30ca132017-06-09 04:32:58 +01001483 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001484
Azim Khand30ca132017-06-09 04:32:58 +01001485 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, input->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001486 mbedtls_cipher_get_block_size( &ctx ),
Paul Bakker5e0efa72013-09-08 23:04:04 +02001487 output, &outlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001488 TEST_ASSERT( outlen == mbedtls_cipher_get_block_size( &ctx ) );
1489 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001490 &outlen ) );
1491 TEST_ASSERT( 0 == outlen );
1492
1493 /* check plaintext only if everything went fine */
1494 if( 0 == finish_result )
Azim Khand30ca132017-06-09 04:32:58 +01001495 TEST_ASSERT( 0 == memcmp( output, result->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001496 mbedtls_cipher_get_block_size( &ctx ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001497
Paul Bakkerbd51b262014-07-10 15:26:12 +02001498exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001499 mbedtls_cipher_free( &ctx );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001500}
1501/* END_CASE */
1502
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001503/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Ronald Cron9ed40732020-06-25 09:03:34 +02001504void test_vec_crypt( int cipher_id, int operation, data_t *key,
1505 data_t *iv, data_t *input, data_t *result,
Hanno Beckere43164e2018-11-12 12:46:35 +00001506 int finish_result, int use_psa )
Ron Eldor7b012442017-09-25 17:03:12 +03001507{
Ron Eldor7b012442017-09-25 17:03:12 +03001508 mbedtls_cipher_context_t ctx;
1509 unsigned char output[32];
1510 size_t outlen;
1511
1512 mbedtls_cipher_init( &ctx );
1513
Ron Eldor7b012442017-09-25 17:03:12 +03001514 memset( output, 0x00, sizeof( output ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001515
1516 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +00001517#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1518 (void) use_psa;
1519#else
1520 if( use_psa == 1 )
1521 {
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001522 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001523 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001524 mbedtls_cipher_info_from_type( cipher_id ), 0 ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001525 }
1526 else
1527#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001528 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001529 mbedtls_cipher_info_from_type( cipher_id ) ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001530
Ronald Cron9ed40732020-06-25 09:03:34 +02001531 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001532 if( MBEDTLS_MODE_CBC == ctx.cipher_info->mode )
1533 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, MBEDTLS_PADDING_NONE ) );
1534
Ronald Cron9ed40732020-06-25 09:03:34 +02001535 TEST_ASSERT( finish_result == mbedtls_cipher_crypt( &ctx, iv->len ? iv->x : NULL,
1536 iv->len, input->x, input->len,
Ron Eldor7b012442017-09-25 17:03:12 +03001537 output, &outlen ) );
Ronald Cron9ed40732020-06-25 09:03:34 +02001538 TEST_ASSERT( result->len == outlen );
Ron Eldor7b012442017-09-25 17:03:12 +03001539 /* check plaintext only if everything went fine */
1540 if( 0 == finish_result )
Ronald Cron9ed40732020-06-25 09:03:34 +02001541 TEST_ASSERT( 0 == memcmp( output, result->x, outlen ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001542
1543exit:
1544 mbedtls_cipher_free( &ctx );
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001545#if defined(MBEDTLS_USE_PSA_CRYPTO)
1546 PSA_DONE( );
1547#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001548}
1549/* END_CASE */
1550
1551/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Paul Bakker33b43f12013-08-20 11:48:36 +02001552void set_padding( int cipher_id, int pad_mode, int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001553{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001554 const mbedtls_cipher_info_t *cipher_info;
1555 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001556
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001557 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001558
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001559 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001560 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001561 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001562
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001563 TEST_ASSERT( ret == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001564
Paul Bakkerbd51b262014-07-10 15:26:12 +02001565exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001566 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001567}
Paul Bakker33b43f12013-08-20 11:48:36 +02001568/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001570/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Azim Khan5fcca462018-06-29 11:05:32 +01001571void check_padding( int pad_mode, data_t * input, int ret, int dlen_check
Azim Khand30ca132017-06-09 04:32:58 +01001572 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001573{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001574 mbedtls_cipher_info_t cipher_info;
1575 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001576 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001577
1578 /* build a fake context just for getting access to get_padding */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001579 mbedtls_cipher_init( &ctx );
1580 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001581 ctx.cipher_info = &cipher_info;
1582
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001583 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001584
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001585
Azim Khand30ca132017-06-09 04:32:58 +01001586 TEST_ASSERT( ret == ctx.get_padding( input->x, input->len, &dlen ) );
Paul Bakker33b43f12013-08-20 11:48:36 +02001587 if( 0 == ret )
1588 TEST_ASSERT( dlen == (size_t) dlen_check );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001589}
Paul Bakker33b43f12013-08-20 11:48:36 +02001590/* END_CASE */
Andrzej Kurek5375fd92021-12-02 09:29:49 +01001591
1592/* BEGIN_CASE */
1593void check_iv( int cipher_id, char * cipher_string,
1594 int iv_len_val, int ret )
1595{
1596 size_t iv_len = iv_len_val;
1597 unsigned char iv[16];
1598
1599 const mbedtls_cipher_info_t *cipher_info;
1600 mbedtls_cipher_context_t ctx_dec;
1601 mbedtls_cipher_context_t ctx_enc;
1602
1603 /*
1604 * Prepare contexts
1605 */
1606 mbedtls_cipher_init( &ctx_dec );
1607 mbedtls_cipher_init( &ctx_enc );
1608
1609 /* Check and get info structures */
1610 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
1611 TEST_ASSERT( NULL != cipher_info );
1612 TEST_ASSERT( mbedtls_cipher_info_from_string( cipher_string ) == cipher_info );
1613
1614 /* Initialise enc and dec contexts */
1615 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
1616 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
1617
1618 TEST_ASSERT( ret == mbedtls_cipher_set_iv( &ctx_dec, iv, iv_len ) );
1619 TEST_ASSERT( ret == mbedtls_cipher_set_iv( &ctx_enc, iv, iv_len ) );
1620
1621exit:
1622 mbedtls_cipher_free( &ctx_dec );
1623 mbedtls_cipher_free( &ctx_enc );
1624}
1625/* END_CASE */