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_PBKDF2_C
231 FCT_SUITE_BGN(test_suite_pbkdf2)
234 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_1_sha1)
236 unsigned char pw_str[100];
237 unsigned char salt_str[100];
238 unsigned char dst_str[100];
243 int pw_len, salt_len;
244 unsigned char key[100];
246 memset(pw_str, 0x00, 100);
247 memset(salt_str, 0x00, 100);
248 memset(dst_str, 0x00, 100);
250 pw_len =
unhexify( pw_str,
"70617373776f7264" );
251 salt_len =
unhexify( salt_str,
"73616c74" );
255 fct_chk( info != NULL );
257 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
260 hexify( dst_str, key, 20 );
261 fct_chk( strcmp( (
char *) dst_str,
"0c60c80f961f0e71f3a9b524af6012062fe037a6" ) == 0 );
266 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_2_sha1)
268 unsigned char pw_str[100];
269 unsigned char salt_str[100];
270 unsigned char dst_str[100];
275 int pw_len, salt_len;
276 unsigned char key[100];
278 memset(pw_str, 0x00, 100);
279 memset(salt_str, 0x00, 100);
280 memset(dst_str, 0x00, 100);
282 pw_len =
unhexify( pw_str,
"70617373776f7264" );
283 salt_len =
unhexify( salt_str,
"73616c74" );
287 fct_chk( info != NULL );
289 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
292 hexify( dst_str, key, 20 );
293 fct_chk( strcmp( (
char *) dst_str,
"ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957" ) == 0 );
298 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_3_sha1)
300 unsigned char pw_str[100];
301 unsigned char salt_str[100];
302 unsigned char dst_str[100];
307 int pw_len, salt_len;
308 unsigned char key[100];
310 memset(pw_str, 0x00, 100);
311 memset(salt_str, 0x00, 100);
312 memset(dst_str, 0x00, 100);
314 pw_len =
unhexify( pw_str,
"70617373776f7264" );
315 salt_len =
unhexify( salt_str,
"73616c74" );
319 fct_chk( info != NULL );
321 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
322 4096, 20, key ) == 0 );
324 hexify( dst_str, key, 20 );
325 fct_chk( strcmp( (
char *) dst_str,
"4b007901b765489abead49d926f721d065a429c1" ) == 0 );
330 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_5_sha1)
332 unsigned char pw_str[100];
333 unsigned char salt_str[100];
334 unsigned char dst_str[100];
339 int pw_len, salt_len;
340 unsigned char key[100];
342 memset(pw_str, 0x00, 100);
343 memset(salt_str, 0x00, 100);
344 memset(dst_str, 0x00, 100);
346 pw_len =
unhexify( pw_str,
"70617373776f726450415353574f524470617373776f7264" );
347 salt_len =
unhexify( salt_str,
"73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74" );
351 fct_chk( info != NULL );
353 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
354 4096, 25, key ) == 0 );
356 hexify( dst_str, key, 25 );
357 fct_chk( strcmp( (
char *) dst_str,
"3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038" ) == 0 );
362 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_6_sha1)
364 unsigned char pw_str[100];
365 unsigned char salt_str[100];
366 unsigned char dst_str[100];
371 int pw_len, salt_len;
372 unsigned char key[100];
374 memset(pw_str, 0x00, 100);
375 memset(salt_str, 0x00, 100);
376 memset(dst_str, 0x00, 100);
378 pw_len =
unhexify( pw_str,
"7061737300776f7264" );
379 salt_len =
unhexify( salt_str,
"7361006c74" );
383 fct_chk( info != NULL );
385 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
386 4096, 16, key ) == 0 );
388 hexify( dst_str, key, 16 );
389 fct_chk( strcmp( (
char *) dst_str,
"56fa6aa75548099dcc37d7f03425e0c3" ) == 0 );