blob: 8a05a38dfbcec46c4c3216530b2574079375a1ee [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
Hanno Becker8c8a93c2018-12-12 21:10:46 +000010/* 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;
Hanno Beckeradc9b172018-12-17 09:34:36 +000017 size_t const buflen = sizeof( buf );
Hanno Becker8c8a93c2018-12-12 21:10:46 +000018 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,
Hanno Beckeradc9b172018-12-17 09:34:36 +000037 mbedtls_dhm_make_params( NULL, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000038 buf, &len,
39 rnd_std_rand,
40 NULL ) );
41 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000042 mbedtls_dhm_make_params( &ctx, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000043 NULL, &len,
44 rnd_std_rand,
45 NULL ) );
46 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000047 mbedtls_dhm_make_params( &ctx, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000048 buf, NULL,
49 rnd_std_rand,
50 NULL ) );
51 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000052 mbedtls_dhm_make_params( &ctx, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000053 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,
Hanno Beckeradc9b172018-12-17 09:34:36 +000065 mbedtls_dhm_read_public( NULL, buf, buflen ) );
Hanno Becker8c8a93c2018-12-12 21:10:46 +000066 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000067 mbedtls_dhm_read_public( &ctx, NULL, buflen ) );
Hanno Becker8c8a93c2018-12-12 21:10:46 +000068
69 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000070 mbedtls_dhm_make_public( NULL, buflen,
71 buf, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000072 rnd_std_rand,
73 NULL ) );
74 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000075 mbedtls_dhm_make_public( &ctx, buflen,
76 NULL, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000077 rnd_std_rand,
78 NULL ) );
79 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000080 mbedtls_dhm_make_public( &ctx, buflen,
81 buf, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000082 NULL,
83 NULL ) );
84
85 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000086 mbedtls_dhm_calc_secret( NULL, buf, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000087 &len, rnd_std_rand,
88 NULL ) );
89 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000090 mbedtls_dhm_calc_secret( &ctx, NULL, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000091 &len, rnd_std_rand,
92 NULL ) );
93 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +000094 mbedtls_dhm_calc_secret( &ctx, buf, buflen,
Hanno Becker8c8a93c2018-12-12 21:10:46 +000095 NULL, rnd_std_rand,
96 NULL ) );
97
98#if defined(MBEDTLS_ASN1_PARSE_C)
99 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +0000100 mbedtls_dhm_parse_dhm( NULL, buf, buflen ) );
Hanno Becker8c8a93c2018-12-12 21:10:46 +0000101 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
Hanno Beckeradc9b172018-12-17 09:34:36 +0000102 mbedtls_dhm_parse_dhm( &ctx, NULL, buflen ) );
Hanno Becker8c8a93c2018-12-12 21:10:46 +0000103
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;
Paul Bakker997bbd12011-03-13 15:45:42 +0000133 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 );
Paul Bakker997bbd12011-03-13 15:45:42 +0000141 memset( &rnd_info, 0x00, sizeof( 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 */
Janos Follath4b151fa2017-09-20 13:46:37 +0100154 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == result );
155 if ( result != 0 )
156 goto exit;
157
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200158 ske[ske_len++] = 0;
159 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200160 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
163 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200164
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100165 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
166 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 +0200167
168 TEST_ASSERT( sec_srv_len == sec_cli_len );
169 TEST_ASSERT( sec_srv_len != 0 );
170 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
171
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200172 /* Re-do calc_secret on server a few times to test update of blinding values */
173 for( i = 0; i < 3; i++ )
174 {
175 sec_srv_len = 1000;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100176 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200177
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200178 TEST_ASSERT( sec_srv_len == sec_cli_len );
179 TEST_ASSERT( sec_srv_len != 0 );
180 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
181 }
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200182
183 /*
184 * Second key exchange to test change of blinding values on server
185 */
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200186 p = ske;
Paul Bakker5c60de22009-07-08 19:47:36 +0000187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000189 ske[ske_len++] = 0;
190 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200191 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000192
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200193 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
194 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000195
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100196 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
197 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 +0000198
199 TEST_ASSERT( sec_srv_len == sec_cli_len );
200 TEST_ASSERT( sec_srv_len != 0 );
201 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
Paul Bakkerc43481a2011-02-20 16:34:26 +0000202
Paul Bakkerbd51b262014-07-10 15:26:12 +0200203exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200204 mbedtls_dhm_free( &ctx_srv );
205 mbedtls_dhm_free( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +0000206}
Paul Bakker33b43f12013-08-20 11:48:36 +0200207/* END_CASE */
Paul Bakker40ce79f2013-09-15 17:43:54 +0200208
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200209/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100210void dhm_file( char * filename, char * p, char * g, int len )
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100211{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200212 mbedtls_dhm_context ctx;
213 mbedtls_mpi P, G;
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200215 mbedtls_dhm_init( &ctx );
216 mbedtls_mpi_init( &P ); mbedtls_mpi_init( &G );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100217
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200218 TEST_ASSERT( mbedtls_mpi_read_string( &P, 16, p ) == 0 );
219 TEST_ASSERT( mbedtls_mpi_read_string( &G, 16, g ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100220
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200221 TEST_ASSERT( mbedtls_dhm_parse_dhmfile( &ctx, filename ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100222
223 TEST_ASSERT( ctx.len == (size_t) len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200224 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.P, &P ) == 0 );
225 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.G, &G ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100226
Paul Bakkerbd51b262014-07-10 15:26:12 +0200227exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228 mbedtls_mpi_free( &P ); mbedtls_mpi_free( &G );
229 mbedtls_dhm_free( &ctx );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100230}
231/* END_CASE */
232
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200233/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +0100234void dhm_selftest( )
Paul Bakker40ce79f2013-09-15 17:43:54 +0200235{
Andres AG93012e82016-09-09 09:10:28 +0100236 TEST_ASSERT( mbedtls_dhm_self_test( 1 ) == 0 );
Paul Bakker40ce79f2013-09-15 17:43:54 +0200237}
238/* END_CASE */