int x509_string_to_names( asn1_named_data **head, const char *name ) { int ret = 0; const char *s = name, *c = s; const char *end = s + strlen( s ); const char *oid = NULL; int in_tag = 1; /* Clear existing chain if present */ asn1_free_named_data_list( head ); while( c <= end ) { if( in_tag && *c == '=' ) { if( ( oid = x509_at_oid_from_name( s, c - s ) ) == NULL ) { ret = POLARSSL_ERR_X509_UNKNOWN_OID; goto exit; } s = c + 1; in_tag = 0; } if( !in_tag && ( *c == ',' || c == end ) ) { if( asn1_store_named_data( head, oid, strlen( oid ), (unsigned char *) s, c - s ) == NULL ) { return( POLARSSL_ERR_X509_MALLOC_FAILED ); } while( c < end && *(c + 1) == ' ' ) c++; s = c + 1; in_tag = 1; } c++; } exit: return( ret ); }
int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name ) { int ret = 0; const char *s = name, *c = s; const char *end = s + strlen( s ); const char *oid = NULL; int in_tag = 1; char data[MBEDTLS_X509_MAX_DN_NAME_SIZE]; char *d = data; /* Clear existing chain if present */ mbedtls_asn1_free_named_data_list( head ); while( c <= end ) { if( in_tag && *c == '=' ) { if( ( oid = x509_at_oid_from_name( s, c - s ) ) == NULL ) { ret = MBEDTLS_ERR_X509_UNKNOWN_OID; goto exit; } s = c + 1; in_tag = 0; d = data; } if( !in_tag && *c == '\\' && c != end ) { c++; /* Check for valid escaped characters */ if( c == end || *c != ',' ) { ret = MBEDTLS_ERR_X509_INVALID_NAME; goto exit; } } else if( !in_tag && ( *c == ',' || c == end ) ) { if( mbedtls_asn1_store_named_data( head, oid, strlen( oid ), (unsigned char *) data, d - data ) == NULL ) { return( MBEDTLS_ERR_X509_ALLOC_FAILED ); } while( c < end && *(c + 1) == ' ' ) c++; s = c + 1; in_tag = 1; } if( !in_tag && s != c + 1 ) { *(d++) = *c; if( d - data == MBEDTLS_X509_MAX_DN_NAME_SIZE ) { ret = MBEDTLS_ERR_X509_INVALID_NAME; goto exit; } } c++; } exit: return( ret ); }