From 3342dcea7a633e579e1971dfd16ff3fc14dc3936 Mon Sep 17 00:00:00 2001 From: Viktor Dukhovni Date: Fri, 15 Jan 2016 03:49:11 -0500 Subject: [PATCH] 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. Reviewed-by: Richard Levitte --- crypto/x509/x509_trs.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/crypto/x509/x509_trs.c b/crypto/x509/x509_trs.c index 8f2ff8321e..851e745220 100644 --- a/crypto/x509/x509_trs.c +++ b/crypto/x509/x509_trs.c @@ -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; }