Commit 47daa155 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson Committed by Matt Caswell
Browse files

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: default avatarMatt Caswell <matt@openssl.org>
(cherry picked from commit e5991ec5)

Reviewed-by: default avatarRich Salz <rsalz@openssl.org>
parent be856c03
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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 */