diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/x509/x509_local.h | 4 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_purp.c | 5 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_verify.c | 46 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509_vfy.c | 24 |
4 files changed, 16 insertions, 63 deletions
diff --git a/src/lib/libcrypto/x509/x509_local.h b/src/lib/libcrypto/x509/x509_local.h index 73cc582d7b..5b74b0d1bd 100644 --- a/src/lib/libcrypto/x509/x509_local.h +++ b/src/lib/libcrypto/x509/x509_local.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509_local.h,v 1.23 2024/03/26 05:39:47 tb Exp $ */ | 1 | /* $OpenBSD: x509_local.h,v 1.24 2024/04/08 23:46:21 beck 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 2013. | 3 | * project 2013. |
4 | */ | 4 | */ |
@@ -188,8 +188,6 @@ struct x509_st { | |||
188 | struct ASIdentifiers_st *rfc3779_asid; | 188 | struct ASIdentifiers_st *rfc3779_asid; |
189 | #endif | 189 | #endif |
190 | unsigned char hash[X509_CERT_HASH_LEN]; | 190 | unsigned char hash[X509_CERT_HASH_LEN]; |
191 | time_t not_before; | ||
192 | time_t not_after; | ||
193 | X509_CERT_AUX *aux; | 191 | X509_CERT_AUX *aux; |
194 | } /* X509 */; | 192 | } /* X509 */; |
195 | 193 | ||
diff --git a/src/lib/libcrypto/x509/x509_purp.c b/src/lib/libcrypto/x509/x509_purp.c index 53f4f2f967..8f4e5934e1 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.39 2024/03/02 10:43:52 tb Exp $ */ | 1 | /* $OpenBSD: x509_purp.c,v 1.40 2024/04/08 23:46:21 beck 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 | */ |
@@ -559,9 +559,6 @@ x509v3_cache_extensions_internal(X509 *x) | |||
559 | if (!x509_extension_oids_are_unique(x)) | 559 | if (!x509_extension_oids_are_unique(x)) |
560 | x->ex_flags |= EXFLAG_INVALID; | 560 | x->ex_flags |= EXFLAG_INVALID; |
561 | 561 | ||
562 | if (!x509_verify_cert_info_populate(x)) | ||
563 | x->ex_flags |= EXFLAG_INVALID; | ||
564 | |||
565 | x->ex_flags |= EXFLAG_SET; | 562 | x->ex_flags |= EXFLAG_SET; |
566 | } | 563 | } |
567 | 564 | ||
diff --git a/src/lib/libcrypto/x509/x509_verify.c b/src/lib/libcrypto/x509/x509_verify.c index 19bb925d9c..c7b2219fa9 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.68 2024/02/01 23:16:38 beck Exp $ */ | 1 | /* $OpenBSD: x509_verify.c,v 1.69 2024/04/08 23:46:21 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 | * |
@@ -52,6 +52,9 @@ x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter, | |||
52 | struct tm tm = { 0 }; | 52 | struct tm tm = { 0 }; |
53 | int type; | 53 | int type; |
54 | 54 | ||
55 | if (atime == NULL) | ||
56 | return 0; | ||
57 | |||
55 | type = ASN1_time_parse(atime->data, atime->length, &tm, atime->type); | 58 | type = ASN1_time_parse(atime->data, atime->length, &tm, atime->type); |
56 | if (type == -1) | 59 | if (type == -1) |
57 | return 0; | 60 | return 0; |
@@ -80,35 +83,6 @@ x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter, | |||
80 | return asn1_time_tm_to_time_t(&tm, out); | 83 | return asn1_time_tm_to_time_t(&tm, out); |
81 | } | 84 | } |
82 | 85 | ||
83 | /* | ||
84 | * Cache certificate hash, and values parsed out of an X509. | ||
85 | * called from cache_extensions() | ||
86 | */ | ||
87 | int | ||
88 | x509_verify_cert_info_populate(X509 *cert) | ||
89 | { | ||
90 | const ASN1_TIME *notBefore, *notAfter; | ||
91 | |||
92 | /* | ||
93 | * Parse and save the cert times, or remember that they | ||
94 | * are unacceptable/unparsable. | ||
95 | */ | ||
96 | |||
97 | cert->not_before = cert->not_after = -1; | ||
98 | |||
99 | if ((notBefore = X509_get_notBefore(cert)) == NULL) | ||
100 | return 0; | ||
101 | if ((notAfter = X509_get_notAfter(cert)) == NULL) | ||
102 | return 0; | ||
103 | |||
104 | if (!x509_verify_asn1_time_to_time_t(notBefore, 0, &cert->not_before)) | ||
105 | return 0; | ||
106 | if (!x509_verify_asn1_time_to_time_t(notAfter, 1, &cert->not_after)) | ||
107 | return 0; | ||
108 | |||
109 | return 1; | ||
110 | } | ||
111 | |||
112 | struct x509_verify_chain * | 86 | struct x509_verify_chain * |
113 | x509_verify_chain_new(void) | 87 | x509_verify_chain_new(void) |
114 | { | 88 | { |
@@ -840,26 +814,28 @@ x509_verify_set_check_time(struct x509_verify_ctx *ctx) | |||
840 | static int | 814 | static int |
841 | x509_verify_cert_times(X509 *cert, time_t *cmp_time, int *error) | 815 | x509_verify_cert_times(X509 *cert, time_t *cmp_time, int *error) |
842 | { | 816 | { |
843 | time_t when; | 817 | time_t when, not_before, not_after; |
844 | 818 | ||
845 | if (cmp_time == NULL) | 819 | if (cmp_time == NULL) |
846 | when = time(NULL); | 820 | when = time(NULL); |
847 | else | 821 | else |
848 | when = *cmp_time; | 822 | when = *cmp_time; |
849 | 823 | ||
850 | if (cert->not_before == -1) { | 824 | if (!x509_verify_asn1_time_to_time_t(X509_get_notBefore(cert), 0, |
825 | ¬_before)) { | ||
851 | *error = X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; | 826 | *error = X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; |
852 | return 0; | 827 | return 0; |
853 | } | 828 | } |
854 | if (when < cert->not_before) { | 829 | if (when < not_before) { |
855 | *error = X509_V_ERR_CERT_NOT_YET_VALID; | 830 | *error = X509_V_ERR_CERT_NOT_YET_VALID; |
856 | return 0; | 831 | return 0; |
857 | } | 832 | } |
858 | if (cert->not_after == -1) { | 833 | if (!x509_verify_asn1_time_to_time_t(X509_get_notAfter(cert), 1, |
834 | ¬_after)) { | ||
859 | *error = X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; | 835 | *error = X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; |
860 | return 0; | 836 | return 0; |
861 | } | 837 | } |
862 | if (when > cert->not_after) { | 838 | if (when > not_after) { |
863 | *error = X509_V_ERR_CERT_HAS_EXPIRED; | 839 | *error = X509_V_ERR_CERT_HAS_EXPIRED; |
864 | return 0; | 840 | return 0; |
865 | } | 841 | } |
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c index 5399658639..501f5e5710 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.142 2024/03/02 10:40:05 tb Exp $ */ | 1 | /* $OpenBSD: x509_vfy.c,v 1.143 2024/04/08 23:46:21 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 | * |
@@ -1744,18 +1744,6 @@ verify_cb_cert(X509_STORE_CTX *ctx, X509 *x, int depth, int err) | |||
1744 | return ctx->verify_cb(0, ctx); | 1744 | return ctx->verify_cb(0, ctx); |
1745 | } | 1745 | } |
1746 | 1746 | ||
1747 | |||
1748 | /* Mimic OpenSSL '0 for failure' ick */ | ||
1749 | static int | ||
1750 | time_t_bogocmp(time_t a, time_t b) | ||
1751 | { | ||
1752 | if (a == -1 || b == -1) | ||
1753 | return 0; | ||
1754 | if (a <= b) | ||
1755 | return -1; | ||
1756 | return 1; | ||
1757 | } | ||
1758 | |||
1759 | /* | 1747 | /* |
1760 | * Check certificate validity times. | 1748 | * Check certificate validity times. |
1761 | * | 1749 | * |
@@ -1777,10 +1765,7 @@ x509_check_cert_time(X509_STORE_CTX *ctx, X509 *x, int depth) | |||
1777 | else | 1765 | else |
1778 | ptime = time(NULL); | 1766 | ptime = time(NULL); |
1779 | 1767 | ||
1780 | if (x->ex_flags & EXFLAG_SET) | 1768 | i = X509_cmp_time(X509_get_notBefore(x), &ptime); |
1781 | i = time_t_bogocmp(x->not_before, ptime); | ||
1782 | else | ||
1783 | i = X509_cmp_time(X509_get_notBefore(x), &ptime); | ||
1784 | 1769 | ||
1785 | if (i >= 0 && depth < 0) | 1770 | if (i >= 0 && depth < 0) |
1786 | return 0; | 1771 | return 0; |
@@ -1791,10 +1776,7 @@ x509_check_cert_time(X509_STORE_CTX *ctx, X509 *x, int depth) | |||
1791 | X509_V_ERR_CERT_NOT_YET_VALID)) | 1776 | X509_V_ERR_CERT_NOT_YET_VALID)) |
1792 | return 0; | 1777 | return 0; |
1793 | 1778 | ||
1794 | if (x->ex_flags & EXFLAG_SET) | 1779 | i = X509_cmp_time_internal(X509_get_notAfter(x), &ptime, 1); |
1795 | i = time_t_bogocmp(x->not_after, ptime); | ||
1796 | else | ||
1797 | i = X509_cmp_time_internal(X509_get_notAfter(x), &ptime, 1); | ||
1798 | 1780 | ||
1799 | if (i <= 0 && depth < 0) | 1781 | if (i <= 0 && depth < 0) |
1800 | return 0; | 1782 | return 0; |