39 #if defined(POLARSSL_X509_USE_C)
44 #if defined(POLARSSL_PEM_PARSE_C)
48 #if defined(POLARSSL_MEMORY_C)
51 #define polarssl_malloc malloc
52 #define polarssl_free free
63 #if defined(POLARSSL_FS_IO)
66 #include <sys/types.h>
80 if( ( end - *p ) < 1 )
89 serial->
tag = *(*p)++;
126 static int x509_get_attr_type_value(
unsigned char **p,
127 const unsigned char *end,
139 if( ( end - *p ) < 1 )
152 if( ( end - *p ) < 1 )
188 int x509_get_name(
unsigned char **p,
const unsigned char *end,
193 const unsigned char *end2;
206 if( ( ret = x509_get_attr_type_value( p, end, use ) ) != 0 )
214 if( use->
next == NULL )
233 if( cur->
next == NULL )
246 int x509_get_time(
unsigned char **p,
const unsigned char *end,
254 if( ( end - *p ) < 1 )
268 memset( date, 0,
sizeof( date ) );
269 memcpy( date, *p, ( len <
sizeof( date ) - 1 ) ?
270 len :
sizeof( date ) - 1 );
272 if( sscanf( date,
"%2d%2d%2d%2d%2d%2d",
277 time->
year += 100 * ( time->
year < 50 );
292 memset( date, 0,
sizeof( date ) );
293 memcpy( date, *p, ( len <
sizeof( date ) - 1 ) ?
294 len :
sizeof( date ) - 1 );
296 if( sscanf( date,
"%4d%2d%2d%2d%2d%2d",
315 if( ( end - *p ) < 1 )
347 int x509_get_ext(
unsigned char **p,
const unsigned char *end,
377 if( end != *p + len )
384 #if defined(POLARSSL_FS_IO)
388 int x509_load_file(
const char *path,
unsigned char **buf,
size_t *n )
393 if( ( f = fopen( path,
"rb" ) ) == NULL )
396 fseek( f, 0, SEEK_END );
397 if( ( size = ftell( f ) ) == -1 )
402 fseek( f, 0, SEEK_SET );
413 if( fread( *buf, 1, *n, f ) != *n )
428 #if defined _MSC_VER && !defined snprintf
431 #if !defined vsnprintf
432 #define vsnprintf _vsnprintf
442 static int compat_snprintf(
char *str,
size_t size,
const char *format, ...)
447 va_start( ap, format );
449 res = vsnprintf( str, size, format, ap );
455 return( (
int) size + 20 );
460 #define snprintf compat_snprintf
463 #define POLARSSL_ERR_DEBUG_BUF_TOO_SMALL -2
465 #define SAFE_SNPRINTF() \
470 if ( (unsigned int) ret > n ) { \
472 return POLARSSL_ERR_DEBUG_BUF_TOO_SMALL;\
475 n -= (unsigned int) ret; \
476 p += (unsigned int) ret; \
489 const char *short_name = NULL;
492 memset( s, 0,
sizeof( s ) );
498 while( name != NULL )
508 ret = snprintf( p, n,
", " );
515 ret = snprintf( p, n,
"%s=", short_name );
517 ret = snprintf( p, n,
"\?\?=" );
520 for( i = 0; i < name->
val.
len; i++ )
522 if( i >=
sizeof( s ) - 1 )
526 if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )
531 ret = snprintf( p, n,
"%s", s );
536 return( (
int) ( size - n ) );
552 nr = ( serial->
len <= 32 )
555 for( i = 0; i < nr; i++ )
557 if( i == 0 && nr > 1 && serial->
p[i] == 0x0 )
560 ret = snprintf( p, n,
"%02X%s",
561 serial->
p[i], ( i < nr - 1 ) ?
":" :
"" );
565 if( nr != serial->
len )
567 ret = snprintf( p, n,
"...." );
571 return( (
int) ( size - n ) );
583 if( strlen( name ) +
sizeof(
" key size" ) > size )
584 return POLARSSL_ERR_DEBUG_BUF_TOO_SMALL;
586 ret = snprintf( p, n,
"%s key size", name );
597 const char *desc = NULL;
617 #if defined(POLARSSL_HAVE_TIME)
639 lt = localtime( &tt );
641 year = lt->tm_year + 1900;
642 mon = lt->tm_mon + 1;
649 if( year > to->
year )
652 if( year == to->
year &&
656 if( year == to->
year &&
661 if( year == to->
year &&
667 if( year == to->
year &&
674 if( year == to->
year &&
692 #if defined(POLARSSL_SELF_TEST)
702 #if defined(POLARSSL_CERTS_C) && defined(POLARSSL_MD5_C)
709 printf(
" X.509 certificate load: " );
713 ret =
x509_crt_parse( &clicert, (
const unsigned char *) test_cli_crt,
714 strlen( test_cli_crt ) );
718 printf(
"failed\n" );
725 ret =
x509_crt_parse( &cacert, (
const unsigned char *) test_ca_crt,
726 strlen( test_ca_crt ) );
730 printf(
"failed\n" );
736 printf(
"passed\n X.509 signature verify: ");
738 ret =
x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL );
742 printf(
"failed\n" );
744 printf(
"ret = %d, &flags = %04x\n", ret, flags);
750 printf(
"passed\n\n");