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_BASE64_C
231 FCT_SUITE_BGN(test_suite_base64)
234 FCT_TEST_BGN(test_case_base64_encode_1)
236 unsigned char src_str[1000];
237 unsigned char dst_str[1000];
240 memset(src_str, 0x00, 1000);
241 memset(dst_str, 0x00, 1000);
243 strcpy( (
char *) src_str,
"" );
244 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
247 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
253 FCT_TEST_BGN(test_case_base64_encode_2)
255 unsigned char src_str[1000];
256 unsigned char dst_str[1000];
259 memset(src_str, 0x00, 1000);
260 memset(dst_str, 0x00, 1000);
262 strcpy( (
char *) src_str,
"f" );
263 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
266 fct_chk( strcmp( (
char *) dst_str,
"Zg==" ) == 0 );
272 FCT_TEST_BGN(test_case_base64_encode_3)
274 unsigned char src_str[1000];
275 unsigned char dst_str[1000];
278 memset(src_str, 0x00, 1000);
279 memset(dst_str, 0x00, 1000);
281 strcpy( (
char *) src_str,
"fo" );
282 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
285 fct_chk( strcmp( (
char *) dst_str,
"Zm8=" ) == 0 );
291 FCT_TEST_BGN(test_case_base64_encode_4)
293 unsigned char src_str[1000];
294 unsigned char dst_str[1000];
297 memset(src_str, 0x00, 1000);
298 memset(dst_str, 0x00, 1000);
300 strcpy( (
char *) src_str,
"foo" );
301 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
304 fct_chk( strcmp( (
char *) dst_str,
"Zm9v" ) == 0 );
310 FCT_TEST_BGN(test_case_base64_encode_5)
312 unsigned char src_str[1000];
313 unsigned char dst_str[1000];
316 memset(src_str, 0x00, 1000);
317 memset(dst_str, 0x00, 1000);
319 strcpy( (
char *) src_str,
"foob" );
320 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
323 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYg==" ) == 0 );
329 FCT_TEST_BGN(test_case_base64_encode_6)
331 unsigned char src_str[1000];
332 unsigned char dst_str[1000];
335 memset(src_str, 0x00, 1000);
336 memset(dst_str, 0x00, 1000);
338 strcpy( (
char *) src_str,
"fooba" );
339 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
342 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYmE=" ) == 0 );
348 FCT_TEST_BGN(test_case_base64_encode_7)
350 unsigned char src_str[1000];
351 unsigned char dst_str[1000];
354 memset(src_str, 0x00, 1000);
355 memset(dst_str, 0x00, 1000);
357 strcpy( (
char *) src_str,
"foobar" );
358 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
361 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYmFy" ) == 0 );
367 FCT_TEST_BGN(test_case_base64_decode_1)
369 unsigned char src_str[1000];
370 unsigned char dst_str[1000];
374 memset(src_str, 0x00, 1000);
375 memset(dst_str, 0x00, 1000);
377 strcpy( (
char *) src_str,
"" );
378 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
381 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
387 FCT_TEST_BGN(test_case_base64_decode_2)
389 unsigned char src_str[1000];
390 unsigned char dst_str[1000];
394 memset(src_str, 0x00, 1000);
395 memset(dst_str, 0x00, 1000);
397 strcpy( (
char *) src_str,
"Zg==" );
398 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
401 fct_chk( strcmp( (
char *) dst_str,
"f" ) == 0 );
407 FCT_TEST_BGN(test_case_base64_decode_3)
409 unsigned char src_str[1000];
410 unsigned char dst_str[1000];
414 memset(src_str, 0x00, 1000);
415 memset(dst_str, 0x00, 1000);
417 strcpy( (
char *) src_str,
"Zm8=" );
418 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
421 fct_chk( strcmp( (
char *) dst_str,
"fo" ) == 0 );
427 FCT_TEST_BGN(test_case_base64_decode_4)
429 unsigned char src_str[1000];
430 unsigned char dst_str[1000];
434 memset(src_str, 0x00, 1000);
435 memset(dst_str, 0x00, 1000);
437 strcpy( (
char *) src_str,
"Zm9v" );
438 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
441 fct_chk( strcmp( (
char *) dst_str,
"foo" ) == 0 );
447 FCT_TEST_BGN(test_case_base64_decode_5)
449 unsigned char src_str[1000];
450 unsigned char dst_str[1000];
454 memset(src_str, 0x00, 1000);
455 memset(dst_str, 0x00, 1000);
457 strcpy( (
char *) src_str,
"Zm9vYg==" );
458 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
461 fct_chk( strcmp( (
char *) dst_str,
"foob" ) == 0 );
467 FCT_TEST_BGN(test_case_base64_decode_6)
469 unsigned char src_str[1000];
470 unsigned char dst_str[1000];
474 memset(src_str, 0x00, 1000);
475 memset(dst_str, 0x00, 1000);
477 strcpy( (
char *) src_str,
"Zm9vYmE=" );
478 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
481 fct_chk( strcmp( (
char *) dst_str,
"fooba" ) == 0 );
487 FCT_TEST_BGN(test_case_base64_decode_7)
489 unsigned char src_str[1000];
490 unsigned char dst_str[1000];
494 memset(src_str, 0x00, 1000);
495 memset(dst_str, 0x00, 1000);
497 strcpy( (
char *) src_str,
"Zm9vYmFy" );
498 fct_chk( res =
base64_decode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
501 fct_chk( strcmp( (
char *) dst_str,
"foobar" ) == 0 );
507 FCT_TEST_BGN(base64_encode_buffer_size_just_right)
509 unsigned char src_str[1000];
510 unsigned char dst_str[1000];
513 memset(src_str, 0x00, 1000);
514 memset(dst_str, 0x00, 1000);
516 strcpy( (
char *) src_str,
"foobar" );
517 fct_chk(
base64_encode( dst_str, &len, src_str, strlen( (
char *) src_str ) ) == 0 );
520 fct_chk( strcmp( (
char *) dst_str,
"Zm9vYmFy" ) == 0 );
526 FCT_TEST_BGN(base64_encode_buffer_size_too_small)
528 unsigned char src_str[1000];
529 unsigned char dst_str[1000];
532 memset(src_str, 0x00, 1000);
533 memset(dst_str, 0x00, 1000);
535 strcpy( (
char *) src_str,
"foobar" );
539 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
545 FCT_TEST_BGN(base64_decode_illegal_character)
547 unsigned char src_str[1000];
548 unsigned char dst_str[1000];
552 memset(src_str, 0x00, 1000);
553 memset(dst_str, 0x00, 1000);
555 strcpy( (
char *) src_str,
"zm#=" );
559 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
565 FCT_TEST_BGN(base64_decode_too_much_equal_signs)
567 unsigned char src_str[1000];
568 unsigned char dst_str[1000];
572 memset(src_str, 0x00, 1000);
573 memset(dst_str, 0x00, 1000);
575 strcpy( (
char *) src_str,
"zm===" );
579 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
585 FCT_TEST_BGN(base64_decode_invalid_char_after_equal_signs)
587 unsigned char src_str[1000];
588 unsigned char dst_str[1000];
592 memset(src_str, 0x00, 1000);
593 memset(dst_str, 0x00, 1000);
595 strcpy( (
char *) src_str,
"zm=masd" );
599 fct_chk( strcmp( (
char *) dst_str,
"" ) == 0 );
604 #ifdef POLARSSL_SELF_TEST
606 FCT_TEST_BGN(base64_selftest)