mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-05-11 22:22:10 +00:00
Make use of CA callback if present when verifying peer CRT chain
This commit is contained in:
parent
5adaad9846
commit
afd0b0a1a7
|
@ -6035,35 +6035,60 @@ static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
|
const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
|
||||||
ssl->transform_negotiate->ciphersuite_info;
|
ssl->transform_negotiate->ciphersuite_info;
|
||||||
mbedtls_x509_crt *ca_chain;
|
int have_ca_chain = 0;
|
||||||
mbedtls_x509_crl *ca_crl;
|
|
||||||
|
|
||||||
if( authmode == MBEDTLS_SSL_VERIFY_NONE )
|
if( authmode == MBEDTLS_SSL_VERIFY_NONE )
|
||||||
return( 0 );
|
return( 0 );
|
||||||
|
|
||||||
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
|
||||||
if( ssl->handshake->sni_ca_chain != NULL )
|
|
||||||
{
|
|
||||||
ca_chain = ssl->handshake->sni_ca_chain;
|
|
||||||
ca_crl = ssl->handshake->sni_ca_crl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
ca_chain = ssl->conf->ca_chain;
|
|
||||||
ca_crl = ssl->conf->ca_crl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main check: verify certificate
|
* Main check: verify certificate
|
||||||
*/
|
*/
|
||||||
ret = mbedtls_x509_crt_verify_restartable(
|
#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
|
||||||
chain,
|
if( ssl->conf->f_ca_cb != NULL )
|
||||||
ca_chain, ca_crl,
|
{
|
||||||
ssl->conf->cert_profile,
|
((void) rs_ctx);
|
||||||
ssl->hostname,
|
have_ca_chain = 1;
|
||||||
&ssl->session_negotiate->verify_result,
|
|
||||||
ssl->conf->f_vrfy, ssl->conf->p_vrfy, rs_ctx );
|
MBEDTLS_SSL_DEBUG_MSG( 3, ( "use CA callback for X.509 CRT verification" ) );
|
||||||
|
ret = mbedtls_x509_crt_verify_with_cb(
|
||||||
|
chain,
|
||||||
|
ssl->conf->f_ca_cb,
|
||||||
|
ssl->conf->p_ca_cb,
|
||||||
|
ssl->conf->cert_profile,
|
||||||
|
ssl->hostname,
|
||||||
|
&ssl->session_negotiate->verify_result,
|
||||||
|
ssl->conf->f_vrfy, ssl->conf->p_vrfy );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK */
|
||||||
|
{
|
||||||
|
mbedtls_x509_crt *ca_chain;
|
||||||
|
mbedtls_x509_crl *ca_crl;
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
|
||||||
|
if( ssl->handshake->sni_ca_chain != NULL )
|
||||||
|
{
|
||||||
|
ca_chain = ssl->handshake->sni_ca_chain;
|
||||||
|
ca_crl = ssl->handshake->sni_ca_crl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
ca_chain = ssl->conf->ca_chain;
|
||||||
|
ca_crl = ssl->conf->ca_crl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ca_chain != NULL )
|
||||||
|
have_ca_chain = 1;
|
||||||
|
|
||||||
|
ret = mbedtls_x509_crt_verify_restartable(
|
||||||
|
chain,
|
||||||
|
ca_chain, ca_crl,
|
||||||
|
ssl->conf->cert_profile,
|
||||||
|
ssl->hostname,
|
||||||
|
&ssl->session_negotiate->verify_result,
|
||||||
|
ssl->conf->f_vrfy, ssl->conf->p_vrfy, rs_ctx );
|
||||||
|
}
|
||||||
|
|
||||||
if( ret != 0 )
|
if( ret != 0 )
|
||||||
{
|
{
|
||||||
|
@ -6119,7 +6144,7 @@ static int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
|
if( have_ca_chain == 0 && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )
|
||||||
{
|
{
|
||||||
MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
|
MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no CA chain" ) );
|
||||||
ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
|
ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;
|
||||||
|
@ -7886,7 +7911,7 @@ void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
|
||||||
|
|
||||||
#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
|
#if defined(MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK)
|
||||||
void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
|
void mbedtls_ssl_conf_ca_cb( mbedtls_ssl_config *conf,
|
||||||
mbedtls_x509_ca_cb_t f_ca_cb,
|
mbedtls_x509_crt_ca_cb_t f_ca_cb,
|
||||||
void *p_ca_cb )
|
void *p_ca_cb )
|
||||||
{
|
{
|
||||||
conf->f_ca_cb = f_ca_cb;
|
conf->f_ca_cb = f_ca_cb;
|
||||||
|
|
Loading…
Reference in a new issue