diff --git a/include/polarssl/pk.h b/include/polarssl/pk.h index a2d166f33..43b9f0933 100644 --- a/include/polarssl/pk.h +++ b/include/polarssl/pk.h @@ -89,6 +89,12 @@ typedef struct /** Public key type */ pk_type_t type; + /** Type name */ + const char *name; + + /** Get key size in bits */ + size_t (*get_size)( void * ); + /** Tell if the context implements this type (eg ECKEY can do ECDSA) */ int (*can_do)( pk_type_t type ); diff --git a/library/pk_wrap.c b/library/pk_wrap.c index 9a8979604..f8985912c 100644 --- a/library/pk_wrap.c +++ b/library/pk_wrap.c @@ -45,6 +45,11 @@ static int rsa_can_do( pk_type_t type ) return( type == POLARSSL_PK_RSA ); } +static size_t rsa_get_size( void * ctx ) +{ + return( mpi_size( &((rsa_context *) ctx)->N ) * 8 ); +} + static int rsa_verify_wrap( void *ctx, const unsigned char *hash, const md_info_t *md_info, const unsigned char *sig, size_t sig_len ) @@ -57,6 +62,8 @@ static int rsa_verify_wrap( void *ctx, const pk_info_t rsa_info = { POLARSSL_PK_RSA, + "RSA", + rsa_get_size, rsa_can_do, rsa_verify_wrap, }; @@ -68,6 +75,11 @@ int ecdsa_can_do( pk_type_t type ) return( type == POLARSSL_PK_ECDSA ); } +static size_t ecdsa_get_size( void *ctx ) +{ + return( ((ecdsa_context *) ctx)->grp.pbits ); +} + int ecdsa_verify_wrap( void *ctx, const unsigned char *hash, const md_info_t *md_info, const unsigned char *sig, size_t sig_len ) @@ -78,6 +90,8 @@ int ecdsa_verify_wrap( void *ctx, const pk_info_t ecdsa_info = { POLARSSL_PK_ECDSA, + "ECDSA", + ecdsa_get_size, ecdsa_can_do, ecdsa_verify_wrap, }; @@ -94,6 +108,11 @@ static int eckey_can_do( pk_type_t type ) type == POLARSSL_PK_ECDSA ); } +static size_t eckey_get_size( void *ctx ) +{ + return( ((ecp_keypair *) ctx)->grp.pbits ); +} + static int eckey_verify_wrap( void *ctx, const unsigned char *hash, const md_info_t *md_info, const unsigned char *sig, size_t sig_len ) @@ -123,6 +142,8 @@ static int eckey_verify_wrap( void *ctx, const pk_info_t eckey_info = { POLARSSL_PK_ECKEY, + "EC", + eckey_get_size, eckey_can_do, eckey_verify_wrap, }; @@ -151,6 +172,8 @@ static int eckeydh_verify_wrap( void *ctx, const pk_info_t eckeydh_info = { POLARSSL_PK_ECKEY_DH, + "EC_DH", + eckey_get_size, /* Same underlying key structure */ eckeydh_can_do, eckeydh_verify_wrap, }; diff --git a/library/x509parse.c b/library/x509parse.c index 31b1fa063..824837378 100644 --- a/library/x509parse.c +++ b/library/x509parse.c @@ -3021,9 +3021,29 @@ int x509parse_serial_gets( char *buf, size_t size, const x509_buf *serial ) return( (int) ( size - n ) ); } +/* + * Helper for writing "RSA key size", "EC key size", etc + */ +static int x509_key_size_helper( char *buf, size_t size, const char *name ) +{ + char *p = buf; + size_t n = size; + int ret; + + if( strlen( name ) + sizeof( " key size" ) > size ) + return POLARSSL_ERR_DEBUG_BUF_TOO_SMALL; + + ret = snprintf( p, n, "%s key size", name ); + SAFE_SNPRINTF(); + + return( 0 ); +} + /* * Return an informational string about the certificate. */ +#define BEFORE_COLON 14 +#define BC "14" int x509parse_cert_info( char *buf, size_t size, const char *prefix, const x509_cert *crt ) { @@ -3031,6 +3051,7 @@ int x509parse_cert_info( char *buf, size_t size, const char *prefix, size_t n; char *p; const char *desc = NULL; + char key_size_str[BEFORE_COLON]; p = buf; n = size; @@ -3079,20 +3100,14 @@ int x509parse_cert_info( char *buf, size_t size, const char *prefix, ret = snprintf( p, n, desc ); SAFE_SNPRINTF(); -#if defined(POLARSSL_RSA_C) - if( crt->pk.type == POLARSSL_PK_RSA ) - ret = snprintf( p, n, "\n%sRSA key size : %d bits\n", prefix, - (int) pk_rsa( crt->pk )->N.n * (int) sizeof( t_uint ) * 8 ); - else -#endif /* POLARSSL_RSA_C */ -#if defined(POLARSSL_ECP_C) - if( crt->pk.type == POLARSSL_PK_ECKEY || - crt->pk.type == POLARSSL_PK_ECKEY_DH ) - ret = snprintf( p, n, "\n%sEC key size : %d bits\n", prefix, - (int) pk_ec( crt->pk )->grp.pbits ); - else -#endif /* POLARSSL_ECP_C */ - ret = snprintf(p, n, "\n%sPK type looks wrong!", prefix); + if( ( ret = x509_key_size_helper( key_size_str, BEFORE_COLON, + crt->pk.info->name ) ) != 0 ) + { + return( ret ); + } + + ret = snprintf( p, n, "\n%s%-" BC "s: %d bits\n", prefix, key_size_str, + (int) crt->pk.info->get_size( crt->pk.data ) ); SAFE_SNPRINTF(); return( (int) ( size - n ) );