mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-01-30 17:31:03 +00:00
Factor common parent checking code
This commit is contained in:
parent
f93a3c4335
commit
312010e6e9
|
@ -1539,36 +1539,27 @@ static int x509_wildcard_verify( const char *cn, x509_buf *name )
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Iterate upwards in the given cert chain to find our parent.
|
* Check if 'parent' is a suitable parent (signing CA) for 'child'.
|
||||||
*
|
* Return 0 if yes, -1 if not.
|
||||||
* Ignore any upper cert that can't be used to sign other certificates
|
|
||||||
* (basic constraints CA=true for now, keyUsage soon).
|
|
||||||
*/
|
*/
|
||||||
static x509_crt *x509_crt_find_parent( x509_crt *crt )
|
static int x509_crt_check_parent( const x509_crt *child,
|
||||||
|
const x509_crt *parent )
|
||||||
{
|
{
|
||||||
x509_crt *parent;
|
if( parent->version == 0 ||
|
||||||
|
parent->ca_istrue == 0 ||
|
||||||
for( parent = crt->next; parent != NULL; parent = parent->next )
|
child->issuer_raw.len != parent->subject_raw.len ||
|
||||||
|
memcmp( child->issuer_raw.p, parent->subject_raw.p,
|
||||||
|
child->issuer_raw.len ) != 0 )
|
||||||
{
|
{
|
||||||
if( parent->version == 0 ||
|
return( -1 );
|
||||||
parent->ca_istrue == 0 ||
|
|
||||||
crt->issuer_raw.len != parent->subject_raw.len ||
|
|
||||||
memcmp( crt->issuer_raw.p, parent->subject_raw.p,
|
|
||||||
crt->issuer_raw.len ) != 0 )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(POLARSSL_X509_CHECK_KEY_USAGE)
|
|
||||||
if( x509_crt_check_key_usage( parent, KU_KEY_CERT_SIGN ) != 0 )
|
|
||||||
continue;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* If we get there, we found a suitable parent */
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return( parent );
|
#if defined(POLARSSL_X509_CHECK_KEY_USAGE)
|
||||||
|
if( x509_crt_check_key_usage( parent, KU_KEY_CERT_SIGN ) != 0 )
|
||||||
|
return( -1 );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int x509_crt_verify_top(
|
static int x509_crt_verify_top(
|
||||||
|
@ -1606,24 +1597,12 @@ static int x509_crt_verify_top(
|
||||||
|
|
||||||
while( trust_ca != NULL )
|
while( trust_ca != NULL )
|
||||||
{
|
{
|
||||||
if( trust_ca->version == 0 ||
|
if( x509_crt_check_parent( child, trust_ca ) != 0 )
|
||||||
trust_ca->ca_istrue == 0 ||
|
|
||||||
child->issuer_raw.len != trust_ca->subject_raw.len ||
|
|
||||||
memcmp( child->issuer_raw.p, trust_ca->subject_raw.p,
|
|
||||||
child->issuer_raw.len ) != 0 )
|
|
||||||
{
|
{
|
||||||
trust_ca = trust_ca->next;
|
trust_ca = trust_ca->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(POLARSSL_X509_CHECK_KEY_USAGE)
|
|
||||||
if( x509_crt_check_key_usage( trust_ca, KU_KEY_CERT_SIGN ) != 0 )
|
|
||||||
{
|
|
||||||
trust_ca = trust_ca->next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reduce path_len to check against if top of the chain is
|
* Reduce path_len to check against if top of the chain is
|
||||||
* the same as the trusted CA
|
* the same as the trusted CA
|
||||||
|
@ -1742,7 +1721,17 @@ static int x509_crt_verify_child(
|
||||||
*flags |= x509_crt_verifycrl(child, parent, ca_crl);
|
*flags |= x509_crt_verifycrl(child, parent, ca_crl);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( ( grandparent = x509_crt_find_parent( parent) ) != NULL )
|
/* Look for a grandparent upwards the chain */
|
||||||
|
for( grandparent = parent->next;
|
||||||
|
grandparent != NULL;
|
||||||
|
grandparent = grandparent->next )
|
||||||
|
{
|
||||||
|
if( x509_crt_check_parent( parent, grandparent ) == 0 )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is our parent part of the chain or at the top? */
|
||||||
|
if( grandparent != NULL )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Part of the chain
|
* Part of the chain
|
||||||
|
@ -1837,7 +1826,15 @@ int x509_crt_verify( x509_crt *crt,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ( parent = x509_crt_find_parent( crt ) ) != NULL )
|
/* Look for a parent upwards the chain */
|
||||||
|
for( parent = crt->next; parent != NULL; parent = parent->next )
|
||||||
|
{
|
||||||
|
if( x509_crt_check_parent( crt, parent ) == 0 )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Are we part of the chain or at the top? */
|
||||||
|
if( parent != NULL )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Part of the chain
|
* Part of the chain
|
||||||
|
|
Loading…
Reference in a new issue