aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/x509
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2012-12-13 18:14:46 +0000
committerDr. Stephen Henson <steve@openssl.org>2012-12-13 18:14:46 +0000
commit51e7a4378a78bb0870a2cdc5c524c230c929ebcb (patch)
tree786b3771776cf062bc6a02de5c70729dcc430ac4 /crypto/x509
parent74cc3b583d69d7fe7b90d177a7e83268f69c23c9 (diff)
downloadopenssl-51e7a4378a78bb0870a2cdc5c524c230c929ebcb.tar.gz
New verify flag to return success if we have any certificate in the
trusted store instead of the default which is to return an error if we can't build the complete chain.
Diffstat (limited to 'crypto/x509')
-rw-r--r--crypto/x509/x509_vfy.c9
-rw-r--r--crypto/x509/x509_vfy.h2
2 files changed, 11 insertions, 0 deletions
diff --git a/crypto/x509/x509_vfy.c b/crypto/x509/x509_vfy.c
index d96d500f5c..1983eacf16 100644
--- a/crypto/x509/x509_vfy.c
+++ b/crypto/x509/x509_vfy.c
@@ -756,6 +756,15 @@ static int check_trust(X509_STORE_CTX *ctx)
return X509_TRUST_REJECTED;
}
}
+ /* If we accept partial chains and have at least one trusted
+ * certificate return success.
+ */
+ if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN)
+ {
+ if (ctx->last_untrusted < sk_X509_num(ctx->chain))
+ return X509_TRUST_TRUSTED;
+ }
+
/* If no trusted certs in chain at all return untrusted and
* allow standard (no issuer cert) etc errors to be indicated.
*/
diff --git a/crypto/x509/x509_vfy.h b/crypto/x509/x509_vfy.h
index 58eff53f72..a8d61e6e43 100644
--- a/crypto/x509/x509_vfy.h
+++ b/crypto/x509/x509_vfy.h
@@ -416,6 +416,8 @@ void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth);
#define X509_V_FLAG_SUITEB_192_LOS 0x20000
/* Suite B 128 bit mode allowing 192 bit algorithms */
#define X509_V_FLAG_SUITEB_128_LOS 0x30000
+/* Allow partial chains if at least one certificate is in trusted store */
+#define X509_V_FLAG_PARTIAL_CHAIN 0x80000
#define X509_VP_FLAG_DEFAULT 0x1