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 ) );