From c6573a27a193ce33971ec2912c02d69305bf954a Mon Sep 17 00:00:00 2001 From: Hanno Becker Date: Sat, 23 Feb 2019 09:13:17 +0000 Subject: [PATCH] Convert X.509 name buffer to linked list via name traversal callback --- library/x509.c | 58 ++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/library/x509.c b/library/x509.c index 8b63572a2..72cadd088 100644 --- a/library/x509.c +++ b/library/x509.c @@ -601,41 +601,47 @@ exit: return( ret ); } +static int x509_get_name_cb( void *ctx, + mbedtls_x509_buf *oid, + mbedtls_x509_buf *val, + int next_merged ) +{ + mbedtls_x509_name **cur_ptr = (mbedtls_x509_name**) ctx; + mbedtls_x509_name *cur = *cur_ptr; + + if( cur->oid.p != NULL ) + { + cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); + if( cur->next == NULL ) + return( MBEDTLS_ERR_ASN1_ALLOC_FAILED ); + + cur = cur->next; + } + + cur->oid = *oid; + cur->val = *val; + cur->next_merged = next_merged; + + *cur_ptr = cur; + return( 0 ); +} int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ) { int ret; - const unsigned char *end_set; - - end_set = *p; - while( 1 ) - { - ret = x509_set_sequence_iterate( p, &end_set, end, - &cur->oid, &cur->val ); - if( ret != 0 ) - return( ret + MBEDTLS_ERR_X509_INVALID_NAME ); - - if( *p != end_set ) - cur->next_merged = 1; - - if( *p == end ) - { - cur->next = NULL; - break; - } - - cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); - if( cur->next == NULL ) - return( MBEDTLS_ERR_X509_ALLOC_FAILED ); - - cur = cur->next; - } + mbedtls_x509_buf_raw name_buf = { *p, end - *p }; + memset( cur, 0, sizeof( mbedtls_x509_name ) ); + ret = mbedtls_x509_name_cmp_raw( &name_buf, &name_buf, + x509_get_name_cb, + &cur ); + if( ret != 0 ) + return( ret ); + *p = (unsigned char*) end; return( 0 ); } - static int x509_parse_int( unsigned char **p, size_t n, int *res ) { *res = 0;