From 27d661657bdc704476aa6d6fbaad852626c2708b Mon Sep 17 00:00:00 2001
From: Paul Bakker
Date: Wed, 17 Mar 2010 06:56:01 +0000
Subject: [PATCH] - Added x509_get_sig_alg() to allow easy future X509
signature algorithm determination expansion
---
ChangeLog | 6 ++++-
include/polarssl/x509.h | 2 ++
library/x509parse.c | 57 ++++++++++++++++++++++-------------------
3 files changed, 38 insertions(+), 27 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 3a63c4420..15c51af24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,15 @@
PolarSSL ChangeLog
= Version 0.12.2 released on XXXXXXXX
-Changes
+Features
* Added option parsing for host and port selection to
ssl_client2
* Added support for GeneralizedTime in X509 parsing
+
+Changes
* Added const correctness for main code base
+ * X509 signature algorithm determination is now
+ in a function to allow easy future expansion
Bug fixes
* Fixed bug resulting in failure to send the last
diff --git a/include/polarssl/x509.h b/include/polarssl/x509.h
index 06b979fff..9e1d5d6ac 100644
--- a/include/polarssl/x509.h
+++ b/include/polarssl/x509.h
@@ -180,6 +180,7 @@ typedef struct _x509_cert
x509_buf sig_oid2;
x509_buf sig;
+ int sig_alg;
struct _x509_cert *next;
}
@@ -220,6 +221,7 @@ typedef struct _x509_crl
x509_buf sig_oid2;
x509_buf sig;
+ int sig_alg;
struct _x509_crl *next;
}
diff --git a/library/x509parse.c b/library/x509parse.c
index 68d4b7030..3013e9b55 100644
--- a/library/x509parse.c
+++ b/library/x509parse.c
@@ -790,6 +790,29 @@ static int x509_get_entries( unsigned char **p,
return( 0 );
}
+static int x509_get_sig_alg( const x509_buf *sig_oid, int *sig_alg )
+{
+ if( sig_oid->len == 9 &&
+ memcmp( sig_oid->p, OID_PKCS1, 8 ) == 0 )
+ {
+ if( sig_oid->p[8] >= 2 && sig_oid->p[8] <= 5 )
+ {
+ *sig_alg = sig_oid->p[8];
+ return( 0 );
+ }
+
+ if ( sig_oid->p[8] >= 11 && sig_oid->p[8] <= 14 )
+ {
+ *sig_alg = sig_oid->p[8];
+ return( 0 );
+ }
+
+ return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
+ }
+
+ return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
+}
+
/*
* Parse one or more certificates and add them to the chained list
*/
@@ -957,19 +980,10 @@ int x509parse_crt( x509_cert *chain, const unsigned char *buf, int buflen )
return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION );
}
- if( crt->sig_oid1.len != 9 ||
- memcmp( crt->sig_oid1.p, OID_PKCS1, 8 ) != 0 )
+ if( ( ret = x509_get_sig_alg( &crt->sig_oid1, &crt->sig_alg ) ) != 0 )
{
x509_free( crt );
- return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
- }
-
- if( crt->sig_oid1.p[8] < 2 ||
- ( crt->sig_oid1.p[8] > 5 && crt->sig_oid1.p[8] < 11 ) ||
- crt->sig_oid1.p[8] > 14 )
- {
- x509_free( crt );
- return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
+ return( ret );
}
/*
@@ -1313,16 +1327,7 @@ int x509parse_crl( x509_crl *chain, const unsigned char *buf, int buflen )
return( POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION );
}
- if( crl->sig_oid1.len != 9 ||
- memcmp( crl->sig_oid1.p, OID_PKCS1, 8 ) != 0 )
- {
- x509_crl_free( crl );
- return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
- }
-
- if( crl->sig_oid1.p[8] < 2 ||
- ( crl->sig_oid1.p[8] > 5 && crl->sig_oid1.p[8] < 11 ) ||
- crl->sig_oid1.p[8] > 14 )
+ if( ( ret = x509_get_sig_alg( &crl->sig_oid1, &crl->sig_alg ) ) != 0 )
{
x509_crl_free( crl );
return( POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG );
@@ -2011,7 +2016,7 @@ int x509parse_cert_info( char *buf, size_t size, const char *prefix,
ret = snprintf( p, n, "\n%ssigned using : RSA+", prefix );
SAFE_SNPRINTF();
- switch( crt->sig_oid1.p[8] )
+ switch( crt->sig_alg )
{
case SIG_RSA_MD2 : ret = snprintf( p, n, "MD2" ); break;
case SIG_RSA_MD4 : ret = snprintf( p, n, "MD4" ); break;
@@ -2102,7 +2107,7 @@ int x509parse_crl_info( char *buf, size_t size, const char *prefix,
ret = snprintf( p, n, "\n%ssigned using : RSA+", prefix );
SAFE_SNPRINTF();
- switch( crl->sig_oid1.p[8] )
+ switch( crl->sig_alg )
{
case SIG_RSA_MD2 : ret = snprintf( p, n, "MD2" ); break;
case SIG_RSA_MD4 : ret = snprintf( p, n, "MD4" ); break;
@@ -2265,7 +2270,7 @@ int x509parse_verify( x509_cert *crt,
continue;
}
- hash_id = crt->sig_oid1.p[8];
+ hash_id = crt->sig_alg;
x509_hash( crt->tbs.p, crt->tbs.len, hash_id, hash );
@@ -2296,7 +2301,7 @@ int x509parse_verify( x509_cert *crt,
trust_ca->max_pathlen < pathlen )
break;
- hash_id = crt->sig_oid1.p[8];
+ hash_id = crt->sig_alg;
x509_hash( crt->tbs.p, crt->tbs.len, hash_id, hash );
@@ -2336,7 +2341,7 @@ int x509parse_verify( x509_cert *crt,
/*
* Check if CRL is correctry signed by the trusted CA
*/
- hash_id = ca_crl->sig_oid1.p[8];
+ hash_id = ca_crl->sig_alg;
x509_hash( ca_crl->tbs.p, ca_crl->tbs.len, hash_id, hash );