diff options
author | Viktor Dukhovni <openssl-users@dukhovni.org> | 2016-01-15 03:49:11 -0500 |
---|---|---|
committer | Viktor Dukhovni <openssl-users@dukhovni.org> | 2016-01-20 19:03:36 -0500 |
commit | 3342dcea7a633e579e1971dfd16ff3fc14dc3936 (patch) | |
tree | 6724238186c3e0cf27177a769b52c370576948d5 /crypto/x509/x509_trs.c | |
parent | 3d6e91c68051ab94400cf4281f95ffef29a7a4a3 (diff) |
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 <levitte@openssl.org>
Diffstat (limited to 'crypto/x509/x509_trs.c')
-rw-r--r-- | crypto/x509/x509_trs.c | 15 |
1 files changed, 15 insertions, 0 deletions
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; } |