Reject when explicit trust EKU are set and none match.
authorViktor Dukhovni <openssl-users@dukhovni.org>
Fri, 15 Jan 2016 08:49:11 +0000 (03:49 -0500)
committerViktor Dukhovni <openssl-users@dukhovni.org>
Thu, 21 Jan 2016 00:03:36 +0000 (19:03 -0500)
Returning untrusted is enough for for full chains that end in
self-signed roots, because when explicit trust is specified it
suppresses the default blanket trust of self-signed objects.

But for partial chains, this is not enough, because absent a similar
trust-self-signed policy, non matching EKUs are indistinguishable
from lack of EKU constraints.

Therefore, failure to match any trusted purpose must trigger an
explicit reject.

Reviewed-by: Richard Levitte <levitte@openssl.org>
crypto/x509/x509_trs.c

index 8f2ff8321ed2c0e80c3fa2db7349030ae1a27fd6..851e745220eef50d01d835d5604d2bdbc22c86a2 100644 (file)
@@ -312,6 +312,21 @@ static int obj_trust(int id, X509 *x, int flags)
             if (OBJ_obj2nid(obj) == id)
                 return X509_TRUST_TRUSTED;
         }
+        /*
+         * Reject when explicit trust EKU are set and none match.
+         *
+         * Returning untrusted is enough for for full chains that end in
+         * self-signed roots, because when explicit trust is specified it
+         * suppresses the default blanket trust of self-signed objects.
+         *
+         * But for partial chains, this is not enough, because absent a similar
+         * trust-self-signed policy, non matching EKUs are indistinguishable
+         * from lack of EKU constraints.
+         *
+         * Therefore, failure to match any trusted purpose must trigger an
+         * explicit reject.
+         */
+        return X509_TRUST_REJECTED;
     }
     return X509_TRUST_UNTRUSTED;
 }