diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/x509/x509_purp.c | 33 | ||||
| -rw-r--r-- | src/lib/libcrypto/x509/x509_vfy.c | 38 |
2 files changed, 6 insertions, 65 deletions
diff --git a/src/lib/libcrypto/x509/x509_purp.c b/src/lib/libcrypto/x509/x509_purp.c index 176d9d679f..621f6f0f90 100644 --- a/src/lib/libcrypto/x509/x509_purp.c +++ b/src/lib/libcrypto/x509/x509_purp.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: x509_purp.c,v 1.21 2023/02/16 10:18:59 tb Exp $ */ | 1 | /* $OpenBSD: x509_purp.c,v 1.22 2023/04/16 08:06:42 tb Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| @@ -380,7 +380,6 @@ X509_supported_extension(X509_EXTENSION *ex) | |||
| 380 | NID_sbgp_autonomousSysNum, /* 291 */ | 380 | NID_sbgp_autonomousSysNum, /* 291 */ |
| 381 | #endif | 381 | #endif |
| 382 | NID_policy_constraints, /* 401 */ | 382 | NID_policy_constraints, /* 401 */ |
| 383 | NID_proxyCertInfo, /* 663 */ | ||
| 384 | NID_name_constraints, /* 666 */ | 383 | NID_name_constraints, /* 666 */ |
| 385 | NID_policy_mappings, /* 747 */ | 384 | NID_policy_mappings, /* 747 */ |
| 386 | NID_inhibit_any_policy /* 748 */ | 385 | NID_inhibit_any_policy /* 748 */ |
| @@ -446,7 +445,6 @@ static void | |||
| 446 | x509v3_cache_extensions_internal(X509 *x) | 445 | x509v3_cache_extensions_internal(X509 *x) |
| 447 | { | 446 | { |
| 448 | BASIC_CONSTRAINTS *bs; | 447 | BASIC_CONSTRAINTS *bs; |
| 449 | PROXY_CERT_INFO_EXTENSION *pci; | ||
| 450 | ASN1_BIT_STRING *usage; | 448 | ASN1_BIT_STRING *usage; |
| 451 | ASN1_BIT_STRING *ns; | 449 | ASN1_BIT_STRING *ns; |
| 452 | EXTENDED_KEY_USAGE *extusage; | 450 | EXTENDED_KEY_USAGE *extusage; |
| @@ -481,30 +479,6 @@ x509v3_cache_extensions_internal(X509 *x) | |||
| 481 | x->ex_flags |= EXFLAG_INVALID; | 479 | x->ex_flags |= EXFLAG_INVALID; |
| 482 | } | 480 | } |
| 483 | 481 | ||
| 484 | /* Handle proxy certificates */ | ||
| 485 | if ((pci = X509_get_ext_d2i(x, NID_proxyCertInfo, &i, NULL))) { | ||
| 486 | if (x->ex_flags & EXFLAG_CA || | ||
| 487 | X509_get_ext_by_NID(x, NID_subject_alt_name, -1) >= 0 || | ||
| 488 | X509_get_ext_by_NID(x, NID_issuer_alt_name, -1) >= 0) { | ||
| 489 | x->ex_flags |= EXFLAG_INVALID; | ||
| 490 | } | ||
| 491 | if (pci->pcPathLengthConstraint) { | ||
| 492 | if (pci->pcPathLengthConstraint->type == | ||
| 493 | V_ASN1_NEG_INTEGER) { | ||
| 494 | x->ex_flags |= EXFLAG_INVALID; | ||
| 495 | x->ex_pcpathlen = 0; | ||
| 496 | } else | ||
| 497 | x->ex_pcpathlen = | ||
| 498 | ASN1_INTEGER_get(pci-> | ||
| 499 | pcPathLengthConstraint); | ||
| 500 | } else | ||
| 501 | x->ex_pcpathlen = -1; | ||
| 502 | PROXY_CERT_INFO_EXTENSION_free(pci); | ||
| 503 | x->ex_flags |= EXFLAG_PROXY; | ||
| 504 | } else if (i != -1) { | ||
| 505 | x->ex_flags |= EXFLAG_INVALID; | ||
| 506 | } | ||
| 507 | |||
| 508 | /* Handle key usage */ | 482 | /* Handle key usage */ |
| 509 | if ((usage = X509_get_ext_d2i(x, NID_key_usage, &i, NULL))) { | 483 | if ((usage = X509_get_ext_d2i(x, NID_key_usage, &i, NULL))) { |
| 510 | if (usage->length > 0) { | 484 | if (usage->length > 0) { |
| @@ -908,10 +882,7 @@ X509_check_issued(X509 *issuer, X509 *subject) | |||
| 908 | return ret; | 882 | return ret; |
| 909 | } | 883 | } |
| 910 | 884 | ||
| 911 | if (subject->ex_flags & EXFLAG_PROXY) { | 885 | if (ku_reject(issuer, KU_KEY_CERT_SIGN)) |
| 912 | if (ku_reject(issuer, KU_DIGITAL_SIGNATURE)) | ||
| 913 | return X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE; | ||
| 914 | } else if (ku_reject(issuer, KU_KEY_CERT_SIGN)) | ||
| 915 | return X509_V_ERR_KEYUSAGE_NO_CERTSIGN; | 886 | return X509_V_ERR_KEYUSAGE_NO_CERTSIGN; |
| 916 | return X509_V_OK; | 887 | return X509_V_OK; |
| 917 | } | 888 | } |
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c index 8bba796198..8fd193699e 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.111 2023/02/16 08:38:17 tb Exp $ */ | 1 | /* $OpenBSD: x509_vfy.c,v 1.112 2023/04/16 08:06:42 tb 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 | * |
| @@ -732,7 +732,6 @@ x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 732 | int (*cb)(int xok, X509_STORE_CTX *xctx); | 732 | int (*cb)(int xok, X509_STORE_CTX *xctx); |
| 733 | int proxy_path_length = 0; | 733 | int proxy_path_length = 0; |
| 734 | int purpose; | 734 | int purpose; |
| 735 | int allow_proxy_certs; | ||
| 736 | 735 | ||
| 737 | cb = ctx->verify_cb; | 736 | cb = ctx->verify_cb; |
| 738 | 737 | ||
| @@ -747,14 +746,10 @@ x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 747 | must_be_ca = -1; | 746 | must_be_ca = -1; |
| 748 | 747 | ||
| 749 | /* CRL path validation */ | 748 | /* CRL path validation */ |
| 750 | if (ctx->parent) { | 749 | if (ctx->parent) |
| 751 | allow_proxy_certs = 0; | ||
| 752 | purpose = X509_PURPOSE_CRL_SIGN; | 750 | purpose = X509_PURPOSE_CRL_SIGN; |
| 753 | } else { | 751 | else |
| 754 | allow_proxy_certs = | ||
| 755 | !!(ctx->param->flags & X509_V_FLAG_ALLOW_PROXY_CERTS); | ||
| 756 | purpose = ctx->param->purpose; | 752 | purpose = ctx->param->purpose; |
| 757 | } | ||
| 758 | 753 | ||
| 759 | /* Check all untrusted certificates */ | 754 | /* Check all untrusted certificates */ |
| 760 | for (i = 0; i < ctx->num_untrusted; i++) { | 755 | for (i = 0; i < ctx->num_untrusted; i++) { |
| @@ -769,14 +764,6 @@ x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 769 | if (!ok) | 764 | if (!ok) |
| 770 | goto end; | 765 | goto end; |
| 771 | } | 766 | } |
| 772 | if (!allow_proxy_certs && (x->ex_flags & EXFLAG_PROXY)) { | ||
| 773 | ctx->error = X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED; | ||
| 774 | ctx->error_depth = i; | ||
| 775 | ctx->current_cert = x; | ||
| 776 | ok = cb(0, ctx); | ||
| 777 | if (!ok) | ||
| 778 | goto end; | ||
| 779 | } | ||
| 780 | ret = X509_check_ca(x); | 767 | ret = X509_check_ca(x); |
| 781 | switch (must_be_ca) { | 768 | switch (must_be_ca) { |
| 782 | case -1: | 769 | case -1: |
| @@ -838,24 +825,7 @@ x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx) | |||
| 838 | /* Increment path length if not self issued */ | 825 | /* Increment path length if not self issued */ |
| 839 | if (!(x->ex_flags & EXFLAG_SI)) | 826 | if (!(x->ex_flags & EXFLAG_SI)) |
| 840 | plen++; | 827 | plen++; |
| 841 | /* If this certificate is a proxy certificate, the next | 828 | must_be_ca = 1; |
| 842 | certificate must be another proxy certificate or a EE | ||
| 843 | certificate. If not, the next certificate must be a | ||
| 844 | CA certificate. */ | ||
| 845 | if (x->ex_flags & EXFLAG_PROXY) { | ||
| 846 | if (x->ex_pcpathlen != -1 && i > x->ex_pcpathlen) { | ||
| 847 | ctx->error = | ||
| 848 | X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED; | ||
| 849 | ctx->error_depth = i; | ||
| 850 | ctx->current_cert = x; | ||
| 851 | ok = cb(0, ctx); | ||
| 852 | if (!ok) | ||
| 853 | goto end; | ||
| 854 | } | ||
| 855 | proxy_path_length++; | ||
| 856 | must_be_ca = 0; | ||
| 857 | } else | ||
| 858 | must_be_ca = 1; | ||
| 859 | } | 829 | } |
| 860 | ok = 1; | 830 | ok = 1; |
| 861 | 831 | ||
