9 typedef UINT32 uint32_t;
18 #define GET_ULONG_BE(n,b,i) \
20 (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
21 | ( (unsigned long) (b)[(i) + 1] << 16 ) \
22 | ( (unsigned long) (b)[(i) + 2] << 8 ) \
23 | ( (unsigned long) (b)[(i) + 3] ); \
28 #define PUT_ULONG_BE(n,b,i) \
30 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
31 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
32 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
33 (b)[(i) + 3] = (unsigned char) ( (n) ); \
37 int unhexify(
unsigned char *obuf,
const char *ibuf)
40 int len = strlen(ibuf) / 2;
41 assert(!(strlen(ibuf) %1));
46 if( c >=
'0' && c <=
'9' )
48 else if( c >=
'a' && c <=
'f' )
50 else if( c >=
'A' && c <=
'F' )
56 if( c2 >=
'0' && c2 <=
'9' )
58 else if( c2 >=
'a' && c2 <=
'f' )
60 else if( c2 >=
'A' && c2 <=
'F' )
65 *obuf++ = ( c << 4 ) | c2;
71 void hexify(
unsigned char *obuf,
const unsigned char *ibuf,
int len)
83 *obuf++ =
'a' + h - 10;
88 *obuf++ =
'a' + l - 10;
104 static int rnd_std_rand(
void *rng_state,
unsigned char *output,
size_t len )
108 if( rng_state != NULL )
111 for( i = 0; i < len; ++i )
122 static int rnd_zero_rand(
void *rng_state,
unsigned char *output,
size_t len )
124 if( rng_state != NULL )
127 memset( output, 0, len );
154 if( rng_state == NULL )
163 memcpy( output, info->
buf, use_len );
164 info->
buf += use_len;
168 if( len - use_len > 0 )
169 return(
rnd_std_rand( NULL, output + use_len, len - use_len ) );
198 uint32_t i, *k, sum, delta=0x9E3779B9;
199 unsigned char result[4];
201 if( rng_state == NULL )
208 size_t use_len = ( len > 4 ) ? 4 : len;
211 for( i = 0; i < 32; i++ )
213 info->
v0 += (((info->
v1 << 4) ^ (info->
v1 >> 5)) + info->
v1) ^ (sum + k[sum & 3]);
215 info->
v1 += (((info->
v0 << 4) ^ (info->
v0 >> 5)) + info->
v0) ^ (sum + k[(sum>>11) & 3]);
219 memcpy( output, result, use_len );
229 #ifdef POLARSSL_DHM_C
230 #ifdef POLARSSL_BIGNUM_C
233 FCT_SUITE_BGN(test_suite_dhm)
236 FCT_TEST_BGN(diffie_hellman_full_exchange_1)
240 unsigned char ske[1000];
241 unsigned char *p = ske;
242 unsigned char pub_cli[1000];
243 unsigned char sec_srv[1000];
244 unsigned char sec_cli[1000];
246 size_t pub_cli_len = 0;
247 size_t sec_srv_len = 1000;
248 size_t sec_cli_len = 1000;
254 memset( ske, 0x00, 1000 );
255 memset( pub_cli, 0x00, 1000 );
256 memset( sec_srv, 0x00, 1000 );
257 memset( sec_cli, 0x00, 1000 );
269 pub_cli_len = x_size;
277 fct_chk( sec_srv_len == sec_cli_len );
278 fct_chk( sec_srv_len != 0 );
279 fct_chk( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
287 FCT_TEST_BGN(diffie_hellman_full_exchange_2)
291 unsigned char ske[1000];
292 unsigned char *p = ske;
293 unsigned char pub_cli[1000];
294 unsigned char sec_srv[1000];
295 unsigned char sec_cli[1000];
297 size_t pub_cli_len = 0;
298 size_t sec_srv_len = 1000;
299 size_t sec_cli_len = 1000;
305 memset( ske, 0x00, 1000 );
306 memset( pub_cli, 0x00, 1000 );
307 memset( sec_srv, 0x00, 1000 );
308 memset( sec_cli, 0x00, 1000 );
311 fct_chk(
mpi_read_string( &ctx_srv.
P, 10,
"93450983094850938450983409623" ) == 0 );
312 fct_chk(
mpi_read_string( &ctx_srv.
G, 10,
"9345098304850938450983409622" ) == 0 );
320 pub_cli_len = x_size;
328 fct_chk( sec_srv_len == sec_cli_len );
329 fct_chk( sec_srv_len != 0 );
330 fct_chk( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );
338 FCT_TEST_BGN(diffie_hellman_full_exchange_2)
342 unsigned char ske[1000];
343 unsigned char *p = ske;
344 unsigned char pub_cli[1000];
345 unsigned char sec_srv[1000];
346 unsigned char sec_cli[1000];
348 size_t pub_cli_len = 0;
349 size_t sec_srv_len = 1000;
350 size_t sec_cli_len = 1000;
356 memset( ske, 0x00, 1000 );
357 memset( pub_cli, 0x00, 1000 );
358 memset( sec_srv, 0x00, 1000 );
359 memset( sec_cli, 0x00, 1000 );
362 fct_chk(
mpi_read_string( &ctx_srv.
P, 10,
"93450983094850938450983409623982317398171298719873918739182739712938719287391879381271" ) == 0 );
363 fct_chk(
mpi_read_string( &ctx_srv.
G, 10,
"9345098309485093845098340962223981329819812792137312973297123912791271" ) == 0 );
371 pub_cli_len = x_size;
379 fct_chk( sec_srv_len == sec_cli_len );
380 fct_chk( sec_srv_len != 0 );
381 fct_chk( memcmp( sec_srv, sec_cli, sec_srv_len ) == 0 );