summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorbeck <>2021-09-03 08:58:53 +0000
committerbeck <>2021-09-03 08:58:53 +0000
commit994245ef52a1aae31fcfe4b4f477541af4815037 (patch)
tree9c46aa8dc9877d0ff22a6819eece4485287e26be /src/lib
parent85941777b4cebd473c07bdc6a1b63738e4b65fa3 (diff)
downloadopenbsd-994245ef52a1aae31fcfe4b4f477541af4815037.tar.gz
openbsd-994245ef52a1aae31fcfe4b4f477541af4815037.tar.bz2
openbsd-994245ef52a1aae31fcfe4b4f477541af4815037.zip
Call the callback on success in new verifier in a compatible way
when we succeed with a chain, and ensure we do not call the callback twice when the caller doesn't expect it. A refactor of the end of the legacy verify code in x509_vfy is probably overdue, but this should be done based on a piece that works. the important bit here is this allows the perl regression tests in tree to pass. Changes the previously committed regress tests to test the success case callbacks to be known to pass. ok bluhm@ tb@
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/x509/x509_internal.h3
-rw-r--r--src/lib/libcrypto/x509/x509_verify.c46
-rw-r--r--src/lib/libcrypto/x509/x509_vfy.c22
3 files changed, 55 insertions, 16 deletions
diff --git a/src/lib/libcrypto/x509/x509_internal.h b/src/lib/libcrypto/x509/x509_internal.h
index 7d3250d063..8891aecb13 100644
--- a/src/lib/libcrypto/x509/x509_internal.h
+++ b/src/lib/libcrypto/x509/x509_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_internal.h,v 1.11 2021/08/28 15:22:42 beck Exp $ */ 1/* $OpenBSD: x509_internal.h,v 1.12 2021/09/03 08:58:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -90,6 +90,7 @@ int x509_vfy_check_revocation(X509_STORE_CTX *ctx);
90int x509_vfy_check_policy(X509_STORE_CTX *ctx); 90int x509_vfy_check_policy(X509_STORE_CTX *ctx);
91int x509_vfy_check_trust(X509_STORE_CTX *ctx); 91int x509_vfy_check_trust(X509_STORE_CTX *ctx);
92int x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx); 92int x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx);
93int x509_vfy_callback_indicate_success(X509_STORE_CTX *ctx);
93void x509v3_cache_extensions(X509 *x); 94void x509v3_cache_extensions(X509 *x);
94X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x); 95X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x);
95 96
diff --git a/src/lib/libcrypto/x509/x509_verify.c b/src/lib/libcrypto/x509/x509_verify.c
index 39371ef038..2ec53f6fc8 100644
--- a/src/lib/libcrypto/x509/x509_verify.c
+++ b/src/lib/libcrypto/x509/x509_verify.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_verify.c,v 1.47 2021/08/30 08:59:33 beck Exp $ */ 1/* $OpenBSD: x509_verify.c,v 1.48 2021/09/03 08:58:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2020-2021 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2020-2021 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -383,6 +383,7 @@ x509_verify_ctx_validate_legacy_chain(struct x509_verify_ctx *ctx,
383 return 0; 383 return 0;
384 chain->cert_errors[ctx->xsc->error_depth] = 384 chain->cert_errors[ctx->xsc->error_depth] =
385 ctx->xsc->error; 385 ctx->xsc->error;
386 ctx->error_depth = ctx->xsc->error_depth;
386 } 387 }
387 388
388 return ret; 389 return ret;
@@ -537,10 +538,11 @@ x509_verify_consider_candidate(struct x509_verify_ctx *ctx, X509 *cert,
537 x509_verify_chain_free(new_chain); 538 x509_verify_chain_free(new_chain);
538 return 0; 539 return 0;
539 } 540 }
540 if (x509_verify_cert_error(ctx, candidate, depth, X509_V_OK, 1)) { 541 if (!x509_verify_ctx_add_chain(ctx, new_chain)) {
541 (void) x509_verify_ctx_add_chain(ctx, new_chain); 542 x509_verify_chain_free(new_chain);
542 goto done; 543 return 0;
543 } 544 }
545 goto done;
544 } 546 }
545 547
546 x509_verify_build_chains(ctx, candidate, new_chain, full_chain); 548 x509_verify_build_chains(ctx, candidate, new_chain, full_chain);
@@ -596,8 +598,15 @@ x509_verify_build_chains(struct x509_verify_ctx *ctx, X509 *cert,
596 return; 598 return;
597 599
598 count = ctx->chains_count; 600 count = ctx->chains_count;
601
599 ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; 602 ctx->error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY;
600 ctx->error_depth = depth; 603 ctx->error_depth = depth;
604
605 if (ctx->saved_error != 0)
606 ctx->error = ctx->saved_error;
607 if (ctx->saved_error_depth != 0)
608 ctx->error_depth = ctx->saved_error_depth;
609
601 if (ctx->xsc != NULL) { 610 if (ctx->xsc != NULL) {
602 /* 611 /*
603 * Long ago experiments at Muppet labs resulted in a 612 * Long ago experiments at Muppet labs resulted in a
@@ -663,8 +672,6 @@ x509_verify_build_chains(struct x509_verify_ctx *ctx, X509 *cert,
663 } else if (ctx->error_depth == depth) { 672 } else if (ctx->error_depth == depth) {
664 if (!x509_verify_ctx_set_xsc_chain(ctx, current_chain, 0, 0)) 673 if (!x509_verify_ctx_set_xsc_chain(ctx, current_chain, 0, 0))
665 return; 674 return;
666 (void) x509_verify_cert_error(ctx, cert, depth,
667 ctx->error, 0);
668 } 675 }
669} 676}
670 677
@@ -1131,9 +1138,12 @@ x509_verify(struct x509_verify_ctx *ctx, X509 *leaf, char *name)
1131 } 1138 }
1132 do { 1139 do {
1133 retry_chain_build = 0; 1140 retry_chain_build = 0;
1134 if (x509_verify_ctx_cert_is_root(ctx, leaf, full_chain)) 1141 if (x509_verify_ctx_cert_is_root(ctx, leaf, full_chain)) {
1135 x509_verify_ctx_add_chain(ctx, current_chain); 1142 if (!x509_verify_ctx_add_chain(ctx, current_chain)) {
1136 else { 1143 x509_verify_chain_free(current_chain);
1144 goto err;
1145 }
1146 } else {
1137 x509_verify_build_chains(ctx, leaf, current_chain, 1147 x509_verify_build_chains(ctx, leaf, current_chain,
1138 full_chain); 1148 full_chain);
1139 if (full_chain && ctx->chains_count == 0) { 1149 if (full_chain && ctx->chains_count == 0) {
@@ -1189,8 +1199,24 @@ x509_verify(struct x509_verify_ctx *ctx, X509 *leaf, char *name)
1189 if (!x509_verify_ctx_set_xsc_chain(ctx, ctx->chains[0], 1199 if (!x509_verify_ctx_set_xsc_chain(ctx, ctx->chains[0],
1190 1, 1)) 1200 1, 1))
1191 goto err; 1201 goto err;
1202 ctx->xsc->error = X509_V_OK;
1203 /*
1204 * Call the callback indicating success up our already
1205 * verified chain. The callback could still tell us to
1206 * fail.
1207 */
1208 if(!x509_vfy_callback_indicate_success(ctx->xsc))
1209 goto err;
1210 } else {
1211 /*
1212 * We had a failure, indicate the failure, but
1213 * allow the callback to override at depth 0
1214 */
1215 if (ctx->xsc->verify_cb(0, ctx->xsc)) {
1216 ctx->xsc->error = X509_V_OK;
1217 return 1;
1218 }
1192 } 1219 }
1193 return ctx->xsc->verify_cb(ctx->chains_count > 0, ctx->xsc);
1194 } 1220 }
1195 return (ctx->chains_count); 1221 return (ctx->chains_count);
1196 1222
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c
index a161b330ae..2f69017e96 100644
--- a/src/lib/libcrypto/x509/x509_vfy.c
+++ b/src/lib/libcrypto/x509/x509_vfy.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_vfy.c,v 1.88 2021/08/28 15:22:42 beck Exp $ */ 1/* $OpenBSD: x509_vfy.c,v 1.89 2021/09/03 08:58:53 beck Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1879,7 +1879,7 @@ x509_check_cert_time(X509_STORE_CTX *ctx, X509 *x, int depth)
1879} 1879}
1880 1880
1881static int 1881static int
1882internal_verify(X509_STORE_CTX *ctx) 1882x509_vfy_internal_verify(X509_STORE_CTX *ctx, int chain_verified)
1883{ 1883{
1884 int n = sk_X509_num(ctx->chain) - 1; 1884 int n = sk_X509_num(ctx->chain) - 1;
1885 X509 *xi = sk_X509_value(ctx->chain, n); 1885 X509 *xi = sk_X509_value(ctx->chain, n);
@@ -1915,8 +1915,8 @@ internal_verify(X509_STORE_CTX *ctx)
1915 * certificate and its depth (rather than the depth of 1915 * certificate and its depth (rather than the depth of
1916 * the subject). 1916 * the subject).
1917 */ 1917 */
1918 if (xs != xi || 1918 if (!chain_verified && ( xs != xi ||
1919 (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE)) { 1919 (ctx->param->flags & X509_V_FLAG_CHECK_SS_SIGNATURE))) {
1920 EVP_PKEY *pkey; 1920 EVP_PKEY *pkey;
1921 if ((pkey = X509_get_pubkey(xi)) == NULL) { 1921 if ((pkey = X509_get_pubkey(xi)) == NULL) {
1922 if (!verify_cb_cert(ctx, xi, xi != xs ? n+1 : n, 1922 if (!verify_cb_cert(ctx, xi, xi != xs ? n+1 : n,
@@ -1933,7 +1933,7 @@ internal_verify(X509_STORE_CTX *ctx)
1933 } 1933 }
1934check_cert: 1934check_cert:
1935 /* Calls verify callback as needed */ 1935 /* Calls verify callback as needed */
1936 if (!x509_check_cert_time(ctx, xs, n)) 1936 if (!chain_verified && !x509_check_cert_time(ctx, xs, n))
1937 return 0; 1937 return 0;
1938 1938
1939 /* 1939 /*
@@ -1954,6 +1954,18 @@ check_cert:
1954 return 1; 1954 return 1;
1955} 1955}
1956 1956
1957static int
1958internal_verify(X509_STORE_CTX *ctx)
1959{
1960 return x509_vfy_internal_verify(ctx, 0);
1961}
1962
1963int
1964x509_vfy_callback_indicate_success(X509_STORE_CTX *ctx)
1965{
1966 return x509_vfy_internal_verify(ctx, 1);
1967}
1968
1957int 1969int
1958X509_cmp_current_time(const ASN1_TIME *ctm) 1970X509_cmp_current_time(const ASN1_TIME *ctm)
1959{ 1971{