提交 bdcadca2 编写于 作者: V Viktor Dukhovni

Fix last-resort depth 0 check when the chain has multiple certificates

Reviewed-by: NRich Salz <rsalz@openssl.org>
上级 0423f812
...@@ -580,7 +580,11 @@ static int check_trust(X509_STORE_CTX *ctx, int num_untrusted) ...@@ -580,7 +580,11 @@ static int check_trust(X509_STORE_CTX *ctx, int num_untrusted)
int num = sk_X509_num(ctx->chain); int num = sk_X509_num(ctx->chain);
int trust; int trust;
if (DANETLS_HAS_TA(dane) && num_untrusted > 0) { /*
* Check for a DANE issuer at depth 1 or greater, if it is a DANE-TA(2)
* match, we're done, otherwise we'll merely record the match depth.
*/
if (DANETLS_HAS_TA(dane) && num_untrusted > 0 && num_untrusted < num) {
switch (trust = check_dane_issuer(ctx, num_untrusted)) { switch (trust = check_dane_issuer(ctx, num_untrusted)) {
case X509_TRUST_TRUSTED: case X509_TRUST_TRUSTED:
case X509_TRUST_REJECTED: case X509_TRUST_REJECTED:
...@@ -614,12 +618,13 @@ static int check_trust(X509_STORE_CTX *ctx, int num_untrusted) ...@@ -614,12 +618,13 @@ static int check_trust(X509_STORE_CTX *ctx, int num_untrusted)
return X509_TRUST_UNTRUSTED; return X509_TRUST_UNTRUSTED;
} }
if (ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) { if (num_untrusted > num && ctx->param->flags & X509_V_FLAG_PARTIAL_CHAIN) {
/* /*
* Last-resort call with no new trusted certificates, check the leaf * Last-resort call with no new trusted certificates, check the leaf
* for a direct trust store match. * for a direct trust store match.
*/ */
x = sk_X509_value(ctx->chain, 0); i = 0;
x = sk_X509_value(ctx->chain, i);
mx = lookup_cert_match(ctx, x); mx = lookup_cert_match(ctx, x);
if (!mx) if (!mx)
return X509_TRUST_UNTRUSTED; return X509_TRUST_UNTRUSTED;
...@@ -2894,7 +2899,7 @@ static int build_chain(X509_STORE_CTX *ctx) ...@@ -2894,7 +2899,7 @@ static int build_chain(X509_STORE_CTX *ctx)
trust = check_dane_pkeys(ctx); trust = check_dane_pkeys(ctx);
if (trust == X509_TRUST_UNTRUSTED && if (trust == X509_TRUST_UNTRUSTED &&
sk_X509_num(ctx->chain) == ctx->num_untrusted) sk_X509_num(ctx->chain) == ctx->num_untrusted)
trust = check_trust(ctx, 1); trust = check_trust(ctx, ctx->num_untrusted+1);
} }
switch (trust) { switch (trust) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册