diff options
Diffstat (limited to 'src/lib/libcrypto/x509/x509_verify.c')
-rw-r--r-- | src/lib/libcrypto/x509/x509_verify.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/src/lib/libcrypto/x509/x509_verify.c b/src/lib/libcrypto/x509/x509_verify.c index ca4814d938..c4c89a23b9 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.66 2023/05/07 07:11:50 tb Exp $ */ | 1 | /* $OpenBSD: x509_verify.c,v 1.67 2023/11/13 10:33:00 tb 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 | * |
@@ -27,6 +27,7 @@ | |||
27 | #include <openssl/x509.h> | 27 | #include <openssl/x509.h> |
28 | #include <openssl/x509v3.h> | 28 | #include <openssl/x509v3.h> |
29 | 29 | ||
30 | #include "asn1_local.h" | ||
30 | #include "x509_internal.h" | 31 | #include "x509_internal.h" |
31 | #include "x509_issuer_cache.h" | 32 | #include "x509_issuer_cache.h" |
32 | 33 | ||
@@ -44,21 +45,22 @@ static void x509_verify_chain_free(struct x509_verify_chain *chain); | |||
44 | * Parse an asn1 to a representable time_t as per RFC 5280 rules. | 45 | * Parse an asn1 to a representable time_t as per RFC 5280 rules. |
45 | * Returns -1 if that can't be done for any reason. | 46 | * Returns -1 if that can't be done for any reason. |
46 | */ | 47 | */ |
47 | time_t | 48 | int |
48 | x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter) | 49 | x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter, |
50 | time_t *out) | ||
49 | { | 51 | { |
50 | struct tm tm = { 0 }; | 52 | struct tm tm = { 0 }; |
51 | int type; | 53 | int type; |
52 | 54 | ||
53 | type = ASN1_time_parse(atime->data, atime->length, &tm, atime->type); | 55 | type = ASN1_time_parse(atime->data, atime->length, &tm, atime->type); |
54 | if (type == -1) | 56 | if (type == -1) |
55 | return -1; | 57 | return 0; |
56 | 58 | ||
57 | /* RFC 5280 section 4.1.2.5 */ | 59 | /* RFC 5280 section 4.1.2.5 */ |
58 | if (tm.tm_year < 150 && type != V_ASN1_UTCTIME) | 60 | if (tm.tm_year < 150 && type != V_ASN1_UTCTIME) |
59 | return -1; | 61 | return 0; |
60 | if (tm.tm_year >= 150 && type != V_ASN1_GENERALIZEDTIME) | 62 | if (tm.tm_year >= 150 && type != V_ASN1_GENERALIZEDTIME) |
61 | return -1; | 63 | return 0; |
62 | 64 | ||
63 | if (notAfter) { | 65 | if (notAfter) { |
64 | /* | 66 | /* |
@@ -67,7 +69,7 @@ x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter) | |||
67 | * date, limit the date to a 32 bit representable value. | 69 | * date, limit the date to a 32 bit representable value. |
68 | */ | 70 | */ |
69 | if (!ASN1_time_tm_clamp_notafter(&tm)) | 71 | if (!ASN1_time_tm_clamp_notafter(&tm)) |
70 | return -1; | 72 | return 0; |
71 | } | 73 | } |
72 | 74 | ||
73 | /* | 75 | /* |
@@ -75,22 +77,36 @@ x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter) | |||
75 | * a time_t. A time_t must be sane if you care about times after | 77 | * a time_t. A time_t must be sane if you care about times after |
76 | * Jan 19 2038. | 78 | * Jan 19 2038. |
77 | */ | 79 | */ |
78 | return timegm(&tm); | 80 | return asn1_time_tm_to_time_t(&tm, out); |
79 | } | 81 | } |
80 | 82 | ||
81 | /* | 83 | /* |
82 | * Cache certificate hash, and values parsed out of an X509. | 84 | * Cache certificate hash, and values parsed out of an X509. |
83 | * called from cache_extensions() | 85 | * called from cache_extensions() |
84 | */ | 86 | */ |
85 | void | 87 | int |
86 | x509_verify_cert_info_populate(X509 *cert) | 88 | x509_verify_cert_info_populate(X509 *cert) |
87 | { | 89 | { |
90 | const ASN1_TIME *notBefore, *notAfter; | ||
91 | |||
88 | /* | 92 | /* |
89 | * Parse and save the cert times, or remember that they | 93 | * Parse and save the cert times, or remember that they |
90 | * are unacceptable/unparsable. | 94 | * are unacceptable/unparsable. |
91 | */ | 95 | */ |
92 | cert->not_before = x509_verify_asn1_time_to_time_t(X509_get_notBefore(cert), 0); | 96 | |
93 | cert->not_after = x509_verify_asn1_time_to_time_t(X509_get_notAfter(cert), 1); | 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; | ||
94 | } | 110 | } |
95 | 111 | ||
96 | struct x509_verify_chain * | 112 | struct x509_verify_chain * |