Remove dependency on sscanf in lib x509

This commit is contained in:
Rich Evans 2015-02-13 11:48:02 +00:00
parent c8ada6d410
commit 7d5a55a365

View File

@ -73,6 +73,8 @@
#endif #endif
#endif #endif
#define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); }
/* /*
* CertificateSerialNumber ::= INTEGER * CertificateSerialNumber ::= INTEGER
*/ */
@ -474,6 +476,16 @@ int x509_get_name( unsigned char **p, const unsigned char *end,
} }
} }
static int x509_parse_int(unsigned char **p, unsigned n, int *res){
*res = 0;
for( ; n > 0; --n ){
if( ( **p < '0') || ( **p > '9' ) ) return POLARSSL_ERR_X509_INVALID_DATE;
*res *= 10;
*res += (*(*p)++ - '0');
}
return 0;
}
/* /*
* Time ::= CHOICE { * Time ::= CHOICE {
* utcTime UTCTime, * utcTime UTCTime,
@ -484,7 +496,6 @@ int x509_get_time( unsigned char **p, const unsigned char *end,
{ {
int ret; int ret;
size_t len; size_t len;
char date[64];
unsigned char tag; unsigned char tag;
if( ( end - *p ) < 1 ) if( ( end - *p ) < 1 )
@ -501,20 +512,19 @@ int x509_get_time( unsigned char **p, const unsigned char *end,
if( ret != 0 ) if( ret != 0 )
return( POLARSSL_ERR_X509_INVALID_DATE + ret ); return( POLARSSL_ERR_X509_INVALID_DATE + ret );
memset( date, 0, sizeof( date ) ); CHECK( x509_parse_int( p, 2, &time->year ) );
memcpy( date, *p, ( len < sizeof( date ) - 1 ) ? CHECK( x509_parse_int( p, 2, &time->mon ) );
len : sizeof( date ) - 1 ); CHECK( x509_parse_int( p, 2, &time->day ) );
CHECK( x509_parse_int( p, 2, &time->hour ) );
if( sscanf( date, "%2d%2d%2d%2d%2d%2dZ", CHECK( x509_parse_int( p, 2, &time->min ) );
&time->year, &time->mon, &time->day, if( len > 10 )
&time->hour, &time->min, &time->sec ) < 5 ) CHECK( x509_parse_int( p, 2, &time->sec ) );
if( len > 12 && *(*p)++ != 'Z' )
return( POLARSSL_ERR_X509_INVALID_DATE ); return( POLARSSL_ERR_X509_INVALID_DATE );
time->year += 100 * ( time->year < 50 ); time->year += 100 * ( time->year < 50 );
time->year += 1900; time->year += 1900;
*p += len;
return( 0 ); return( 0 );
} }
else if( tag == ASN1_GENERALIZED_TIME ) else if( tag == ASN1_GENERALIZED_TIME )
@ -525,17 +535,16 @@ int x509_get_time( unsigned char **p, const unsigned char *end,
if( ret != 0 ) if( ret != 0 )
return( POLARSSL_ERR_X509_INVALID_DATE + ret ); return( POLARSSL_ERR_X509_INVALID_DATE + ret );
memset( date, 0, sizeof( date ) ); CHECK( x509_parse_int( p, 4, &time->year ) );
memcpy( date, *p, ( len < sizeof( date ) - 1 ) ? CHECK( x509_parse_int( p, 2, &time->mon ) );
len : sizeof( date ) - 1 ); CHECK( x509_parse_int( p, 2, &time->day ) );
CHECK( x509_parse_int( p, 2, &time->hour ) );
if( sscanf( date, "%4d%2d%2d%2d%2d%2dZ", CHECK( x509_parse_int( p, 2, &time->min ) );
&time->year, &time->mon, &time->day, if( len > 12 )
&time->hour, &time->min, &time->sec ) < 5 ) CHECK( x509_parse_int( p, 2, &time->sec ) );
if( len > 14 && *(*p)++ != 'Z' )
return( POLARSSL_ERR_X509_INVALID_DATE ); return( POLARSSL_ERR_X509_INVALID_DATE );
*p += len;
return( 0 ); return( 0 );
} }
else else