summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2015-03-24 16:21:21 +0000
committerMatt Caswell <matt@openssl.org>2015-04-20 13:42:17 +0100
commit47daa155a31b0a54ce09ad2ed4d55fad74096dab (patch)
tree977bb80b5b67f19675eb782a8adfbc22a7fa32dc
parentbe856c0391d65c8c179721ffa8f35374fddf5892 (diff)
Fix verify algorithm.
Disable loop checking when we retry verification with an alternative path. This fixes the case where an intermediate CA is explicitly trusted and part of the untrusted certificate list. By disabling loop checking for this case the untrusted CA can be replaced by the explicitly trusted case and verification will succeed. Signed-off-by: Matt Caswell <matt@openssl.org> (cherry picked from commit e5991ec528b1c339062440811e2641f5ea2b328b) Reviewed-by: Rich Salz <rsalz@openssl.org>
-rw-r--r--crypto/x509/x509_vfy.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
index f3e9c56b09..c0f6a5dfff 100644
--- a/crypto/x509/x509_vfy.c
+++ b/crypto/x509/x509_vfy.c
@@ -370,8 +370,16 @@ int X509_verify_cert(X509_STORE_CTX *ctx)
&& !(ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST)
&& !(ctx->param->flags & X509_V_FLAG_NO_ALT_CHAINS)) {
while (j-- > 1) {
+ STACK_OF(X509) *chtmp = ctx->chain;
xtmp2 = sk_X509_value(ctx->chain, j - 1);
+ /*
+ * Temporarily set chain to NULL so we don't discount
+ * duplicates: the same certificate could be an untrusted
+ * CA found in the trusted store.
+ */
+ ctx->chain = NULL;
ok = ctx->get_issuer(&xtmp, ctx, xtmp2);
+ ctx->chain = chtmp;
if (ok < 0)
goto end;
/* Check if we found an alternate chain */