Move static x509_name_cmp() in library/x509_crt.c
A subsequent change will need this function earlier within the file.
This commit is contained in:
parent
52acdb5926
commit
0f6903d84c
1 changed files with 130 additions and 130 deletions
|
@ -227,6 +227,136 @@ static int x509_profile_check_key( const mbedtls_x509_crt_profile *profile,
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Like memcmp, but case-insensitive and always returns -1 if different
|
||||||
|
*/
|
||||||
|
static int x509_memcasecmp( const void *s1, const void *s2, size_t len )
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
unsigned char diff;
|
||||||
|
const unsigned char *n1 = s1, *n2 = s2;
|
||||||
|
|
||||||
|
for( i = 0; i < len; i++ )
|
||||||
|
{
|
||||||
|
diff = n1[i] ^ n2[i];
|
||||||
|
|
||||||
|
if( diff == 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( diff == 32 &&
|
||||||
|
( ( n1[i] >= 'a' && n1[i] <= 'z' ) ||
|
||||||
|
( n1[i] >= 'A' && n1[i] <= 'Z' ) ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return 0 if name matches wildcard, -1 otherwise
|
||||||
|
*/
|
||||||
|
static int x509_check_wildcard( const char *cn, const mbedtls_x509_buf *name )
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
size_t cn_idx = 0, cn_len = strlen( cn );
|
||||||
|
|
||||||
|
/* We can't have a match if there is no wildcard to match */
|
||||||
|
if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
for( i = 0; i < cn_len; ++i )
|
||||||
|
{
|
||||||
|
if( cn[i] == '.' )
|
||||||
|
{
|
||||||
|
cn_idx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( cn_idx == 0 )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
if( cn_len - cn_idx == name->len - 1 &&
|
||||||
|
x509_memcasecmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 )
|
||||||
|
{
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare two X.509 strings, case-insensitive, and allowing for some encoding
|
||||||
|
* variations (but not all).
|
||||||
|
*
|
||||||
|
* Return 0 if equal, -1 otherwise.
|
||||||
|
*/
|
||||||
|
static int x509_string_cmp( const mbedtls_x509_buf *a, const mbedtls_x509_buf *b )
|
||||||
|
{
|
||||||
|
if( a->tag == b->tag &&
|
||||||
|
a->len == b->len &&
|
||||||
|
memcmp( a->p, b->p, b->len ) == 0 )
|
||||||
|
{
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&
|
||||||
|
( b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&
|
||||||
|
a->len == b->len &&
|
||||||
|
x509_memcasecmp( a->p, b->p, b->len ) == 0 )
|
||||||
|
{
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compare two X.509 Names (aka rdnSequence).
|
||||||
|
*
|
||||||
|
* See RFC 5280 section 7.1, though we don't implement the whole algorithm:
|
||||||
|
* we sometimes return unequal when the full algorithm would return equal,
|
||||||
|
* but never the other way. (In particular, we don't do Unicode normalisation
|
||||||
|
* or space folding.)
|
||||||
|
*
|
||||||
|
* Return 0 if equal, -1 otherwise.
|
||||||
|
*/
|
||||||
|
static int x509_name_cmp( const mbedtls_x509_name *a, const mbedtls_x509_name *b )
|
||||||
|
{
|
||||||
|
/* Avoid recursion, it might not be optimised by the compiler */
|
||||||
|
while( a != NULL || b != NULL )
|
||||||
|
{
|
||||||
|
if( a == NULL || b == NULL )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
/* type */
|
||||||
|
if( a->oid.tag != b->oid.tag ||
|
||||||
|
a->oid.len != b->oid.len ||
|
||||||
|
memcmp( a->oid.p, b->oid.p, b->oid.len ) != 0 )
|
||||||
|
{
|
||||||
|
return( -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* value */
|
||||||
|
if( x509_string_cmp( &a->val, &b->val ) != 0 )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
/* structure of the list of sets */
|
||||||
|
if( a->next_merged != b->next_merged )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
a = a->next;
|
||||||
|
b = b->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* a == NULL == b */
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset (init or clear) a verify_chain
|
* Reset (init or clear) a verify_chain
|
||||||
*/
|
*/
|
||||||
|
@ -1756,136 +1886,6 @@ static int x509_crt_verifycrl( mbedtls_x509_crt *crt, mbedtls_x509_crt *ca,
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_X509_CRL_PARSE_C */
|
#endif /* MBEDTLS_X509_CRL_PARSE_C */
|
||||||
|
|
||||||
/*
|
|
||||||
* Like memcmp, but case-insensitive and always returns -1 if different
|
|
||||||
*/
|
|
||||||
static int x509_memcasecmp( const void *s1, const void *s2, size_t len )
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
unsigned char diff;
|
|
||||||
const unsigned char *n1 = s1, *n2 = s2;
|
|
||||||
|
|
||||||
for( i = 0; i < len; i++ )
|
|
||||||
{
|
|
||||||
diff = n1[i] ^ n2[i];
|
|
||||||
|
|
||||||
if( diff == 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( diff == 32 &&
|
|
||||||
( ( n1[i] >= 'a' && n1[i] <= 'z' ) ||
|
|
||||||
( n1[i] >= 'A' && n1[i] <= 'Z' ) ) )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return 0 if name matches wildcard, -1 otherwise
|
|
||||||
*/
|
|
||||||
static int x509_check_wildcard( const char *cn, const mbedtls_x509_buf *name )
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
size_t cn_idx = 0, cn_len = strlen( cn );
|
|
||||||
|
|
||||||
/* We can't have a match if there is no wildcard to match */
|
|
||||||
if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
for( i = 0; i < cn_len; ++i )
|
|
||||||
{
|
|
||||||
if( cn[i] == '.' )
|
|
||||||
{
|
|
||||||
cn_idx = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( cn_idx == 0 )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
if( cn_len - cn_idx == name->len - 1 &&
|
|
||||||
x509_memcasecmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 )
|
|
||||||
{
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compare two X.509 strings, case-insensitive, and allowing for some encoding
|
|
||||||
* variations (but not all).
|
|
||||||
*
|
|
||||||
* Return 0 if equal, -1 otherwise.
|
|
||||||
*/
|
|
||||||
static int x509_string_cmp( const mbedtls_x509_buf *a, const mbedtls_x509_buf *b )
|
|
||||||
{
|
|
||||||
if( a->tag == b->tag &&
|
|
||||||
a->len == b->len &&
|
|
||||||
memcmp( a->p, b->p, b->len ) == 0 )
|
|
||||||
{
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( ( a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&
|
|
||||||
( b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&
|
|
||||||
a->len == b->len &&
|
|
||||||
x509_memcasecmp( a->p, b->p, b->len ) == 0 )
|
|
||||||
{
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compare two X.509 Names (aka rdnSequence).
|
|
||||||
*
|
|
||||||
* See RFC 5280 section 7.1, though we don't implement the whole algorithm:
|
|
||||||
* we sometimes return unequal when the full algorithm would return equal,
|
|
||||||
* but never the other way. (In particular, we don't do Unicode normalisation
|
|
||||||
* or space folding.)
|
|
||||||
*
|
|
||||||
* Return 0 if equal, -1 otherwise.
|
|
||||||
*/
|
|
||||||
static int x509_name_cmp( const mbedtls_x509_name *a, const mbedtls_x509_name *b )
|
|
||||||
{
|
|
||||||
/* Avoid recursion, it might not be optimised by the compiler */
|
|
||||||
while( a != NULL || b != NULL )
|
|
||||||
{
|
|
||||||
if( a == NULL || b == NULL )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
/* type */
|
|
||||||
if( a->oid.tag != b->oid.tag ||
|
|
||||||
a->oid.len != b->oid.len ||
|
|
||||||
memcmp( a->oid.p, b->oid.p, b->oid.len ) != 0 )
|
|
||||||
{
|
|
||||||
return( -1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* value */
|
|
||||||
if( x509_string_cmp( &a->val, &b->val ) != 0 )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
/* structure of the list of sets */
|
|
||||||
if( a->next_merged != b->next_merged )
|
|
||||||
return( -1 );
|
|
||||||
|
|
||||||
a = a->next;
|
|
||||||
b = b->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* a == NULL == b */
|
|
||||||
return( 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check the signature of a certificate by its parent
|
* Check the signature of a certificate by its parent
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue