blob: 76e474f2170fa15100c82939e2965101c193f7e2 [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{
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200705 size_t length = length_val, outlen, total_len, i, block_size;
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, sizeof( iv ) ) );
762 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, sizeof( iv ) ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200763
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
765 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200766
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200767#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, ad, sizeof( ad ) - i ) );
769 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, ad, sizeof( ad ) - i ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200770#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000771
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200772 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
773 TEST_ASSERT( block_size != 0 );
774
Paul Bakker8123e9d2011-01-06 15:37:30 +0000775 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200776 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200777 total_len = outlen;
778
779 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200780 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200781 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200782 total_len + block_size > length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000783
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200784 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200785 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000786
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200787#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200788 TEST_ASSERT( 0 == mbedtls_cipher_write_tag( &ctx_enc, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200789#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200790
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200791 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200792 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200793 total_len > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200794 total_len <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000795
796 /* decode the previously encoded string */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200797 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, total_len, decbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200798 total_len = outlen;
799
800 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200801 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200802 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200803 total_len + block_size >= length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000804
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200805 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200806 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000807
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200808#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200809 TEST_ASSERT( 0 == mbedtls_cipher_check_tag( &ctx_dec, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200810#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200811
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200812 /* check result */
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200813 TEST_ASSERT( total_len == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000814 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200815 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000816
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200817 /*
818 * Done
819 */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200820exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821 mbedtls_cipher_free( &ctx_dec );
822 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200823}
Paul Bakker33b43f12013-08-20 11:48:36 +0200824/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000825
Paul Bakker33b43f12013-08-20 11:48:36 +0200826/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100827void enc_fail( int cipher_id, int pad_mode, int key_len, int length_val,
828 int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200829{
Paul Bakker33b43f12013-08-20 11:48:36 +0200830 size_t length = length_val;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200831 unsigned char key[32];
832 unsigned char iv[16];
833
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834 const mbedtls_cipher_info_t *cipher_info;
835 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200836
837 unsigned char inbuf[64];
838 unsigned char encbuf[64];
839
840 size_t outlen = 0;
841
842 memset( key, 0, 32 );
843 memset( iv , 0, 16 );
844
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200846
847 memset( inbuf, 5, 64 );
848 memset( encbuf, 0, 64 );
849
850 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200851 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200852 TEST_ASSERT( NULL != cipher_info );
853
854 /* Initialise context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200855 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, key_len, MBEDTLS_ENCRYPT ) );
857#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
858 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200859#else
860 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
862 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv, 16 ) );
863 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200864#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200866#endif
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200867
868 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200869 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, inbuf, length, encbuf, &outlen ) );
870 TEST_ASSERT( ret == mbedtls_cipher_finish( &ctx, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200871
872 /* done */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200873exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200874 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200875}
Paul Bakker33b43f12013-08-20 11:48:36 +0200876/* END_CASE */
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200877
Paul Bakker33b43f12013-08-20 11:48:36 +0200878/* BEGIN_CASE */
k-stachowiakd8727232019-07-29 17:46:29 +0200879void dec_empty_buf( int cipher,
880 int expected_update_ret,
881 int expected_finish_ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200882{
Paul Bakker8123e9d2011-01-06 15:37:30 +0000883 unsigned char key[32];
884 unsigned char iv[16];
885
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200886 mbedtls_cipher_context_t ctx_dec;
887 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000888
889 unsigned char encbuf[64];
890 unsigned char decbuf[64];
891
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000892 size_t outlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000893
894 memset( key, 0, 32 );
895 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200896
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897 mbedtls_cipher_init( &ctx_dec );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200898
Paul Bakker8123e9d2011-01-06 15:37:30 +0000899 memset( encbuf, 0, 64 );
900 memset( decbuf, 0, 64 );
901
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200902 /* Initialise context */
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100903 cipher_info = mbedtls_cipher_info_from_type( cipher );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000904 TEST_ASSERT( NULL != cipher_info);
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100905 TEST_ASSERT( sizeof(key) * 8 >= cipher_info->key_bitlen );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200906
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200907 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000908
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100909 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec,
910 key, cipher_info->key_bitlen,
911 MBEDTLS_DECRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000912
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200913 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200914
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200915 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200916
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200917#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200919#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000920
921 /* decode 0-byte string */
k-stachowiakd8727232019-07-29 17:46:29 +0200922 TEST_ASSERT( expected_update_ret ==
923 mbedtls_cipher_update( &ctx_dec, encbuf, 0, decbuf, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000924 TEST_ASSERT( 0 == outlen );
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100925
k-stachowiakd8727232019-07-29 17:46:29 +0200926 if ( expected_finish_ret == 0 &&
927 ( cipher_info->mode == MBEDTLS_MODE_CBC ||
928 cipher_info->mode == MBEDTLS_MODE_ECB ) )
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100929 {
930 /* Non-CBC and non-ECB ciphers are OK with decrypting empty buffers and
931 * return success, not MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED, when
k-stachowiakd8727232019-07-29 17:46:29 +0200932 * decrypting an empty buffer.
933 * On the other hand, CBC and ECB ciphers need a full block of input.
934 */
935 expected_finish_ret = MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED;
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100936 }
937
k-stachowiakd8727232019-07-29 17:46:29 +0200938 TEST_ASSERT( expected_finish_ret == mbedtls_cipher_finish(
939 &ctx_dec, decbuf + outlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000940 TEST_ASSERT( 0 == outlen );
941
Paul Bakkerbd51b262014-07-10 15:26:12 +0200942exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200943 mbedtls_cipher_free( &ctx_dec );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200944}
Paul Bakker33b43f12013-08-20 11:48:36 +0200945/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000946
Paul Bakker33b43f12013-08-20 11:48:36 +0200947/* BEGIN_CASE */
948void enc_dec_buf_multipart( int cipher_id, int key_len, int first_length_val,
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700949 int second_length_val, int pad_mode,
950 int first_encrypt_output_len, int second_encrypt_output_len,
951 int first_decrypt_output_len, int second_decrypt_output_len )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200952{
Paul Bakker33b43f12013-08-20 11:48:36 +0200953 size_t first_length = first_length_val;
954 size_t second_length = second_length_val;
Paul Bakker23986e52011-04-24 08:57:21 +0000955 size_t length = first_length + second_length;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200956 size_t block_size;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000957 unsigned char key[32];
958 unsigned char iv[16];
959
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960 mbedtls_cipher_context_t ctx_dec;
961 mbedtls_cipher_context_t ctx_enc;
962 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000963
964 unsigned char inbuf[64];
965 unsigned char encbuf[64];
966 unsigned char decbuf[64];
967
Paul Bakker23986e52011-04-24 08:57:21 +0000968 size_t outlen = 0;
969 size_t totaloutlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000970
971 memset( key, 0, 32 );
972 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200973
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200974 mbedtls_cipher_init( &ctx_dec );
975 mbedtls_cipher_init( &ctx_enc );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200976
Paul Bakker8123e9d2011-01-06 15:37:30 +0000977 memset( inbuf, 5, 64 );
978 memset( encbuf, 0, 64 );
979 memset( decbuf, 0, 64 );
980
981 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200982 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000983 TEST_ASSERT( NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200984
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200985 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
986 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200987
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
989 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000990
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700991#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
992 if( -1 != pad_mode )
993 {
994 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
995 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
996 }
997#else
998 (void) pad_mode;
999#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
1000
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
1002 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +02001003
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001004 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
1005 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +02001006
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001007#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001008 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
1009 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001010#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +00001011
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001012 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
1013 TEST_ASSERT( block_size != 0 );
1014
Paul Bakker8123e9d2011-01-06 15:37:30 +00001015 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001016 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, first_length, encbuf, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001017 TEST_ASSERT( (size_t)first_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001018 totaloutlen = outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001019 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf + first_length, second_length, encbuf + totaloutlen, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001020 TEST_ASSERT( (size_t)second_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001021 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001022 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001023 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001024 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001025 totaloutlen + block_size > length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001026
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001027 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + totaloutlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001028 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001029 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001030 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001031 totaloutlen > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001032 totaloutlen <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001033
1034 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001035 second_length = totaloutlen - first_length;
1036 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, first_length, decbuf, &outlen ) );
1037 TEST_ASSERT( (size_t)first_decrypt_output_len == outlen );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001038 totaloutlen = outlen;
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001039 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf + first_length, second_length, decbuf + totaloutlen, &outlen ) );
1040 TEST_ASSERT( (size_t)second_decrypt_output_len == outlen );
1041 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001042
1043 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001044 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001045 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +02001046 totaloutlen + block_size >= length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001047
Jethro Beekman6c563fa2018-03-27 19:16:17 -07001048 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + totaloutlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +02001049 totaloutlen += outlen;
1050
1051 TEST_ASSERT( totaloutlen == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +00001052
1053 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
1054
Paul Bakkerbd51b262014-07-10 15:26:12 +02001055exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056 mbedtls_cipher_free( &ctx_dec );
1057 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001058}
Paul Bakker33b43f12013-08-20 11:48:36 +02001059/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001060
Paul Bakker33b43f12013-08-20 11:48:36 +02001061/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001062void decrypt_test_vec( int cipher_id, int pad_mode, data_t * key,
1063 data_t * iv, data_t * cipher,
1064 data_t * clear, data_t * ad, data_t * tag,
Azim Khand30ca132017-06-09 04:32:58 +01001065 int finish_result, int tag_result )
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001066{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +02001067 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001068 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001069 size_t outlen, total_len;
1070
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001071 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001072
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001073 memset( output, 0x00, sizeof( output ) );
1074
Azim Khanf1aaec92017-05-30 14:23:15 +01001075#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mohammad Azim Khancf32c452017-06-13 14:55:58 +01001076 ((void) ad);
1077 ((void) tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +02001078#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001079
1080 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001081 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082 mbedtls_cipher_info_from_type( cipher_id ) ) );
Azim Khand30ca132017-06-09 04:32:58 +01001083 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001084#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001085 if( pad_mode != -1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001086 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +02001087#else
1088 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Azim Khand30ca132017-06-09 04:32:58 +01001090 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv->x, iv->len ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001092#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +01001093 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, ad->x, ad->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001094#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001095
Azim Khand30ca132017-06-09 04:32:58 +01001096 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001097 total_len = 0;
Azim Khand30ca132017-06-09 04:32:58 +01001098 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, cipher->x, cipher->len, output, &outlen ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001099 total_len += outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001100 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001101 &outlen ) );
1102 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +02001103#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +01001104 TEST_ASSERT( tag_result == mbedtls_cipher_check_tag( &ctx, tag->x, tag->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +02001105#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001106
1107 /* check plaintext only if everything went fine */
1108 if( 0 == finish_result && 0 == tag_result )
1109 {
Azim Khand30ca132017-06-09 04:32:58 +01001110 TEST_ASSERT( total_len == clear->len );
1111 TEST_ASSERT( 0 == memcmp( output, clear->x, clear->len ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001112 }
1113
Paul Bakkerbd51b262014-07-10 15:26:12 +02001114exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001115 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001116}
1117/* END_CASE */
1118
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001119/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_AUTH_CRYPT */
Azim Khan5fcca462018-06-29 11:05:32 +01001120void auth_crypt_tv( int cipher_id, data_t * key, data_t * iv,
1121 data_t * ad, data_t * cipher, data_t * tag,
Hanno Beckera13272d2018-11-12 16:27:30 +00001122 char * result, data_t * clear, int use_psa )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001123{
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001124 /*
1125 * Take an AEAD ciphertext + tag and perform a pair
1126 * of AEAD decryption and AEAD encryption. Check that
Hanno Beckera13272d2018-11-12 16:27:30 +00001127 * this results in the expected plaintext, and that
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001128 * decryption and encryption are inverse to one another.
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001129 *
1130 * Do that twice:
1131 * - once with legacy functions auth_decrypt/auth_encrypt
1132 * - once with new functions auth_decrypt_ext/auth_encrypt_ext
1133 * This allows testing both without duplicating test cases.
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001134 */
Hanno Beckera13272d2018-11-12 16:27:30 +00001135
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001136 int ret;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001137 int using_nist_kw, using_nist_kw_padding;
Hanno Beckera13272d2018-11-12 16:27:30 +00001138
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001140 size_t outlen;
1141
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001142 unsigned char *cipher_plus_tag = NULL;
1143 size_t cipher_plus_tag_len;
1144 unsigned char *decrypt_buf = NULL;
1145 size_t decrypt_buf_len = 0;
1146 unsigned char *encrypt_buf = NULL;
1147 size_t encrypt_buf_len = 0;
1148
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001149#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1150 !defined(MBEDTLS_DEPRECATED_REMOVED)
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001151 unsigned char *tmp_tag = NULL;
1152 unsigned char *tmp_cipher = NULL;
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001153 unsigned char *tag_buf = NULL;
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001154#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1155
Gilles Peskine70edd682020-12-03 20:27:27 +01001156 /* Null pointers are documented as valid for inputs of length 0.
1157 * The test framework passes non-null pointers, so set them to NULL.
1158 * key, cipher and tag can't be empty. */
1159 if( iv->len == 0 )
1160 iv->x = NULL;
1161 if( ad->len == 0 )
1162 ad->x = NULL;
1163 if( clear->len == 0 )
1164 clear->x = NULL;
1165
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001166 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001167
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001168 /* Initialize PSA Crypto */
1169#if defined(MBEDTLS_USE_PSA_CRYPTO)
1170 if( use_psa == 1 )
1171 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckera13272d2018-11-12 16:27:30 +00001172#else
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001173 (void) use_psa;
1174#endif
1175
1176 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001177 * Are we using NIST_KW? with padding?
1178 */
1179 using_nist_kw_padding = cipher_id == MBEDTLS_CIPHER_AES_128_KWP ||
1180 cipher_id == MBEDTLS_CIPHER_AES_192_KWP ||
1181 cipher_id == MBEDTLS_CIPHER_AES_256_KWP;
1182 using_nist_kw = cipher_id == MBEDTLS_CIPHER_AES_128_KW ||
1183 cipher_id == MBEDTLS_CIPHER_AES_192_KW ||
1184 cipher_id == MBEDTLS_CIPHER_AES_256_KW ||
1185 using_nist_kw_padding;
1186
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001187 /****************************************************************
1188 * *
1189 * Part 1: non-deprecated API *
1190 * *
1191 ****************************************************************/
1192
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001193 /*
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001194 * Prepare context for decryption
1195 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001196 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1197 MBEDTLS_DECRYPT ) )
1198 goto exit;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001199
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001200 /*
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001201 * prepare buffer for decryption
1202 * (we need the tag appended to the ciphertext)
1203 */
1204 cipher_plus_tag_len = cipher->len + tag->len;
1205 ASSERT_ALLOC( cipher_plus_tag, cipher_plus_tag_len );
1206 memcpy( cipher_plus_tag, cipher->x, cipher->len );
1207 memcpy( cipher_plus_tag + cipher->len, tag->x, tag->len );
1208
1209 /*
1210 * Compute length of output buffer according to the documentation
1211 */
1212 if( using_nist_kw )
1213 decrypt_buf_len = cipher_plus_tag_len - 8;
1214 else
1215 decrypt_buf_len = cipher_plus_tag_len - tag->len;
1216
1217
1218 /*
1219 * Try decrypting to a buffer that's 1B too small
1220 */
1221 if( decrypt_buf_len != 0 )
1222 {
1223 ASSERT_ALLOC( decrypt_buf, decrypt_buf_len - 1 );
1224
1225 outlen = 0;
1226 ret = mbedtls_cipher_auth_decrypt_ext( &ctx, iv->x, iv->len,
1227 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1228 decrypt_buf, decrypt_buf_len - 1, &outlen, tag->len );
1229 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1230
1231 mbedtls_free( decrypt_buf );
1232 decrypt_buf = NULL;
1233 }
1234
1235 /*
1236 * Authenticate and decrypt, and check result
1237 */
1238 ASSERT_ALLOC( decrypt_buf, decrypt_buf_len );
1239
1240 outlen = 0;
1241 ret = mbedtls_cipher_auth_decrypt_ext( &ctx, iv->x, iv->len,
1242 ad->x, ad->len, cipher_plus_tag, cipher_plus_tag_len,
1243 decrypt_buf, decrypt_buf_len, &outlen, tag->len );
1244
1245 if( strcmp( result, "FAIL" ) == 0 )
1246 {
1247 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +01001248 TEST_ASSERT( buffer_is_all_zero( decrypt_buf, decrypt_buf_len ) );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001249 }
1250 else
1251 {
1252 TEST_ASSERT( ret == 0 );
Gilles Peskinea2971ea2020-12-03 20:36:02 +01001253 ASSERT_COMPARE( decrypt_buf, outlen, clear->x, clear->len );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001254 }
1255
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001256 /* Free this, but keep cipher_plus_tag for deprecated function with PSA */
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001257 mbedtls_free( decrypt_buf );
1258 decrypt_buf = NULL;
1259
1260 /*
1261 * Encrypt back if test data was authentic
1262 */
1263 if( strcmp( result, "FAIL" ) != 0 )
1264 {
1265 /* prepare context for encryption */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001266 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1267 MBEDTLS_ENCRYPT ) )
1268 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001269
1270 /*
1271 * Compute size of output buffer according to documentation
1272 */
1273 if( using_nist_kw )
1274 {
1275 encrypt_buf_len = clear->len + 8;
1276 if( using_nist_kw_padding && encrypt_buf_len % 8 != 0 )
1277 encrypt_buf_len += 8 - encrypt_buf_len % 8;
1278 }
1279 else
1280 {
1281 encrypt_buf_len = clear->len + tag->len;
1282 }
1283
1284 /*
1285 * Try encrypting with an output buffer that's 1B too small
1286 */
1287 ASSERT_ALLOC( encrypt_buf, encrypt_buf_len - 1 );
1288
1289 outlen = 0;
1290 ret = mbedtls_cipher_auth_encrypt_ext( &ctx, iv->x, iv->len,
1291 ad->x, ad->len, clear->x, clear->len,
1292 encrypt_buf, encrypt_buf_len - 1, &outlen, tag->len );
1293 TEST_ASSERT( ret != 0 );
1294
1295 mbedtls_free( encrypt_buf );
1296 encrypt_buf = NULL;
1297
1298 /*
1299 * Encrypt and check the result
1300 */
1301 ASSERT_ALLOC( encrypt_buf, encrypt_buf_len );
1302
1303 outlen = 0;
1304 ret = mbedtls_cipher_auth_encrypt_ext( &ctx, iv->x, iv->len,
1305 ad->x, ad->len, clear->x, clear->len,
1306 encrypt_buf, encrypt_buf_len, &outlen, tag->len );
1307 TEST_ASSERT( ret == 0 );
1308
1309 TEST_ASSERT( outlen == cipher->len + tag->len );
1310 TEST_ASSERT( memcmp( encrypt_buf, cipher->x, cipher->len ) == 0 );
1311 TEST_ASSERT( memcmp( encrypt_buf + cipher->len,
1312 tag->x, tag->len ) == 0 );
1313
1314 mbedtls_free( encrypt_buf );
1315 encrypt_buf = NULL;
1316 }
1317
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001318 /****************************************************************
1319 * *
1320 * Part 2: deprecated API *
1321 * *
1322 ****************************************************************/
1323
1324#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1325 !defined(MBEDTLS_DEPRECATED_REMOVED)
1326
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001327 /*
1328 * Prepare context for decryption
1329 */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001330 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1331 MBEDTLS_DECRYPT ) )
1332 goto exit;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001333
1334 /*
1335 * Prepare pointers for decryption
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001336 */
1337#if defined(MBEDTLS_USE_PSA_CRYPTO)
1338 if( use_psa == 1 )
1339 {
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001340 /* PSA requires that the tag immediately follows the ciphertext.
1341 * Fortunately, we already have that from testing the new API. */
1342 tmp_cipher = cipher_plus_tag;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001343 tmp_tag = tmp_cipher + cipher->len;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001344 }
1345 else
1346#endif /* MBEDTLS_USE_PSA_CRYPTO */
1347 {
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001348 tmp_cipher = cipher->x;
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001349 tmp_tag = tag->x;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001350 }
1351
1352 /*
1353 * Authenticate and decrypt, and check result
1354 */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001355
Gilles Peskine70edd682020-12-03 20:27:27 +01001356 ASSERT_ALLOC( decrypt_buf, cipher->len );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001357 outlen = 0;
Hanno Beckera13272d2018-11-12 16:27:30 +00001358 ret = mbedtls_cipher_auth_decrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001359 tmp_cipher, cipher->len, decrypt_buf, &outlen,
Hanno Beckera13272d2018-11-12 16:27:30 +00001360 tmp_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001361
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001362 if( using_nist_kw )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001363 {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001364 /* NIST_KW with legacy API */
1365 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
1366 }
1367 else if( strcmp( result, "FAIL" ) == 0 )
1368 {
1369 /* unauthentic message */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001370 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Manuel Pégourié-Gonnardf215ef82020-12-03 12:33:31 +01001371 TEST_ASSERT( buffer_is_all_zero( decrypt_buf, cipher->len ) );
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001372 }
1373 else
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001374 {
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001375 /* authentic message: is the plaintext correct? */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001376 TEST_ASSERT( ret == 0 );
Gilles Peskinea2971ea2020-12-03 20:36:02 +01001377 ASSERT_COMPARE( decrypt_buf, outlen, clear->x, clear->len );
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001378 }
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001379
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001380 mbedtls_free( decrypt_buf );
1381 decrypt_buf = NULL;
1382 mbedtls_free( cipher_plus_tag );
1383 cipher_plus_tag = NULL;
1384
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001385 /*
1386 * Encrypt back if test data was authentic
1387 */
1388 if( strcmp( result, "FAIL" ) != 0 )
1389 {
1390 /* prepare context for encryption */
Gilles Peskine8a3d2342020-12-03 21:06:15 +01001391 if( ! cipher_reset_key( &ctx, cipher_id, use_psa, tag->len, key,
1392 MBEDTLS_ENCRYPT ) )
1393 goto exit;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001394
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001395 /* prepare buffers for encryption */
1396#if defined(MBEDTLS_USE_PSA_CRYPTO)
1397 if( use_psa )
1398 {
1399 ASSERT_ALLOC( cipher_plus_tag, cipher->len + tag->len );
1400 tmp_cipher = cipher_plus_tag;
1401 tmp_tag = cipher_plus_tag + cipher->len;
1402 }
1403 else
1404#endif /* MBEDTLS_USE_PSA_CRYPTO */
1405 {
Gilles Peskine70edd682020-12-03 20:27:27 +01001406 ASSERT_ALLOC( encrypt_buf, cipher->len );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001407 ASSERT_ALLOC( tag_buf, tag->len );
1408 tmp_cipher = encrypt_buf;
1409 tmp_tag = tag_buf;
1410 }
1411
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001412 /*
1413 * Encrypt and check the result
1414 */
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001415 outlen = 0;
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001416 ret = mbedtls_cipher_auth_encrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001417 clear->x, clear->len, tmp_cipher, &outlen,
1418 tmp_tag, tag->len );
Manuel Pégourié-Gonnard4c1a1002020-11-26 10:22:50 +01001419
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001420 if( using_nist_kw )
1421 {
1422 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
1423 }
1424 else
1425 {
1426 TEST_ASSERT( ret == 0 );
1427
1428 TEST_ASSERT( outlen == cipher->len );
Gilles Peskine70edd682020-12-03 20:27:27 +01001429 if( cipher->len != 0 )
1430 TEST_ASSERT( memcmp( tmp_cipher, cipher->x, cipher->len ) == 0 );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001431 TEST_ASSERT( memcmp( tmp_tag, tag->x, tag->len ) == 0 );
Manuel Pégourié-Gonnardf2ffbc42020-12-01 09:57:55 +01001432 }
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001433 }
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001434
Manuel Pégourié-Gonnard513c2432020-12-01 10:34:57 +01001435#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
1436
Paul Bakkerbd51b262014-07-10 15:26:12 +02001437exit:
Hanno Beckera13272d2018-11-12 16:27:30 +00001438
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001439 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard53f10e72020-11-30 10:17:01 +01001440 mbedtls_free( decrypt_buf );
1441 mbedtls_free( encrypt_buf );
1442 mbedtls_free( cipher_plus_tag );
Manuel Pégourié-Gonnard9b2a7892020-12-03 11:09:46 +01001443#if !defined(MBEDTLS_DEPRECATED_WARNING) && \
1444 !defined(MBEDTLS_DEPRECATED_REMOVED)
1445 mbedtls_free( tag_buf );
1446#endif /* !MBEDTLS_DEPRECATED_WARNING && !MBEDTLS_DEPRECATED_REMOVED */
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001447
Hanno Beckera13272d2018-11-12 16:27:30 +00001448#if defined(MBEDTLS_USE_PSA_CRYPTO)
1449 if( use_psa == 1 )
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001450 PSA_DONE( );
Hanno Beckera13272d2018-11-12 16:27:30 +00001451#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001452}
1453/* END_CASE */
1454
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001455/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001456void test_vec_ecb( int cipher_id, int operation, data_t * key,
1457 data_t * input, data_t * result, int finish_result
Azim Khand30ca132017-06-09 04:32:58 +01001458 )
Paul Bakker5e0efa72013-09-08 23:04:04 +02001459{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001460 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +02001461 unsigned char output[32];
1462 size_t outlen;
1463
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001464 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001465
Paul Bakker5e0efa72013-09-08 23:04:04 +02001466 memset( output, 0x00, sizeof( output ) );
1467
1468 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001469 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001470 mbedtls_cipher_info_from_type( cipher_id ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001471
Paul Bakker5e0efa72013-09-08 23:04:04 +02001472
Azim Khand30ca132017-06-09 04:32:58 +01001473 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001474
Azim Khand30ca132017-06-09 04:32:58 +01001475 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, input->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001476 mbedtls_cipher_get_block_size( &ctx ),
Paul Bakker5e0efa72013-09-08 23:04:04 +02001477 output, &outlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001478 TEST_ASSERT( outlen == mbedtls_cipher_get_block_size( &ctx ) );
1479 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001480 &outlen ) );
1481 TEST_ASSERT( 0 == outlen );
1482
1483 /* check plaintext only if everything went fine */
1484 if( 0 == finish_result )
Azim Khand30ca132017-06-09 04:32:58 +01001485 TEST_ASSERT( 0 == memcmp( output, result->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
Paul Bakkerbd51b262014-07-10 15:26:12 +02001488exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001489 mbedtls_cipher_free( &ctx );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001490}
1491/* END_CASE */
1492
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001493/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Ronald Cron9ed40732020-06-25 09:03:34 +02001494void test_vec_crypt( int cipher_id, int operation, data_t *key,
1495 data_t *iv, data_t *input, data_t *result,
Hanno Beckere43164e2018-11-12 12:46:35 +00001496 int finish_result, int use_psa )
Ron Eldor7b012442017-09-25 17:03:12 +03001497{
Ron Eldor7b012442017-09-25 17:03:12 +03001498 mbedtls_cipher_context_t ctx;
1499 unsigned char output[32];
1500 size_t outlen;
1501
1502 mbedtls_cipher_init( &ctx );
1503
Ron Eldor7b012442017-09-25 17:03:12 +03001504 memset( output, 0x00, sizeof( output ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001505
1506 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +00001507#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1508 (void) use_psa;
1509#else
1510 if( use_psa == 1 )
1511 {
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001512 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001513 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001514 mbedtls_cipher_info_from_type( cipher_id ), 0 ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001515 }
1516 else
1517#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001518 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001519 mbedtls_cipher_info_from_type( cipher_id ) ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001520
Ronald Cron9ed40732020-06-25 09:03:34 +02001521 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001522 if( MBEDTLS_MODE_CBC == ctx.cipher_info->mode )
1523 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, MBEDTLS_PADDING_NONE ) );
1524
Ronald Cron9ed40732020-06-25 09:03:34 +02001525 TEST_ASSERT( finish_result == mbedtls_cipher_crypt( &ctx, iv->len ? iv->x : NULL,
1526 iv->len, input->x, input->len,
Ron Eldor7b012442017-09-25 17:03:12 +03001527 output, &outlen ) );
Ronald Cron9ed40732020-06-25 09:03:34 +02001528 TEST_ASSERT( result->len == outlen );
Ron Eldor7b012442017-09-25 17:03:12 +03001529 /* check plaintext only if everything went fine */
1530 if( 0 == finish_result )
Ronald Cron9ed40732020-06-25 09:03:34 +02001531 TEST_ASSERT( 0 == memcmp( output, result->x, outlen ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001532
1533exit:
1534 mbedtls_cipher_free( &ctx );
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001535#if defined(MBEDTLS_USE_PSA_CRYPTO)
1536 PSA_DONE( );
1537#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001538}
1539/* END_CASE */
1540
1541/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Paul Bakker33b43f12013-08-20 11:48:36 +02001542void set_padding( int cipher_id, int pad_mode, int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001543{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001544 const mbedtls_cipher_info_t *cipher_info;
1545 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001546
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001547 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001548
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001549 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001550 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001551 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001552
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001553 TEST_ASSERT( ret == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001554
Paul Bakkerbd51b262014-07-10 15:26:12 +02001555exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001556 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001557}
Paul Bakker33b43f12013-08-20 11:48:36 +02001558/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001559
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001560/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Azim Khan5fcca462018-06-29 11:05:32 +01001561void check_padding( int pad_mode, data_t * input, int ret, int dlen_check
Azim Khand30ca132017-06-09 04:32:58 +01001562 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001563{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001564 mbedtls_cipher_info_t cipher_info;
1565 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001566 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001567
1568 /* build a fake context just for getting access to get_padding */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001569 mbedtls_cipher_init( &ctx );
1570 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001571 ctx.cipher_info = &cipher_info;
1572
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001573 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001574
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001575
Azim Khand30ca132017-06-09 04:32:58 +01001576 TEST_ASSERT( ret == ctx.get_padding( input->x, input->len, &dlen ) );
Paul Bakker33b43f12013-08-20 11:48:36 +02001577 if( 0 == ret )
1578 TEST_ASSERT( dlen == (size_t) dlen_check );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001579}
Paul Bakker33b43f12013-08-20 11:48:36 +02001580/* END_CASE */