Nicer interface between PK and debug.

Finally get rid of pk_context.type member, too.
diff --git a/include/polarssl/pk.h b/include/polarssl/pk.h
index 4f9fdb1..778efa7 100644
--- a/include/polarssl/pk.h
+++ b/include/polarssl/pk.h
@@ -82,6 +82,29 @@
 } pk_type_t;
 
 /**
+ * \brief           Types for interfacing with the debug module
+ */
+typedef enum
+{
+    POLARSSL_PK_DEBUG_NONE = 0,
+    POLARSSL_PK_DEBUG_MPI,
+    POLARSSL_PK_DEBUG_ECP,
+} pk_debug_type;
+
+/**
+ * \brief           Item to send to the debug module
+ */
+typedef struct
+{
+    pk_debug_type type;
+    char *name;
+    void *value;
+} pk_debug_item;
+
+/** Maximum number of item send for debugging, plus 1 */
+#define POLARSSL_PK_DEBUG_MAX_ITEMS 3
+
+/**
  * \brief           Public key info
  */
 typedef struct
@@ -109,6 +132,9 @@
     /** Free the given context */
     void (*ctx_free_func)( void *ctx );
 
+    /** Interface with the debug module */
+    void (*debug_func)( const void *ctx, pk_debug_item *items );
+
 } pk_info_t;
 
 /**
@@ -117,7 +143,6 @@
 typedef struct
 {
     const pk_info_t *   info;       /**< Public key informations */
-    pk_type_t           type;       /**< Public key type (temporary) */
     void *              data;       /**< Public key data */
 } pk_context;
 
@@ -182,6 +207,16 @@
                const unsigned char *hash, const md_info_t *md_info,
                const unsigned char *sig, size_t sig_len );
 
+/**
+ * \brief           Export debug information
+ *
+ * \param ctx       Context to use
+ * \param items     Place to write debug items
+ *
+ * \return          0 on sucess or POLARSSL_ERR_PK_BAD_INPUT_DATA
+ */
+int pk_debug( const pk_context *ctx, pk_debug_item *items );
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/library/debug.c b/library/debug.c
index 8e3dd03..5522fb6 100644
--- a/library/debug.c
+++ b/library/debug.c
@@ -225,6 +225,39 @@
 #endif /* POLARSSL_BIGNUM_C */
 
 #if defined(POLARSSL_X509_PARSE_C)
+static void debug_print_pk( const ssl_context *ssl, int level,
+                            const char *file, int line,
+                            const char *text, const pk_context *pk )
+{
+    size_t i;
+    pk_debug_item items[POLARSSL_PK_DEBUG_MAX_ITEMS];
+    char name[16];
+
+    memset( items, 0, sizeof( items ) );
+
+    if( pk_debug( pk, items ) != 0 )
+    {
+        debug_print_msg( ssl, level, file, line, "invalid PK context" );
+        return;
+    }
+
+    for( i = 0; i < sizeof( items ); i++ )
+    {
+        if( items[i].type == POLARSSL_PK_DEBUG_NONE )
+            return;
+
+        snprintf( name, sizeof( name ), "%s%s", text, items[i].name );
+        name[sizeof( name ) - 1] = '\0';
+
+        if( items[i].type == POLARSSL_PK_DEBUG_MPI )
+            debug_print_mpi( ssl, level, file, line, name, items[i].value );
+        else if( items[i].type == POLARSSL_PK_DEBUG_ECP )
+            debug_print_ecp( ssl, level, file, line, name, items[i].value );
+        else
+            debug_print_msg( ssl, level, file, line, "should not happen" );
+    }
+}
+
 void debug_print_crt( const ssl_context *ssl, int level,
                       const char *file, int line,
                       const char *text, const x509_cert *crt )
@@ -250,25 +283,7 @@
         str[maxlen] = '\0';
         ssl->f_dbg( ssl->p_dbg, level, str );
 
-#if defined(POLARSSL_RSA_C)
-        if( crt->pk.type == POLARSSL_PK_RSA )
-        {
-            debug_print_mpi( ssl, level, file, line,
-                    "crt->rsa.N", &pk_rsa( crt->pk )->N );
-            debug_print_mpi( ssl, level, file, line,
-                    "crt->rsa.E", &pk_rsa( crt->pk )->E );
-        } else
-#endif /* POLARSSL_RSA_C */
-#if defined(POLARSSL_ECP_C)
-        if( crt->pk.type == POLARSSL_PK_ECKEY ||
-            crt->pk.type == POLARSSL_PK_ECKEY_DH )
-        {
-            debug_print_ecp( ssl, level, file, line,
-                    "crt->eckey.Q", &pk_ec( crt->pk )->Q );
-        } else
-#endif /* POLARSSL_ECP_C */
-            debug_print_msg( ssl, level, file, line,
-                    "crt->pk.type is not valid" );
+        debug_print_pk( ssl, level, file, line, "crt->", &crt->pk );
 
         crt = crt->next;
     }
diff --git a/library/pk.c b/library/pk.c
index ce3b88a..f3c64cb 100644
--- a/library/pk.c
+++ b/library/pk.c
@@ -56,7 +56,6 @@
         return;
 
     ctx->info = NULL;
