summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbeck <>2021-08-18 15:10:46 +0000
committerbeck <>2021-08-18 15:10:46 +0000
commit6a47c54b3f19d412f9ffcb9ba77688105dae1ba9 (patch)
treec688b69836ef92b723fa2bb812132749e0d32bf7 /src
parentd43dfde099f95029309eec46e9649dd7f61bf5d2 (diff)
downloadopenbsd-6a47c54b3f19d412f9ffcb9ba77688105dae1ba9.tar.gz
openbsd-6a47c54b3f19d412f9ffcb9ba77688105dae1ba9.tar.bz2
openbsd-6a47c54b3f19d412f9ffcb9ba77688105dae1ba9.zip
Refactor the legacy chain validation from the chain adding code into its
own function, in preparation for subesquent change. No functional change. ok tb@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/x509/x509_verify.c122
1 files changed, 70 insertions, 52 deletions
diff --git a/src/lib/libcrypto/x509/x509_verify.c b/src/lib/libcrypto/x509/x509_verify.c
index 18d395d273..dd053ad812 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.39 2021/07/12 15:12:38 beck Exp $ */ 1/* $OpenBSD: x509_verify.c,v 1.40 2021/08/18 15:10:46 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 *
@@ -307,6 +307,71 @@ x509_verify_ctx_restore_xsc_error(struct x509_verify_ctx *ctx)
307 return 1; 307 return 1;
308} 308}
309 309
310/* Perform legacy style validation of a chain */
311static int
312x509_verify_ctx_validate_legacy_chain(struct x509_verify_ctx *ctx,
313 struct x509_verify_chain *chain, size_t depth)
314{
315 int ret = 0;
316
317 if (ctx->xsc == NULL)
318 return 1;
319
320 /*
321 * If we have a legacy xsc, choose a validated chain, and
322 * apply the extensions, revocation, and policy checks just
323 * like the legacy code did. We do this here instead of as
324 * building the chains to more easily support the callback and
325 * the bewildering array of VERIFY_PARAM knobs that are there
326 * for the fiddling.
327 */
328
329 /* These may be set in one of the following calls. */
330 ctx->xsc->error = X509_V_OK;
331 ctx->xsc->error_depth = 0;
332
333 if (!x509_verify_ctx_set_xsc_chain(ctx, chain, 0, 1))
334 goto err;
335
336 /*
337 * XXX currently this duplicates some work done in chain
338 * build, but we keep it here until we have feature parity
339 */
340 if (!x509_vfy_check_chain_extensions(ctx->xsc))
341 goto err;
342
343 if (!x509_constraints_chain(ctx->xsc->chain,
344 &ctx->xsc->error, &ctx->xsc->error_depth)) {
345 X509 *cert = sk_X509_value(ctx->xsc->chain, depth);
346 if (!x509_verify_cert_error(ctx, cert,
347 ctx->xsc->error_depth, ctx->xsc->error, 0))
348 goto err;
349 }
350
351 if (!x509_vfy_check_revocation(ctx->xsc))
352 goto err;
353
354 if (!x509_vfy_check_policy(ctx->xsc))
355 goto err;
356
357 ret = 1;
358
359 err:
360 /*
361 * The above checks may have set ctx->xsc->error and
362 * ctx->xsc->error_depth - save these for later on.
363 */
364 if (ctx->xsc->error != X509_V_OK) {
365 if (ctx->xsc->error_depth < 0 ||
366 ctx->xsc->error_depth >= X509_VERIFY_MAX_CHAIN_CERTS)
367 return 0;
368 chain->cert_errors[ctx->xsc->error_depth] =
369 ctx->xsc->error;
370 }
371
372 return ret;
373}
374
310/* Add a validated chain to our list of valid chains */ 375/* Add a validated chain to our list of valid chains */
311static int 376static int
312x509_verify_ctx_add_chain(struct x509_verify_ctx *ctx, 377x509_verify_ctx_add_chain(struct x509_verify_ctx *ctx,
@@ -328,59 +393,12 @@ x509_verify_ctx_add_chain(struct x509_verify_ctx *ctx,
328 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY) 393 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY)
329 chain->cert_errors[depth] = X509_V_OK; 394 chain->cert_errors[depth] = X509_V_OK;
330 395
331 /* 396 if (!x509_verify_ctx_validate_legacy_chain(ctx, chain, depth))
332 * If we have a legacy xsc, choose a validated chain, 397 return 0;
333 * and apply the extensions, revocation, and policy checks
334 * just like the legacy code did. We do this here instead
335 * of as building the chains to more easily support the
336 * callback and the bewildering array of VERIFY_PARAM
337 * knobs that are there for the fiddling.
338 */
339 if (ctx->xsc != NULL) {
340 /* These may be set in one of the following calls. */
341 ctx->xsc->error = X509_V_OK;
342 ctx->xsc->error_depth = 0;
343
344 if (!x509_verify_ctx_set_xsc_chain(ctx, chain, 0, 1))
345 return 0;
346
347 /*
348 * XXX currently this duplicates some work done
349 * in chain build, but we keep it here until
350 * we have feature parity
351 */
352 if (!x509_vfy_check_chain_extensions(ctx->xsc))
353 return 0;
354
355 if (!x509_constraints_chain(ctx->xsc->chain,
356 &ctx->xsc->error, &ctx->xsc->error_depth)) {
357 X509 *cert = sk_X509_value(ctx->xsc->chain, depth);
358 if (!x509_verify_cert_error(ctx, cert,
359 ctx->xsc->error_depth, ctx->xsc->error, 0))
360 return 0;
361 }
362
363 if (!x509_vfy_check_revocation(ctx->xsc))
364 return 0;
365
366 if (!x509_vfy_check_policy(ctx->xsc))
367 return 0;
368 398
369 /*
370 * The above checks may have set ctx->xsc->error and
371 * ctx->xsc->error_depth - save these for later on.
372 */
373 if (ctx->xsc->error != X509_V_OK) {
374 if (ctx->xsc->error_depth < 0 ||
375 ctx->xsc->error_depth >= X509_VERIFY_MAX_CHAIN_CERTS)
376 return 0;
377 chain->cert_errors[ctx->xsc->error_depth] =
378 ctx->xsc->error;
379 }
380 }
381 /* 399 /*
382 * no xsc means we are being called from the non-legacy API, 400 * In the non-legacy code, extensions and purpose are dealt
383 * extensions and purpose are dealt with as the chain is built. 401 * with as the chain is built.
384 * 402 *
385 * The non-legacy api returns multiple chains but does not do 403 * The non-legacy api returns multiple chains but does not do
386 * any revocation checking (it must be done by the caller on 404 * any revocation checking (it must be done by the caller on