Convert X.509 name buffer to linked list via name traversal callback

This commit is contained in:
Hanno Becker 2019-02-23 09:13:17 +00:00
parent 6b37812a45
commit c6573a27a1

View file

@ -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;