mirror of
https://github.com/qemu/qemu.git
synced 2026-02-04 02:24:51 +00:00
crypto: only verify CA certs in chain of trust
The CA file provided to qemu may contain CA certificates which do not form part of the chain of trust for the specific certificate we are sanity checking. This patch changes the sanity checking from validating every CA certificate to only checking the CA certificates which are part of the chain of trust (issuer chain). Other certificates are ignored. Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Henry Kleynhans <hkleynhans@fb.com> [DB: changed 'int' to 'bool' in 'checking_issuer' variable] Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
committed by
Daniel P. Berrangé
parent
b7a1f2ca45
commit
75216f239f
@@ -315,6 +315,51 @@ qcrypto_tls_creds_check_cert(QCryptoTLSCredsX509 *creds,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qcrypto_tls_creds_check_authority_chain(QCryptoTLSCredsX509 *creds,
|
||||
gnutls_x509_crt_t cert,
|
||||
gnutls_x509_crt_t *cacerts,
|
||||
unsigned int ncacerts,
|
||||
const char *cacertFile,
|
||||
bool isServer,
|
||||
bool isCA,
|
||||
Error **errp)
|
||||
{
|
||||
gnutls_x509_crt_t *cert_to_check = &cert;
|
||||
bool checking_issuer = true;
|
||||
int retval = 0;
|
||||
|
||||
while (checking_issuer) {
|
||||
checking_issuer = false;
|
||||
|
||||
if (gnutls_x509_crt_check_issuer(*cert_to_check,
|
||||
*cert_to_check)) {
|
||||
/*
|
||||
* The cert is self-signed indicating we have
|
||||
* reached the root of trust.
|
||||
*/
|
||||
return qcrypto_tls_creds_check_cert(
|
||||
creds, *cert_to_check, cacertFile,
|
||||
isServer, isCA, errp);
|
||||
}
|
||||
for (int i = 0; i < ncacerts; i++) {
|
||||
if (gnutls_x509_crt_check_issuer(*cert_to_check,
|
||||
cacerts[i])) {
|
||||
retval = qcrypto_tls_creds_check_cert(
|
||||
creds, cacerts[i], cacertFile,
|
||||
isServer, isCA, errp);
|
||||
if (retval < 0) {
|
||||
return retval;
|
||||
}
|
||||
cert_to_check = &cacerts[i];
|
||||
checking_issuer = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
qcrypto_tls_creds_check_cert_pair(gnutls_x509_crt_t cert,
|
||||
@@ -499,12 +544,12 @@ qcrypto_tls_creds_x509_sanity_check(QCryptoTLSCredsX509 *creds,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
for (i = 0; i < ncacerts; i++) {
|
||||
if (qcrypto_tls_creds_check_cert(creds,
|
||||
cacerts[i], cacertFile,
|
||||
isServer, true, errp) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
if (cert &&
|
||||
qcrypto_tls_creds_check_authority_chain(creds, cert,
|
||||
cacerts, ncacerts,
|
||||
cacertFile, isServer,
|
||||
true, errp) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (cert && ncacerts &&
|
||||
|
||||
Reference in New Issue
Block a user