-    ctx->type = POLARSSL_PK_NONE;
     ctx->data = NULL;
 }
 
@@ -72,7 +71,6 @@
     ctx->data = NULL;
 
     ctx->info = NULL;
-    ctx->type = POLARSSL_PK_NONE;
 }
 
 /*
@@ -107,11 +105,13 @@
 {
     const pk_info_t *info;
 
-    if( ctx->type == type )
-        return( 0 );
+    if( ctx->info != NULL )
+    {
+        if( ctx->info->type == type )
+            return 0;
 
-    if( ctx->type != POLARSSL_PK_NONE )
         return( POLARSSL_ERR_PK_TYPE_MISMATCH );
+    }
 
     if( ( info = pk_info_from_type( type ) ) == NULL )
         return( POLARSSL_ERR_PK_TYPE_MISMATCH );
@@ -119,7 +119,6 @@
     if( ( ctx->data = info->ctx_alloc_func() ) == NULL )
         return( POLARSSL_ERR_PK_MALLOC_FAILED );
 
-    ctx->type = type;
     ctx->info = info;
 
     return( 0 );
@@ -160,3 +159,15 @@
 
     return( ctx->info->get_size( ctx->data ) );
 }
+
+/*
+ * Export debug information
+ */
+int pk_debug( const pk_context *ctx, pk_debug_item *items )
+{
+    if( ctx == NULL || ctx->info == NULL )
+        return( POLARSSL_ERR_PK_TYPE_MISMATCH ); // TODO
+
+    ctx->info->debug_func( ctx->data, items );
+    return( 0 );
+}
diff --git a/library/pk_wrap.c b/library/pk_wrap.c
index 239ff78..284bd1d 100644
--- a/library/pk_wrap.c
+++ b/library/pk_wrap.c
@@ -84,6 +84,19 @@
     polarssl_free( ctx );
 }
 
+static void rsa_debug( const void *ctx, pk_debug_item *items )
+{
+    items->type = POLARSSL_PK_DEBUG_MPI;
+    items->name = "rsa.N";
+    items->value = &( ((rsa_context *) ctx)->N );
+
+    items++;
+
+    items->type = POLARSSL_PK_DEBUG_MPI;
+    items->name = "rsa.E";
+    items->value = &( ((rsa_context *) ctx)->E );
+}
+
 const pk_info_t rsa_info = {
     POLARSSL_PK_RSA,
     "RSA",
@@ -92,6 +105,7 @@
     rsa_verify_wrap,
     rsa_alloc_wrap,
     rsa_free_wrap,
+    rsa_debug,
 };
 #endif /* POLARSSL_RSA_C */
 
@@ -138,6 +152,7 @@
     ecdsa_verify_wrap,
     ecdsa_alloc_wrap,
     ecdsa_free_wrap,
+    NULL,
 };
 #endif /* POLARSSL_ECDSA_C */
 
@@ -200,6 +215,13 @@
     polarssl_free( ctx );
 }
 
+static void eckey_debug( const void *ctx, pk_debug_item *items )
+{
+    items->type = POLARSSL_PK_DEBUG_ECP;
+    items->name = "eckey.Q";
+    items->value = &( ((ecp_keypair *) ctx)->Q );
+}
+
 const pk_info_t eckey_info = {
     POLARSSL_PK_ECKEY,
     "EC",
@@ -208,6 +230,7 @@
     eckey_verify_wrap,
     eckey_alloc_wrap,
     eckey_free_wrap,
+    eckey_debug,
 };
 
 /*
@@ -240,5 +263,6 @@
     eckeydh_verify_wrap,
     eckey_alloc_wrap,       /* Same underlying key structure */
     eckey_free_wrap,        /* Same underlying key structure */
+    NULL,
 };
 #endif /* POLARSSL_ECP_C */
diff --git a/tests/suites/test_suite_x509parse.function b/tests/suites/test_suite_x509parse.function
index cec4d8d..6bda6fa 100644
--- a/tests/suites/test_suite_x509parse.function
+++ b/tests/suites/test_suite_x509parse.function
@@ -226,7 +226,7 @@
     if( res == 0 )
     {
         ecp_keypair *eckey;
-        TEST_ASSERT( ctx.type == POLARSSL_PK_ECKEY );
+        TEST_ASSERT( pk_can_do( &ctx, POLARSSL_PK_ECKEY ) );
         eckey = (ecp_keypair *) ctx.data;
         TEST_ASSERT( ecp_check_pubkey( &eckey->grp, &eckey->Q ) == 0 );
     }
@@ -250,7 +250,7 @@
     if( res == 0 )
     {
         ecp_keypair *eckey;
-        TEST_ASSERT( ctx.type == POLARSSL_PK_ECKEY );
+        TEST_ASSERT( pk_can_do( &ctx, POLARSSL_PK_ECKEY ) );
         eckey = (ecp_keypair *) ctx.data;
         TEST_ASSERT( ecp_check_privkey( &eckey->grp, &eckey->d ) == 0 );
     }