blob: 4fd8fff2379fdba7c0f62ba505096c3ee9201d0f [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
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,
Janos Follath4b151fa2017-09-20 13:46:37 +010012 int radix_G, char *input_G, int result )
Paul Bakker5c60de22009-07-08 19:47:36 +000013{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020014 mbedtls_dhm_context ctx_srv;
15 mbedtls_dhm_context ctx_cli;
Paul Bakker5c60de22009-07-08 19:47:36 +000016 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;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +010023 size_t sec_srv_len;
24 size_t sec_cli_len;
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
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020028 mbedtls_dhm_init( &ctx_srv );
29 mbedtls_dhm_init( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +000030 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 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020039 TEST_ASSERT( mbedtls_mpi_read_string( &ctx_srv.P, radix_P, input_P ) == 0 );
40 TEST_ASSERT( mbedtls_mpi_read_string( &ctx_srv.G, radix_G, input_G ) == 0 );
41 x_size = mbedtls_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 */
Janos Follath4b151fa2017-09-20 13:46:37 +010047 TEST_ASSERT( mbedtls_dhm_make_params( &ctx_srv, x_size, ske, &ske_len, &rnd_pseudo_rand, &rnd_info ) == result );
48 if ( result != 0 )
49 goto exit;
50
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020051 ske[ske_len++] = 0;
52 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020055 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
56 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020057
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +010058 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
59 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 +020060
61 TEST_ASSERT( sec_srv_len == sec_cli_len );
62 TEST_ASSERT( sec_srv_len != 0 );
63 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
64
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +020065 /* Re-do calc_secret on server a few times to test update of blinding values */
66 for( i = 0; i < 3; i++ )
67 {
68 sec_srv_len = 1000;
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +010069 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 +020070
Manuel Pégourié-Gonnard15d5de12013-09-17 11:34:11 +020071 TEST_ASSERT( sec_srv_len == sec_cli_len );
72 TEST_ASSERT( sec_srv_len != 0 );
73 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
74 }
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020075
76 /*
77 * Second key exchange to test change of blinding values on server
78 */
Manuel Pégourié-Gonnard143b5022013-09-04 16:29:59 +020079 p = ske;
Paul Bakker5c60de22009-07-08 19:47:36 +000080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020081 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 +000082 ske[ske_len++] = 0;
83 ske[ske_len++] = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020084 TEST_ASSERT( mbedtls_dhm_read_params( &ctx_cli, &p, ske + ske_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +000085
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020086 TEST_ASSERT( mbedtls_dhm_make_public( &ctx_cli, x_size, pub_cli, pub_cli_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
87 TEST_ASSERT( mbedtls_dhm_read_public( &ctx_srv, pub_cli, pub_cli_len ) == 0 );
Paul Bakker5c60de22009-07-08 19:47:36 +000088
Manuel Pégourié-Gonnard33352052015-06-02 16:17:08 +010089 TEST_ASSERT( mbedtls_dhm_calc_secret( &ctx_srv, sec_srv, sizeof( sec_srv ), &sec_srv_len, &rnd_pseudo_rand, &rnd_info ) == 0 );
90 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 +000091
92 TEST_ASSERT( sec_srv_len == sec_cli_len );
93 TEST_ASSERT( sec_srv_len != 0 );
94 TEST_ASSERT( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
Paul Bakkerc43481a2011-02-20 16:34:26 +000095
Paul Bakkerbd51b262014-07-10 15:26:12 +020096exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097 mbedtls_dhm_free( &ctx_srv );
98 mbedtls_dhm_free( &ctx_cli );
Paul Bakker5c60de22009-07-08 19:47:36 +000099}
Paul Bakker33b43f12013-08-20 11:48:36 +0200100/* END_CASE */
Paul Bakker40ce79f2013-09-15 17:43:54 +0200101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200102/* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100103void dhm_file( char *filename, char *p, char *g, int len )
104{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200105 mbedtls_dhm_context ctx;
106 mbedtls_mpi P, G;
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200108 mbedtls_dhm_init( &ctx );
109 mbedtls_mpi_init( &P ); mbedtls_mpi_init( &G );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100110
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200111 TEST_ASSERT( mbedtls_mpi_read_string( &P, 16, p ) == 0 );
112 TEST_ASSERT( mbedtls_mpi_read_string( &G, 16, g ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114 TEST_ASSERT( mbedtls_dhm_parse_dhmfile( &ctx, filename ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100115
116 TEST_ASSERT( ctx.len == (size_t) len );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.P, &P ) == 0 );
118 TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.G, &G ) == 0 );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100119
Paul Bakkerbd51b262014-07-10 15:26:12 +0200120exit:
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200121 mbedtls_mpi_free( &P ); mbedtls_mpi_free( &G );
122 mbedtls_dhm_free( &ctx );
Manuel Pégourié-Gonnard3fec2202014-03-29 16:42:38 +0100123}
124/* END_CASE */
125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126/* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
Paul Bakker40ce79f2013-09-15 17:43:54 +0200127void dhm_selftest()
128{
Andres AG93012e82016-09-09 09:10:28 +0100129 TEST_ASSERT( mbedtls_dhm_self_test( 1 ) == 0 );
Paul Bakker40ce79f2013-09-15 17:43:54 +0200130}
131/* END_CASE */