blob: 9733eb235672bae05337cb7dde16233c1344fb70 [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/gcm.h"
Gilles Peskine36dd93e2021-04-13 13:02:03 +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_gcm_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{
16 int ok = 0;
17 uint8_t *output = NULL;
18 size_t n2 = input->len - n1;
Gilles Peskinea56c4482021-04-15 17:22:35 +020019 size_t olen;
Gilles Peskine36dd93e2021-04-13 13:02:03 +020020
21 /* Sanity checks on the test data */
22 TEST_ASSERT( n1 <= input->len );
23 TEST_EQUAL( input->len, expected_output->len );
24
25 TEST_EQUAL( 0, mbedtls_gcm_starts( ctx, mode,
Gilles Peskine295fc132021-04-15 18:32:23 +020026 iv->x, iv->len ) );
27 TEST_EQUAL( 0, mbedtls_gcm_update_ad( ctx, add->x, add->len ) );
Gilles Peskine36dd93e2021-04-13 13:02:03 +020028
29 /* Allocate a tight buffer for each update call. This way, if the function
30 * tries to write beyond the advertised required buffer size, this will
31 * count as an overflow for memory sanitizers and static checkers. */
32 ASSERT_ALLOC( output, n1 );
Gilles Peskinea56c4482021-04-15 17:22:35 +020033 olen = 0xdeadbeef;
34 TEST_EQUAL( 0, mbedtls_gcm_update( ctx, input->x, n1, output, n1, &olen ) );
35 TEST_EQUAL( n1, olen );
36 ASSERT_COMPARE( output, olen, expected_output->x, n1 );
Gilles Peskine36dd93e2021-04-13 13:02:03 +020037 mbedtls_free( output );
38 output = NULL;
39
40 ASSERT_ALLOC( output, n2 );
Gilles Peskinea56c4482021-04-15 17:22:35 +020041 olen = 0xdeadbeef;
42 TEST_EQUAL( 0, mbedtls_gcm_update( ctx, input->x + n1, n2, output, n2, &olen ) );
43 TEST_EQUAL( n2, olen );
44 ASSERT_COMPARE( output, olen, expected_output->x + n1, n2 );
Gilles Peskine36dd93e2021-04-13 13:02:03 +020045 mbedtls_free( output );
46 output = NULL;
47
48 ASSERT_ALLOC( output, tag->len );
Gilles Peskine9461e452021-04-15 16:48:32 +020049 TEST_EQUAL( 0, mbedtls_gcm_finish( ctx, NULL, 0, output, tag->len ) );
Gilles Peskine36dd93e2021-04-13 13:02:03 +020050 ASSERT_COMPARE( output, tag->len, tag->x, tag->len );
51 mbedtls_free( output );
52 output = NULL;
53
54 ok = 1;
55exit:
56 mbedtls_free( output );
57 return( ok );
58}
59
Paul Bakker33b43f12013-08-20 11:48:36 +020060/* END_HEADER */
Paul Bakker89e80c92012-03-20 13:50:09 +000061
Paul Bakker33b43f12013-08-20 11:48:36 +020062/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020063 * depends_on:MBEDTLS_GCM_C
Paul Bakker33b43f12013-08-20 11:48:36 +020064 * END_DEPENDENCIES
65 */
Paul Bakker89e80c92012-03-20 13:50:09 +000066
Paul Bakker33b43f12013-08-20 11:48:36 +020067/* BEGIN_CASE */
Ron Eldor5a21fd62016-12-16 16:15:56 +020068void gcm_bad_parameters( int cipher_id, int direction,
Azim Khan5fcca462018-06-29 11:05:32 +010069 data_t *key_str, data_t *src_str,
70 data_t *iv_str, data_t *add_str,
Ron Eldor5a21fd62016-12-16 16:15:56 +020071 int tag_len_bits, int gcm_result )
72{
Ron Eldor5a21fd62016-12-16 16:15:56 +020073 unsigned char output[128];
74 unsigned char tag_output[16];
75 mbedtls_gcm_context ctx;
Azim Khan317efe82017-08-02 17:33:54 +010076 size_t tag_len = tag_len_bits / 8;
Ron Eldor5a21fd62016-12-16 16:15:56 +020077
78 mbedtls_gcm_init( &ctx );
79
Ron Eldor5a21fd62016-12-16 16:15:56 +020080 memset( output, 0x00, sizeof( output ) );
81 memset( tag_output, 0x00, sizeof( tag_output ) );
Darryl Green11999bb2018-03-13 15:22:58 +000082
Azim Khan317efe82017-08-02 17:33:54 +010083 TEST_ASSERT( mbedtls_gcm_setkey( &ctx, cipher_id, key_str->x, key_str->len * 8 ) == 0 );
84 TEST_ASSERT( mbedtls_gcm_crypt_and_tag( &ctx, direction, src_str->len, iv_str->x, iv_str->len,
85 add_str->x, add_str->len, src_str->x, output, tag_len, tag_output ) == gcm_result );
Ron Eldor5a21fd62016-12-16 16:15:56 +020086
87exit:
88 mbedtls_gcm_free( &ctx );
89}
90/* END_CASE */
91
92/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +010093void gcm_encrypt_and_tag( int cipher_id, data_t * key_str,
94 data_t * src_str, data_t * iv_str,
Ronald Cronac6ae352020-06-26 14:33:03 +020095 data_t * add_str, data_t * dst,
96 int tag_len_bits, data_t * tag,
Azim Khand30ca132017-06-09 04:32:58 +010097 int init_result )
Paul Bakker89e80c92012-03-20 13:50:09 +000098{
Paul Bakker89e80c92012-03-20 13:50:09 +000099 unsigned char output[128];
100 unsigned char tag_output[16];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101 mbedtls_gcm_context ctx;
Azim Khanf1aaec92017-05-30 14:23:15 +0100102 size_t tag_len = tag_len_bits / 8;
Gilles Peskine36dd93e2021-04-13 13:02:03 +0200103 size_t n1;
Paul Bakker89e80c92012-03-20 13:50:09 +0000104
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200105 mbedtls_gcm_init( &ctx );
106
Paul Bakker89e80c92012-03-20 13:50:09 +0000107 memset(output, 0x00, 128);
108 memset(tag_output, 0x00, 16);
109
Paul Bakker89e80c92012-03-20 13:50:09 +0000110
Azim Khand30ca132017-06-09 04:32:58 +0100111 TEST_ASSERT( mbedtls_gcm_setkey( &ctx, cipher_id, key_str->x, key_str->len * 8 ) == init_result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200112 if( init_result == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +0000113 {
Azim Khand30ca132017-06-09 04:32:58 +0100114 TEST_ASSERT( mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_ENCRYPT, src_str->len, iv_str->x, iv_str->len, add_str->x, add_str->len, src_str->x, output, tag_len, tag_output ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000115
Gilles Peskine36dd93e2021-04-13 13:02:03 +0200116 ASSERT_COMPARE( output, src_str->len, dst->x, dst->len );
117 ASSERT_COMPARE( tag_output, tag_len, tag->x, tag->len );
118
Gilles Peskine58fc2722021-04-13 15:58:27 +0200119 for( n1 = 0; n1 <= src_str->len; n1 += 1 )
Gilles Peskine36dd93e2021-04-13 13:02:03 +0200120 {
121 mbedtls_test_set_step( n1 );
122 if( !check_multipart( &ctx, MBEDTLS_GCM_ENCRYPT,
123 iv_str, add_str, src_str,
124 dst, tag,
125 n1 ) )
126 goto exit;
127 }
Paul Bakker89e80c92012-03-20 13:50:09 +0000128 }
Manuel Pégourié-Gonnard4fe92002013-09-13 13:45:58 +0200129
Paul Bakkerbd51b262014-07-10 15:26:12 +0200130exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200131 mbedtls_gcm_free( &ctx );
Paul Bakker89e80c92012-03-20 13:50:09 +0000132}
Paul Bakker33b43f12013-08-20 11:48:36 +0200133/* END_CASE */
Paul Bakker89e80c92012-03-20 13:50:09 +0000134
Paul Bakker33b43f12013-08-20 11:48:36 +0200135/* BEGIN_CASE */
Azim Khan5fcca462018-06-29 11:05:32 +0100136void gcm_decrypt_and_verify( int cipher_id, data_t * key_str,
137 data_t * src_str, data_t * iv_str,
138 data_t * add_str, int tag_len_bits,
139 data_t * tag_str, char * result,
140 data_t * pt_result, int init_result )
Paul Bakker89e80c92012-03-20 13:50:09 +0000141{
Paul Bakker89e80c92012-03-20 13:50:09 +0000142 unsigned char output[128];
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143 mbedtls_gcm_context ctx;
Paul Bakker89e80c92012-03-20 13:50:09 +0000144 int ret;
Azim Khanf1aaec92017-05-30 14:23:15 +0100145 size_t tag_len = tag_len_bits / 8;
Gilles Peskine36dd93e2021-04-13 13:02:03 +0200146 size_t n1;
Paul Bakker89e80c92012-03-20 13:50:09 +0000147
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200148 mbedtls_gcm_init( &ctx );
149
Paul Bakker89e80c92012-03-20 13:50:09 +0000150 memset(output, 0x00, 128);
151
Paul Bakker89e80c92012-03-20 13:50:09 +0000152
Azim Khand30ca132017-06-09 04:32:58 +0100153 TEST_ASSERT( mbedtls_gcm_setkey( &ctx, cipher_id, key_str->x, key_str->len * 8 ) == init_result );
Paul Bakker33b43f12013-08-20 11:48:36 +0200154 if( init_result == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +0000155 {
Azim Khand30ca132017-06-09 04:32:58 +0100156 ret = mbedtls_gcm_auth_decrypt( &ctx, src_str->len, iv_str->x, iv_str->len, add_str->x, add_str->len, tag_str->x, tag_len, src_str->x, output );
Paul Bakker89e80c92012-03-20 13:50:09 +0000157
Azim Khan46c9b1f2017-05-31 20:46:35 +0100158 if( strcmp( "FAIL", result ) == 0 )
Paul Bakker89e80c92012-03-20 13:50:09 +0000159 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200160 TEST_ASSERT( ret == MBEDTLS_ERR_GCM_AUTH_FAILED );
Paul Bakker89e80c92012-03-20 13:50:09 +0000161 }
162 else
163 {
Manuel Pégourié-Gonnardf7ce67f2013-09-03 20:17:35 +0200164 TEST_ASSERT( ret == 0 );
Gilles Peskine36dd93e2021-04-13 13:02:03 +0200165 ASSERT_COMPARE( output, src_str->len, pt_result->x, pt_result->len );
Paul Bakker89e80c92012-03-20 13:50:09 +0000166
Gilles Peskine58fc2722021-04-13 15:58:27 +0200167 for( n1 = 0; n1 <= src_str->len; n1 += 1 )
Gilles Peskine36dd93e2021-04-13 13:02:03 +0200168 {
169 mbedtls_test_set_step( n1 );
170 if( !check_multipart( &ctx, MBEDTLS_GCM_DECRYPT,
171 iv_str, add_str, src_str,
172 pt_result, tag_str,
173 n1 ) )
174 goto exit;
175 }
Paul Bakker89e80c92012-03-20 13:50:09 +0000176 }
177 }
Manuel Pégourié-Gonnard4fe92002013-09-13 13:45:58 +0200178
Paul Bakkerbd51b262014-07-10 15:26:12 +0200179exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200180 mbedtls_gcm_free( &ctx );
Paul Bakker89e80c92012-03-20 13:50:09 +0000181}
Paul Bakker33b43f12013-08-20 11:48:36 +0200182/* END_CASE */
Paul Bakker89e80c92012-03-20 13:50:09 +0000183
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500184/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
185void gcm_invalid_param( )
186{
187 mbedtls_gcm_context ctx;
188 unsigned char valid_buffer[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
189 mbedtls_cipher_id_t valid_cipher = MBEDTLS_CIPHER_ID_AES;
190 int valid_mode = MBEDTLS_GCM_ENCRYPT;
191 int valid_len = sizeof(valid_buffer);
192 int valid_bitlen = 128, invalid_bitlen = 1;
Gilles Peskinea56c4482021-04-15 17:22:35 +0200193 size_t olen;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500194
195 mbedtls_gcm_init( &ctx );
196
197 /* mbedtls_gcm_init() */
198 TEST_INVALID_PARAM( mbedtls_gcm_init( NULL ) );
199
200 /* mbedtls_gcm_setkey */
201 TEST_INVALID_PARAM_RET(
202 MBEDTLS_ERR_GCM_BAD_INPUT,
203 mbedtls_gcm_setkey( NULL, valid_cipher, valid_buffer, valid_bitlen ) );
204 TEST_INVALID_PARAM_RET(
205 MBEDTLS_ERR_GCM_BAD_INPUT,
206 mbedtls_gcm_setkey( &ctx, valid_cipher, NULL, valid_bitlen ) );
207 TEST_INVALID_PARAM_RET(
208 MBEDTLS_ERR_GCM_BAD_INPUT,
209 mbedtls_gcm_setkey( &ctx, valid_cipher, valid_buffer, invalid_bitlen ) );
210
211 /* mbedtls_gcm_crypt_and_tag() */
212 TEST_INVALID_PARAM_RET(
213 MBEDTLS_ERR_GCM_BAD_INPUT,
214 mbedtls_gcm_crypt_and_tag( NULL, valid_mode, valid_len,
215 valid_buffer, valid_len,
216 valid_buffer, valid_len,
217 valid_buffer, valid_buffer,
218 valid_len, valid_buffer ) );
219 TEST_INVALID_PARAM_RET(
220 MBEDTLS_ERR_GCM_BAD_INPUT,
221 mbedtls_gcm_crypt_and_tag( &ctx, valid_mode, valid_len,
222 NULL, valid_len,
223 valid_buffer, valid_len,
224 valid_buffer, valid_buffer,
225 valid_len, valid_buffer ) );
226 TEST_INVALID_PARAM_RET(
227 MBEDTLS_ERR_GCM_BAD_INPUT,
228 mbedtls_gcm_crypt_and_tag( &ctx, valid_mode, valid_len,
229 valid_buffer, valid_len,
230 NULL, valid_len,
231 valid_buffer, valid_buffer,
232 valid_len, valid_buffer ) );
233 TEST_INVALID_PARAM_RET(
234 MBEDTLS_ERR_GCM_BAD_INPUT,
235 mbedtls_gcm_crypt_and_tag( &ctx, valid_mode, valid_len,
236 valid_buffer, valid_len,
237 valid_buffer, valid_len,
238 NULL, valid_buffer,
239 valid_len, valid_buffer ) );
240 TEST_INVALID_PARAM_RET(
241 MBEDTLS_ERR_GCM_BAD_INPUT,
242 mbedtls_gcm_crypt_and_tag( &ctx, valid_mode, valid_len,
243 valid_buffer, valid_len,
244 valid_buffer, valid_len,
245 valid_buffer, NULL,
246 valid_len, valid_buffer ) );
247 TEST_INVALID_PARAM_RET(
248 MBEDTLS_ERR_GCM_BAD_INPUT,
249 mbedtls_gcm_crypt_and_tag( &ctx, valid_mode, valid_len,
250 valid_buffer, valid_len,
251 valid_buffer, valid_len,
252 valid_buffer, valid_buffer,
253 valid_len, NULL ) );
254
255 /* mbedtls_gcm_auth_decrypt() */
256 TEST_INVALID_PARAM_RET(
257 MBEDTLS_ERR_GCM_BAD_INPUT,
258 mbedtls_gcm_auth_decrypt( NULL, valid_len,
259 valid_buffer, valid_len,
260 valid_buffer, valid_len,
261 valid_buffer, valid_len,
262 valid_buffer, valid_buffer) );
263 TEST_INVALID_PARAM_RET(
264 MBEDTLS_ERR_GCM_BAD_INPUT,
265 mbedtls_gcm_auth_decrypt( &ctx, valid_len,
266 NULL, valid_len,
267 valid_buffer, valid_len,
268 valid_buffer, valid_len,
269 valid_buffer, valid_buffer) );
270 TEST_INVALID_PARAM_RET(
271 MBEDTLS_ERR_GCM_BAD_INPUT,
272 mbedtls_gcm_auth_decrypt( &ctx, valid_len,
273 valid_buffer, valid_len,
274 NULL, valid_len,
275 valid_buffer, valid_len,
276 valid_buffer, valid_buffer) );
277 TEST_INVALID_PARAM_RET(
278 MBEDTLS_ERR_GCM_BAD_INPUT,
279 mbedtls_gcm_auth_decrypt( &ctx, valid_len,
280 valid_buffer, valid_len,
281 valid_buffer, valid_len,
282 NULL, valid_len,
283 valid_buffer, valid_buffer) );
284 TEST_INVALID_PARAM_RET(
285 MBEDTLS_ERR_GCM_BAD_INPUT,
286 mbedtls_gcm_auth_decrypt( &ctx, valid_len,
287 valid_buffer, valid_len,
288 valid_buffer, valid_len,
289 valid_buffer, valid_len,
290 NULL, valid_buffer) );
291 TEST_INVALID_PARAM_RET(
292 MBEDTLS_ERR_GCM_BAD_INPUT,
293 mbedtls_gcm_auth_decrypt( &ctx, valid_len,
294 valid_buffer, valid_len,
295 valid_buffer, valid_len,
296 valid_buffer, valid_len,
297 valid_buffer, NULL) );
298
299 /* mbedtls_gcm_starts() */
300 TEST_INVALID_PARAM_RET(
301 MBEDTLS_ERR_GCM_BAD_INPUT,
302 mbedtls_gcm_starts( NULL, valid_mode,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500303 valid_buffer, valid_len ) );
304
305 TEST_INVALID_PARAM_RET(
306 MBEDTLS_ERR_GCM_BAD_INPUT,
307 mbedtls_gcm_starts( &ctx, valid_mode,
Gilles Peskine295fc132021-04-15 18:32:23 +0200308 NULL, valid_len ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500309
Gilles Peskine295fc132021-04-15 18:32:23 +0200310 /* mbedtls_gcm_update_ad() */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500311 TEST_INVALID_PARAM_RET(
312 MBEDTLS_ERR_GCM_BAD_INPUT,
Gilles Peskine295fc132021-04-15 18:32:23 +0200313 mbedtls_gcm_update_ad( &ctx,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500314 NULL, valid_len ) );
315
316 /* mbedtls_gcm_update() */
317 TEST_INVALID_PARAM_RET(
318 MBEDTLS_ERR_GCM_BAD_INPUT,
Gilles Peskinea56c4482021-04-15 17:22:35 +0200319 mbedtls_gcm_update( NULL, valid_buffer, valid_len,
320 valid_buffer, valid_len, &olen ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500321 TEST_INVALID_PARAM_RET(
322 MBEDTLS_ERR_GCM_BAD_INPUT,
Gilles Peskinea56c4482021-04-15 17:22:35 +0200323 mbedtls_gcm_update( &ctx, NULL, valid_len,
324 valid_buffer, valid_len, &olen ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500325 TEST_INVALID_PARAM_RET(
326 MBEDTLS_ERR_GCM_BAD_INPUT,
Gilles Peskinea56c4482021-04-15 17:22:35 +0200327 mbedtls_gcm_update( &ctx, valid_buffer, valid_len,
328 NULL, valid_len, &olen ) );
329 TEST_INVALID_PARAM_RET(
330 MBEDTLS_ERR_GCM_BAD_INPUT,
331 mbedtls_gcm_update( &ctx, valid_buffer, valid_len,
332 valid_buffer, valid_len, NULL ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500333
334 /* mbedtls_gcm_finish() */
335 TEST_INVALID_PARAM_RET(
336 MBEDTLS_ERR_GCM_BAD_INPUT,
Gilles Peskine9461e452021-04-15 16:48:32 +0200337 mbedtls_gcm_finish( NULL, NULL, 0, valid_buffer, valid_len ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500338 TEST_INVALID_PARAM_RET(
339 MBEDTLS_ERR_GCM_BAD_INPUT,
Gilles Peskine9461e452021-04-15 16:48:32 +0200340 mbedtls_gcm_finish( &ctx, NULL, 0, NULL, valid_len ) );
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500341
342exit:
343 mbedtls_gcm_free( &ctx );
344}
345/* END_CASE */
346
347/* BEGIN_CASE */
348void gcm_valid_param( )
349{
350 TEST_VALID_PARAM( mbedtls_gcm_free( NULL ) );
351exit:
352 return;
353}
354/* END_CASE */
355
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200356/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +0100357void gcm_selftest( )
Paul Bakker89e80c92012-03-20 13:50:09 +0000358{
Andres AG93012e82016-09-09 09:10:28 +0100359 TEST_ASSERT( mbedtls_gcm_self_test( 1 ) == 0 );
Paul Bakker89e80c92012-03-20 13:50:09 +0000360}
Paul Bakker33b43f12013-08-20 11:48:36 +0200361/* END_CASE */