blob: f6367f17582fbb4719ceecc31f03eaf26a31dc54 [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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02004#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00005#include "mbedtls/gcm.h"
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +02006#endif
Gilles Peskine5386f6b2019-08-01 12:47:40 +02007
8#if defined(MBEDTLS_USE_PSA_CRYPTO)
9#include "psa_crypto_helpers.h"
10#endif
11
Paul Bakker33b43f12013-08-20 11:48:36 +020012/* END_HEADER */
Paul Bakker8123e9d2011-01-06 15:37:30 +000013
Paul Bakker33b43f12013-08-20 11:48:36 +020014/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020015 * depends_on:MBEDTLS_CIPHER_C
Paul Bakker33b43f12013-08-20 11:48:36 +020016 * END_DEPENDENCIES
17 */
Paul Bakker5690efc2011-05-26 13:16:06 +000018
Paul Bakker33b43f12013-08-20 11:48:36 +020019/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +010020void mbedtls_cipher_list( )
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010021{
22 const int *cipher_type;
23
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020024 for( cipher_type = mbedtls_cipher_list(); *cipher_type != 0; cipher_type++ )
25 TEST_ASSERT( mbedtls_cipher_info_from_type( *cipher_type ) != NULL );
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010026}
27/* END_CASE */
28
29/* BEGIN_CASE */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050030void cipher_invalid_param_unconditional( )
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020031{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050032 mbedtls_cipher_context_t valid_ctx;
33 mbedtls_cipher_context_t invalid_ctx;
34 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
35 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
36 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
37 int valid_size = sizeof(valid_buffer);
38 int valid_bitlen = valid_size * 8;
39 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
40 *( mbedtls_cipher_list() ) );
41 size_t size_t_var;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020042
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050043 (void)valid_mode; /* In some configurations this is unused */
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020044
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050045 mbedtls_cipher_init( &valid_ctx );
46 mbedtls_cipher_setup( &valid_ctx, valid_info );
47 mbedtls_cipher_init( &invalid_ctx );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020048
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050049 /* mbedtls_cipher_setup() */
50 TEST_ASSERT( mbedtls_cipher_setup( &valid_ctx, NULL ) ==
51 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020052
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050053 /* mbedtls_cipher_get_block_size() */
54 TEST_ASSERT( mbedtls_cipher_get_block_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020055
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050056 /* mbedtls_cipher_get_cipher_mode() */
57 TEST_ASSERT( mbedtls_cipher_get_cipher_mode( &invalid_ctx ) ==
58 MBEDTLS_MODE_NONE );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020059
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050060 /* mbedtls_cipher_get_iv_size() */
61 TEST_ASSERT( mbedtls_cipher_get_iv_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020062
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050063 /* mbedtls_cipher_get_type() */
64 TEST_ASSERT(
65 mbedtls_cipher_get_type( &invalid_ctx ) ==
66 MBEDTLS_CIPHER_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020067
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050068 /* mbedtls_cipher_get_name() */
69 TEST_ASSERT( mbedtls_cipher_get_name( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020070
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050071 /* mbedtls_cipher_get_key_bitlen() */
72 TEST_ASSERT( mbedtls_cipher_get_key_bitlen( &invalid_ctx ) ==
73 MBEDTLS_KEY_LENGTH_NONE );
74
75 /* mbedtls_cipher_get_operation() */
76 TEST_ASSERT( mbedtls_cipher_get_operation( &invalid_ctx ) ==
77 MBEDTLS_OPERATION_NONE );
78
79 /* mbedtls_cipher_setkey() */
80 TEST_ASSERT(
81 mbedtls_cipher_setkey( &invalid_ctx,
82 valid_buffer,
83 valid_bitlen,
84 valid_operation ) ==
85 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
86
87 /* mbedtls_cipher_set_iv() */
88 TEST_ASSERT(
89 mbedtls_cipher_set_iv( &invalid_ctx,
90 valid_buffer,
91 valid_size ) ==
92 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
93
94 /* mbedtls_cipher_reset() */
95 TEST_ASSERT( mbedtls_cipher_reset( &invalid_ctx ) ==
96 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020097
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020098#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050099 /* mbedtls_cipher_update_ad() */
100 TEST_ASSERT(
101 mbedtls_cipher_update_ad( &invalid_ctx,
102 valid_buffer,
103 valid_size ) ==
104 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
105#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
106
107#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
108 /* mbedtls_cipher_set_padding_mode() */
109 TEST_ASSERT( mbedtls_cipher_set_padding_mode( &invalid_ctx, valid_mode ) ==
110 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200111#endif
112
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500113 /* mbedtls_cipher_update() */
114 TEST_ASSERT(
115 mbedtls_cipher_update( &invalid_ctx,
116 valid_buffer,
117 valid_size,
118 valid_buffer,
119 &size_t_var ) ==
120 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200121
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500122 /* mbedtls_cipher_finish() */
123 TEST_ASSERT(
124 mbedtls_cipher_finish( &invalid_ctx,
125 valid_buffer,
126 &size_t_var ) ==
127 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200128
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200129#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500130 /* mbedtls_cipher_write_tag() */
131 TEST_ASSERT(
132 mbedtls_cipher_write_tag( &invalid_ctx,
133 valid_buffer,
134 valid_size ) ==
135 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200136
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500137 /* mbedtls_cipher_check_tag() */
138 TEST_ASSERT(
139 mbedtls_cipher_check_tag( &invalid_ctx,
140 valid_buffer,
141 valid_size ) ==
142 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
143#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
144
145exit:
146 mbedtls_cipher_free( &invalid_ctx );
147 mbedtls_cipher_free( &valid_ctx );
148}
149/* END_CASE */
150
151/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
152void cipher_invalid_param_conditional( )
153{
154 mbedtls_cipher_context_t valid_ctx;
155
156 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
157 mbedtls_operation_t invalid_operation = 100;
158 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
159 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
160 int valid_size = sizeof(valid_buffer);
161 int valid_bitlen = valid_size * 8;
162 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
163 *( mbedtls_cipher_list() ) );
164
165 size_t size_t_var;
166
167 (void)valid_mode; /* In some configurations this is unused */
168
169 /* mbedtls_cipher_init() */
170 TEST_VALID_PARAM( mbedtls_cipher_init( &valid_ctx ) );
171 TEST_INVALID_PARAM( mbedtls_cipher_init( NULL ) );
172
173 /* mbedtls_cipher_setup() */
174 TEST_VALID_PARAM( mbedtls_cipher_setup( &valid_ctx, valid_info ) );
175 TEST_INVALID_PARAM_RET(
176 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
177 mbedtls_cipher_setup( NULL, valid_info ) );
178
179 /* mbedtls_cipher_get_block_size() */
180 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_block_size( NULL ) );
181
182 /* mbedtls_cipher_get_cipher_mode() */
183 TEST_INVALID_PARAM_RET(
184 MBEDTLS_MODE_NONE,
185 mbedtls_cipher_get_cipher_mode( NULL ) );
186
187 /* mbedtls_cipher_get_iv_size() */
188 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_iv_size( NULL ) );
189
190 /* mbedtls_cipher_get_type() */
191 TEST_INVALID_PARAM_RET(
192 MBEDTLS_CIPHER_NONE,
193 mbedtls_cipher_get_type( NULL ) );
194
195 /* mbedtls_cipher_get_name() */
196 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_name( NULL ) );
197
198 /* mbedtls_cipher_get_key_bitlen() */
199 TEST_INVALID_PARAM_RET(
200 MBEDTLS_KEY_LENGTH_NONE,
201 mbedtls_cipher_get_key_bitlen( NULL ) );
202
203 /* mbedtls_cipher_get_operation() */
204 TEST_INVALID_PARAM_RET(
205 MBEDTLS_OPERATION_NONE,
206 mbedtls_cipher_get_operation( NULL ) );
207
208 /* mbedtls_cipher_setkey() */
209 TEST_INVALID_PARAM_RET(
210 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
211 mbedtls_cipher_setkey( NULL,
212 valid_buffer,
213 valid_bitlen,
214 valid_operation ) );
215 TEST_INVALID_PARAM_RET(
216 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
217 mbedtls_cipher_setkey( &valid_ctx,
218 NULL,
219 valid_bitlen,
220 valid_operation ) );
221 TEST_INVALID_PARAM_RET(
222 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
223 mbedtls_cipher_setkey( &valid_ctx,
224 valid_buffer,
225 valid_bitlen,
226 invalid_operation ) );
227
228 /* mbedtls_cipher_set_iv() */
229 TEST_INVALID_PARAM_RET(
230 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
231 mbedtls_cipher_set_iv( NULL,
232 valid_buffer,
233 valid_size ) );
234 TEST_INVALID_PARAM_RET(
235 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
236 mbedtls_cipher_set_iv( &valid_ctx,
237 NULL,
238 valid_size ) );
239
240 /* mbedtls_cipher_reset() */
241 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
242 mbedtls_cipher_reset( NULL ) );
243
244#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
245 /* mbedtls_cipher_update_ad() */
246 TEST_INVALID_PARAM_RET(
247 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
248 mbedtls_cipher_update_ad( NULL,
249 valid_buffer,
250 valid_size ) );
251 TEST_INVALID_PARAM_RET(
252 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
253 mbedtls_cipher_update_ad( &valid_ctx,
254 NULL,
255 valid_size ) );
256#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
257
258#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
259 /* mbedtls_cipher_set_padding_mode() */
260 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
261 mbedtls_cipher_set_padding_mode( NULL, valid_mode ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200262#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500263
264 /* mbedtls_cipher_update() */
265 TEST_INVALID_PARAM_RET(
266 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
267 mbedtls_cipher_update( NULL,
268 valid_buffer,
269 valid_size,
270 valid_buffer,
271 &size_t_var ) );
272 TEST_INVALID_PARAM_RET(
273 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
274 mbedtls_cipher_update( &valid_ctx,
275 NULL, valid_size,
276 valid_buffer,
277 &size_t_var ) );
278 TEST_INVALID_PARAM_RET(
279 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
280 mbedtls_cipher_update( &valid_ctx,
281 valid_buffer, valid_size,
282 NULL,
283 &size_t_var ) );
284 TEST_INVALID_PARAM_RET(
285 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
286 mbedtls_cipher_update( &valid_ctx,
287 valid_buffer, valid_size,
288 valid_buffer,
289 NULL ) );
290
291 /* mbedtls_cipher_finish() */
292 TEST_INVALID_PARAM_RET(
293 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
294 mbedtls_cipher_finish( NULL,
295 valid_buffer,
296 &size_t_var ) );
297 TEST_INVALID_PARAM_RET(
298 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
299 mbedtls_cipher_finish( &valid_ctx,
300 NULL,
301 &size_t_var ) );
302 TEST_INVALID_PARAM_RET(
303 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
304 mbedtls_cipher_finish( &valid_ctx,
305 valid_buffer,
306 NULL ) );
307
308#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
309 /* mbedtls_cipher_write_tag() */
310 TEST_INVALID_PARAM_RET(
311 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
312 mbedtls_cipher_write_tag( NULL,
313 valid_buffer,
314 valid_size ) );
315 TEST_INVALID_PARAM_RET(
316 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
317 mbedtls_cipher_write_tag( &valid_ctx,
318 NULL,
319 valid_size ) );
320
321 /* mbedtls_cipher_check_tag() */
322 TEST_INVALID_PARAM_RET(
323 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
324 mbedtls_cipher_check_tag( NULL,
325 valid_buffer,
326 valid_size ) );
327 TEST_INVALID_PARAM_RET(
328 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
329 mbedtls_cipher_check_tag( &valid_ctx,
330 NULL,
331 valid_size ) );
332#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
333
334 /* mbedtls_cipher_crypt() */
335 TEST_INVALID_PARAM_RET(
336 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
337 mbedtls_cipher_crypt( NULL,
338 valid_buffer, valid_size,
339 valid_buffer, valid_size,
340 valid_buffer, &size_t_var ) );
341 TEST_INVALID_PARAM_RET(
342 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
343 mbedtls_cipher_crypt( &valid_ctx,
344 NULL, valid_size,
345 valid_buffer, valid_size,
346 valid_buffer, &size_t_var ) );
347 TEST_INVALID_PARAM_RET(
348 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
349 mbedtls_cipher_crypt( &valid_ctx,
350 valid_buffer, valid_size,
351 NULL, valid_size,
352 valid_buffer, &size_t_var ) );
353 TEST_INVALID_PARAM_RET(
354 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
355 mbedtls_cipher_crypt( &valid_ctx,
356 valid_buffer, valid_size,
357 valid_buffer, valid_size,
358 NULL, &size_t_var ) );
359 TEST_INVALID_PARAM_RET(
360 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
361 mbedtls_cipher_crypt( &valid_ctx,
362 valid_buffer, valid_size,
363 valid_buffer, valid_size,
364 valid_buffer, NULL ) );
365
366#if defined(MBEDTLS_CIPHER_MODE_AEAD)
367 /* mbedtls_cipher_auth_encrypt() */
368 TEST_INVALID_PARAM_RET(
369 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
370 mbedtls_cipher_auth_encrypt( NULL,
371 valid_buffer, valid_size,
372 valid_buffer, valid_size,
373 valid_buffer, valid_size,
374 valid_buffer, &size_t_var,
375 valid_buffer, valid_size ) );
376 TEST_INVALID_PARAM_RET(
377 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
378 mbedtls_cipher_auth_encrypt( &valid_ctx,
379 NULL, valid_size,
380 valid_buffer, valid_size,
381 valid_buffer, valid_size,
382 valid_buffer, &size_t_var,
383 valid_buffer, valid_size ) );
384 TEST_INVALID_PARAM_RET(
385 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
386 mbedtls_cipher_auth_encrypt( &valid_ctx,
387 valid_buffer, valid_size,
388 NULL, valid_size,
389 valid_buffer, valid_size,
390 valid_buffer, &size_t_var,
391 valid_buffer, valid_size ) );
392 TEST_INVALID_PARAM_RET(
393 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
394 mbedtls_cipher_auth_encrypt( &valid_ctx,
395 valid_buffer, valid_size,
396 valid_buffer, valid_size,
397 NULL, valid_size,
398 valid_buffer, &size_t_var,
399 valid_buffer, valid_size ) );
400 TEST_INVALID_PARAM_RET(
401 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
402 mbedtls_cipher_auth_encrypt( &valid_ctx,
403 valid_buffer, valid_size,
404 valid_buffer, valid_size,
405 valid_buffer, valid_size,
406 NULL, &size_t_var,
407 valid_buffer, valid_size ) );
408 TEST_INVALID_PARAM_RET(
409 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
410 mbedtls_cipher_auth_encrypt( &valid_ctx,
411 valid_buffer, valid_size,
412 valid_buffer, valid_size,
413 valid_buffer, valid_size,
414 valid_buffer, NULL,
415 valid_buffer, valid_size ) );
416 TEST_INVALID_PARAM_RET(
417 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
418 mbedtls_cipher_auth_encrypt( &valid_ctx,
419 valid_buffer, valid_size,
420 valid_buffer, valid_size,
421 valid_buffer, valid_size,
422 valid_buffer, &size_t_var,
423 NULL, valid_size ) );
424
425 /* mbedtls_cipher_auth_decrypt() */
426 TEST_INVALID_PARAM_RET(
427 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
428 mbedtls_cipher_auth_decrypt( NULL,
429 valid_buffer, valid_size,
430 valid_buffer, valid_size,
431 valid_buffer, valid_size,
432 valid_buffer, &size_t_var,
433 valid_buffer, valid_size ) );
434 TEST_INVALID_PARAM_RET(
435 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
436 mbedtls_cipher_auth_decrypt( &valid_ctx,
437 NULL, valid_size,
438 valid_buffer, valid_size,
439 valid_buffer, valid_size,
440 valid_buffer, &size_t_var,
441 valid_buffer, valid_size ) );
442 TEST_INVALID_PARAM_RET(
443 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
444 mbedtls_cipher_auth_decrypt( &valid_ctx,
445 valid_buffer, valid_size,
446 NULL, valid_size,
447 valid_buffer, valid_size,
448 valid_buffer, &size_t_var,
449 valid_buffer, valid_size ) );
450 TEST_INVALID_PARAM_RET(
451 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
452 mbedtls_cipher_auth_decrypt( &valid_ctx,
453 valid_buffer, valid_size,
454 valid_buffer, valid_size,
455 NULL, valid_size,
456 valid_buffer, &size_t_var,
457 valid_buffer, valid_size ) );
458 TEST_INVALID_PARAM_RET(
459 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
460 mbedtls_cipher_auth_decrypt( &valid_ctx,
461 valid_buffer, valid_size,
462 valid_buffer, valid_size,
463 valid_buffer, valid_size,
464 NULL, &size_t_var,
465 valid_buffer, valid_size ) );
466 TEST_INVALID_PARAM_RET(
467 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
468 mbedtls_cipher_auth_decrypt( &valid_ctx,
469 valid_buffer, valid_size,
470 valid_buffer, valid_size,
471 valid_buffer, valid_size,
472 valid_buffer, NULL,
473 valid_buffer, valid_size ) );
474 TEST_INVALID_PARAM_RET(
475 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
476 mbedtls_cipher_auth_decrypt( &valid_ctx,
477 valid_buffer, valid_size,
478 valid_buffer, valid_size,
479 valid_buffer, valid_size,
480 valid_buffer, &size_t_var,
481 NULL, valid_size ) );
482#endif /* defined(MBEDTLS_CIPHER_MODE_AEAD) */
483
484 /* mbedtls_cipher_free() */
485 TEST_VALID_PARAM( mbedtls_cipher_free( NULL ) );
486exit:
487 TEST_VALID_PARAM( mbedtls_cipher_free( &valid_ctx ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200488}
489/* END_CASE */
490
Paul Bakker6a9c7252016-07-14 13:46:10 +0100491/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Azim Khanf1aaec92017-05-30 14:23:15 +0100492void cipher_special_behaviours( )
Paul Bakker6a9c7252016-07-14 13:46:10 +0100493{
494 const mbedtls_cipher_info_t *cipher_info;
495 mbedtls_cipher_context_t ctx;
496 unsigned char input[32];
497 unsigned char output[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300498#if defined (MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100499 unsigned char iv[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300500#endif
Paul Bakker6a9c7252016-07-14 13:46:10 +0100501 size_t olen = 0;
502
503 mbedtls_cipher_init( &ctx );
504 memset( input, 0, sizeof( input ) );
505 memset( output, 0, sizeof( output ) );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300506#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100507 memset( iv, 0, sizeof( iv ) );
508
509 /* Check and get info structures */
Ron Eldor7b012442017-09-25 17:03:12 +0300510 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_CBC );
Paul Bakker6a9c7252016-07-14 13:46:10 +0100511 TEST_ASSERT( NULL != cipher_info );
512
513 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
514
515 /* IV too big */
516 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, MBEDTLS_MAX_IV_LENGTH + 1 )
517 == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
518
519 /* IV too small */
520 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, 0 )
521 == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
522
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300523 mbedtls_cipher_free( &ctx );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300524 mbedtls_cipher_init( &ctx );
Ron Eldor6f90ed82017-09-26 12:08:54 +0300525#endif /* MBEDTLS_CIPHER_MODE_CBC */
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300526 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
Ron Eldor7b012442017-09-25 17:03:12 +0300527 TEST_ASSERT( NULL != cipher_info );
528
529 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
530
Paul Bakker6a9c7252016-07-14 13:46:10 +0100531 /* Update ECB with partial block */
532 TEST_ASSERT( mbedtls_cipher_update( &ctx, input, 1, output, &olen )
533 == MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
534
535exit:
536 mbedtls_cipher_free( &ctx );
537}
538/* END_CASE */
539
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200540/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100541void enc_dec_buf( int cipher_id, char * cipher_string, int key_len,
Paul Bakker33b43f12013-08-20 11:48:36 +0200542 int length_val, int pad_mode )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200543{
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200544 size_t length = length_val, outlen, total_len, i, block_size;
Jaeden Amerod906b812018-06-08 11:03:16 +0100545 unsigned char key[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000546 unsigned char iv[16];
Manuel Pégourié-Gonnard9241be72013-08-31 17:31:03 +0200547 unsigned char ad[13];
548 unsigned char tag[16];
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200549 unsigned char inbuf[64];
550 unsigned char encbuf[64];
551 unsigned char decbuf[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000552
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200553 const mbedtls_cipher_info_t *cipher_info;
554 mbedtls_cipher_context_t ctx_dec;
555 mbedtls_cipher_context_t ctx_enc;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000556
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200557 /*
558 * Prepare contexts
559 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560 mbedtls_cipher_init( &ctx_dec );
561 mbedtls_cipher_init( &ctx_enc );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200562
563 memset( key, 0x2a, sizeof( key ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000564
565 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200566 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000567 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200568 TEST_ASSERT( mbedtls_cipher_info_from_string( cipher_string ) == cipher_info );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000569
570 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200571 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
572 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
575 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000576
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200577#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Paul Bakker33b43f12013-08-20 11:48:36 +0200578 if( -1 != pad_mode )
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200579 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200580 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
581 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200582 }
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200583#else
584 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200586
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200587 /*
588 * Do a few encode/decode cycles
589 */
590 for( i = 0; i < 3; i++ )
591 {
592 memset( iv , 0x00 + i, sizeof( iv ) );
593 memset( ad, 0x10 + i, sizeof( ad ) );
594 memset( inbuf, 0x20 + i, sizeof( inbuf ) );
595
596 memset( encbuf, 0, sizeof( encbuf ) );
597 memset( decbuf, 0, sizeof( decbuf ) );
598 memset( tag, 0, sizeof( tag ) );
599
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200600 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, sizeof( iv ) ) );
601 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, sizeof( iv ) ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200602
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200603 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
604 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200605
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200606#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200607 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, ad, sizeof( ad ) - i ) );
608 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, ad, sizeof( ad ) - i ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200609#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000610
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200611 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
612 TEST_ASSERT( block_size != 0 );
613
Paul Bakker8123e9d2011-01-06 15:37:30 +0000614 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200616 total_len = outlen;
617
618 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200619 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200620 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200621 total_len + block_size > length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000622
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200623 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200624 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000625
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200626#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627 TEST_ASSERT( 0 == mbedtls_cipher_write_tag( &ctx_enc, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200628#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200629
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200630 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200631 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200632 total_len > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200633 total_len <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000634
635 /* decode the previously encoded string */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200636 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, total_len, decbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200637 total_len = outlen;
638
639 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200640 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200641 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200642 total_len + block_size >= length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000643
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200645 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000646
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200647#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200648 TEST_ASSERT( 0 == mbedtls_cipher_check_tag( &ctx_dec, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200649#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200650
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200651 /* check result */
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200652 TEST_ASSERT( total_len == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000653 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200654 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000655
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200656 /*
657 * Done
658 */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200659exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660 mbedtls_cipher_free( &ctx_dec );
661 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200662}
Paul Bakker33b43f12013-08-20 11:48:36 +0200663/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000664
Paul Bakker33b43f12013-08-20 11:48:36 +0200665/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100666void enc_fail( int cipher_id, int pad_mode, int key_len, int length_val,
667 int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200668{
Paul Bakker33b43f12013-08-20 11:48:36 +0200669 size_t length = length_val;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200670 unsigned char key[32];
671 unsigned char iv[16];
672
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200673 const mbedtls_cipher_info_t *cipher_info;
674 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200675
676 unsigned char inbuf[64];
677 unsigned char encbuf[64];
678
679 size_t outlen = 0;
680
681 memset( key, 0, 32 );
682 memset( iv , 0, 16 );
683
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200684 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200685
686 memset( inbuf, 5, 64 );
687 memset( encbuf, 0, 64 );
688
689 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200690 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200691 TEST_ASSERT( NULL != cipher_info );
692
693 /* Initialise context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200694 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200695 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, key_len, MBEDTLS_ENCRYPT ) );
696#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
697 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200698#else
699 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200700#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
701 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv, 16 ) );
702 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200703#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200704 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200705#endif
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200706
707 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200708 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, inbuf, length, encbuf, &outlen ) );
709 TEST_ASSERT( ret == mbedtls_cipher_finish( &ctx, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200710
711 /* done */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200712exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200713 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200714}
Paul Bakker33b43f12013-08-20 11:48:36 +0200715/* END_CASE */
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200716
Paul Bakker33b43f12013-08-20 11:48:36 +0200717/* BEGIN_CASE */
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100718void dec_empty_buf( int cipher )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200719{
Paul Bakker8123e9d2011-01-06 15:37:30 +0000720 unsigned char key[32];
721 unsigned char iv[16];
722
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200723 mbedtls_cipher_context_t ctx_dec;
724 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000725
726 unsigned char encbuf[64];
727 unsigned char decbuf[64];
728
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000729 size_t outlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000730
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100731 int expected_ret;
732
Paul Bakker8123e9d2011-01-06 15:37:30 +0000733 memset( key, 0, 32 );
734 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200735
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736 mbedtls_cipher_init( &ctx_dec );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200737
Paul Bakker8123e9d2011-01-06 15:37:30 +0000738 memset( encbuf, 0, 64 );
739 memset( decbuf, 0, 64 );
740
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200741 /* Initialise context */
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100742 cipher_info = mbedtls_cipher_info_from_type( cipher );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000743 TEST_ASSERT( NULL != cipher_info);
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100744 TEST_ASSERT( sizeof(key) * 8 >= cipher_info->key_bitlen );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200745
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200746 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000747
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100748 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec,
749 key, cipher_info->key_bitlen,
750 MBEDTLS_DECRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000751
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200752 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200753
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200754 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200755
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200756#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200757 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200758#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000759
760 /* decode 0-byte string */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, 0, decbuf, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000762 TEST_ASSERT( 0 == outlen );
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100763
764 if ( cipher_info->mode == MBEDTLS_MODE_CBC ||
765 cipher_info->mode == MBEDTLS_MODE_ECB )
766 {
767 /* CBC and ECB ciphers need a full block of input. */
768 expected_ret = MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED;
769 }
770 else
771 {
772 /* Non-CBC and non-ECB ciphers are OK with decrypting empty buffers and
773 * return success, not MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED, when
774 * decrypting an empty buffer. */
775 expected_ret = 0;
776 }
777
778 TEST_ASSERT( expected_ret == mbedtls_cipher_finish(
779 &ctx_dec, decbuf + outlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000780 TEST_ASSERT( 0 == outlen );
781
Paul Bakkerbd51b262014-07-10 15:26:12 +0200782exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200783 mbedtls_cipher_free( &ctx_dec );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200784}
Paul Bakker33b43f12013-08-20 11:48:36 +0200785/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000786
Paul Bakker33b43f12013-08-20 11:48:36 +0200787/* BEGIN_CASE */
788void enc_dec_buf_multipart( int cipher_id, int key_len, int first_length_val,
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700789 int second_length_val, int pad_mode,
790 int first_encrypt_output_len, int second_encrypt_output_len,
791 int first_decrypt_output_len, int second_decrypt_output_len )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200792{
Paul Bakker33b43f12013-08-20 11:48:36 +0200793 size_t first_length = first_length_val;
794 size_t second_length = second_length_val;
Paul Bakker23986e52011-04-24 08:57:21 +0000795 size_t length = first_length + second_length;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200796 size_t block_size;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000797 unsigned char key[32];
798 unsigned char iv[16];
799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800 mbedtls_cipher_context_t ctx_dec;
801 mbedtls_cipher_context_t ctx_enc;
802 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000803
804 unsigned char inbuf[64];
805 unsigned char encbuf[64];
806 unsigned char decbuf[64];
807
Paul Bakker23986e52011-04-24 08:57:21 +0000808 size_t outlen = 0;
809 size_t totaloutlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000810
811 memset( key, 0, 32 );
812 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200813
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200814 mbedtls_cipher_init( &ctx_dec );
815 mbedtls_cipher_init( &ctx_enc );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200816
Paul Bakker8123e9d2011-01-06 15:37:30 +0000817 memset( inbuf, 5, 64 );
818 memset( encbuf, 0, 64 );
819 memset( decbuf, 0, 64 );
820
821 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200822 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000823 TEST_ASSERT( NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200824
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200825 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
826 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200827
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
829 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000830
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700831#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
832 if( -1 != pad_mode )
833 {
834 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
835 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
836 }
837#else
838 (void) pad_mode;
839#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
840
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200841 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
842 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200843
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200844 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
845 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200846
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200847#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200848 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
849 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200850#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000851
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200852 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
853 TEST_ASSERT( block_size != 0 );
854
Paul Bakker8123e9d2011-01-06 15:37:30 +0000855 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200856 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, first_length, encbuf, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700857 TEST_ASSERT( (size_t)first_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000858 totaloutlen = outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200859 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf + first_length, second_length, encbuf + totaloutlen, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700860 TEST_ASSERT( (size_t)second_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000861 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200862 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200863 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200864 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200865 totaloutlen + block_size > length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200866
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200867 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + totaloutlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000868 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200869 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200870 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200871 totaloutlen > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200872 totaloutlen <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000873
874 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700875 second_length = totaloutlen - first_length;
876 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, first_length, decbuf, &outlen ) );
877 TEST_ASSERT( (size_t)first_decrypt_output_len == outlen );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200878 totaloutlen = outlen;
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700879 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf + first_length, second_length, decbuf + totaloutlen, &outlen ) );
880 TEST_ASSERT( (size_t)second_decrypt_output_len == outlen );
881 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200882
883 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200884 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200885 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200886 totaloutlen + block_size >= length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200887
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700888 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + totaloutlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200889 totaloutlen += outlen;
890
891 TEST_ASSERT( totaloutlen == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000892
893 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
894
Paul Bakkerbd51b262014-07-10 15:26:12 +0200895exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200896 mbedtls_cipher_free( &ctx_dec );
897 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200898}
Paul Bakker33b43f12013-08-20 11:48:36 +0200899/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000900
Paul Bakker33b43f12013-08-20 11:48:36 +0200901/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100902void decrypt_test_vec( int cipher_id, int pad_mode, data_t * key,
903 data_t * iv, data_t * cipher,
904 data_t * clear, data_t * ad, data_t * tag,
Azim Khand30ca132017-06-09 04:32:58 +0100905 int finish_result, int tag_result )
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200906{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +0200907 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200908 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200909 size_t outlen, total_len;
910
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200911 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200912
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200913 memset( output, 0x00, sizeof( output ) );
914
Azim Khanf1aaec92017-05-30 14:23:15 +0100915#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mohammad Azim Khancf32c452017-06-13 14:55:58 +0100916 ((void) ad);
917 ((void) tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +0200918#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200919
920 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200921 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200922 mbedtls_cipher_info_from_type( cipher_id ) ) );
Azim Khand30ca132017-06-09 04:32:58 +0100923 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200924#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200925 if( pad_mode != -1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200926 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200927#else
928 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Azim Khand30ca132017-06-09 04:32:58 +0100930 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv->x, iv->len ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200932#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +0100933 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, ad->x, ad->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200934#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200935
Azim Khand30ca132017-06-09 04:32:58 +0100936 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200937 total_len = 0;
Azim Khand30ca132017-06-09 04:32:58 +0100938 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, cipher->x, cipher->len, output, &outlen ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200939 total_len += outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200940 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200941 &outlen ) );
942 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200943#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +0100944 TEST_ASSERT( tag_result == mbedtls_cipher_check_tag( &ctx, tag->x, tag->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200945#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200946
947 /* check plaintext only if everything went fine */
948 if( 0 == finish_result && 0 == tag_result )
949 {
Azim Khand30ca132017-06-09 04:32:58 +0100950 TEST_ASSERT( total_len == clear->len );
951 TEST_ASSERT( 0 == memcmp( output, clear->x, clear->len ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200952 }
953
Paul Bakkerbd51b262014-07-10 15:26:12 +0200954exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200955 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200956}
957/* END_CASE */
958
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200959/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_AEAD */
Azim Khan5fcca462018-06-29 11:05:32 +0100960void auth_crypt_tv( int cipher_id, data_t * key, data_t * iv,
961 data_t * ad, data_t * cipher, data_t * tag,
Hanno Beckera13272d2018-11-12 16:27:30 +0000962 char * result, data_t * clear, int use_psa )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200963{
Hanno Beckera13272d2018-11-12 16:27:30 +0000964 /* Takes an AEAD ciphertext + tag and performs a pair
965 * of AEAD decryption and AEAD encryption. It checks that
966 * this results in the expected plaintext, and that
967 * decryption and encryption are inverse to one another. */
968
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200969 int ret;
Hanno Beckera13272d2018-11-12 16:27:30 +0000970 unsigned char output[300]; /* Temporary buffer for results of
971 * encryption and decryption. */
972 unsigned char *output_tag = NULL; /* Temporary buffer for tag in the
973 * encryption step. */
974
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200975 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200976 size_t outlen;
977
Hanno Beckera13272d2018-11-12 16:27:30 +0000978 unsigned char *tmp_tag = NULL;
979 unsigned char *tmp_cipher = NULL;
980
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200981 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200982 memset( output, 0xFF, sizeof( output ) );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200983
984 /* Prepare context */
Hanno Beckera13272d2018-11-12 16:27:30 +0000985#if !defined(MBEDTLS_USE_PSA_CRYPTO)
986 (void) use_psa;
987#else
988 if( use_psa == 1 )
989 {
Gilles Peskine5386f6b2019-08-01 12:47:40 +0200990 PSA_ASSERT( psa_crypto_init( ) );
Jaeden Amero3ea26872019-02-13 11:30:22 +0000991
Hanno Beckera13272d2018-11-12 16:27:30 +0000992 /* PSA requires that the tag immediately follows the ciphertext. */
993 tmp_cipher = mbedtls_calloc( 1, cipher->len + tag->len );
994 TEST_ASSERT( tmp_cipher != NULL );
995 tmp_tag = tmp_cipher + cipher->len;
996
997 memcpy( tmp_cipher, cipher->x, cipher->len );
998 memcpy( tmp_tag, tag->x, tag->len );
999
1000 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
1001 mbedtls_cipher_info_from_type( cipher_id ),
1002 tag->len ) );
1003 }
1004 else
1005#endif
1006 {
1007 tmp_tag = tag->x;
1008 tmp_cipher = cipher->x;
1009 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
1010 mbedtls_cipher_info_from_type( cipher_id ) ) );
1011 }
1012
1013 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len,
1014 MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001015
Azim Khand30ca132017-06-09 04:32:58 +01001016 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001017
Hanno Beckera13272d2018-11-12 16:27:30 +00001018 /* Sanity check that we don't use overly long inputs. */
1019 TEST_ASSERT( sizeof( output ) >= cipher->len );
1020
1021 ret = mbedtls_cipher_auth_decrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
1022 tmp_cipher, cipher->len, output, &outlen,
1023 tmp_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001024
1025 /* make sure the message is rejected if it should be */
Azim Khan46c9b1f2017-05-31 20:46:35 +01001026 if( strcmp( result, "FAIL" ) == 0 )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001027 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001028 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Paul Bakkerbd51b262014-07-10 15:26:12 +02001029 goto exit;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001030 }
1031
1032 /* otherwise, make sure it was decrypted properly */
1033 TEST_ASSERT( ret == 0 );
1034
Azim Khand30ca132017-06-09 04:32:58 +01001035 TEST_ASSERT( outlen == clear->len );
1036 TEST_ASSERT( memcmp( output, clear->x, clear->len ) == 0 );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001037
Azim Khand30ca132017-06-09 04:32:58 +01001038 /* then encrypt the clear->x and make sure we get the same ciphertext and tag->x */
Gilles Peskine424840e2019-04-16 15:56:36 +02001039 mbedtls_cipher_free( &ctx );
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001040#if defined(MBEDTLS_USE_PSA_CRYPTO)
1041 if( use_psa == 1 )
1042 {
1043 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
1044 mbedtls_cipher_info_from_type( cipher_id ),
1045 tag->len ) );
1046 }
1047 else
1048#endif
1049 {
1050 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
1051 mbedtls_cipher_info_from_type( cipher_id ) ) );
1052 }
Jack Lloyd1dbc5a22019-03-07 16:59:14 -05001053 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len,
1054 MBEDTLS_ENCRYPT ) );
1055
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001056 memset( output, 0xFF, sizeof( output ) );
1057 outlen = 0;
1058
Hanno Beckera13272d2018-11-12 16:27:30 +00001059 /* Sanity check that we don't use overly long inputs. */
1060 TEST_ASSERT( sizeof( output ) >= clear->len + tag->len );
1061
1062 output_tag = output + clear->len;
Azim Khand30ca132017-06-09 04:32:58 +01001063 ret = mbedtls_cipher_auth_encrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
1064 clear->x, clear->len, output, &outlen,
Hanno Beckera13272d2018-11-12 16:27:30 +00001065 output_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001066 TEST_ASSERT( ret == 0 );
1067
Jack Lloyd1dbc5a22019-03-07 16:59:14 -05001068 TEST_ASSERT( outlen == cipher->len );
Hanno Beckera13272d2018-11-12 16:27:30 +00001069 TEST_ASSERT( memcmp( output, cipher->x, cipher->len ) == 0 );
1070 TEST_ASSERT( memcmp( output_tag, tag->x, tag->len ) == 0 );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001071
Paul Bakkerbd51b262014-07-10 15:26:12 +02001072exit:
Hanno Beckera13272d2018-11-12 16:27:30 +00001073
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001074 mbedtls_cipher_free( &ctx );
1075
Hanno Beckera13272d2018-11-12 16:27:30 +00001076#if defined(MBEDTLS_USE_PSA_CRYPTO)
1077 if( use_psa == 1 )
1078 {
1079 mbedtls_free( tmp_cipher );
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001080 PSA_DONE( );
Hanno Beckera13272d2018-11-12 16:27:30 +00001081 }
1082#endif /* MBEDTLS_USE_PSA_CRYPTO */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001083}
1084/* END_CASE */
1085
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001086/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001087void test_vec_ecb( int cipher_id, int operation, data_t * key,
1088 data_t * input, data_t * result, int finish_result
Azim Khand30ca132017-06-09 04:32:58 +01001089 )
Paul Bakker5e0efa72013-09-08 23:04:04 +02001090{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001091 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +02001092 unsigned char output[32];
1093 size_t outlen;
1094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001095 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001096
Paul Bakker5e0efa72013-09-08 23:04:04 +02001097 memset( output, 0x00, sizeof( output ) );
1098
1099 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001100 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001101 mbedtls_cipher_info_from_type( cipher_id ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001102
Paul Bakker5e0efa72013-09-08 23:04:04 +02001103
Azim Khand30ca132017-06-09 04:32:58 +01001104 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001105
Azim Khand30ca132017-06-09 04:32:58 +01001106 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, input->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107 mbedtls_cipher_get_block_size( &ctx ),
Paul Bakker5e0efa72013-09-08 23:04:04 +02001108 output, &outlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001109 TEST_ASSERT( outlen == mbedtls_cipher_get_block_size( &ctx ) );
1110 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001111 &outlen ) );
1112 TEST_ASSERT( 0 == outlen );
1113
1114 /* check plaintext only if everything went fine */
1115 if( 0 == finish_result )
Azim Khand30ca132017-06-09 04:32:58 +01001116 TEST_ASSERT( 0 == memcmp( output, result->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117 mbedtls_cipher_get_block_size( &ctx ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001118
Paul Bakkerbd51b262014-07-10 15:26:12 +02001119exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120 mbedtls_cipher_free( &ctx );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001121}
1122/* END_CASE */
1123
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001124/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Ron Eldor7b012442017-09-25 17:03:12 +03001125void test_vec_crypt( int cipher_id, int operation, char *hex_key,
Hanno Beckere43164e2018-11-12 12:46:35 +00001126 char *hex_iv, char *hex_input, char *hex_result,
1127 int finish_result, int use_psa )
Ron Eldor7b012442017-09-25 17:03:12 +03001128{
1129 unsigned char key[50];
1130 unsigned char input[16];
1131 unsigned char result[16];
1132 unsigned char iv[16];
1133 size_t key_len, iv_len, inputlen, resultlen;
1134 mbedtls_cipher_context_t ctx;
1135 unsigned char output[32];
1136 size_t outlen;
1137
1138 mbedtls_cipher_init( &ctx );
1139
1140 memset( key, 0x00, sizeof( key ) );
1141 memset( input, 0x00, sizeof( input ) );
1142 memset( result, 0x00, sizeof( result ) );
1143 memset( output, 0x00, sizeof( output ) );
1144 memset( iv, 0x00, sizeof( iv ) );
1145
1146 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +00001147#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1148 (void) use_psa;
1149#else
1150 if( use_psa == 1 )
1151 {
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001152 PSA_ASSERT( psa_crypto_init( ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001153 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001154 mbedtls_cipher_info_from_type( cipher_id ), 0 ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001155 }
1156 else
1157#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001158 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001159 mbedtls_cipher_info_from_type( cipher_id ) ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001160
1161 key_len = unhexify( key, hex_key );
1162 inputlen = unhexify( input, hex_input );
1163 resultlen = unhexify( result, hex_result );
1164
1165 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, 8 * key_len, operation ) );
1166 if( MBEDTLS_MODE_CBC == ctx.cipher_info->mode )
1167 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, MBEDTLS_PADDING_NONE ) );
1168
Ron Eldor4e64e0b2017-09-25 18:22:32 +03001169 iv_len = unhexify( iv, hex_iv );
Ron Eldor7b012442017-09-25 17:03:12 +03001170
1171 TEST_ASSERT( finish_result == mbedtls_cipher_crypt( &ctx, iv_len ? iv : NULL,
1172 iv_len, input, inputlen,
1173 output, &outlen ) );
1174 TEST_ASSERT( resultlen == outlen );
1175 /* check plaintext only if everything went fine */
1176 if( 0 == finish_result )
1177 TEST_ASSERT( 0 == memcmp( output, result, outlen ) );
1178
1179exit:
1180 mbedtls_cipher_free( &ctx );
Gilles Peskine5386f6b2019-08-01 12:47:40 +02001181#if defined(MBEDTLS_USE_PSA_CRYPTO)
1182 PSA_DONE( );
1183#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001184}
1185/* END_CASE */
1186
1187/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Paul Bakker33b43f12013-08-20 11:48:36 +02001188void set_padding( int cipher_id, int pad_mode, int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001189{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190 const mbedtls_cipher_info_t *cipher_info;
1191 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001192
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001194
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001195 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001196 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001197 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001198
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001199 TEST_ASSERT( ret == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001200
Paul Bakkerbd51b262014-07-10 15:26:12 +02001201exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001202 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001203}
Paul Bakker33b43f12013-08-20 11:48:36 +02001204/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001206/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Azim Khan5fcca462018-06-29 11:05:32 +01001207void check_padding( int pad_mode, data_t * input, int ret, int dlen_check
Azim Khand30ca132017-06-09 04:32:58 +01001208 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001209{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001210 mbedtls_cipher_info_t cipher_info;
1211 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001212 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001213
1214 /* build a fake context just for getting access to get_padding */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215 mbedtls_cipher_init( &ctx );
1216 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001217 ctx.cipher_info = &cipher_info;
1218
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001220
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001221
Azim Khand30ca132017-06-09 04:32:58 +01001222 TEST_ASSERT( ret == ctx.get_padding( input->x, input->len, &dlen ) );
Paul Bakker33b43f12013-08-20 11:48:36 +02001223 if( 0 == ret )
1224 TEST_ASSERT( dlen == (size_t) dlen_check );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001225}
Paul Bakker33b43f12013-08-20 11:48:36 +02001226/* END_CASE */