Fix verify algorithm.
authorDr. Stephen Henson <steve@openssl.org>
Tue, 24 Mar 2015 16:21:21 +0000 (16:21 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 24 Mar 2015 17:35:59 +0000 (17:35 +0000)
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.

Reviewed-by: Matt Caswell <matt@openssl.org>
crypto/x509/x509_vfy.c

index bb6e1ce9af990c8a83716e1d73efa9c53a5dd9c7..61f02b58a646700bd11841738f55f603de96dbaa 100644 (file)
@@ -365,8 +365,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 */