8 typedef UINT32 uint32_t;
17 #define GET_UINT32_BE(n,b,i) \
19 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
20 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
21 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
22 | ( (uint32_t) (b)[(i) + 3] ); \
27 #define PUT_UINT32_BE(n,b,i) \
29 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
30 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
31 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
32 (b)[(i) + 3] = (unsigned char) ( (n) ); \
36 int unhexify(
unsigned char *obuf,
const char *ibuf)
39 int len = strlen(ibuf) / 2;
40 assert(!(strlen(ibuf) %1));
45 if( c >=
'0' && c <=
'9' )
47 else if( c >=
'a' && c <=
'f' )
49 else if( c >=
'A' && c <=
'F' )
55 if( c2 >=
'0' && c2 <=
'9' )
57 else if( c2 >=
'a' && c2 <=
'f' )
59 else if( c2 >=
'A' && c2 <=
'F' )
64 *obuf++ = ( c << 4 ) | c2;
70 void hexify(
unsigned char *obuf,
const unsigned char *ibuf,
int len)
82 *obuf++ =
'a' + h - 10;
87 *obuf++ =
'a' + l - 10;
103 static int rnd_std_rand(
void *rng_state,
unsigned char *output,
size_t len )
107 if( rng_state != NULL )
110 for( i = 0; i < len; ++i )
121 static int rnd_zero_rand(
void *rng_state,
unsigned char *output,
size_t len )
123 if( rng_state != NULL )
126 memset( output, 0, len );
153 if( rng_state == NULL )
162 memcpy( output, info->
buf, use_len );
163 info->
buf += use_len;
167 if( len - use_len > 0 )
168 return(
rnd_std_rand( NULL, output + use_len, len - use_len ) );
197 uint32_t i, *k, sum, delta=0x9E3779B9;
198 unsigned char result[4];
200 if( rng_state == NULL )
207 size_t use_len = ( len > 4 ) ? 4 : len;
210 for( i = 0; i < 32; i++ )
212 info->
v0 += (((info->
v1 << 4) ^ (info->
v1 >> 5)) + info->
v1) ^ (sum + k[sum & 3]);
214 info->
v1 += (((info->
v0 << 4) ^ (info->
v0 >> 5)) + info->
v0) ^ (sum + k[(sum>>11) & 3]);
218 memcpy( output, result, use_len );
228 #ifdef POLARSSL_DHM_C
229 #ifdef POLARSSL_BIGNUM_C
232 FCT_SUITE_BGN(test_suite_dhm)
235 FCT_TEST_BGN(diffie_hellman_full_exchange_1)
239 unsigned char ske[1000];
240 unsigned char *p = ske;
241 unsigned char pub_cli[1000];
242 unsigned char sec_srv[1000];
243 unsigned char sec_cli[1000];
245 size_t pub_cli_len = 0;
246 size_t sec_srv_len = 1000;
247 size_t sec_cli_len = 1000;
253 memset( ske, 0x00, 1000 );
254 memset( pub_cli, 0x00, 1000 );
255 memset( sec_srv, 0x00, 1000 );
256 memset( sec_cli, 0x00, 1000 );
268 pub_cli_len = x_size;
276 fct_chk( sec_srv_len == sec_cli_len );
277 fct_chk( sec_srv_len != 0 );
278 fct_chk( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
286 FCT_TEST_BGN(diffie_hellman_full_exchange_2)
290 unsigned char ske[1000];
291 unsigned char *p = ske;
292 unsigned char pub_cli[1000];
293 unsigned char sec_srv[1000];
294 unsigned char sec_cli[1000];
296 size_t pub_cli_len = 0;
297 size_t sec_srv_len = 1000;
298 size_t sec_cli_len = 1000;
304 memset( ske, 0x00, 1000 );
305 memset( pub_cli, 0x00, 1000 );
306 memset( sec_srv, 0x00, 1000 );
307 memset( sec_cli, 0x00, 1000 );
310 fct_chk(
mpi_read_string( &ctx_srv.
P, 10,
"93450983094850938450983409623" ) == 0 );
311 fct_chk(
mpi_read_string( &ctx_srv.
G, 10,
"9345098304850938450983409622" ) == 0 );
319 pub_cli_len = x_size;
327 fct_chk( sec_srv_len == sec_cli_len );
328 fct_chk( sec_srv_len != 0 );
329 fct_chk( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
337 FCT_TEST_BGN(diffie_hellman_full_exchange_2)
341 unsigned char ske[1000];
342 unsigned char *p = ske;
343 unsigned char pub_cli[1000];
344 unsigned char sec_srv[1000];
345 unsigned char sec_cli[1000];
347 size_t pub_cli_len = 0;
348 size_t sec_srv_len = 1000;
349 size_t sec_cli_len = 1000;
355 memset( ske, 0x00, 1000 );
356 memset( pub_cli, 0x00, 1000 );
357 memset( sec_srv, 0x00, 1000 );
358 memset( sec_cli, 0x00, 1000 );
361 fct_chk(
mpi_read_string( &ctx_srv.
P, 10,
"93450983094850938450983409623982317398171298719873918739182739712938719287391879381271" ) == 0 );
362 fct_chk(
mpi_read_string( &ctx_srv.
G, 10,
"9345098309485093845098340962223981329819812792137312973297123912791271" ) == 0 );
370 pub_cli_len = x_size;
378 fct_chk( sec_srv_len == sec_cli_len );
379 fct_chk( sec_srv_len != 0 );
380 fct_chk( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );