36 #if !defined(POLARSSL_CONFIG_FILE)
39 #include POLARSSL_CONFIG_FILE
42 #if defined(POLARSSL_X509_USE_C)
47 #if defined(POLARSSL_PEM_PARSE_C)
51 #if defined(POLARSSL_PLATFORM_C)
54 #define polarssl_printf printf
55 #define polarssl_malloc malloc
56 #define polarssl_free free
61 #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
67 #if defined(EFIX64) || defined(EFI32)
71 #if defined(POLARSSL_FS_IO)
74 #include <sys/types.h>
88 if( ( end - *p ) < 1 )
97 serial->
tag = *(*p)++;
128 int x509_get_alg(
unsigned char **p,
const unsigned char *end,
133 if( ( ret =
asn1_get_alg( p, end, alg, params ) ) != 0 )
139 #if defined(POLARSSL_X509_RSASSA_PSS_SUPPORT)
153 const unsigned char *end;
162 p = (
unsigned char *) alg->
p;
214 const unsigned char *end, *end2;
228 p = (
unsigned char *) params->
p;
229 end = p + params->
len;
268 if( ( ret =
x509_get_alg( &p, end2, &alg_id, &alg_params ) ) != 0 )
277 if( ( ret = x509_get_hash_alg( &alg_params, mgf_md ) ) != 0 )
321 if( ( ret =
asn1_get_int( &p, end2, &trailer_field ) ) != 0 )
328 if( trailer_field != 1 )
351 static int x509_get_attr_type_value(
unsigned char **p,
352 const unsigned char *end,
364 if( ( end - *p ) < 1 )
377 if( ( end - *p ) < 1 )
417 int x509_get_name(
unsigned char **p,
const unsigned char *end,
422 const unsigned char *end_set;
431 end_set = *p + set_len;
433 if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 )
447 if( cur->
next == NULL )
460 int x509_get_time(
unsigned char **p,
const unsigned char *end,
468 if( ( end - *p ) < 1 )
482 memset( date, 0,
sizeof( date ) );
483 memcpy( date, *p, ( len <
sizeof( date ) - 1 ) ?
484 len :
sizeof( date ) - 1 );
486 if( sscanf( date,
"%2d%2d%2d%2d%2d%2dZ",
491 time->
year += 100 * ( time->
year < 50 );
506 memset( date, 0,
sizeof( date ) );
507 memcpy( date, *p, ( len <
sizeof( date ) - 1 ) ?
508 len :
sizeof( date ) - 1 );
510 if( sscanf( date,
"%4d%2d%2d%2d%2d%2dZ",
529 if( ( end - *p ) < 1 )
555 if( *sig_opts != NULL )
561 #if defined(POLARSSL_X509_RSASSA_PSS_SUPPORT)
567 if( pss_opts == NULL )
580 *sig_opts = (
void *) pss_opts;
587 sig_params->
len != 0 )
598 int x509_get_ext(
unsigned char **p,
const unsigned char *end,
628 if( end != *p + len )
635 #if defined(POLARSSL_FS_IO)
639 int x509_load_file(
const char *path,
unsigned char **buf,
size_t *n )
644 if( ( f = fopen( path,
"rb" ) ) == NULL )
647 fseek( f, 0, SEEK_END );
648 if( ( size = ftell( f ) ) == -1 )
653 fseek( f, 0, SEEK_SET );
664 if( fread( *buf, 1, *n, f ) != *n )
679 #if defined(_MSC_VER) && !defined snprintf && !defined(EFIX64) && \
683 #if !defined vsnprintf
684 #define vsnprintf _vsnprintf
694 static int compat_snprintf(
char *str,
size_t size,
const char *format, ... )
699 va_start( ap, format );
701 res = vsnprintf( str, size, format, ap );
707 return( (
int) size + 20 );
712 #define snprintf compat_snprintf
715 #define POLARSSL_ERR_DEBUG_BUF_TOO_SMALL -2
717 #define SAFE_SNPRINTF() \
722 if( (unsigned int) ret > n ) { \
724 return( POLARSSL_ERR_DEBUG_BUF_TOO_SMALL ); \
727 n -= (unsigned int) ret; \
728 p += (unsigned int) ret; \
741 const char *short_name = NULL;
744 memset( s, 0,
sizeof( s ) );
750 while( name != NULL )
760 ret = snprintf( p, n,
", " );
767 ret = snprintf( p, n,
"%s=", short_name );
769 ret = snprintf( p, n,
"\?\?=" );
772 for( i = 0; i < name->
val.
len; i++ )
774 if( i >=
sizeof( s ) - 1 )
778 if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )
783 ret = snprintf( p, n,
"%s", s );
788 return( (
int) ( size - n ) );
804 nr = ( serial->
len <= 32 )
807 for( i = 0; i < nr; i++ )
809 if( i == 0 && nr > 1 && serial->
p[i] == 0x0 )
812 ret = snprintf( p, n,
"%02X%s",
813 serial->
p[i], ( i < nr - 1 ) ?
":" :
"" );
817 if( nr != serial->
len )
819 ret = snprintf( p, n,
"...." );
823 return( (
int) ( size - n ) );
831 const void *sig_opts )
836 const char *desc = NULL;
840 ret = snprintf( p, n,
"???" );
842 ret = snprintf( p, n,
"%s", desc );
845 #if defined(POLARSSL_X509_RSASSA_PSS_SUPPORT)
856 ret = snprintf( p, n,
" (%s, MGF1-%s, 0x%02X)",
857 md_info ? md_info->
name :
"???",
858 mgf_md_info ? mgf_md_info->
name :
"???",
868 return( (
int)( size - n ) );
880 if( strlen( name ) +
sizeof(
" key size" ) > size )
881 return( POLARSSL_ERR_DEBUG_BUF_TOO_SMALL );
883 ret = snprintf( p, n,
"%s key size", name );
894 const char *desc = NULL;
914 #if defined(POLARSSL_HAVE_TIME)
916 static void x509_get_current_time(
x509_time *now )
918 #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)
921 GetSystemTime( &st );
923 now->
year = st.wYear;
924 now->
mon = st.wMonth;
926 now->
hour = st.wHour;
927 now->
min = st.wMinute;
928 now->
sec = st.wSecond;
934 gmtime_r( &tt, < );
936 now->
year = lt.tm_year + 1900;
937 now->
mon = lt.tm_mon + 1;
938 now->
day = lt.tm_mday;
939 now->
hour = lt.tm_hour;
940 now->
min = lt.tm_min;
941 now->
sec = lt.tm_sec;
954 before->
mon > after->
mon )
958 before->
mon == after->
mon &&
959 before->
day > after->
day )
963 before->
mon == after->
mon &&
964 before->
day == after->
day &&
969 before->
mon == after->
mon &&
970 before->
day == after->
day &&
972 before->
min > after->
min )
976 before->
mon == after->
mon &&
977 before->
day == after->
day &&
979 before->
min == after->
min &&
980 before->
sec > after->
sec )
990 x509_get_current_time( &now );
992 return( x509_check_time( &now, to ) );
999 x509_get_current_time( &now );
1001 return( x509_check_time( from, &now ) );
1019 #if defined(POLARSSL_SELF_TEST)
1029 #if defined(POLARSSL_CERTS_C) && defined(POLARSSL_SHA1_C)
1040 ret =
x509_crt_parse( &clicert, (
const unsigned char *) test_cli_crt,
1041 strlen( test_cli_crt ) );
1052 ret =
x509_crt_parse( &cacert, (
const unsigned char *) test_ca_crt,
1053 strlen( test_ca_crt ) );
1065 ret =
x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL );