9 typedef UINT32 uint32_t;
18 #define GET_UINT32_BE(n,b,i) \
20 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
21 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
22 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
23 | ( (uint32_t) (b)[(i) + 3] ); \
28 #define PUT_UINT32_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_PBKDF2_C
232 FCT_SUITE_BGN(test_suite_pbkdf2)
235 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_1_sha1)
237 unsigned char pw_str[100];
238 unsigned char salt_str[100];
239 unsigned char dst_str[100];
244 int pw_len, salt_len;
245 unsigned char key[100];
247 memset(pw_str, 0x00, 100);
248 memset(salt_str, 0x00, 100);
249 memset(dst_str, 0x00, 100);
251 pw_len =
unhexify( pw_str,
"70617373776f7264" );
252 salt_len =
unhexify( salt_str,
"73616c74" );
256 fct_chk( info != NULL );
258 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
261 hexify( dst_str, key, 20 );
262 fct_chk( strcmp( (
char *) dst_str,
"0c60c80f961f0e71f3a9b524af6012062fe037a6" ) == 0 );
267 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_2_sha1)
269 unsigned char pw_str[100];
270 unsigned char salt_str[100];
271 unsigned char dst_str[100];
276 int pw_len, salt_len;
277 unsigned char key[100];
279 memset(pw_str, 0x00, 100);
280 memset(salt_str, 0x00, 100);
281 memset(dst_str, 0x00, 100);
283 pw_len =
unhexify( pw_str,
"70617373776f7264" );
284 salt_len =
unhexify( salt_str,
"73616c74" );
288 fct_chk( info != NULL );
290 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
293 hexify( dst_str, key, 20 );
294 fct_chk( strcmp( (
char *) dst_str,
"ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957" ) == 0 );
299 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_3_sha1)
301 unsigned char pw_str[100];
302 unsigned char salt_str[100];
303 unsigned char dst_str[100];
308 int pw_len, salt_len;
309 unsigned char key[100];
311 memset(pw_str, 0x00, 100);
312 memset(salt_str, 0x00, 100);
313 memset(dst_str, 0x00, 100);
315 pw_len =
unhexify( pw_str,
"70617373776f7264" );
316 salt_len =
unhexify( salt_str,
"73616c74" );
320 fct_chk( info != NULL );
322 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
323 4096, 20, key ) == 0 );
325 hexify( dst_str, key, 20 );
326 fct_chk( strcmp( (
char *) dst_str,
"4b007901b765489abead49d926f721d065a429c1" ) == 0 );
331 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_5_sha1)
333 unsigned char pw_str[100];
334 unsigned char salt_str[100];
335 unsigned char dst_str[100];
340 int pw_len, salt_len;
341 unsigned char key[100];
343 memset(pw_str, 0x00, 100);
344 memset(salt_str, 0x00, 100);
345 memset(dst_str, 0x00, 100);
347 pw_len =
unhexify( pw_str,
"70617373776f726450415353574f524470617373776f7264" );
348 salt_len =
unhexify( salt_str,
"73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74" );
352 fct_chk( info != NULL );
354 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
355 4096, 25, key ) == 0 );
357 hexify( dst_str, key, 25 );
358 fct_chk( strcmp( (
char *) dst_str,
"3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038" ) == 0 );
363 FCT_TEST_BGN(pbkdf2_rfc_6070_test_vector_6_sha1)
365 unsigned char pw_str[100];
366 unsigned char salt_str[100];
367 unsigned char dst_str[100];
372 int pw_len, salt_len;
373 unsigned char key[100];
375 memset(pw_str, 0x00, 100);
376 memset(salt_str, 0x00, 100);
377 memset(dst_str, 0x00, 100);
379 pw_len =
unhexify( pw_str,
"7061737300776f7264" );
380 salt_len =
unhexify( salt_str,
"7361006c74" );
384 fct_chk( info != NULL );
386 fct_chk(
pbkdf2_hmac( &ctx, pw_str, pw_len, salt_str, salt_len,
387 4096, 16, key ) == 0 );
389 hexify( dst_str, key, 16 );
390 fct_chk( strcmp( (
char *) dst_str,
"56fa6aa75548099dcc37d7f03425e0c3" ) == 0 );