summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjob <>2023-01-20 22:00:47 +0000
committerjob <>2023-01-20 22:00:47 +0000
commit33b8a0e11319f8cfbe896e89be1e758ff0815afa (patch)
tree9f7bfeec9179516889295ebca388ee7cf8407b59
parent3b8fab639ce60f060611af336273df1eaf66b779 (diff)
downloadopenbsd-33b8a0e11319f8cfbe896e89be1e758ff0815afa.tar.gz
openbsd-33b8a0e11319f8cfbe896e89be1e758ff0815afa.tar.bz2
openbsd-33b8a0e11319f8cfbe896e89be1e758ff0815afa.zip
Refactor x509v3_cache_extensions
Simplify x509v3_cache_extensions() by using a wrapper to avoid duplication of code for locking and checking the EXFLAG_INVALID flag. OK tb@
-rw-r--r--src/lib/libcrypto/x509/x509_internal.h4
-rw-r--r--src/lib/libcrypto/x509/x509_purp.c51
-rw-r--r--src/lib/libcrypto/x509/x509_verify.c12
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);
94int x509_vfy_check_trust(X509_STORE_CTX *ctx); 94int x509_vfy_check_trust(X509_STORE_CTX *ctx);
95int x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx); 95int x509_vfy_check_chain_extensions(X509_STORE_CTX *ctx);
96int x509_vfy_callback_indicate_completion(X509_STORE_CTX *ctx); 96int x509_vfy_callback_indicate_completion(X509_STORE_CTX *ctx);
97void x509v3_cache_extensions(X509 *x); 97int x509v3_cache_extensions(X509 *x);
98X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x); 98X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x);
99 99
100time_t x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notafter); 100time_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
79void x509v3_cache_extensions(X509 *x);
80
81static int check_ssl_ca(const X509 *x); 79static int check_ssl_ca(const X509 *x);
82static int check_purpose_ssl_client(const X509_PURPOSE *xp, const X509 *x, 80static 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
452void 446static void
453x509v3_cache_extensions(X509 *x) 447x509v3_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
637int
638x509v3_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)
680int 686int
681X509_check_ca(X509 *x) 687X509_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)
241static int 241static int
242x509_verify_cert_cache_extensions(X509 *cert) 242x509_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
255static int 247static int