Split x509_csr_parse_der() out of x509_csr_parse()
diff --git a/library/x509_csr.c b/library/x509_csr.c
index eee6e72..0b4f771 100644
--- a/library/x509_csr.c
+++ b/library/x509_csr.c
@@ -90,18 +90,15 @@
}
/*
- * Parse a CSR
+ * Parse a CSR in DER format
*/
-int x509_csr_parse( x509_csr *csr, const unsigned char *buf, size_t buflen )
+int x509_csr_parse_der( x509_csr *csr,
+ const unsigned char *buf, size_t buflen )
{
int ret;
size_t len;
unsigned char *p, *end;
x509_buf sig_params;
-#if defined(POLARSSL_PEM_PARSE_C)
- size_t use_len;
- pem_context pem;
-#endif
memset( &sig_params, 0, sizeof( x509_buf ) );
@@ -113,41 +110,15 @@
x509_csr_init( csr );
-#if defined(POLARSSL_PEM_PARSE_C)
- pem_init( &pem );
- ret = pem_read_buffer( &pem,
- "-----BEGIN CERTIFICATE REQUEST-----",
- "-----END CERTIFICATE REQUEST-----",
- buf, NULL, 0, &use_len );
+ /*
+ * first copy the raw DER data
+ */
+ p = (unsigned char *) polarssl_malloc( len = buflen );
- if( ret == 0 )
- {
- /*
- * Was PEM encoded, steal PEM buffer
- */
- p = pem.buf;
- pem.buf = NULL;
- len = pem.buflen;
- pem_free( &pem );
- }
- else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
- {
- pem_free( &pem );
- return( ret );
- }
- else
-#endif /* POLARSSL_PEM_PARSE_C */
- {
- /*
- * nope, copy the raw DER data
- */
- p = (unsigned char *) polarssl_malloc( len = buflen );
+ if( p == NULL )
+ return( POLARSSL_ERR_X509_MALLOC_FAILED );
- if( p == NULL )
- return( POLARSSL_ERR_X509_MALLOC_FAILED );
-
- memcpy( p, buf, buflen );
- }
+ memcpy( p, buf, buflen );
csr->raw.p = p;
csr->raw.len = len;
@@ -284,6 +255,51 @@
return( 0 );
}
+/*
+ * Parse a CSR, allowing for PEM or raw DER encoding
+ */
+int x509_csr_parse( x509_csr *csr, const unsigned char *buf, size_t buflen )
+{
+ int ret;
+#if defined(POLARSSL_PEM_PARSE_C)
+ size_t use_len;
+ pem_context pem;
+#endif
+
+ /*
+ * Check for valid input
+ */
+ if( csr == NULL || buf == NULL )
+ return( POLARSSL_ERR_X509_BAD_INPUT_DATA );
+
+#if defined(POLARSSL_PEM_PARSE_C)
+ pem_init( &pem );
+ ret = pem_read_buffer( &pem,
+ "-----BEGIN CERTIFICATE REQUEST-----",
+ "-----END CERTIFICATE REQUEST-----",
+ buf, NULL, 0, &use_len );
+
+ if( ret == 0 )
+ {
+ /*
+ * Was PEM encoded, parse the result
+ */
+ if( ( ret = x509_csr_parse_der( csr, pem.buf, pem.buflen ) ) != 0 )
+ return( ret );
+
+ pem_free( &pem );
+ return( 0 );
+ }
+ else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
+ {
+ pem_free( &pem );
+ return( ret );
+ }
+ else
+#endif /* POLARSSL_PEM_PARSE_C */
+ return( x509_csr_parse_der( csr, buf, buflen ) );
+}
+
#if defined(POLARSSL_FS_IO)
/*
* Load a CSR into the structure