blob: b0df9fdbb21ee9579f4b98511cfcd069350bdebf [file] [log] [blame]
Paul Bakker33b43f12013-08-20 11:48:36 +02001/* BEGIN_HEADER */
Paul Bakker5c60de22009-07-08 19:47:36 +00002#include <polarssl/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
6 * depends_on:POLARSSL_DHM_C:POLARSSL_BIGNUM_C
7 * END_DEPENDENCIES
8 */
Paul Bakker5690efc2011-05-26 13:16:06 +00009
Paul Bakker33b43f12013-08-20 11:48:36 +020010/* BEGIN_CASE */
Manuel Pégourié-Gonnarded8a02b2013-09-04 16:39:03 +020011void dhm_do_dhm( int radix_P, char *input_P,
Paul Bakker33b43f12013-08-20 11:48:36 +020012 int radix_G, char *input_G )
Paul Bakker5c60de22009-07-08 19:47:36 +000013{
14 dhm_context ctx_srv;
15 dhm_context ctx_cli;
16 unsigned char ske[1000];
17 unsigned char *p = ske;
18 unsigned char pub_cli[1000];
19 unsigned char sec_srv[1000];
20 unsigned char sec_cli[1000];
Paul Bakkerf4a3f302011-04-24 15:53:29 +000021 size_t ske_len = 0;
22 size_t pub_cli_len = 0;
23 size_t sec_srv_len = 1000;
24 size_t sec_cli_len = 1000;
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +020025 int x_size, i;
Paul Bakker997bbd12011-03-13 15:45:42 +000026 rnd_pseudo_info rnd_info;
Paul Bakker5c60de22009-07-08 19:47:36 +000027
28 memset( &ctx_srv, 0x00, sizeof( dhm_context ) );
29 memset( &ctx_cli, 0x00, sizeof( dhm_context ) );
30 memset( ske, 0x00, 1000 );
31 memset( pub_cli, 0x00, 1000 );
32 memset( sec_srv, 0x00, 1000 );
33 memset( sec_cli, 0x00, 1000 );
Paul Bakker997bbd12011-03-13 15:45:42 +000034 memset( &rnd_info, 0x00, sizeof( rnd_pseudo_info ) );
Paul Bakker5c60de22009-07-08 19:47:36 +000035
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020036 /*
37 * Set params
38 */
Paul Bakker33b43f12013-08-20 11:48:36 +020039 TEST_ASSERT( mpi_read_string( &ctx_srv.P, radix_P, input_P ) == 0 );
40 TEST_ASSERT( mpi_read_string( &ctx_srv.G, radix_G, input_G ) == 0 );
Paul Bakker69998dd2009-07-11 19:15:20 +000041 x_size = mpi_size( &ctx_srv.P );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020042 pub_cli_len = x_size;
43
44 /*
45 * First key exchange
46 */
47 TEST_ASSERT( dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
48 ske[ske_len++] = 0;
49 ske[ske_len++] = 0;
50 TEST_ASSERT( dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
51
52 TEST_ASSERT( dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
53 TEST_ASSERT( dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
54
55 TEST_ASSERT( dhm_calc_secret( &ctx_srv, sec_srv, &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
56 TEST_ASSERT( dhm_calc_secret( &ctx_cli, sec_cli, &sec_cli_len, NULL, NULL ) == 0 );
57
58 TEST_ASSERT( sec_srv_len == sec_cli_len );
59 TEST_ASSERT( sec_srv_len != 0 );
60 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
61
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +020062 /* Re-do calc_secret on server a few times to test update of blinding values */
63 for( i = 0; i < 3; i++ )
64 {
65 sec_srv_len = 1000;
66 TEST_ASSERT( dhm_calc_secret( &ctx_srv, sec_srv, &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020067
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +020068 TEST_ASSERT( sec_srv_len == sec_cli_len );
69 TEST_ASSERT( sec_srv_len != 0 );
70 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
71 }
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020072
73 /*
74 * Second key exchange to test change of blinding values on server
75 */
76 sec_cli_len = 1000;
77 sec_srv_len = 1000;
78 p = ske;
Paul Bakker5c60de22009-07-08 19:47:36 +000079
Paul Bakker997bbd12011-03-13 15:45:42 +000080 TEST_ASSERT( dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +000081 ske[ske_len++] = 0;
82 ske[ske_len++] = 0;
83 TEST_ASSERT( dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
84
Paul Bakker997bbd12011-03-13 15:45:42 +000085 TEST_ASSERT( dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +000086 TEST_ASSERT( dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
87
Manuel Pégourié-Gonnard2d627642013-09-04 14:22:07 +020088 TEST_ASSERT( dhm_calc_secret( &ctx_srv, sec_srv, &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
89 TEST_ASSERT( dhm_calc_secret( &ctx_cli, sec_cli, &sec_cli_len, NULL, NULL ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +000090
91 TEST_ASSERT( sec_srv_len == sec_cli_len );
92 TEST_ASSERT( sec_srv_len != 0 );
93 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
Paul Bakkerc43481a2011-02-20 16:34:26 +000094
95 dhm_free( &ctx_srv );
96 dhm_free( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +000097}
Paul Bakker33b43f12013-08-20 11:48:36 +020098/* END_CASE */
Paul Bakker40ce79f2013-09-15 17:43:54 +020099
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100100/* BEGIN_CASE depends_on:POLARSSL_FS_IO */
101void dhm_file( char *filename, char *p, char *g, int len )
102{
103 dhm_context ctx;
104 mpi P, G;
105
106 memset( &ctx, 0, sizeof ctx );
107 mpi_init( &P ); mpi_init( &G );
108
109 TEST_ASSERT( mpi_read_string( &P, 16, p ) == 0 );
110 TEST_ASSERT( mpi_read_string( &G, 16, g ) == 0 );
111
112 TEST_ASSERT( dhm_parse_dhmfile( &ctx, filename ) == 0 );
113
114 TEST_ASSERT( ctx.len == (size_t) len );
115 TEST_ASSERT( mpi_cmp_mpi( &ctx.P, &P ) == 0 );
116 TEST_ASSERT( mpi_cmp_mpi( &ctx.G, &G ) == 0 );
117
118 mpi_free( &P ); mpi_free( &G );
119 dhm_free( &ctx );
120}
121/* END_CASE */
122
Manuel Pégourié-Gonnard20140162013-10-10 12:48:03 +0200123/* BEGIN_CASE depends_on:POLARSSL_SELF_TEST */
Paul Bakker40ce79f2013-09-15 17:43:54 +0200124void dhm_selftest()
125{
126 TEST_ASSERT( dhm_self_test( 0 ) == 0 );
127}
128/* END_CASE */