blob: 39e0b0b532e5a868fe94c1122ba1df3809a3dd17 [file] [log] [blame]
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/ccm.h"
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +02003
4/* Use the multipart interface to process the encrypted data in two parts
5 * and check that the output matches the expected output.
6 * The context must have been set up with the key. */
7static int check_multipart( mbedtls_ccm_context *ctx,
8 int mode,
9 const data_t *iv,
10 const data_t *add,
11 const data_t *input,
12 const data_t *expected_output,
13 const data_t *tag,
14 size_t n1,
15 size_t n1_add)
16{
17 int ok = 0;
18 uint8_t *output = NULL;
19 size_t n2 = input->len - n1;
20 size_t n2_add = add->len - n1_add;
21 size_t olen;
22
23 /* Sanity checks on the test data */
24 TEST_ASSERT( n1 <= input->len );
25 TEST_ASSERT( n1_add <= add->len );
26 TEST_EQUAL( input->len, expected_output->len );
27 TEST_EQUAL( 0, mbedtls_ccm_starts( ctx, mode, iv->x, iv->len ) );
28 TEST_EQUAL( 0, mbedtls_ccm_set_lengths( ctx, add->len, input->len, tag->len ) );
29 TEST_EQUAL( 0, mbedtls_ccm_update_ad( ctx, add->x, n1_add) );
30 TEST_EQUAL( 0, mbedtls_ccm_update_ad( ctx, add->x + n1_add, n2_add ) );
31
32 /* Allocate a tight buffer for each update call. This way, if the function
33 * tries to write beyond the advertised required buffer size, this will
34 * count as an overflow for memory sanitizers and static checkers. */
35 ASSERT_ALLOC( output, n1 );
36 olen = 0xdeadbeef;
37 TEST_EQUAL( 0, mbedtls_ccm_update( ctx, input->x, n1, output, n1, &olen ) );
38 TEST_EQUAL( n1, olen );
39 ASSERT_COMPARE( output, olen, expected_output->x, n1 );
40 mbedtls_free( output );
41 output = NULL;
42
43 ASSERT_ALLOC( output, n2 );
44 olen = 0xdeadbeef;
45 TEST_EQUAL( 0, mbedtls_ccm_update( ctx, input->x + n1, n2, output, n2, &olen ) );
46 TEST_EQUAL( n2, olen );
47 ASSERT_COMPARE( output, olen, expected_output->x + n1, n2 );
48 mbedtls_free( output );
49 output = NULL;
50
Mateusz Starzykc8bdf362021-07-28 15:39:51 +020051 ASSERT_ALLOC( output, tag->len );
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +020052 TEST_EQUAL( 0, mbedtls_ccm_finish( ctx, output, tag->len ) );
53 ASSERT_COMPARE( output, tag->len, tag->x, tag->len );
54 mbedtls_free( output );
55 output = NULL;
56
57 ok = 1;
58exit:
59 mbedtls_free( output );
60 return( ok );
61}
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +020062/* END_HEADER */
63
64/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020065 * depends_on:MBEDTLS_CCM_C
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +020066 * END_DEPENDENCIES
67 */
68
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020069/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST:MBEDTLS_AES_C */
Azim Khanf1aaec92017-05-30 14:23:15 +010070void mbedtls_ccm_self_test( )
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +020071{
Andres AG93012e82016-09-09 09:10:28 +010072 TEST_ASSERT( mbedtls_ccm_self_test( 1 ) == 0 );
Manuel Pégourié-Gonnarda6916fa2014-05-02 15:17:29 +020073}
74/* END_CASE */
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020075
76/* BEGIN_CASE */
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +020077void mbedtls_ccm_setkey( int cipher_id, int key_size, int result )
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020078{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079 mbedtls_ccm_context ctx;
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020080 unsigned char key[32];
81 int ret;
82
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +020083 mbedtls_ccm_init( &ctx );
84
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020085 memset( key, 0x2A, sizeof( key ) );
86 TEST_ASSERT( (unsigned) key_size <= 8 * sizeof( key ) );
87
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +020088 ret = mbedtls_ccm_setkey( &ctx, cipher_id, key, key_size );
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020089 TEST_ASSERT( ret == result );
90
Paul Bakkerbd51b262014-07-10 15:26:12 +020091exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092 mbedtls_ccm_free( &ctx );
Manuel Pégourié-Gonnard9fe0d132014-05-06 12:12:45 +020093}
94/* END_CASE */
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +020095
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020096/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +020097void ccm_lengths( int msg_len, int iv_len, int add_len, int tag_len, int res )
98{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020099 mbedtls_ccm_context ctx;
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200100 unsigned char key[16];
101 unsigned char msg[10];
102 unsigned char iv[14];
Dave Rodgman2e680342020-10-15 14:00:40 +0100103 unsigned char *add = NULL;
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200104 unsigned char out[10];
105 unsigned char tag[18];
106 int decrypt_ret;
107
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200108 mbedtls_ccm_init( &ctx );
109
Dave Rodgman2e680342020-10-15 14:00:40 +0100110 ASSERT_ALLOC_WEAK( add, add_len );
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200111 memset( key, 0, sizeof( key ) );
112 memset( msg, 0, sizeof( msg ) );
113 memset( iv, 0, sizeof( iv ) );
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200114 memset( out, 0, sizeof( out ) );
115 memset( tag, 0, sizeof( tag ) );
116
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200117 TEST_ASSERT( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200118 key, 8 * sizeof( key ) ) == 0 );
119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120 TEST_ASSERT( mbedtls_ccm_encrypt_and_tag( &ctx, msg_len, iv, iv_len, add, add_len,
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200121 msg, out, tag, tag_len ) == res );
122
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123 decrypt_ret = mbedtls_ccm_auth_decrypt( &ctx, msg_len, iv, iv_len, add, add_len,
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200124 msg, out, tag, tag_len );
125
126 if( res == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127 TEST_ASSERT( decrypt_ret == MBEDTLS_ERR_CCM_AUTH_FAILED );
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200128 else
129 TEST_ASSERT( decrypt_ret == res );
130
Paul Bakkerbd51b262014-07-10 15:26:12 +0200131exit:
Dave Rodgman2e680342020-10-15 14:00:40 +0100132 mbedtls_free( add );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200133 mbedtls_ccm_free( &ctx );
Manuel Pégourié-Gonnard87df5ba2014-05-06 18:07:24 +0200134}
135/* END_CASE */
136
Janos Follath95ab93d2018-05-14 14:32:41 +0100137/* BEGIN_CASE depends_on:MBEDTLS_AES_C */
138void ccm_star_lengths( int msg_len, int iv_len, int add_len, int tag_len,
139 int res )
140{
141 mbedtls_ccm_context ctx;
142 unsigned char key[16];
143 unsigned char msg[10];
144 unsigned char iv[14];
145 unsigned char add[10];
146 unsigned char out[10];
147 unsigned char tag[18];
148 int decrypt_ret;
149
150 mbedtls_ccm_init( &ctx );
151
152 memset( key, 0, sizeof( key ) );
153 memset( msg, 0, sizeof( msg ) );
154 memset( iv, 0, sizeof( iv ) );
155 memset( add, 0, sizeof( add ) );
156 memset( out, 0, sizeof( out ) );
157 memset( tag, 0, sizeof( tag ) );
158
159 TEST_ASSERT( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES,
160 key, 8 * sizeof( key ) ) == 0 );
161
162 TEST_ASSERT( mbedtls_ccm_star_encrypt_and_tag( &ctx, msg_len, iv, iv_len,
163 add, add_len, msg, out, tag, tag_len ) == res );
164
165 decrypt_ret = mbedtls_ccm_star_auth_decrypt( &ctx, msg_len, iv, iv_len, add,
166 add_len, msg, out, tag, tag_len );
167
168 if( res == 0 && tag_len != 0 )
169 TEST_ASSERT( decrypt_ret == MBEDTLS_ERR_CCM_AUTH_FAILED );
170 else
171 TEST_ASSERT( decrypt_ret == res );
172
173exit:
174 mbedtls_ccm_free( &ctx );
175}
176/* END_CASE */
177
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200178/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100179void mbedtls_ccm_encrypt_and_tag( int cipher_id, data_t * key,
180 data_t * msg, data_t * iv,
181 data_t * add, data_t * result )
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200182{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200183 mbedtls_ccm_context ctx;
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200184 size_t n1, n1_add;
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200185 uint8_t* io_msg_buf = NULL;
186 uint8_t* tag_buf = NULL;
187 const size_t expected_tag_len = result->len - msg->len;
188 const uint8_t* expected_tag = result->x + msg->len;
189
190 /* Prepare input/output message buffer */
191 ASSERT_ALLOC( io_msg_buf, msg->len );
192 if( msg->len != 0 )
193 memcpy( io_msg_buf, msg->x, msg->len );
194
195 /* Prepare tag buffer */
196 ASSERT_ALLOC( tag_buf, expected_tag_len );
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200197
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200198 mbedtls_ccm_init( &ctx );
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200199 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ), 0 );
Manuel Pégourié-Gonnard0f6b66d2014-05-07 14:43:46 +0200200 /* Test with input == output */
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200201 TEST_EQUAL( mbedtls_ccm_encrypt_and_tag( &ctx, msg->len, iv->x, iv->len, add->x, add->len,
202 io_msg_buf, io_msg_buf, tag_buf, expected_tag_len ), 0);
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200203
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200204 ASSERT_COMPARE( io_msg_buf, msg->len, result->x, msg->len );
205 ASSERT_COMPARE( tag_buf, expected_tag_len, expected_tag, expected_tag_len );
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200206
Mateusz Starzykceb5bc62021-07-30 14:36:22 +0200207 /* Prepare data_t structures for multipart testing */
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200208 const data_t encrypted_expected = { .x = result->x,
209 .len = msg->len };
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200210 const data_t tag_expected = { .x = (uint8_t*) expected_tag, /* cast to conform with data_t x type */
211 .len = expected_tag_len };
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200212
213 for( n1 = 0; n1 <= msg->len; n1 += 1 )
214 {
215 for( n1_add = 0; n1_add <= add->len; n1_add += 1 )
216 {
217 mbedtls_test_set_step( n1 * 10000 + n1_add );
218 if( !check_multipart( &ctx, MBEDTLS_CCM_ENCRYPT,
219 iv, add, msg,
220 &encrypted_expected,
221 &tag_expected,
222 n1, n1_add ) )
223 goto exit;
224 }
225 }
226
Paul Bakkerbd51b262014-07-10 15:26:12 +0200227exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228 mbedtls_ccm_free( &ctx );
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200229 mbedtls_free( io_msg_buf );
230 mbedtls_free( tag_buf );
Manuel Pégourié-Gonnard637eb3d2014-05-06 12:13:09 +0200231}
232/* END_CASE */
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200233
234/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100235void mbedtls_ccm_auth_decrypt( int cipher_id, data_t * key,
236 data_t * msg, data_t * iv,
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200237 data_t * add, int expected_tag_len, int result,
Ronald Cronac6ae352020-06-26 14:33:03 +0200238 data_t * expected_msg )
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200239{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200240 mbedtls_ccm_context ctx;
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200241 size_t n1, n1_add;
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200242
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200243 const size_t expected_msg_len = msg->len - expected_tag_len;
244 const uint8_t* expected_tag = msg->x + expected_msg_len;
245
246 /* Prepare input/output message buffer */
247 uint8_t* io_msg_buf = NULL;
248 ASSERT_ALLOC( io_msg_buf, expected_msg_len );
249 if( expected_msg_len )
250 memcpy( io_msg_buf, msg->x, expected_msg_len );
251
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200252 mbedtls_ccm_init( &ctx );
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200253 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ), 0 );
Manuel Pégourié-Gonnard0f6b66d2014-05-07 14:43:46 +0200254 /* Test with input == output */
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200255 TEST_EQUAL( mbedtls_ccm_auth_decrypt( &ctx, expected_msg_len, iv->x, iv->len, add->x, add->len,
256 io_msg_buf, io_msg_buf, expected_tag, expected_tag_len ), result );
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200257
Mohammad Azim Khancfd83422018-06-26 18:15:18 +0100258 if( result == 0 )
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200259 {
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200260 ASSERT_COMPARE( io_msg_buf, expected_msg_len, expected_msg->x, expected_msg_len );
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200261
Mateusz Starzykceb5bc62021-07-30 14:36:22 +0200262 /* Prepare data_t structures for multipart testing */
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200263 const data_t encrypted = { .x = msg->x,
264 .len = expected_msg_len };
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200265
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200266 const data_t tag_expected = { .x = (uint8_t*) expected_tag,
267 .len = expected_tag_len };
268
269 for( n1 = 0; n1 <= expected_msg_len; n1 += 1 )
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200270 {
271 for( n1_add = 0; n1_add <= add->len; n1_add += 1 )
272 {
273 mbedtls_test_set_step( n1 * 10000 + n1_add );
274 if( !check_multipart( &ctx, MBEDTLS_CCM_DECRYPT,
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200275 iv, add, &encrypted,
Mateusz Starzyk25a3dfe2021-07-12 14:53:45 +0200276 expected_msg,
277 &tag_expected,
278 n1, n1_add ) )
279 goto exit;
280 }
281 }
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200282 }
283 else
284 {
285 size_t i;
286
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200287 for( i = 0; i < expected_msg_len; i++ )
288 TEST_EQUAL( io_msg_buf[i], 0 );
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200289 }
290
Paul Bakkerbd51b262014-07-10 15:26:12 +0200291exit:
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200292 mbedtls_free(io_msg_buf);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293 mbedtls_ccm_free( &ctx );
Manuel Pégourié-Gonnardce77d552014-05-06 18:06:52 +0200294}
295/* END_CASE */
Darryl Green0daf4ca2018-05-29 14:12:26 +0100296
297/* BEGIN_CASE */
298void mbedtls_ccm_star_encrypt_and_tag( int cipher_id,
Ronald Cron9ed40732020-06-25 09:03:34 +0200299 data_t *key, data_t *msg,
300 data_t *source_address, data_t *frame_counter,
301 int sec_level, data_t *add,
302 data_t *expected_result, int output_ret )
Darryl Green0daf4ca2018-05-29 14:12:26 +0100303{
Darryl Green0daf4ca2018-05-29 14:12:26 +0100304 unsigned char iv[13];
Darryl Green0daf4ca2018-05-29 14:12:26 +0100305 mbedtls_ccm_context ctx;
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200306 size_t iv_len, expected_tag_len;
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200307 size_t n1, n1_add;
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200308 uint8_t* io_msg_buf = NULL;
309 uint8_t* tag_buf = NULL;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100310
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200311 const uint8_t* expected_tag = expected_result->x + msg->len;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100312
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200313 /* Calculate tag length */
Darryl Green0daf4ca2018-05-29 14:12:26 +0100314 if( sec_level % 4 == 0)
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200315 expected_tag_len = 0;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100316 else
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200317 expected_tag_len = 1 << ( sec_level % 4 + 1);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100318
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200319 /* Prepare input/output message buffer */
320 ASSERT_ALLOC( io_msg_buf, msg->len );
321 if( msg->len )
322 memcpy( io_msg_buf, msg->x, msg->len );
323
324 /* Prepare tag buffer */
325 if( expected_tag_len == 0 )
326 ASSERT_ALLOC( tag_buf, 16 );
327 else
328 ASSERT_ALLOC( tag_buf, expected_tag_len );
329
330 /* Calculate iv */
Gilles Peskineb168c0d2021-02-09 12:00:13 +0100331 TEST_ASSERT( source_address->len == 8 );
332 TEST_ASSERT( frame_counter->len == 4 );
333 memcpy( iv, source_address->x, source_address->len );
334 memcpy( iv + source_address->len, frame_counter->x, frame_counter->len );
Ronald Cron9ed40732020-06-25 09:03:34 +0200335 iv[source_address->len + frame_counter->len] = sec_level;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100336 iv_len = sizeof( iv );
337
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200338 mbedtls_ccm_init( &ctx );
339 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id,
340 key->x, key->len * 8 ), 0 );
341 /* Test with input == output */
342 TEST_EQUAL( mbedtls_ccm_star_encrypt_and_tag( &ctx, msg->len, iv, iv_len,
343 add->x, add->len, io_msg_buf,
344 io_msg_buf, tag_buf, expected_tag_len), output_ret );
Darryl Green0daf4ca2018-05-29 14:12:26 +0100345
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200346 ASSERT_COMPARE( io_msg_buf, msg->len, expected_result->x, msg->len );
347 ASSERT_COMPARE( tag_buf, expected_tag_len, expected_tag, expected_tag_len );
Darryl Green0daf4ca2018-05-29 14:12:26 +0100348
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200349 if( output_ret == 0 )
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200350 {
351 const data_t iv_data = { .x = iv,
352 .len = iv_len };
353
354 const data_t encrypted_expected = { .x = expected_result->x,
355 .len = msg->len };
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200356 const data_t tag_expected = { .x = (uint8_t*)expected_tag,
357 .len = expected_tag_len };
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200358
359 for( n1 = 0; n1 <= msg->len; n1 += 1 )
360 {
361 for( n1_add = 0; n1_add <= add->len; n1_add += 1 )
362 {
363 mbedtls_test_set_step( n1 * 10000 + n1_add );
364 if( !check_multipart( &ctx, MBEDTLS_CCM_STAR_ENCRYPT,
365 &iv_data, add, msg,
366 &encrypted_expected,
367 &tag_expected,
368 n1, n1_add ) )
369 goto exit;
370 }
371 }
372 }
373
Darryl Green0daf4ca2018-05-29 14:12:26 +0100374exit:
375 mbedtls_ccm_free( &ctx );
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200376 mbedtls_free( io_msg_buf );
377 mbedtls_free( tag_buf );
Darryl Green0daf4ca2018-05-29 14:12:26 +0100378}
379/* END_CASE */
380
381/* BEGIN_CASE */
382void mbedtls_ccm_star_auth_decrypt( int cipher_id,
Ronald Cron9ed40732020-06-25 09:03:34 +0200383 data_t *key, data_t *msg,
384 data_t *source_address, data_t *frame_counter,
385 int sec_level, data_t *add,
386 data_t *expected_result, int output_ret )
Darryl Green0daf4ca2018-05-29 14:12:26 +0100387{
Darryl Green0daf4ca2018-05-29 14:12:26 +0100388 unsigned char iv[13];
Darryl Green0daf4ca2018-05-29 14:12:26 +0100389 mbedtls_ccm_context ctx;
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200390 size_t iv_len, expected_tag_len;
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200391 size_t n1, n1_add;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100392
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200393 /* Calculate tag length */
Darryl Green0daf4ca2018-05-29 14:12:26 +0100394 if( sec_level % 4 == 0)
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200395 expected_tag_len = 0;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100396 else
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200397 expected_tag_len = 1 << ( sec_level % 4 + 1);
Darryl Green0daf4ca2018-05-29 14:12:26 +0100398
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200399 const size_t expected_msg_len = msg->len - expected_tag_len;
400 const uint8_t* expected_tag = msg->x + expected_msg_len;
401
402 /* Prepare input/output message buffer */
403 uint8_t* io_msg_buf = NULL;
404 ASSERT_ALLOC( io_msg_buf, expected_msg_len );
405 if( expected_msg_len )
406 memcpy( io_msg_buf, msg->x, expected_msg_len );
407
408 /* Calculate iv */
409 memset( iv, 0x00, sizeof( iv ) );
Gilles Peskineb168c0d2021-02-09 12:00:13 +0100410 TEST_ASSERT( source_address->len == 8 );
411 TEST_ASSERT( frame_counter->len == 4 );
412 memcpy( iv, source_address->x, source_address->len );
413 memcpy( iv + source_address->len, frame_counter->x, frame_counter->len );
Ronald Cron9ed40732020-06-25 09:03:34 +0200414 iv[source_address->len + frame_counter->len] = sec_level;
Darryl Green0daf4ca2018-05-29 14:12:26 +0100415 iv_len = sizeof( iv );
416
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200417 mbedtls_ccm_init( &ctx );
Ronald Cron9ed40732020-06-25 09:03:34 +0200418 TEST_ASSERT( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ) == 0 );
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200419 /* Test with input == output */
420 TEST_EQUAL( mbedtls_ccm_star_auth_decrypt( &ctx, expected_msg_len, iv, iv_len,
421 add->x, add->len, io_msg_buf, io_msg_buf,
422 expected_tag, expected_tag_len ), output_ret );
Darryl Green0daf4ca2018-05-29 14:12:26 +0100423
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200424 ASSERT_COMPARE( io_msg_buf, expected_msg_len, expected_result->x, expected_msg_len );
Darryl Green0daf4ca2018-05-29 14:12:26 +0100425
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200426 if( output_ret == 0 )
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200427 {
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200428 const data_t iv_data = { .x = iv,
429 .len = iv_len };
430
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200431 const data_t encrypted = { .x = msg->x,
432 .len = expected_msg_len} ;
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200433
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200434 const data_t tag_expected = { .x = (uint8_t*) expected_tag,
435 .len = expected_tag_len };
436
437 for( n1 = 0; n1 <= expected_msg_len; n1 += 1 )
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200438 {
439 for( n1_add = 0; n1_add <= add->len; n1_add += 1 )
440 {
441 mbedtls_test_set_step( n1 * 10000 + n1_add );
442 if( !check_multipart( &ctx, MBEDTLS_CCM_STAR_DECRYPT,
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200443 &iv_data, add, &encrypted,
Mateusz Starzyk29ec75b2021-07-13 12:26:17 +0200444 expected_result,
445 &tag_expected,
446 n1, n1_add ) )
447 goto exit;
448 }
449 }
450 }
451
Darryl Green0daf4ca2018-05-29 14:12:26 +0100452exit:
453 mbedtls_ccm_free( &ctx );
Mateusz Starzyk27a1bef2021-07-13 15:33:19 +0200454 mbedtls_free( io_msg_buf );
Darryl Green0daf4ca2018-05-29 14:12:26 +0100455}
456/* END_CASE */
Mateusz Starzyk87889062021-07-29 14:08:18 +0200457
458/* BEGIN_CASE */
459void mbedtls_ccm_skip_auth( int cipher_id, int mode,
460 data_t * key, data_t * msg, data_t * iv,
461 data_t * result, data_t * tag )
462{
463 mbedtls_ccm_context ctx;
464 uint8_t *output = NULL;
465 size_t olen;
466
467 /* Sanity checks on the test data */
468 TEST_EQUAL( msg->len, result->len );
469
470 mbedtls_ccm_init( &ctx );
471 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ), 0 );
472 TEST_EQUAL( 0, mbedtls_ccm_starts( &ctx, mode, iv->x, iv->len ) );
473 TEST_EQUAL( 0, mbedtls_ccm_set_lengths( &ctx, 0, msg->len, tag->len ) );
474
475 ASSERT_ALLOC( output, result->len );
476 olen = 0xdeadbeef;
477 TEST_EQUAL( 0, mbedtls_ccm_update( &ctx, msg->x, msg->len, output, result->len, &olen ) );
478 TEST_EQUAL( result->len, olen );
479 ASSERT_COMPARE( output, olen, result->x, result->len );
480 mbedtls_free( output );
481 output = NULL;
482
483 ASSERT_ALLOC( output, tag->len );
484 TEST_EQUAL( 0, mbedtls_ccm_finish( &ctx, output, tag->len ) );
485 ASSERT_COMPARE( output, tag->len, tag->x, tag->len );
486 mbedtls_free( output );
487 output = NULL;
488
489exit:
490 mbedtls_free( output );
491 mbedtls_ccm_free( &ctx );
492}
493/* END_CASE */
494
495/* BEGIN_CASE */
496void mbedtls_ccm_skip_cipher( int cipher_id, int mode,
497 data_t * key, data_t * iv, data_t* add,
498 data_t * tag )
499{
500 mbedtls_ccm_context ctx;
501 uint8_t *output = NULL;
502
503 mbedtls_ccm_init( &ctx );
504 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ), 0 );
505 TEST_EQUAL( 0, mbedtls_ccm_starts( &ctx, mode, iv->x, iv->len ) );
506 TEST_EQUAL( 0, mbedtls_ccm_set_lengths( &ctx, add->len, 0, tag->len ) );
507
508 TEST_EQUAL( 0, mbedtls_ccm_update_ad( &ctx, add->x, add->len) );
509
510 ASSERT_ALLOC( output, tag->len );
511 TEST_EQUAL( 0, mbedtls_ccm_finish( &ctx, output, tag->len ) );
512 ASSERT_COMPARE( output, tag->len, tag->x, tag->len );
513 mbedtls_free( output );
514 output = NULL;
515
516exit:
517 mbedtls_free( output );
518 mbedtls_ccm_free( &ctx );
519}
520/* END_CASE */
521
522/* BEGIN_CASE */
523void mbedtls_ccm_overflow_auth( int cipher_id, int mode,
524 data_t * key, data_t * iv,
525 data_t * add )
526{
527 mbedtls_ccm_context ctx;
528
529 mbedtls_ccm_init( &ctx );
530 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ), 0 );
531 TEST_EQUAL( 0, mbedtls_ccm_starts( &ctx, mode, iv->x, iv->len ) );
532 // use hardcoded values for msg length and tag length. They are not a part of this test
533 // set half of auth data length to provoke an overflow
534 TEST_EQUAL( 0, mbedtls_ccm_set_lengths( &ctx, add->len / 2, 16, 16 ) );
535
536 TEST_EQUAL( MBEDTLS_ERR_CCM_BAD_INPUT, mbedtls_ccm_update_ad( &ctx, add->x, add->len) );
537exit:
538 mbedtls_ccm_free( &ctx );
539}
540/* END_CASE */
541
542/* BEGIN_CASE */
543void mbedtls_ccm_overflow_cipher( int cipher_id, int mode,
544 data_t * key, data_t * msg, data_t * iv,
545 data_t * add )
546{
547 mbedtls_ccm_context ctx;
548 uint8_t *output = NULL;
549 size_t olen;
550
551 mbedtls_ccm_init( &ctx );
552 TEST_EQUAL( mbedtls_ccm_setkey( &ctx, cipher_id, key->x, key->len * 8 ), 0 );
553 TEST_EQUAL( 0, mbedtls_ccm_starts( &ctx, mode, iv->x, iv->len ) );
554 // use hardcoded value for tag length. It is a not a part of this test
555 // set half of msg length to provoke an overflow
556 TEST_EQUAL( 0, mbedtls_ccm_set_lengths( &ctx, add->len, msg->len / 2, 16 ) );
557
558 TEST_EQUAL( 0, mbedtls_ccm_update_ad( &ctx, add->x, add->len) );
559
560 ASSERT_ALLOC( output, msg->len );
561 TEST_EQUAL( MBEDTLS_ERR_CCM_BAD_INPUT, \
562 mbedtls_ccm_update( &ctx, msg->x, msg->len, output, msg->len, &olen ) );
563exit:
564 mbedtls_free( output );
565 mbedtls_ccm_free( &ctx );
566}
567/* END_CASE */