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,