Add cb to build dynamic linked list representation of SubjectAltName
This commit adds a callback for use with `x509_subject_alt_name_traverse()`
which builds the legacy dynamically allocated linked list presentation
of the `SubjectAlternativeNames` extension while traversing the raw data.
diff --git a/library/x509_crt.c b/library/x509_crt.c
index 8541d11..5d43a44 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -517,6 +517,38 @@
*
* NOTE: we only parse and use dNSName at this point.
*/
+static int x509_get_subject_alt_name_cb( void *ctx,
+ int tag,
+ unsigned char *data,
+ size_t data_len )
+{
+ mbedtls_asn1_sequence **cur_ptr = (mbedtls_asn1_sequence **) ctx;
+ mbedtls_asn1_sequence *cur = *cur_ptr;
+
+ /* Skip everything but DNS name */
+ if( tag != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2 ) )
+ return( 0 );
+
+ /* Allocate and assign next pointer */
+ if( cur->buf.p != NULL )
+ {
+ cur->next = mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) );
+ if( cur->next == NULL )
+ {
+ return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +
+ MBEDTLS_ERR_ASN1_ALLOC_FAILED );
+ }
+ cur = cur->next;
+ }
+
+ cur->buf.tag = tag;
+ cur->buf.p = data;
+ cur->buf.len = data_len;
+
+ *cur_ptr = cur;
+ return( 0 );
+}
+
static int x509_subject_alt_name_traverse( unsigned char *p,
const unsigned char *end,
int (*cb)( void *ctx,