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_BASE64_C
232 FCT_SUITE_BGN(test_suite_base64)
235 FCT_TEST_BGN(test_case_base64_encode_1)
237 unsigned char src_str[1000];
238 unsigned char dst_str[1000];
241 memset(src_str, 0x00, 1000);
242 memset(dst_str, 0x00, 1000);
244 strcpy( (
char *) src_str,
"" );
245 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
248 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
254 FCT_TEST_BGN(test_case_base64_encode_2)
256 unsigned char src_str[1000];
257 unsigned char dst_str[1000];
260 memset(src_str, 0x00, 1000);
261 memset(dst_str, 0x00, 1000);
263 strcpy( (
char *) src_str,
"f" );
264 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
267 fct_chk( strcmp( (
char *) dst_str,
"Zg==" ) == 0 );
273 FCT_TEST_BGN(test_case_base64_encode_3)
275 unsigned char src_str[1000];
276 unsigned char dst_str[1000];
279 memset(src_str, 0x00, 1000);
280 memset(dst_str, 0x00, 1000);
282 strcpy( (
char *) src_str,
"fo" );
283 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
286 fct_chk( strcmp( (
char *) dst_str,
"Zm8=" ) == 0 );
292 FCT_TEST_BGN(test_case_base64_encode_4)
294 unsigned char src_str[1000];
295 unsigned char dst_str[1000];
298 memset(src_str, 0x00, 1000);
299 memset(dst_str, 0x00, 1000);
301 strcpy( (
char *) src_str,
"foo" );
302 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
305 fct_chk( strcmp( (
char *) dst_str,
"Zm9v" ) == 0 );
311 FCT_TEST_BGN(test_case_base64_encode_5)
313 unsigned char src_str[1000];
314 unsigned char dst_str[1000];
317 memset(src_str, 0x00, 1000);
318 memset(dst_str, 0x00, 1000);
320 strcpy( (
char *) src_str,
"foob" );
321 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
324 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYg==" ) == 0 );
330 FCT_TEST_BGN(test_case_base64_encode_6)
332 unsigned char src_str[1000];
333 unsigned char dst_str[1000];
336 memset(src_str, 0x00, 1000);
337 memset(dst_str, 0x00, 1000);
339 strcpy( (
char *) src_str,
"fooba" );
340 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
343 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYmE=" ) == 0 );
349 FCT_TEST_BGN(test_case_base64_encode_7)
351 unsigned char src_str[1000];
352 unsigned char dst_str[1000];
355 memset(src_str, 0x00, 1000);
356 memset(dst_str, 0x00, 1000);
358 strcpy( (
char *) src_str,
"foobar" );
359 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
362 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYmFy" ) == 0 );
368 FCT_TEST_BGN(test_case_base64_decode_1)
370 unsigned char src_str[1000];
371 unsigned char dst_str[1000];
375 memset(src_str, 0x00, 1000);
376 memset(dst_str, 0x00, 1000);
378 strcpy( (
char *) src_str,
"" );
379 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
382 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
388 FCT_TEST_BGN(test_case_base64_decode_2)
390 unsigned char src_str[1000];
391 unsigned char dst_str[1000];
395 memset(src_str, 0x00, 1000);
396 memset(dst_str, 0x00, 1000);
398 strcpy( (
char *) src_str,
"Zg==" );
399 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
402 fct_chk( strcmp( (
char *) dst_str,
"f" ) == 0 );
408 FCT_TEST_BGN(test_case_base64_decode_3)
410 unsigned char src_str[1000];
411 unsigned char dst_str[1000];
415 memset(src_str, 0x00, 1000);
416 memset(dst_str, 0x00, 1000);
418 strcpy( (
char *) src_str,
"Zm8=" );
419 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
422 fct_chk( strcmp( (
char *) dst_str,
"fo" ) == 0 );
428 FCT_TEST_BGN(test_case_base64_decode_4)
430 unsigned char src_str[1000];
431 unsigned char dst_str[1000];
435 memset(src_str, 0x00, 1000);
436 memset(dst_str, 0x00, 1000);
438 strcpy( (
char *) src_str,
"Zm9v" );
439 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
442 fct_chk( strcmp( (
char *) dst_str,
"foo" ) == 0 );
448 FCT_TEST_BGN(test_case_base64_decode_5)
450 unsigned char src_str[1000];
451 unsigned char dst_str[1000];
455 memset(src_str, 0x00, 1000);
456 memset(dst_str, 0x00, 1000);
458 strcpy( (
char *) src_str,
"Zm9vYg==" );
459 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
462 fct_chk( strcmp( (
char *) dst_str,
"foob" ) == 0 );
468 FCT_TEST_BGN(test_case_base64_decode_6)
470 unsigned char src_str[1000];
471 unsigned char dst_str[1000];
475 memset(src_str, 0x00, 1000);
476 memset(dst_str, 0x00, 1000);
478 strcpy( (
char *) src_str,
"Zm9vYmE=" );
479 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
482 fct_chk( strcmp( (
char *) dst_str,
"fooba" ) == 0 );
488 FCT_TEST_BGN(test_case_base64_decode_7)
490 unsigned char src_str[1000];
491 unsigned char dst_str[1000];
495 memset(src_str, 0x00, 1000);
496 memset(dst_str, 0x00, 1000);
498 strcpy( (
char *) src_str,
"Zm9vYmFy" );
499 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
502 fct_chk( strcmp( (
char *) dst_str,
"foobar" ) == 0 );
508 FCT_TEST_BGN(base64_encode_buffer_size_just_right)
510 unsigned char src_str[1000];
511 unsigned char dst_str[1000];
514 memset(src_str, 0x00, 1000);
515 memset(dst_str, 0x00, 1000);
517 strcpy( (
char *) src_str,
"foobar" );
518 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
521 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYmFy" ) == 0 );
527 FCT_TEST_BGN(base64_encode_buffer_size_too_small)
529 unsigned char src_str[1000];
530 unsigned char dst_str[1000];
533 memset(src_str, 0x00, 1000);
534 memset(dst_str, 0x00, 1000);
536 strcpy( (
char *) src_str,
"foobar" );
540 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
546 FCT_TEST_BGN(base64_decode_illegal_character)
548 unsigned char src_str[1000];
549 unsigned char dst_str[1000];
553 memset(src_str, 0x00, 1000);
554 memset(dst_str, 0x00, 1000);
556 strcpy( (
char *) src_str,
"zm#=" );
560 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
566 FCT_TEST_BGN(base64_decode_too_much_equal_signs)
568 unsigned char src_str[1000];
569 unsigned char dst_str[1000];
573 memset(src_str, 0x00, 1000);
574 memset(dst_str, 0x00, 1000);
576 strcpy( (
char *) src_str,
"zm===" );
580 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
586 FCT_TEST_BGN(base64_decode_invalid_char_after_equal_signs)
588 unsigned char src_str[1000];
589 unsigned char dst_str[1000];
593 memset(src_str, 0x00, 1000);
594 memset(dst_str, 0x00, 1000);
596 strcpy( (
char *) src_str,
"zm=masd" );
600 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
605 #ifdef POLARSSL_SELF_TEST
607 FCT_TEST_BGN(base64_selftest)