2 #include "mbedtls/dhm.h"
6 * depends_on:MBEDTLS_DHM_C:MBEDTLS_BIGNUM_C
10 /* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
11 void dhm_invalid_params( )
13 mbedtls_dhm_context ctx;
14 unsigned char buf[42] = { 0 };
15 unsigned char *buf_null = NULL;
17 size_t const buflen = sizeof( buf );
20 TEST_INVALID_PARAM( mbedtls_dhm_init( NULL ) );
21 TEST_VALID_PARAM( mbedtls_dhm_free( NULL ) );
23 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
24 mbedtls_dhm_read_params( NULL,
25 (unsigned char**) &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,
36 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
37 mbedtls_dhm_make_params( NULL, buflen,
41 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
42 mbedtls_dhm_make_params( &ctx, buflen,
46 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
47 mbedtls_dhm_make_params( &ctx, buflen,
51 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
52 mbedtls_dhm_make_params( &ctx, buflen,
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 ) );
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 ) );
69 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
70 mbedtls_dhm_make_public( NULL, buflen,
74 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
75 mbedtls_dhm_make_public( &ctx, buflen,
79 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
80 mbedtls_dhm_make_public( &ctx, buflen,
85 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
86 mbedtls_dhm_calc_secret( NULL, buf, buflen,
89 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
90 mbedtls_dhm_calc_secret( &ctx, NULL, buflen,
93 TEST_INVALID_PARAM_RET( MBEDTLS_ERR_DHM_BAD_INPUT_DATA,
94 mbedtls_dhm_calc_secret( &ctx, buf, buflen,
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 ) );
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 */
118 void dhm_do_dhm( int radix_P, char *input_P,
119 int radix_G, char *input_G, int result )
121 mbedtls_dhm_context ctx_srv;
122 mbedtls_dhm_context ctx_cli;
123 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];
129 size_t pub_cli_len = 0;
133 rnd_pseudo_info rnd_info;
135 mbedtls_dhm_init( &ctx_srv );
136 mbedtls_dhm_init( &ctx_cli );
137 memset( ske, 0x00, 1000 );
138 memset( pub_cli, 0x00, 1000 );
139 memset( sec_srv, 0x00, 1000 );
140 memset( sec_cli, 0x00, 1000 );
141 memset( &rnd_info, 0x00, sizeof( rnd_pseudo_info ) );
146 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 );
149 pub_cli_len = x_size;
154 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == result );
160 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
162 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 );
165 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 );
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 );
172 /* Re-do calc_secret on server a few times to test update of blinding values */
173 for( i = 0; i < 3; i++ )
176 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
178 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 );
184 * Second key exchange to test change of blinding values on server
188 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
191 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
193 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 );
196 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 );
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 );
204 mbedtls_dhm_free( &ctx_srv );
205 mbedtls_dhm_free( &ctx_cli );
209 /* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
210 void dhm_file( char * filename, char * p, char * g, int len )
212 mbedtls_dhm_context ctx;
215 mbedtls_dhm_init( &ctx );
216 mbedtls_mpi_init( &P ); mbedtls_mpi_init( &G );
218 TEST_ASSERT( mbedtls_mpi_read_string( &P, 16, p ) == 0 );
219 TEST_ASSERT( mbedtls_mpi_read_string( &G, 16, g ) == 0 );
221 TEST_ASSERT( mbedtls_dhm_parse_dhmfile( &ctx, filename ) == 0 );
223 TEST_ASSERT( ctx.len == (size_t) len );
224 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.P, &P ) == 0 );
225 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.G, &G ) == 0 );
228 mbedtls_mpi_free( &P ); mbedtls_mpi_free( &G );
229 mbedtls_dhm_free( &ctx );
233 /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
236 TEST_ASSERT( mbedtls_dhm_self_test( 1 ) == 0 );