blob: 1726b9eb75c19daf702f1756b5d4855272998cf9 [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/dhm.h"
Paul Bakker33b43f12013-08-20 11:48:36 +02003/* END_HEADER */
Paul Bakker5c60de22009-07-08 19:47:36 +00004
Paul Bakker33b43f12013-08-20 11:48:36 +02005/* BEGIN_DEPENDENCIES
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02006 * depends_on:MBEDTLS_DHM_C:MBEDTLS_BIGNUM_C
Paul Bakker33b43f12013-08-20 11:48:36 +02007 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050010/* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
11void dhm_invalid_params( )
12{
13 mbedtls_dhm_context ctx;
14 unsigned char buf[42] = { 0 };
15 unsigned char *buf_null = NULL;
16 mbedtls_mpi X;
17 size_t const buflen = sizeof( buf );
18 size_t len;
19
20 TEST_INVALID_PARAM( mbedtls_dhm_init( NULL ) );
21 TEST_VALID_PARAM( mbedtls_dhm_free( NULL ) );
22
23 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
24 mbedtls_dhm_read_params( NULL,
25 (unsigned char**) &buf,
26 buf ) );
27 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
28 mbedtls_dhm_read_params( &ctx, &buf_null, buf ) );
29 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
30 mbedtls_dhm_read_params( &ctx, NULL, buf ) );
31 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
32 mbedtls_dhm_read_params( &ctx,
33 (unsigned char**) &buf,
34 NULL ) );
35
36 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
37 mbedtls_dhm_make_params( NULL, buflen,
38 buf, &len,
Ronald Cron351f0ee2020-06-10 12:12:18 +020039 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050040 NULL ) );
41 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
42 mbedtls_dhm_make_params( &ctx, buflen,
43 NULL, &len,
Ronald Cron351f0ee2020-06-10 12:12:18 +020044 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050045 NULL ) );
46 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
47 mbedtls_dhm_make_params( &ctx, buflen,
48 buf, NULL,
Ronald Cron351f0ee2020-06-10 12:12:18 +020049 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050050 NULL ) );
51 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
52 mbedtls_dhm_make_params( &ctx, buflen,
53 buf, &len,
54 NULL,
55 NULL ) );
56
57 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
58 mbedtls_dhm_set_group( NULL, &X, &X ) );
59 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
60 mbedtls_dhm_set_group( &ctx, NULL, &X ) );
61 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
62 mbedtls_dhm_set_group( &ctx, &X, NULL ) );
63
64 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
65 mbedtls_dhm_read_public( NULL, buf, buflen ) );
66 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
67 mbedtls_dhm_read_public( &ctx, NULL, buflen ) );
68
69 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
70 mbedtls_dhm_make_public( NULL, buflen,
71 buf, buflen,
Ronald Cron351f0ee2020-06-10 12:12:18 +020072 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050073 NULL ) );
74 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
75 mbedtls_dhm_make_public( &ctx, buflen,
76 NULL, buflen,
Ronald Cron351f0ee2020-06-10 12:12:18 +020077 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050078 NULL ) );
79 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
80 mbedtls_dhm_make_public( &ctx, buflen,
81 buf, buflen,
82 NULL,
83 NULL ) );
84
85 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020086 mbedtls_dhm_calc_secret( NULL, buf, buflen, &len,
87 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050088 NULL ) );
89 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020090 mbedtls_dhm_calc_secret( &ctx, NULL, buflen, &len,
91 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050092 NULL ) );
93 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Ronald Cron6c5bd7f2020-06-10 14:08:26 +020094 mbedtls_dhm_calc_secret( &ctx, buf, buflen, NULL,
95 mbedtls_test_rnd_std_rand,
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050096 NULL ) );
97
98#if defined(MBEDTLS_ASN1_PARSE_C)
99 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
100 mbedtls_dhm_parse_dhm( NULL, buf, buflen ) );
101 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
102 mbedtls_dhm_parse_dhm( &ctx, NULL, buflen ) );
103
104#if defined(MBEDTLS_FS_IO)
105 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
106 mbedtls_dhm_parse_dhmfile( NULL, "" ) );
107 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
108 mbedtls_dhm_parse_dhmfile( &ctx, NULL ) );
109#endif /* MBEDTLS_FS_IO */
110#endif /* MBEDTLS_ASN1_PARSE_C */
111
112exit:
113 return;
114}
115/* END_CASE */
116
Paul Bakker33b43f12013-08-20 11:48:36 +0200117/* BEGIN_CASE */
Manuel Pégourié-Gonnarded8a02b2013-09-04 16:39:03 +0200118void dhm_do_dhm( int radix_P, char *input_P,
Janos Follath4b151fa2017-09-20 13:46:37 +0100119 int radix_G, char *input_G, int result )
Paul Bakker5c60de22009-07-08 19:47:36 +0000120{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121 mbedtls_dhm_context ctx_srv;
122 mbedtls_dhm_context ctx_cli;
Paul Bakker5c60de22009-07-08 19:47:36 +0000123 unsigned char ske[1000];
124 unsigned char *p = ske;
125 unsigned char pub_cli[1000];
126 unsigned char sec_srv[1000];
127 unsigned char sec_cli[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000128 size_t ske_len = 0;
129 size_t pub_cli_len = 0;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100130 size_t sec_srv_len;
131 size_t sec_cli_len;
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200132 int x_size, i;
Ronald Cron351f0ee2020-06-10 12:12:18 +0200133 mbedtls_test_rnd_pseudo_info rnd_info;
Paul Bakker5c60de22009-07-08 19:47:36 +0000134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 mbedtls_dhm_init( &ctx_srv );
136 mbedtls_dhm_init( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +0000137 memset( ske, 0x00, 1000 );
138 memset( pub_cli, 0x00, 1000 );
139 memset( sec_srv, 0x00, 1000 );
140 memset( sec_cli, 0x00, 1000 );
Ronald Cron351f0ee2020-06-10 12:12:18 +0200141 memset( &rnd_info, 0x00, sizeof( mbedtls_test_rnd_pseudo_info ) );
Paul Bakker5c60de22009-07-08 19:47:36 +0000142
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200143 /*
144 * Set params
145 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146 TEST_ASSERT( mbedtls_mpi_read_string( &ctx_srv.P, radix_P, input_P ) == 0 );
147 TEST_ASSERT( mbedtls_mpi_read_string( &ctx_srv.G, radix_G, input_G ) == 0 );
148 x_size = mbedtls_mpi_size( &ctx_srv.P );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200149 pub_cli_len = x_size;
150
151 /*
152 * First key exchange
153 */
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200154 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len,
155 &mbedtls_test_rnd_pseudo_rand,
156 &rnd_info ) == result );
Janos Follath4b151fa2017-09-20 13:46:37 +0100157 if ( result != 0 )
158 goto exit;
159
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200160 ske[ske_len++] = 0;
161 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200163
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200164 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len,
165 &mbedtls_test_rnd_pseudo_rand,
166 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200167 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200168
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200169 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ),
170 &sec_srv_len,
171 &mbedtls_test_rnd_pseudo_rand,
172 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100173 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_cli, sec_cli, sizeof( sec_cli ), &sec_cli_len, NULL, NULL ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200174
175 TEST_ASSERT( sec_srv_len == sec_cli_len );
176 TEST_ASSERT( sec_srv_len != 0 );
177 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
178
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200179 /* Re-do calc_secret on server a few times to test update of blinding values */
180 for( i = 0; i < 3; i++ )
181 {
182 sec_srv_len = 1000;
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200183 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv,
184 sizeof( sec_srv ), &sec_srv_len,
185 &mbedtls_test_rnd_pseudo_rand,
186 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200187
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200188 TEST_ASSERT( sec_srv_len == sec_cli_len );
189 TEST_ASSERT( sec_srv_len != 0 );
190 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
191 }
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200192
193 /*
194 * Second key exchange to test change of blinding values on server
195 */
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200196 p = ske;
Paul Bakker5c60de22009-07-08 19:47:36 +0000197
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200198 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len,
199 &mbedtls_test_rnd_pseudo_rand,
200 &rnd_info ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000201 ske[ske_len++] = 0;
202 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200203 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000204
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200205 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len,
206 &mbedtls_test_rnd_pseudo_rand,
207 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000209
Ronald Cron6c5bd7f2020-06-10 14:08:26 +0200210 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ),
211 &sec_srv_len,
212 &mbedtls_test_rnd_pseudo_rand,
213 &rnd_info ) == 0 );
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100214 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_cli, sec_cli, sizeof( sec_cli ), &sec_cli_len, NULL, NULL ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000215
216 TEST_ASSERT( sec_srv_len == sec_cli_len );
217 TEST_ASSERT( sec_srv_len != 0 );
218 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
Paul Bakkerc43481a2011-02-20 16:34:26 +0000219
Paul Bakkerbd51b262014-07-10 15:26:12 +0200220exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200221 mbedtls_dhm_free( &ctx_srv );
222 mbedtls_dhm_free( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +0000223}
Paul Bakker33b43f12013-08-20 11:48:36 +0200224/* END_CASE */
Paul Bakker40ce79f2013-09-15 17:43:54 +0200225
Chris Jonesd10b3312020-12-02 10:41:50 +0000226/* BEGIN_CASE */
227void dhm_make_public( int P_bytes, int radix_G, char *input_G, int result )
228{
229 mbedtls_mpi P, G;
230 mbedtls_dhm_context ctx;
231 unsigned char output[MBEDTLS_MPI_MAX_SIZE];
232
233 mbedtls_mpi_init( &P );
234 mbedtls_mpi_init( &G );
235 mbedtls_dhm_init( &ctx );
236
237 TEST_ASSERT( mbedtls_mpi_lset( &P, 1 ) == 0 );
238 TEST_ASSERT( mbedtls_mpi_shift_l( &P, ( P_bytes * 8 ) - 1 ) == 0 );
239 TEST_ASSERT( mbedtls_mpi_set_bit( &P, 0, 1 ) == 0 );
240
241 TEST_ASSERT( mbedtls_mpi_read_string( &G, radix_G, input_G ) == 0 );
242
243 TEST_ASSERT( mbedtls_dhm_set_group( &ctx, &P, &G ) == 0 );
244 TEST_ASSERT( mbedtls_dhm_make_public( &ctx, (int) mbedtls_mpi_size( &P ),
245 output, sizeof(output),
246 &mbedtls_test_rnd_pseudo_rand,
247 NULL ) == result );
248
249exit:
250 mbedtls_mpi_free( &P );
251 mbedtls_mpi_free( &G );
252 mbedtls_dhm_free( &ctx );
253}
254/* END_CASE */
255
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200256/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100257void dhm_file( char * filename, char * p, char * g, int len )
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100258{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259 mbedtls_dhm_context ctx;
260 mbedtls_mpi P, G;
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262 mbedtls_dhm_init( &ctx );
263 mbedtls_mpi_init( &P ); mbedtls_mpi_init( &G );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200265 TEST_ASSERT( mbedtls_mpi_read_string( &P, 16, p ) == 0 );
266 TEST_ASSERT( mbedtls_mpi_read_string( &G, 16, g ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100267
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268 TEST_ASSERT( mbedtls_dhm_parse_dhmfile( &ctx, filename ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100269
270 TEST_ASSERT( ctx.len == (size_t) len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.P, &P ) == 0 );
272 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.G, &G ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100273
Paul Bakkerbd51b262014-07-10 15:26:12 +0200274exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200275 mbedtls_mpi_free( &P ); mbedtls_mpi_free( &G );
276 mbedtls_dhm_free( &ctx );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100277}
278/* END_CASE */
279
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200280/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +0100281void dhm_selftest( )
Paul Bakker40ce79f2013-09-15 17:43:54 +0200282{
Andres AG93012e82016-09-09 09:10:28 +0100283 TEST_ASSERT( mbedtls_dhm_self_test( 1 ) == 0 );
Paul Bakker40ce79f2013-09-15 17:43:54 +0200284}
285/* END_CASE */