blob: 70f4bc12052bf01bb51d1e1ae217612ae50bdabf [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
Paul Bakker33b43f12013-08-20 11:48:36 +020011/* END_HEADER */
Paul Bakker8123e9d2011-01-06 15:37:30 +000012
Paul Bakker33b43f12013-08-20 11:48:36 +020013/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020014 * depends_on:MBEDTLS_CIPHER_C
Paul Bakker33b43f12013-08-20 11:48:36 +020015 * END_DEPENDENCIES
16 */
Paul Bakker5690efc2011-05-26 13:16:06 +000017
Paul Bakker33b43f12013-08-20 11:48:36 +020018/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +010019void mbedtls_cipher_list( )
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010020{
21 const int *cipher_type;
22
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020023 for( cipher_type = mbedtls_cipher_list(); *cipher_type != 0; cipher_type++ )
24 TEST_ASSERT( mbedtls_cipher_info_from_type( *cipher_type ) != NULL );
Manuel Pégourié-Gonnard66dfc5a2014-03-29 16:10:55 +010025}
26/* END_CASE */
27
28/* BEGIN_CASE */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050029void cipher_invalid_param_unconditional( )
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020030{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050031 mbedtls_cipher_context_t valid_ctx;
32 mbedtls_cipher_context_t invalid_ctx;
33 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
34 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
35 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
36 int valid_size = sizeof(valid_buffer);
37 int valid_bitlen = valid_size * 8;
38 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
39 *( mbedtls_cipher_list() ) );
40 size_t size_t_var;
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020041
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050042 (void)valid_mode; /* In some configurations this is unused */
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020043
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050044 mbedtls_cipher_init( &valid_ctx );
45 mbedtls_cipher_setup( &valid_ctx, valid_info );
46 mbedtls_cipher_init( &invalid_ctx );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020047
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050048 /* mbedtls_cipher_setup() */
49 TEST_ASSERT( mbedtls_cipher_setup( &valid_ctx, NULL ) ==
50 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020051
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050052 /* mbedtls_cipher_get_block_size() */
53 TEST_ASSERT( mbedtls_cipher_get_block_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020054
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050055 /* mbedtls_cipher_get_cipher_mode() */
56 TEST_ASSERT( mbedtls_cipher_get_cipher_mode( &invalid_ctx ) ==
57 MBEDTLS_MODE_NONE );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020058
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050059 /* mbedtls_cipher_get_iv_size() */
60 TEST_ASSERT( mbedtls_cipher_get_iv_size( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020061
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050062 /* mbedtls_cipher_get_type() */
63 TEST_ASSERT(
64 mbedtls_cipher_get_type( &invalid_ctx ) ==
65 MBEDTLS_CIPHER_NONE);
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020066
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050067 /* mbedtls_cipher_get_name() */
68 TEST_ASSERT( mbedtls_cipher_get_name( &invalid_ctx ) == 0 );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020069
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050070 /* mbedtls_cipher_get_key_bitlen() */
71 TEST_ASSERT( mbedtls_cipher_get_key_bitlen( &invalid_ctx ) ==
72 MBEDTLS_KEY_LENGTH_NONE );
73
74 /* mbedtls_cipher_get_operation() */
75 TEST_ASSERT( mbedtls_cipher_get_operation( &invalid_ctx ) ==
76 MBEDTLS_OPERATION_NONE );
77
78 /* mbedtls_cipher_setkey() */
79 TEST_ASSERT(
80 mbedtls_cipher_setkey( &invalid_ctx,
81 valid_buffer,
82 valid_bitlen,
83 valid_operation ) ==
84 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
85
86 /* mbedtls_cipher_set_iv() */
87 TEST_ASSERT(
88 mbedtls_cipher_set_iv( &invalid_ctx,
89 valid_buffer,
90 valid_size ) ==
91 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
92
93 /* mbedtls_cipher_reset() */
94 TEST_ASSERT( mbedtls_cipher_reset( &invalid_ctx ) ==
95 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +020096
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +020097#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050098 /* mbedtls_cipher_update_ad() */
99 TEST_ASSERT(
100 mbedtls_cipher_update_ad( &invalid_ctx,
101 valid_buffer,
102 valid_size ) ==
103 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
104#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
105
106#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
107 /* mbedtls_cipher_set_padding_mode() */
108 TEST_ASSERT( mbedtls_cipher_set_padding_mode( &invalid_ctx, valid_mode ) ==
109 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200110#endif
111
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500112 /* mbedtls_cipher_update() */
113 TEST_ASSERT(
114 mbedtls_cipher_update( &invalid_ctx,
115 valid_buffer,
116 valid_size,
117 valid_buffer,
118 &size_t_var ) ==
119 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200120
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500121 /* mbedtls_cipher_finish() */
122 TEST_ASSERT(
123 mbedtls_cipher_finish( &invalid_ctx,
124 valid_buffer,
125 &size_t_var ) ==
126 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200127
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200128#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500129 /* mbedtls_cipher_write_tag() */
130 TEST_ASSERT(
131 mbedtls_cipher_write_tag( &invalid_ctx,
132 valid_buffer,
133 valid_size ) ==
134 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200135
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500136 /* mbedtls_cipher_check_tag() */
137 TEST_ASSERT(
138 mbedtls_cipher_check_tag( &invalid_ctx,
139 valid_buffer,
140 valid_size ) ==
141 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
142#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
143
144exit:
145 mbedtls_cipher_free( &invalid_ctx );
146 mbedtls_cipher_free( &valid_ctx );
147}
148/* END_CASE */
149
150/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
151void cipher_invalid_param_conditional( )
152{
153 mbedtls_cipher_context_t valid_ctx;
154
155 mbedtls_operation_t valid_operation = MBEDTLS_ENCRYPT;
156 mbedtls_operation_t invalid_operation = 100;
157 mbedtls_cipher_padding_t valid_mode = MBEDTLS_PADDING_ZEROS;
158 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
159 int valid_size = sizeof(valid_buffer);
160 int valid_bitlen = valid_size * 8;
161 const mbedtls_cipher_info_t *valid_info = mbedtls_cipher_info_from_type(
162 *( mbedtls_cipher_list() ) );
163
164 size_t size_t_var;
165
166 (void)valid_mode; /* In some configurations this is unused */
167
168 /* mbedtls_cipher_init() */
169 TEST_VALID_PARAM( mbedtls_cipher_init( &valid_ctx ) );
170 TEST_INVALID_PARAM( mbedtls_cipher_init( NULL ) );
171
172 /* mbedtls_cipher_setup() */
173 TEST_VALID_PARAM( mbedtls_cipher_setup( &valid_ctx, valid_info ) );
174 TEST_INVALID_PARAM_RET(
175 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
176 mbedtls_cipher_setup( NULL, valid_info ) );
177
178 /* mbedtls_cipher_get_block_size() */
179 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_block_size( NULL ) );
180
181 /* mbedtls_cipher_get_cipher_mode() */
182 TEST_INVALID_PARAM_RET(
183 MBEDTLS_MODE_NONE,
184 mbedtls_cipher_get_cipher_mode( NULL ) );
185
186 /* mbedtls_cipher_get_iv_size() */
187 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_iv_size( NULL ) );
188
189 /* mbedtls_cipher_get_type() */
190 TEST_INVALID_PARAM_RET(
191 MBEDTLS_CIPHER_NONE,
192 mbedtls_cipher_get_type( NULL ) );
193
194 /* mbedtls_cipher_get_name() */
195 TEST_INVALID_PARAM_RET( 0, mbedtls_cipher_get_name( NULL ) );
196
197 /* mbedtls_cipher_get_key_bitlen() */
198 TEST_INVALID_PARAM_RET(
199 MBEDTLS_KEY_LENGTH_NONE,
200 mbedtls_cipher_get_key_bitlen( NULL ) );
201
202 /* mbedtls_cipher_get_operation() */
203 TEST_INVALID_PARAM_RET(
204 MBEDTLS_OPERATION_NONE,
205 mbedtls_cipher_get_operation( NULL ) );
206
207 /* mbedtls_cipher_setkey() */
208 TEST_INVALID_PARAM_RET(
209 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
210 mbedtls_cipher_setkey( NULL,
211 valid_buffer,
212 valid_bitlen,
213 valid_operation ) );
214 TEST_INVALID_PARAM_RET(
215 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
216 mbedtls_cipher_setkey( &valid_ctx,
217 NULL,
218 valid_bitlen,
219 valid_operation ) );
220 TEST_INVALID_PARAM_RET(
221 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
222 mbedtls_cipher_setkey( &valid_ctx,
223 valid_buffer,
224 valid_bitlen,
225 invalid_operation ) );
226
227 /* mbedtls_cipher_set_iv() */
228 TEST_INVALID_PARAM_RET(
229 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
230 mbedtls_cipher_set_iv( NULL,
231 valid_buffer,
232 valid_size ) );
233 TEST_INVALID_PARAM_RET(
234 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
235 mbedtls_cipher_set_iv( &valid_ctx,
236 NULL,
237 valid_size ) );
238
239 /* mbedtls_cipher_reset() */
240 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
241 mbedtls_cipher_reset( NULL ) );
242
243#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
244 /* mbedtls_cipher_update_ad() */
245 TEST_INVALID_PARAM_RET(
246 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
247 mbedtls_cipher_update_ad( NULL,
248 valid_buffer,
249 valid_size ) );
250 TEST_INVALID_PARAM_RET(
251 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
252 mbedtls_cipher_update_ad( &valid_ctx,
253 NULL,
254 valid_size ) );
255#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
256
257#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
258 /* mbedtls_cipher_set_padding_mode() */
259 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
260 mbedtls_cipher_set_padding_mode( NULL, valid_mode ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200261#endif
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500262
263 /* mbedtls_cipher_update() */
264 TEST_INVALID_PARAM_RET(
265 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
266 mbedtls_cipher_update( NULL,
267 valid_buffer,
268 valid_size,
269 valid_buffer,
270 &size_t_var ) );
271 TEST_INVALID_PARAM_RET(
272 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
273 mbedtls_cipher_update( &valid_ctx,
274 NULL, valid_size,
275 valid_buffer,
276 &size_t_var ) );
277 TEST_INVALID_PARAM_RET(
278 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
279 mbedtls_cipher_update( &valid_ctx,
280 valid_buffer, valid_size,
281 NULL,
282 &size_t_var ) );
283 TEST_INVALID_PARAM_RET(
284 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
285 mbedtls_cipher_update( &valid_ctx,
286 valid_buffer, valid_size,
287 valid_buffer,
288 NULL ) );
289
290 /* mbedtls_cipher_finish() */
291 TEST_INVALID_PARAM_RET(
292 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
293 mbedtls_cipher_finish( NULL,
294 valid_buffer,
295 &size_t_var ) );
296 TEST_INVALID_PARAM_RET(
297 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
298 mbedtls_cipher_finish( &valid_ctx,
299 NULL,
300 &size_t_var ) );
301 TEST_INVALID_PARAM_RET(
302 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
303 mbedtls_cipher_finish( &valid_ctx,
304 valid_buffer,
305 NULL ) );
306
307#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
308 /* mbedtls_cipher_write_tag() */
309 TEST_INVALID_PARAM_RET(
310 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
311 mbedtls_cipher_write_tag( NULL,
312 valid_buffer,
313 valid_size ) );
314 TEST_INVALID_PARAM_RET(
315 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
316 mbedtls_cipher_write_tag( &valid_ctx,
317 NULL,
318 valid_size ) );
319
320 /* mbedtls_cipher_check_tag() */
321 TEST_INVALID_PARAM_RET(
322 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
323 mbedtls_cipher_check_tag( NULL,
324 valid_buffer,
325 valid_size ) );
326 TEST_INVALID_PARAM_RET(
327 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
328 mbedtls_cipher_check_tag( &valid_ctx,
329 NULL,
330 valid_size ) );
331#endif /* defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C) */
332
333 /* mbedtls_cipher_crypt() */
334 TEST_INVALID_PARAM_RET(
335 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
336 mbedtls_cipher_crypt( NULL,
337 valid_buffer, valid_size,
338 valid_buffer, valid_size,
339 valid_buffer, &size_t_var ) );
340 TEST_INVALID_PARAM_RET(
341 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
342 mbedtls_cipher_crypt( &valid_ctx,
343 NULL, valid_size,
344 valid_buffer, valid_size,
345 valid_buffer, &size_t_var ) );
346 TEST_INVALID_PARAM_RET(
347 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
348 mbedtls_cipher_crypt( &valid_ctx,
349 valid_buffer, valid_size,
350 NULL, valid_size,
351 valid_buffer, &size_t_var ) );
352 TEST_INVALID_PARAM_RET(
353 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
354 mbedtls_cipher_crypt( &valid_ctx,
355 valid_buffer, valid_size,
356 valid_buffer, valid_size,
357 NULL, &size_t_var ) );
358 TEST_INVALID_PARAM_RET(
359 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
360 mbedtls_cipher_crypt( &valid_ctx,
361 valid_buffer, valid_size,
362 valid_buffer, valid_size,
363 valid_buffer, NULL ) );
364
365#if defined(MBEDTLS_CIPHER_MODE_AEAD)
366 /* mbedtls_cipher_auth_encrypt() */
367 TEST_INVALID_PARAM_RET(
368 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
369 mbedtls_cipher_auth_encrypt( NULL,
370 valid_buffer, valid_size,
371 valid_buffer, valid_size,
372 valid_buffer, valid_size,
373 valid_buffer, &size_t_var,
374 valid_buffer, valid_size ) );
375 TEST_INVALID_PARAM_RET(
376 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
377 mbedtls_cipher_auth_encrypt( &valid_ctx,
378 NULL, valid_size,
379 valid_buffer, valid_size,
380 valid_buffer, valid_size,
381 valid_buffer, &size_t_var,
382 valid_buffer, valid_size ) );
383 TEST_INVALID_PARAM_RET(
384 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
385 mbedtls_cipher_auth_encrypt( &valid_ctx,
386 valid_buffer, valid_size,
387 NULL, valid_size,
388 valid_buffer, valid_size,
389 valid_buffer, &size_t_var,
390 valid_buffer, valid_size ) );
391 TEST_INVALID_PARAM_RET(
392 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
393 mbedtls_cipher_auth_encrypt( &valid_ctx,
394 valid_buffer, valid_size,
395 valid_buffer, valid_size,
396 NULL, valid_size,
397 valid_buffer, &size_t_var,
398 valid_buffer, valid_size ) );
399 TEST_INVALID_PARAM_RET(
400 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
401 mbedtls_cipher_auth_encrypt( &valid_ctx,
402 valid_buffer, valid_size,
403 valid_buffer, valid_size,
404 valid_buffer, valid_size,
405 NULL, &size_t_var,
406 valid_buffer, valid_size ) );
407 TEST_INVALID_PARAM_RET(
408 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
409 mbedtls_cipher_auth_encrypt( &valid_ctx,
410 valid_buffer, valid_size,
411 valid_buffer, valid_size,
412 valid_buffer, valid_size,
413 valid_buffer, NULL,
414 valid_buffer, valid_size ) );
415 TEST_INVALID_PARAM_RET(
416 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
417 mbedtls_cipher_auth_encrypt( &valid_ctx,
418 valid_buffer, valid_size,
419 valid_buffer, valid_size,
420 valid_buffer, valid_size,
421 valid_buffer, &size_t_var,
422 NULL, valid_size ) );
423
424 /* mbedtls_cipher_auth_decrypt() */
425 TEST_INVALID_PARAM_RET(
426 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
427 mbedtls_cipher_auth_decrypt( NULL,
428 valid_buffer, valid_size,
429 valid_buffer, valid_size,
430 valid_buffer, valid_size,
431 valid_buffer, &size_t_var,
432 valid_buffer, valid_size ) );
433 TEST_INVALID_PARAM_RET(
434 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
435 mbedtls_cipher_auth_decrypt( &valid_ctx,
436 NULL, valid_size,
437 valid_buffer, valid_size,
438 valid_buffer, valid_size,
439 valid_buffer, &size_t_var,
440 valid_buffer, valid_size ) );
441 TEST_INVALID_PARAM_RET(
442 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
443 mbedtls_cipher_auth_decrypt( &valid_ctx,
444 valid_buffer, valid_size,
445 NULL, valid_size,
446 valid_buffer, valid_size,
447 valid_buffer, &size_t_var,
448 valid_buffer, valid_size ) );
449 TEST_INVALID_PARAM_RET(
450 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
451 mbedtls_cipher_auth_decrypt( &valid_ctx,
452 valid_buffer, valid_size,
453 valid_buffer, valid_size,
454 NULL, valid_size,
455 valid_buffer, &size_t_var,
456 valid_buffer, valid_size ) );
457 TEST_INVALID_PARAM_RET(
458 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
459 mbedtls_cipher_auth_decrypt( &valid_ctx,
460 valid_buffer, valid_size,
461 valid_buffer, valid_size,
462 valid_buffer, valid_size,
463 NULL, &size_t_var,
464 valid_buffer, valid_size ) );
465 TEST_INVALID_PARAM_RET(
466 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
467 mbedtls_cipher_auth_decrypt( &valid_ctx,
468 valid_buffer, valid_size,
469 valid_buffer, valid_size,
470 valid_buffer, valid_size,
471 valid_buffer, NULL,
472 valid_buffer, valid_size ) );
473 TEST_INVALID_PARAM_RET(
474 MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA,
475 mbedtls_cipher_auth_decrypt( &valid_ctx,
476 valid_buffer, valid_size,
477 valid_buffer, valid_size,
478 valid_buffer, valid_size,
479 valid_buffer, &size_t_var,
480 NULL, valid_size ) );
481#endif /* defined(MBEDTLS_CIPHER_MODE_AEAD) */
482
483 /* mbedtls_cipher_free() */
484 TEST_VALID_PARAM( mbedtls_cipher_free( NULL ) );
485exit:
486 TEST_VALID_PARAM( mbedtls_cipher_free( &valid_ctx ) );
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200487}
488/* END_CASE */
489
Paul Bakker6a9c7252016-07-14 13:46:10 +0100490/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Azim Khanf1aaec92017-05-30 14:23:15 +0100491void cipher_special_behaviours( )
Paul Bakker6a9c7252016-07-14 13:46:10 +0100492{
493 const mbedtls_cipher_info_t *cipher_info;
494 mbedtls_cipher_context_t ctx;
495 unsigned char input[32];
496 unsigned char output[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300497#if defined (MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100498 unsigned char iv[32];
Ron Eldor6f90ed82017-09-26 12:08:54 +0300499#endif
Paul Bakker6a9c7252016-07-14 13:46:10 +0100500 size_t olen = 0;
501
502 mbedtls_cipher_init( &ctx );
503 memset( input, 0, sizeof( input ) );
504 memset( output, 0, sizeof( output ) );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300505#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6a9c7252016-07-14 13:46:10 +0100506 memset( iv, 0, sizeof( iv ) );
507
508 /* Check and get info structures */
Ron Eldor7b012442017-09-25 17:03:12 +0300509 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_CBC );
Paul Bakker6a9c7252016-07-14 13:46:10 +0100510 TEST_ASSERT( NULL != cipher_info );
511
512 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
513
514 /* IV too big */
515 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, MBEDTLS_MAX_IV_LENGTH + 1 )
516 == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );
517
518 /* IV too small */
519 TEST_ASSERT( mbedtls_cipher_set_iv( &ctx, iv, 0 )
520 == MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
521
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300522 mbedtls_cipher_free( &ctx );
Ron Eldorbb4bbbb2017-10-01 17:04:54 +0300523 mbedtls_cipher_init( &ctx );
Ron Eldor6f90ed82017-09-26 12:08:54 +0300524#endif /* MBEDTLS_CIPHER_MODE_CBC */
Ron Eldor4e64e0b2017-09-25 18:22:32 +0300525 cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );
Ron Eldor7b012442017-09-25 17:03:12 +0300526 TEST_ASSERT( NULL != cipher_info );
527
528 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
529
Paul Bakker6a9c7252016-07-14 13:46:10 +0100530 /* Update ECB with partial block */
531 TEST_ASSERT( mbedtls_cipher_update( &ctx, input, 1, output, &olen )
532 == MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );
533
534exit:
535 mbedtls_cipher_free( &ctx );
536}
537/* END_CASE */
538
Manuel Pégourié-Gonnard5e7693f2014-06-13 16:08:07 +0200539/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100540void enc_dec_buf( int cipher_id, char * cipher_string, int key_len,
Paul Bakker33b43f12013-08-20 11:48:36 +0200541 int length_val, int pad_mode )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200542{
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200543 size_t length = length_val, outlen, total_len, i, block_size;
Jaeden Amerod906b812018-06-08 11:03:16 +0100544 unsigned char key[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000545 unsigned char iv[16];
Manuel Pégourié-Gonnard9241be72013-08-31 17:31:03 +0200546 unsigned char ad[13];
547 unsigned char tag[16];
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200548 unsigned char inbuf[64];
549 unsigned char encbuf[64];
550 unsigned char decbuf[64];
Paul Bakker8123e9d2011-01-06 15:37:30 +0000551
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200552 const mbedtls_cipher_info_t *cipher_info;
553 mbedtls_cipher_context_t ctx_dec;
554 mbedtls_cipher_context_t ctx_enc;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000555
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200556 /*
557 * Prepare contexts
558 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559 mbedtls_cipher_init( &ctx_dec );
560 mbedtls_cipher_init( &ctx_enc );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200561
562 memset( key, 0x2a, sizeof( key ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000563
564 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200565 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000566 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200567 TEST_ASSERT( mbedtls_cipher_info_from_string( cipher_string ) == cipher_info );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000568
569 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200570 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
571 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200572
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200573 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
574 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000575
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200576#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Paul Bakker33b43f12013-08-20 11:48:36 +0200577 if( -1 != pad_mode )
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200578 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200579 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
580 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200581 }
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200582#else
583 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200584#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Manuel Pégourié-Gonnard6c978992013-07-26 13:20:42 +0200585
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200586 /*
587 * Do a few encode/decode cycles
588 */
589 for( i = 0; i < 3; i++ )
590 {
591 memset( iv , 0x00 + i, sizeof( iv ) );
592 memset( ad, 0x10 + i, sizeof( ad ) );
593 memset( inbuf, 0x20 + i, sizeof( inbuf ) );
594
595 memset( encbuf, 0, sizeof( encbuf ) );
596 memset( decbuf, 0, sizeof( decbuf ) );
597 memset( tag, 0, sizeof( tag ) );
598
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200599 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, sizeof( iv ) ) );
600 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, sizeof( iv ) ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200601
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200602 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
603 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200604
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200605#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200606 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, ad, sizeof( ad ) - i ) );
607 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, ad, sizeof( ad ) - i ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200608#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000609
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200610 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
611 TEST_ASSERT( block_size != 0 );
612
Paul Bakker8123e9d2011-01-06 15:37:30 +0000613 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200614 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, length, encbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200615 total_len = outlen;
616
617 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200618 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200619 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200620 total_len + block_size > length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000621
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200622 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200623 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000624
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200625#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626 TEST_ASSERT( 0 == mbedtls_cipher_write_tag( &ctx_enc, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200627#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200628
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200629 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200630 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200631 total_len > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200632 total_len <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000633
634 /* decode the previously encoded string */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200635 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, total_len, decbuf, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200636 total_len = outlen;
637
638 TEST_ASSERT( total_len == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200639 ( total_len % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200640 total_len < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200641 total_len + block_size >= length ) );
Paul Bakker343a8702011-06-09 14:27:58 +0000642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200644 total_len += outlen;
Paul Bakker343a8702011-06-09 14:27:58 +0000645
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200646#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200647 TEST_ASSERT( 0 == mbedtls_cipher_check_tag( &ctx_dec, tag, sizeof( tag ) ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200648#endif
Manuel Pégourié-Gonnardaa9ffc52013-09-03 16:19:22 +0200649
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200650 /* check result */
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200651 TEST_ASSERT( total_len == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000652 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200653 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000654
Manuel Pégourié-Gonnard1af50a22013-09-05 10:30:32 +0200655 /*
656 * Done
657 */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200658exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200659 mbedtls_cipher_free( &ctx_dec );
660 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200661}
Paul Bakker33b43f12013-08-20 11:48:36 +0200662/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000663
Paul Bakker33b43f12013-08-20 11:48:36 +0200664/* BEGIN_CASE */
Azim Khanf1aaec92017-05-30 14:23:15 +0100665void enc_fail( int cipher_id, int pad_mode, int key_len, int length_val,
666 int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200667{
Paul Bakker33b43f12013-08-20 11:48:36 +0200668 size_t length = length_val;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200669 unsigned char key[32];
670 unsigned char iv[16];
671
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200672 const mbedtls_cipher_info_t *cipher_info;
673 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200674
675 unsigned char inbuf[64];
676 unsigned char encbuf[64];
677
678 size_t outlen = 0;
679
680 memset( key, 0, 32 );
681 memset( iv , 0, 16 );
682
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200683 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200684
685 memset( inbuf, 5, 64 );
686 memset( encbuf, 0, 64 );
687
688 /* Check and get info structures */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200689 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200690 TEST_ASSERT( NULL != cipher_info );
691
692 /* Initialise context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200693 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200694 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, key_len, MBEDTLS_ENCRYPT ) );
695#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
696 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200697#else
698 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
700 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv, 16 ) );
701 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200702#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200703 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200704#endif
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200705
706 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200707 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, inbuf, length, encbuf, &outlen ) );
708 TEST_ASSERT( ret == mbedtls_cipher_finish( &ctx, encbuf + outlen, &outlen ) );
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200709
710 /* done */
Paul Bakkerbd51b262014-07-10 15:26:12 +0200711exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200713}
Paul Bakker33b43f12013-08-20 11:48:36 +0200714/* END_CASE */
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200715
Paul Bakker33b43f12013-08-20 11:48:36 +0200716/* BEGIN_CASE */
k-stachowiakd8727232019-07-29 17:46:29 +0200717void dec_empty_buf( int cipher,
718 int expected_update_ret,
719 int expected_finish_ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200720{
Paul Bakker8123e9d2011-01-06 15:37:30 +0000721 unsigned char key[32];
722 unsigned char iv[16];
723
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200724 mbedtls_cipher_context_t ctx_dec;
725 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000726
727 unsigned char encbuf[64];
728 unsigned char decbuf[64];
729
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000730 size_t outlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000731
732 memset( key, 0, 32 );
733 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200734
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200735 mbedtls_cipher_init( &ctx_dec );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200736
Paul Bakker8123e9d2011-01-06 15:37:30 +0000737 memset( encbuf, 0, 64 );
738 memset( decbuf, 0, 64 );
739
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200740 /* Initialise context */
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100741 cipher_info = mbedtls_cipher_info_from_type( cipher );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000742 TEST_ASSERT( NULL != cipher_info);
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100743 TEST_ASSERT( sizeof(key) * 8 >= cipher_info->key_bitlen );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200744
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200745 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000746
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100747 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec,
748 key, cipher_info->key_bitlen,
749 MBEDTLS_DECRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000750
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200751 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200752
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200753 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200754
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200755#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200756 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200757#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000758
759 /* decode 0-byte string */
k-stachowiakd8727232019-07-29 17:46:29 +0200760 TEST_ASSERT( expected_update_ret ==
761 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
k-stachowiakd8727232019-07-29 17:46:29 +0200764 if ( expected_finish_ret == 0 &&
765 ( cipher_info->mode == MBEDTLS_MODE_CBC ||
766 cipher_info->mode == MBEDTLS_MODE_ECB ) )
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100767 {
768 /* Non-CBC and non-ECB ciphers are OK with decrypting empty buffers and
769 * return success, not MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED, when
k-stachowiakd8727232019-07-29 17:46:29 +0200770 * decrypting an empty buffer.
771 * On the other hand, CBC and ECB ciphers need a full block of input.
772 */
773 expected_finish_ret = MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED;
Jaeden Amero5ab80ef2019-06-05 15:35:08 +0100774 }
775
k-stachowiakd8727232019-07-29 17:46:29 +0200776 TEST_ASSERT( expected_finish_ret == mbedtls_cipher_finish(
777 &ctx_dec, decbuf + outlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000778 TEST_ASSERT( 0 == outlen );
779
Paul Bakkerbd51b262014-07-10 15:26:12 +0200780exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781 mbedtls_cipher_free( &ctx_dec );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200782}
Paul Bakker33b43f12013-08-20 11:48:36 +0200783/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000784
Paul Bakker33b43f12013-08-20 11:48:36 +0200785/* BEGIN_CASE */
786void enc_dec_buf_multipart( int cipher_id, int key_len, int first_length_val,
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700787 int second_length_val, int pad_mode,
788 int first_encrypt_output_len, int second_encrypt_output_len,
789 int first_decrypt_output_len, int second_decrypt_output_len )
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200790{
Paul Bakker33b43f12013-08-20 11:48:36 +0200791 size_t first_length = first_length_val;
792 size_t second_length = second_length_val;
Paul Bakker23986e52011-04-24 08:57:21 +0000793 size_t length = first_length + second_length;
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200794 size_t block_size;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000795 unsigned char key[32];
796 unsigned char iv[16];
797
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200798 mbedtls_cipher_context_t ctx_dec;
799 mbedtls_cipher_context_t ctx_enc;
800 const mbedtls_cipher_info_t *cipher_info;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000801
802 unsigned char inbuf[64];
803 unsigned char encbuf[64];
804 unsigned char decbuf[64];
805
Paul Bakker23986e52011-04-24 08:57:21 +0000806 size_t outlen = 0;
807 size_t totaloutlen = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000808
809 memset( key, 0, 32 );
810 memset( iv , 0, 16 );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200811
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812 mbedtls_cipher_init( &ctx_dec );
813 mbedtls_cipher_init( &ctx_enc );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200814
Paul Bakker8123e9d2011-01-06 15:37:30 +0000815 memset( inbuf, 5, 64 );
816 memset( encbuf, 0, 64 );
817 memset( decbuf, 0, 64 );
818
819 /* Initialise enc and dec contexts */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200820 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000821 TEST_ASSERT( NULL != cipher_info);
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200822
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200823 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_dec, cipher_info ) );
824 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx_enc, cipher_info ) );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_dec, key, key_len, MBEDTLS_DECRYPT ) );
827 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx_enc, key, key_len, MBEDTLS_ENCRYPT ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000828
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700829#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
830 if( -1 != pad_mode )
831 {
832 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_dec, pad_mode ) );
833 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx_enc, pad_mode ) );
834 }
835#else
836 (void) pad_mode;
837#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
838
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200839 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_dec, iv, 16 ) );
840 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx_enc, iv, 16 ) );
Manuel Pégourié-Gonnard9c853b92013-09-03 13:04:44 +0200841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_dec ) );
843 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx_enc ) );
Manuel Pégourié-Gonnard2adc40c2013-09-03 13:54:12 +0200844
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200845#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200846 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_dec, NULL, 0 ) );
847 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx_enc, NULL, 0 ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200848#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +0000849
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200850 block_size = mbedtls_cipher_get_block_size( &ctx_enc );
851 TEST_ASSERT( block_size != 0 );
852
Paul Bakker8123e9d2011-01-06 15:37:30 +0000853 /* encode length number of bytes from inbuf */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf, first_length, encbuf, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700855 TEST_ASSERT( (size_t)first_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000856 totaloutlen = outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_enc, inbuf + first_length, second_length, encbuf + totaloutlen, &outlen ) );
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700858 TEST_ASSERT( (size_t)second_encrypt_output_len == outlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000859 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200860 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200861 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200862 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200863 totaloutlen + block_size > length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_enc, encbuf + totaloutlen, &outlen ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000866 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200867 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200868 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200869 totaloutlen > length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200870 totaloutlen <= length + block_size ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000871
872 /* decode the previously encoded string */
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700873 second_length = totaloutlen - first_length;
874 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf, first_length, decbuf, &outlen ) );
875 TEST_ASSERT( (size_t)first_decrypt_output_len == outlen );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200876 totaloutlen = outlen;
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700877 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx_dec, encbuf + first_length, second_length, decbuf + totaloutlen, &outlen ) );
878 TEST_ASSERT( (size_t)second_decrypt_output_len == outlen );
879 totaloutlen += outlen;
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200880
881 TEST_ASSERT( totaloutlen == length ||
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200882 ( totaloutlen % block_size == 0 &&
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200883 totaloutlen < length &&
Manuel Pégourié-Gonnardac5361f2015-06-24 01:08:09 +0200884 totaloutlen + block_size >= length ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200885
Jethro Beekman6c563fa2018-03-27 19:16:17 -0700886 TEST_ASSERT( 0 == mbedtls_cipher_finish( &ctx_dec, decbuf + totaloutlen, &outlen ) );
Manuel Pégourié-Gonnard725680f2013-07-25 15:26:54 +0200887 totaloutlen += outlen;
888
889 TEST_ASSERT( totaloutlen == length );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000890
891 TEST_ASSERT( 0 == memcmp(inbuf, decbuf, length) );
892
Paul Bakkerbd51b262014-07-10 15:26:12 +0200893exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200894 mbedtls_cipher_free( &ctx_dec );
895 mbedtls_cipher_free( &ctx_enc );
Paul Bakkerdbd443d2013-08-16 13:38:47 +0200896}
Paul Bakker33b43f12013-08-20 11:48:36 +0200897/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000898
Paul Bakker33b43f12013-08-20 11:48:36 +0200899/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100900void decrypt_test_vec( int cipher_id, int pad_mode, data_t * key,
901 data_t * iv, data_t * cipher,
902 data_t * clear, data_t * ad, data_t * tag,
Azim Khand30ca132017-06-09 04:32:58 +0100903 int finish_result, int tag_result )
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200904{
Manuel Pégourié-Gonnard234e1ce2018-05-10 12:54:32 +0200905 unsigned char output[265];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200906 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200907 size_t outlen, total_len;
908
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200909 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +0200910
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200911 memset( output, 0x00, sizeof( output ) );
912
Azim Khanf1aaec92017-05-30 14:23:15 +0100913#if !defined(MBEDTLS_GCM_C) && !defined(MBEDTLS_CHACHAPOLY_C)
Mohammad Azim Khancf32c452017-06-13 14:55:58 +0100914 ((void) ad);
915 ((void) tag);
Manuel Pégourié-Gonnarda7496f02013-09-20 11:29:59 +0200916#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200917
918 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +0200919 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200920 mbedtls_cipher_info_from_type( cipher_id ) ) );
Azim Khand30ca132017-06-09 04:32:58 +0100921 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200922#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200923 if( pad_mode != -1 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200924 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnard989ed382013-09-13 14:41:45 +0200925#else
926 (void) pad_mode;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */
Azim Khand30ca132017-06-09 04:32:58 +0100928 TEST_ASSERT( 0 == mbedtls_cipher_set_iv( &ctx, iv->x, iv->len ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200929 TEST_ASSERT( 0 == mbedtls_cipher_reset( &ctx ) );
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200930#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +0100931 TEST_ASSERT( 0 == mbedtls_cipher_update_ad( &ctx, ad->x, ad->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200932#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200933
Azim Khand30ca132017-06-09 04:32:58 +0100934 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200935 total_len = 0;
Azim Khand30ca132017-06-09 04:32:58 +0100936 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, cipher->x, cipher->len, output, &outlen ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200937 total_len += outlen;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200938 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200939 &outlen ) );
940 total_len += outlen;
Manuel Pégourié-Gonnarddca3a5d2018-05-07 10:43:27 +0200941#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CHACHAPOLY_C)
Azim Khand30ca132017-06-09 04:32:58 +0100942 TEST_ASSERT( tag_result == mbedtls_cipher_check_tag( &ctx, tag->x, tag->len ) );
Manuel Pégourié-Gonnard8f625632014-06-24 15:26:28 +0200943#endif
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200944
945 /* check plaintext only if everything went fine */
946 if( 0 == finish_result && 0 == tag_result )
947 {
Azim Khand30ca132017-06-09 04:32:58 +0100948 TEST_ASSERT( total_len == clear->len );
949 TEST_ASSERT( 0 == memcmp( output, clear->x, clear->len ) );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200950 }
951
Paul Bakkerbd51b262014-07-10 15:26:12 +0200952exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +0200954}
955/* END_CASE */
956
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_AEAD */
Azim Khan5fcca462018-06-29 11:05:32 +0100958void auth_crypt_tv( int cipher_id, data_t * key, data_t * iv,
959 data_t * ad, data_t * cipher, data_t * tag,
Hanno Beckera13272d2018-11-12 16:27:30 +0000960 char * result, data_t * clear, int use_psa )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200961{
Hanno Beckera13272d2018-11-12 16:27:30 +0000962 /* Takes an AEAD ciphertext + tag and performs a pair
963 * of AEAD decryption and AEAD encryption. It checks that
964 * this results in the expected plaintext, and that
965 * decryption and encryption are inverse to one another. */
966
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200967 int ret;
Hanno Beckera13272d2018-11-12 16:27:30 +0000968 unsigned char output[300]; /* Temporary buffer for results of
969 * encryption and decryption. */
970 unsigned char *output_tag = NULL; /* Temporary buffer for tag in the
971 * encryption step. */
972
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200973 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200974 size_t outlen;
975
Hanno Beckera13272d2018-11-12 16:27:30 +0000976 unsigned char *tmp_tag = NULL;
977 unsigned char *tmp_cipher = NULL;
978
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200979 mbedtls_cipher_init( &ctx );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200980 memset( output, 0xFF, sizeof( output ) );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +0200981
982 /* Prepare context */
Hanno Beckera13272d2018-11-12 16:27:30 +0000983#if !defined(MBEDTLS_USE_PSA_CRYPTO)
984 (void) use_psa;
985#else
986 if( use_psa == 1 )
987 {
Jaeden Amero3ea26872019-02-13 11:30:22 +0000988 TEST_ASSERT( psa_crypto_init() == 0 );
989
Hanno Beckera13272d2018-11-12 16:27:30 +0000990 /* PSA requires that the tag immediately follows the ciphertext. */
991 tmp_cipher = mbedtls_calloc( 1, cipher->len + tag->len );
992 TEST_ASSERT( tmp_cipher != NULL );
993 tmp_tag = tmp_cipher + cipher->len;
994
995 memcpy( tmp_cipher, cipher->x, cipher->len );
996 memcpy( tmp_tag, tag->x, tag->len );
997
998 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
999 mbedtls_cipher_info_from_type( cipher_id ),
1000 tag->len ) );
1001 }
1002 else
1003#endif
1004 {
1005 tmp_tag = tag->x;
1006 tmp_cipher = cipher->x;
1007 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
1008 mbedtls_cipher_info_from_type( cipher_id ) ) );
1009 }
1010
1011 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len,
1012 MBEDTLS_DECRYPT ) );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001013
Azim Khand30ca132017-06-09 04:32:58 +01001014 /* decode buffer and check tag->x */
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001015
Hanno Beckera13272d2018-11-12 16:27:30 +00001016 /* Sanity check that we don't use overly long inputs. */
1017 TEST_ASSERT( sizeof( output ) >= cipher->len );
1018
1019 ret = mbedtls_cipher_auth_decrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
1020 tmp_cipher, cipher->len, output, &outlen,
1021 tmp_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001022
1023 /* make sure the message is rejected if it should be */
Azim Khan46c9b1f2017-05-31 20:46:35 +01001024 if( strcmp( result, "FAIL" ) == 0 )
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001025 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001026 TEST_ASSERT( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED );
Paul Bakkerbd51b262014-07-10 15:26:12 +02001027 goto exit;
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001028 }
1029
1030 /* otherwise, make sure it was decrypted properly */
1031 TEST_ASSERT( ret == 0 );
1032
Azim Khand30ca132017-06-09 04:32:58 +01001033 TEST_ASSERT( outlen == clear->len );
1034 TEST_ASSERT( memcmp( output, clear->x, clear->len ) == 0 );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001035
Azim Khand30ca132017-06-09 04:32:58 +01001036 /* then encrypt the clear->x and make sure we get the same ciphertext and tag->x */
Gilles Peskine424840e2019-04-16 15:56:36 +02001037 mbedtls_cipher_free( &ctx );
Gilles Peskine139ec3b2019-04-16 15:25:20 +02001038#if defined(MBEDTLS_USE_PSA_CRYPTO)
1039 if( use_psa == 1 )
1040 {
1041 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
1042 mbedtls_cipher_info_from_type( cipher_id ),
1043 tag->len ) );
1044 }
1045 else
1046#endif
1047 {
1048 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
1049 mbedtls_cipher_info_from_type( cipher_id ) ) );
1050 }
Jack Lloyd1dbc5a22019-03-07 16:59:14 -05001051 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len,
1052 MBEDTLS_ENCRYPT ) );
1053
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001054 memset( output, 0xFF, sizeof( output ) );
1055 outlen = 0;
1056
Hanno Beckera13272d2018-11-12 16:27:30 +00001057 /* Sanity check that we don't use overly long inputs. */
1058 TEST_ASSERT( sizeof( output ) >= clear->len + tag->len );
1059
1060 output_tag = output + clear->len;
Azim Khand30ca132017-06-09 04:32:58 +01001061 ret = mbedtls_cipher_auth_encrypt( &ctx, iv->x, iv->len, ad->x, ad->len,
1062 clear->x, clear->len, output, &outlen,
Hanno Beckera13272d2018-11-12 16:27:30 +00001063 output_tag, tag->len );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001064 TEST_ASSERT( ret == 0 );
1065
Jack Lloyd1dbc5a22019-03-07 16:59:14 -05001066 TEST_ASSERT( outlen == cipher->len );
Hanno Beckera13272d2018-11-12 16:27:30 +00001067 TEST_ASSERT( memcmp( output, cipher->x, cipher->len ) == 0 );
1068 TEST_ASSERT( memcmp( output_tag, tag->x, tag->len ) == 0 );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001069
Paul Bakkerbd51b262014-07-10 15:26:12 +02001070exit:
Hanno Beckera13272d2018-11-12 16:27:30 +00001071
1072#if defined(MBEDTLS_USE_PSA_CRYPTO)
1073 if( use_psa == 1 )
1074 {
1075 mbedtls_free( tmp_cipher );
1076 }
1077#endif /* MBEDTLS_USE_PSA_CRYPTO */
1078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079 mbedtls_cipher_free( &ctx );
Manuel Pégourié-Gonnard542eac52014-05-15 16:03:07 +02001080}
1081/* END_CASE */
1082
Manuel Pégourié-Gonnard8eccab52013-09-03 18:31:25 +02001083/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +01001084void test_vec_ecb( int cipher_id, int operation, data_t * key,
1085 data_t * input, data_t * result, int finish_result
Azim Khand30ca132017-06-09 04:32:58 +01001086 )
Paul Bakker5e0efa72013-09-08 23:04:04 +02001087{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088 mbedtls_cipher_context_t ctx;
Paul Bakker5e0efa72013-09-08 23:04:04 +02001089 unsigned char output[32];
1090 size_t outlen;
1091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001092 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001093
Paul Bakker5e0efa72013-09-08 23:04:04 +02001094 memset( output, 0x00, sizeof( output ) );
1095
1096 /* Prepare context */
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001097 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098 mbedtls_cipher_info_from_type( cipher_id ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001099
Paul Bakker5e0efa72013-09-08 23:04:04 +02001100
Azim Khand30ca132017-06-09 04:32:58 +01001101 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key->x, 8 * key->len, operation ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001102
Azim Khand30ca132017-06-09 04:32:58 +01001103 TEST_ASSERT( 0 == mbedtls_cipher_update( &ctx, input->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104 mbedtls_cipher_get_block_size( &ctx ),
Paul Bakker5e0efa72013-09-08 23:04:04 +02001105 output, &outlen ) );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106 TEST_ASSERT( outlen == mbedtls_cipher_get_block_size( &ctx ) );
1107 TEST_ASSERT( finish_result == mbedtls_cipher_finish( &ctx, output + outlen,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001108 &outlen ) );
1109 TEST_ASSERT( 0 == outlen );
1110
1111 /* check plaintext only if everything went fine */
1112 if( 0 == finish_result )
Azim Khand30ca132017-06-09 04:32:58 +01001113 TEST_ASSERT( 0 == memcmp( output, result->x,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114 mbedtls_cipher_get_block_size( &ctx ) ) );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001115
Paul Bakkerbd51b262014-07-10 15:26:12 +02001116exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117 mbedtls_cipher_free( &ctx );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001118}
1119/* END_CASE */
1120
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001121/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Ron Eldor7b012442017-09-25 17:03:12 +03001122void test_vec_crypt( int cipher_id, int operation, char *hex_key,
Hanno Beckere43164e2018-11-12 12:46:35 +00001123 char *hex_iv, char *hex_input, char *hex_result,
1124 int finish_result, int use_psa )
Ron Eldor7b012442017-09-25 17:03:12 +03001125{
1126 unsigned char key[50];
1127 unsigned char input[16];
1128 unsigned char result[16];
1129 unsigned char iv[16];
1130 size_t key_len, iv_len, inputlen, resultlen;
1131 mbedtls_cipher_context_t ctx;
1132 unsigned char output[32];
1133 size_t outlen;
1134
1135 mbedtls_cipher_init( &ctx );
1136
1137 memset( key, 0x00, sizeof( key ) );
1138 memset( input, 0x00, sizeof( input ) );
1139 memset( result, 0x00, sizeof( result ) );
1140 memset( output, 0x00, sizeof( output ) );
1141 memset( iv, 0x00, sizeof( iv ) );
1142
1143 /* Prepare context */
Hanno Beckere43164e2018-11-12 12:46:35 +00001144#if !defined(MBEDTLS_USE_PSA_CRYPTO)
1145 (void) use_psa;
1146#else
1147 if( use_psa == 1 )
1148 {
Jaeden Amero3ea26872019-02-13 11:30:22 +00001149 TEST_ASSERT( psa_crypto_init() == 0 );
Hanno Beckere43164e2018-11-12 12:46:35 +00001150 TEST_ASSERT( 0 == mbedtls_cipher_setup_psa( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001151 mbedtls_cipher_info_from_type( cipher_id ), 0 ) );
Hanno Beckere43164e2018-11-12 12:46:35 +00001152 }
1153 else
1154#endif /* MBEDTLS_USE_PSA_CRYPTO */
Ron Eldor7b012442017-09-25 17:03:12 +03001155 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx,
Hanno Beckera13272d2018-11-12 16:27:30 +00001156 mbedtls_cipher_info_from_type( cipher_id ) ) );
Ron Eldor7b012442017-09-25 17:03:12 +03001157
1158 key_len = unhexify( key, hex_key );
1159 inputlen = unhexify( input, hex_input );
1160 resultlen = unhexify( result, hex_result );
1161
1162 TEST_ASSERT( 0 == mbedtls_cipher_setkey( &ctx, key, 8 * key_len, operation ) );
1163 if( MBEDTLS_MODE_CBC == ctx.cipher_info->mode )
1164 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, MBEDTLS_PADDING_NONE ) );
1165
Ron Eldor4e64e0b2017-09-25 18:22:32 +03001166 iv_len = unhexify( iv, hex_iv );
Ron Eldor7b012442017-09-25 17:03:12 +03001167
1168 TEST_ASSERT( finish_result == mbedtls_cipher_crypt( &ctx, iv_len ? iv : NULL,
1169 iv_len, input, inputlen,
1170 output, &outlen ) );
1171 TEST_ASSERT( resultlen == outlen );
1172 /* check plaintext only if everything went fine */
1173 if( 0 == finish_result )
1174 TEST_ASSERT( 0 == memcmp( output, result, outlen ) );
1175
1176exit:
1177 mbedtls_cipher_free( &ctx );
1178}
1179/* END_CASE */
1180
1181/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_WITH_PADDING */
Paul Bakker33b43f12013-08-20 11:48:36 +02001182void set_padding( int cipher_id, int pad_mode, int ret )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001183{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001184 const mbedtls_cipher_info_t *cipher_info;
1185 mbedtls_cipher_context_t ctx;
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001187 mbedtls_cipher_init( &ctx );
Paul Bakkerd2a2d612014-07-01 15:45:49 +02001188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001189 cipher_info = mbedtls_cipher_info_from_type( cipher_id );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001190 TEST_ASSERT( NULL != cipher_info );
Manuel Pégourié-Gonnard8473f872015-05-14 13:51:45 +02001191 TEST_ASSERT( 0 == mbedtls_cipher_setup( &ctx, cipher_info ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001192
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001193 TEST_ASSERT( ret == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnardd5fdcaf2013-07-24 18:05:00 +02001194
Paul Bakkerbd51b262014-07-10 15:26:12 +02001195exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001196 mbedtls_cipher_free( &ctx );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001197}
Paul Bakker33b43f12013-08-20 11:48:36 +02001198/* END_CASE */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001199
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200/* BEGIN_CASE depends_on:MBEDTLS_CIPHER_MODE_CBC */
Azim Khan5fcca462018-06-29 11:05:32 +01001201void check_padding( int pad_mode, data_t * input, int ret, int dlen_check
Azim Khand30ca132017-06-09 04:32:58 +01001202 )
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001203{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001204 mbedtls_cipher_info_t cipher_info;
1205 mbedtls_cipher_context_t ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +01001206 size_t dlen;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001207
1208 /* build a fake context just for getting access to get_padding */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001209 mbedtls_cipher_init( &ctx );
1210 cipher_info.mode = MBEDTLS_MODE_CBC;
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001211 ctx.cipher_info = &cipher_info;
1212
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001213 TEST_ASSERT( 0 == mbedtls_cipher_set_padding_mode( &ctx, pad_mode ) );
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001214
Manuel Pégourié-Gonnarda6408492013-07-26 10:55:02 +02001215
Azim Khand30ca132017-06-09 04:32:58 +01001216 TEST_ASSERT( ret == ctx.get_padding( input->x, input->len, &dlen ) );
Paul Bakker33b43f12013-08-20 11:48:36 +02001217 if( 0 == ret )
1218 TEST_ASSERT( dlen == (size_t) dlen_check );
Paul Bakkerdbd443d2013-08-16 13:38:47 +02001219}
Paul Bakker33b43f12013-08-20 11:48:36 +02001220/* END_CASE */