diff options
-rw-r--r-- | src/lib/libcrypto/x509/x509_internal.h | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_purp.c | 51 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_verify.c | 12 |
3 files changed, 26 insertions, 41 deletions
diff --git a/src/lib/libcrypto/x509/x509_internal.h b/src/lib/libcrypto/x509/x509_internal.h index 4ce6cd1e85..cb80005075 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.23 2022/11/26 16:08:54 tb Exp $ */ | 1 | /* $OpenBSD: x509_internal.h,v 1.24 2023/01/20 22:00:47 job Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> | 3 | * Copyright (c) 2020 Bob Beck <beck@openbsd.org> |
4 | * | 4 | * |
@@ -94,7 +94,7 @@ int x509_vfy_check_policy(X509_STORE_CTX *ctx); | |||
94 | int x509_vfy_check_trust(X509_STORE_CTX *ctx); | 94 | int x509_vfy_check_trust(X509_STORE_CTX *ctx); |
95 | int x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx); | 95 | int x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx); |
96 | int x509_vfy_callback_indicate_completion(X509_STORE_CTX *ctx); | 96 | int x509_vfy_callback_indicate_completion(X509_STORE_CTX *ctx); |
97 | void x509v3_cache_extensions(X509 *x); | 97 | int x509v3_cache_extensions(X509 *x); |
98 | X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x); | 98 | X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x); |
99 | 99 | ||
100 | time_t x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notafter); | 100 | time_t x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notafter); |
diff --git a/src/lib/libcrypto/x509/x509_purp.c b/src/lib/libcrypto/x509/x509_purp.c index 4faf83b975..7ec986062f 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.18 2022/11/26 16:08:55 tb Exp $ */ | 1 | /* $OpenBSD: x509_purp.c,v 1.19 2023/01/20 22:00:47 job 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 | */ |
@@ -76,8 +76,6 @@ | |||
76 | #define ns_reject(x, usage) \ | 76 | #define ns_reject(x, usage) \ |
77 | (((x)->ex_flags & EXFLAG_NSCERT) && !((x)->ex_nscert & (usage))) | 77 | (((x)->ex_flags & EXFLAG_NSCERT) && !((x)->ex_nscert & (usage))) |
78 | 78 | ||
79 | void x509v3_cache_extensions(X509 *x); | ||
80 | |||
81 | static int check_ssl_ca(const X509 *x); | 79 | static int check_ssl_ca(const X509 *x); |
82 | static int check_purpose_ssl_client(const X509_PURPOSE *xp, const X509 *x, | 80 | static int check_purpose_ssl_client(const X509_PURPOSE *xp, const X509 *x, |
83 | int ca); | 81 | int ca); |
@@ -131,13 +129,9 @@ X509_check_purpose(X509 *x, int id, int ca) | |||
131 | int idx; | 129 | int idx; |
132 | const X509_PURPOSE *pt; | 130 | const X509_PURPOSE *pt; |
133 | 131 | ||
134 | if (!(x->ex_flags & EXFLAG_SET)) { | 132 | if (!x509v3_cache_extensions(x)) |
135 | CRYPTO_w_lock(CRYPTO_LOCK_X509); | 133 | return -1; |
136 | x509v3_cache_extensions(x); | 134 | |
137 | CRYPTO_w_unlock(CRYPTO_LOCK_X509); | ||
138 | if (x->ex_flags & EXFLAG_INVALID) | ||
139 | return -1; | ||
140 | } | ||
141 | if (id == -1) | 135 | if (id == -1) |
142 | return 1; | 136 | return 1; |
143 | idx = X509_PURPOSE_get_by_id(id); | 137 | idx = X509_PURPOSE_get_by_id(id); |
@@ -449,8 +443,8 @@ setup_crldp(X509 *x) | |||
449 | setup_dp(x, sk_DIST_POINT_value(x->crldp, i)); | 443 | setup_dp(x, sk_DIST_POINT_value(x->crldp, i)); |
450 | } | 444 | } |
451 | 445 | ||
452 | void | 446 | static void |
453 | x509v3_cache_extensions(X509 *x) | 447 | x509v3_cache_extensions_internal(X509 *x) |
454 | { | 448 | { |
455 | BASIC_CONSTRAINTS *bs; | 449 | BASIC_CONSTRAINTS *bs; |
456 | PROXY_CERT_INFO_EXTENSION *pci; | 450 | PROXY_CERT_INFO_EXTENSION *pci; |
@@ -640,6 +634,18 @@ x509v3_cache_extensions(X509 *x) | |||
640 | x->ex_flags |= EXFLAG_SET; | 634 | x->ex_flags |= EXFLAG_SET; |
641 | } | 635 | } |
642 | 636 | ||
637 | int | ||
638 | x509v3_cache_extensions(X509 *x) | ||
639 | { | ||
640 | if ((x->ex_flags & EXFLAG_SET) == 0) { | ||
641 | CRYPTO_w_lock(CRYPTO_LOCK_X509); | ||
642 | x509v3_cache_extensions_internal(x); | ||
643 | CRYPTO_w_unlock(CRYPTO_LOCK_X509); | ||
644 | } | ||
645 | |||
646 | return (x->ex_flags & EXFLAG_INVALID) == 0; | ||
647 | } | ||
648 | |||
643 | /* CA checks common to all purposes | 649 | /* CA checks common to all purposes |
644 | * return codes: | 650 | * return codes: |
645 | * 0 not a CA | 651 | * 0 not a CA |
@@ -680,11 +686,7 @@ check_ca(const X509 *x) | |||
680 | int | 686 | int |
681 | X509_check_ca(X509 *x) | 687 | X509_check_ca(X509 *x) |
682 | { | 688 | { |
683 | if (!(x->ex_flags & EXFLAG_SET)) { | 689 | x509v3_cache_extensions(x); |
684 | CRYPTO_w_lock(CRYPTO_LOCK_X509); | ||
685 | x509v3_cache_extensions(x); | ||
686 | CRYPTO_w_unlock(CRYPTO_LOCK_X509); | ||
687 | } | ||
688 | 690 | ||
689 | return check_ca(x); | 691 | return check_ca(x); |
690 | } | 692 | } |
@@ -895,19 +897,10 @@ X509_check_issued(X509 *issuer, X509 *subject) | |||
895 | if (X509_NAME_cmp(X509_get_subject_name(issuer), | 897 | if (X509_NAME_cmp(X509_get_subject_name(issuer), |
896 | X509_get_issuer_name(subject))) | 898 | X509_get_issuer_name(subject))) |
897 | return X509_V_ERR_SUBJECT_ISSUER_MISMATCH; | 899 | return X509_V_ERR_SUBJECT_ISSUER_MISMATCH; |
898 | if (!(issuer->ex_flags & EXFLAG_SET)) { | 900 | |
899 | CRYPTO_w_lock(CRYPTO_LOCK_X509); | 901 | if (!x509v3_cache_extensions(issuer)) |
900 | x509v3_cache_extensions(issuer); | ||
901 | CRYPTO_w_unlock(CRYPTO_LOCK_X509); | ||
902 | } | ||
903 | if (issuer->ex_flags & EXFLAG_INVALID) | ||
904 | return X509_V_ERR_UNSPECIFIED; | 902 | return X509_V_ERR_UNSPECIFIED; |
905 | if (!(subject->ex_flags & EXFLAG_SET)) { | 903 | if (!x509v3_cache_extensions(subject)) |
906 | CRYPTO_w_lock(CRYPTO_LOCK_X509); | ||
907 | x509v3_cache_extensions(subject); | ||
908 | CRYPTO_w_unlock(CRYPTO_LOCK_X509); | ||
909 | } | ||
910 | if (subject->ex_flags & EXFLAG_INVALID) | ||
911 | return X509_V_ERR_UNSPECIFIED; | 904 | return X509_V_ERR_UNSPECIFIED; |
912 | 905 | ||
913 | if (subject->akid) { | 906 | if (subject->akid) { |
diff --git a/src/lib/libcrypto/x509/x509_verify.c b/src/lib/libcrypto/x509/x509_verify.c index 5891bd8df3..c60bdf743f 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.62 2023/01/17 23:49:28 beck Exp $ */ | 1 | /* $OpenBSD: x509_verify.c,v 1.63 2023/01/20 22:00:47 job 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 | * |
@@ -241,15 +241,7 @@ x509_verify_ctx_clear(struct x509_verify_ctx *ctx) | |||
241 | static int | 241 | static int |
242 | x509_verify_cert_cache_extensions(X509 *cert) | 242 | x509_verify_cert_cache_extensions(X509 *cert) |
243 | { | 243 | { |
244 | if (!(cert->ex_flags & EXFLAG_SET)) { | 244 | return x509v3_cache_extensions(cert); |
245 | CRYPTO_w_lock(CRYPTO_LOCK_X509); | ||
246 | x509v3_cache_extensions(cert); | ||
247 | CRYPTO_w_unlock(CRYPTO_LOCK_X509); | ||
248 | } | ||
249 | if (cert->ex_flags & EXFLAG_INVALID) | ||
250 | return 0; | ||
251 | |||
252 | return (cert->ex_flags & EXFLAG_SET); | ||
253 | } | 245 | } |
254 | 246 | ||
255 | static int | 247 | static int |