Add name and get_size() members in PK
diff --git a/include/polarssl/pk.h b/include/polarssl/pk.h
index a2d166f..43b9f09 100644
--- a/include/polarssl/pk.h
+++ b/include/polarssl/pk.h
@@ -89,6 +89,12 @@
/** 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 9a89796..f898591 100644
--- a/library/pk_wrap.c
+++ b/library/pk_wrap.c
@@ -45,6 +45,11 @@
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 @@
const pk_info_t rsa_info = {
POLARSSL_PK_RSA,
+ "RSA",
+ rsa_get_size,
rsa_can_do,
rsa_verify_wrap,
};
@@ -68,6 +75,11 @@
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 @@
const pk_info_t ecdsa_info = {
POLARSSL_PK_ECDSA,
+ "ECDSA",
+ ecdsa_get_size,
ecdsa_can_do,
ecdsa_verify_wrap,
};
@@ -94,6 +108,11 @@
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 @@
const pk_info_t eckey_info = {
POLARSSL_PK_ECKEY,
+ "EC",
+ eckey_get_size,
eckey_can_do,
eckey_verify_wrap,
};
@@ -151,6 +172,8 @@
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 31b1fa0..8248373 100644
--- a/library/x509parse.c
+++ b/library/x509parse.c
@@ -3022,8 +3022,28 @@
}
/*
+ * 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 @@
size_t n;
char *p;
const char *desc = NULL;
+ char key_size_str[BEFORE_COLON];
p = buf;
n = size;
@@ -3079,20 +3100,14 @@
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 ) );