Prepare transition from x509_cert.rsa to pk
diff --git a/include/polarssl/x509.h b/include/polarssl/x509.h
index 61c7846..24e3453 100644
--- a/include/polarssl/x509.h
+++ b/include/polarssl/x509.h
@@ -211,7 +211,8 @@
     x509_time valid_from;       /**< Start time of certificate validity. */
     x509_time valid_to;         /**< End time of certificate validity. */
 
-    rsa_context rsa;            /**< Container for the RSA context. Only RSA is supported for public keys at this time. */
+    pk_context pk;              /**< Container for the public key context. */
+    rsa_context rsa;            /**< Container for the RSA context. Kept for compatibility while transitioning to generic PK */
 
     x509_buf issuer_id;         /**< Optional X.509 v2/v3 issuer unique identifier. */
     x509_buf subject_id;        /**< Optional X.509 v2/v3 subject unique identifier. */
diff --git a/library/x509parse.c b/library/x509parse.c
index a2a8660..7c69aa2 100644
--- a/library/x509parse.c
+++ b/library/x509parse.c
@@ -637,21 +637,6 @@
     return( ret );
 }
 
-/*
- * Get an RSA public key (compatibility wrapper)
- */
-static int x509_get_pubkey_rsa( unsigned char **p,
-                                const unsigned char *end,
-                                rsa_context *rsa )
-{
-    pk_context pk_ctx;
-
-    pk_init( &pk_ctx );
-    pk_wrap_rsa( &pk_ctx, rsa );
-
-    return( x509_get_pubkey( p, end, &pk_ctx ) );
-}
-
 static int x509_get_sig( unsigned char **p,
                          const unsigned char *end,
                          x509_buf *sig )
@@ -1416,13 +1401,24 @@
     /*
      * SubjectPublicKeyInfo
      */
-    if( ( ret = x509_get_pubkey_rsa( &p, end, &crt->rsa ) ) != 0 )
+    if( ( ret = x509_get_pubkey( &p, end, &crt->pk ) ) != 0 )
     {
         x509_free( crt );
         return( ret );
     }
 
     /*
+     * Temporary hack for compatibility while transitioning to PK abstraction
+     * (Cannot use rsa_wrap above since it would force RSA key type.)
+     */
+    if( crt->pk.type == POLARSSL_PK_RSA ) {
+        memcpy( &crt->rsa, pk_rsa( crt->pk ), sizeof( rsa_context ) );
+        free( crt->pk.data );
+        crt->pk.data = &crt->rsa;
+        crt->pk.dont_free = 1;
+    }
+
+    /*
      *  issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
      *                       -- If present, version shall be v2 or v3
      *  subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
@@ -3969,6 +3965,7 @@
 
     do
     {
+        pk_free( &cert_cur->pk );
         rsa_free( &cert_cur->rsa );
 
         name_cur = cert_cur->issuer.next;