blob: dad6be1e232db174c4ec4208042a5b2d46072c6c [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;
17 size_t len;
18
19 TEST_INVALID_PARAM( mbedtls_dhm_init( NULL ) );
20 TEST_VALID_PARAM( mbedtls_dhm_free( NULL ) );
21
22 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
23 mbedtls_dhm_read_params( NULL,
24 (unsigned char**) &buf,
25 buf ) );
26 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
27 mbedtls_dhm_read_params( &ctx, &buf_null, buf ) );
28 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
29 mbedtls_dhm_read_params( &ctx, NULL, buf ) );
30 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
31 mbedtls_dhm_read_params( &ctx,
32 (unsigned char**) &buf,
33 NULL ) );
34
35 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
36 mbedtls_dhm_make_params( NULL, 42,
37 buf, &len,
38 rnd_std_rand,
39 NULL ) );
40 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
41 mbedtls_dhm_make_params( &ctx, 42,
42 NULL, &len,
43 rnd_std_rand,
44 NULL ) );
45 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
46 mbedtls_dhm_make_params( &ctx, 42,
47 buf, NULL,
48 rnd_std_rand,
49 NULL ) );
50 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
51 mbedtls_dhm_make_params( &ctx, 42,
52 buf, &len,
53 NULL,
54 NULL ) );
55
56 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
57 mbedtls_dhm_set_group( NULL, &X, &X ) );
58 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
59 mbedtls_dhm_set_group( &ctx, NULL, &X ) );
60 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
61 mbedtls_dhm_set_group( &ctx, &X, NULL ) );
62
63 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
64 mbedtls_dhm_read_public( NULL, buf, 42 ) );
65 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
66 mbedtls_dhm_read_public( &ctx, NULL, 42 ) );
67
68 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
69 mbedtls_dhm_make_public( NULL, 42,
70 buf, 42,
71 rnd_std_rand,
72 NULL ) );
73 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
74 mbedtls_dhm_make_public( &ctx, 42,
75 NULL, 42,
76 rnd_std_rand,
77 NULL ) );
78 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
79 mbedtls_dhm_make_public( &ctx, 42,
80 buf, 42,
81 NULL,
82 NULL ) );
83
84 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
85 mbedtls_dhm_calc_secret( NULL, buf, 42,
86 &len, rnd_std_rand,
87 NULL ) );
88 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
89 mbedtls_dhm_calc_secret( &ctx, NULL, 42,
90 &len, rnd_std_rand,
91 NULL ) );
92 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
93 mbedtls_dhm_calc_secret( &ctx, buf, 42,
94 NULL, rnd_std_rand,
95 NULL ) );
96
97#if defined(MBEDTLS_ASN1_PARSE_C)
98 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
99 mbedtls_dhm_parse_dhm( NULL, buf, 42 ) );
100 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
101 mbedtls_dhm_parse_dhm( &ctx, NULL, 42 ) );
102
103#if defined(MBEDTLS_FS_IO)
104 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
105 mbedtls_dhm_parse_dhmfile( NULL, "" ) );
106 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
107 mbedtls_dhm_parse_dhmfile( &ctx, NULL ) );
108#endif /* MBEDTLS_FS_IO */
109#endif /* MBEDTLS_ASN1_PARSE_C */
110
111exit:
112 return;
113}
114/* END_CASE */
115
Paul Bakker33b43f12013-08-20 11:48:36 +0200116/* BEGIN_CASE */
Manuel Pégourié-Gonnarded8a02b2013-09-04 16:39:03 +0200117void dhm_do_dhm( int radix_P, char *input_P,
Janos Follath4b151fa2017-09-20 13:46:37 +0100118 int radix_G, char *input_G, int result )
Paul Bakker5c60de22009-07-08 19:47:36 +0000119{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120 mbedtls_dhm_context ctx_srv;
121 mbedtls_dhm_context ctx_cli;
Paul Bakker5c60de22009-07-08 19:47:36 +0000122 unsigned char ske[1000];
123 unsigned char *p = ske;
124 unsigned char pub_cli[1000];
125 unsigned char sec_srv[1000];
126 unsigned char sec_cli[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +0000127 size_t ske_len = 0;
128 size_t pub_cli_len = 0;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100129 size_t sec_srv_len;
130 size_t sec_cli_len;
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200131 int x_size, i;
Paul Bakker997bbd12011-03-13 15:45:42 +0000132 rnd_pseudo_info rnd_info;
Paul Bakker5c60de22009-07-08 19:47:36 +0000133
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200134 mbedtls_dhm_init( &ctx_srv );
135 mbedtls_dhm_init( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +0000136 memset( ske, 0x00, 1000 );
137 memset( pub_cli, 0x00, 1000 );
138 memset( sec_srv, 0x00, 1000 );
139 memset( sec_cli, 0x00, 1000 );
Paul Bakker997bbd12011-03-13 15:45:42 +0000140 memset( &rnd_info, 0x00, sizeof( rnd_pseudo_info ) );
Paul Bakker5c60de22009-07-08 19:47:36 +0000141
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200142 /*
143 * Set params
144 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145 TEST_ASSERT( mbedtls_mpi_read_string( &ctx_srv.P, radix_P, input_P ) == 0 );
146 TEST_ASSERT( mbedtls_mpi_read_string( &ctx_srv.G, radix_G, input_G ) == 0 );
147 x_size = mbedtls_mpi_size( &ctx_srv.P );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200148 pub_cli_len = x_size;
149
150 /*
151 * First key exchange
152 */
Janos Follath4b151fa2017-09-20 13:46:37 +0100153 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == result );
154 if ( result != 0 )
155 goto exit;
156
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200157 ske[ske_len++] = 0;
158 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200159 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200160
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200161 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
162 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200163
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100164 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
165 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 +0200166
167 TEST_ASSERT( sec_srv_len == sec_cli_len );
168 TEST_ASSERT( sec_srv_len != 0 );
169 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
170
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200171 /* Re-do calc_secret on server a few times to test update of blinding values */
172 for( i = 0; i < 3; i++ )
173 {
174 sec_srv_len = 1000;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100175 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 +0200176
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +0200177 TEST_ASSERT( sec_srv_len == sec_cli_len );
178 TEST_ASSERT( sec_srv_len != 0 );
179 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
180 }
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200181
182 /*
183 * Second key exchange to test change of blinding values on server
184 */
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +0200185 p = ske;
Paul Bakker5c60de22009-07-08 19:47:36 +0000186
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187 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 +0000188 ske[ske_len++] = 0;
189 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200192 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
193 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +0000194
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +0100195 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
196 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 +0000197
198 TEST_ASSERT( sec_srv_len == sec_cli_len );
199 TEST_ASSERT( sec_srv_len != 0 );
200 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
Paul Bakkerc43481a2011-02-20 16:34:26 +0000201
Paul Bakkerbd51b262014-07-10 15:26:12 +0200202exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200203 mbedtls_dhm_free( &ctx_srv );
204 mbedtls_dhm_free( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +0000205}
Paul Bakker33b43f12013-08-20 11:48:36 +0200206/* END_CASE */
Paul Bakker40ce79f2013-09-15 17:43:54 +0200207
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200208/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Azim Khanf1aaec92017-05-30 14:23:15 +0100209void dhm_file( char * filename, char * p, char * g, int len )
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100210{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200211 mbedtls_dhm_context ctx;
212 mbedtls_mpi P, G;
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214 mbedtls_dhm_init( &ctx );
215 mbedtls_mpi_init( &P ); mbedtls_mpi_init( &G );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200217 TEST_ASSERT( mbedtls_mpi_read_string( &P, 16, p ) == 0 );
218 TEST_ASSERT( mbedtls_mpi_read_string( &G, 16, g ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100219
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200220 TEST_ASSERT( mbedtls_dhm_parse_dhmfile( &ctx, filename ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100221
222 TEST_ASSERT( ctx.len == (size_t) len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200223 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.P, &P ) == 0 );
224 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.G, &G ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100225
Paul Bakkerbd51b262014-07-10 15:26:12 +0200226exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200227 mbedtls_mpi_free( &P ); mbedtls_mpi_free( &G );
228 mbedtls_dhm_free( &ctx );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100229}
230/* END_CASE */
231
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200232/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Azim Khanf1aaec92017-05-30 14:23:15 +0100233void dhm_selftest( )
Paul Bakker40ce79f2013-09-15 17:43:54 +0200234{
Andres AG93012e82016-09-09 09:10:28 +0100235 TEST_ASSERT( mbedtls_dhm_self_test( 1 ) == 0 );
Paul Bakker40ce79f2013-09-15 17:43:54 +0200236}
237/* END_CASE */