summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libcrypto/x509/x509_internal.h7
-rw-r--r--src/lib/libcrypto/x509/x509_purp.c5
-rw-r--r--src/lib/libcrypto/x509/x509_verify.c38
-rw-r--r--src/lib/libcrypto/x509/x509_vfy.c5
4 files changed, 36 insertions, 19 deletions
diff --git a/src/lib/libcrypto/x509/x509_internal.h b/src/lib/libcrypto/x509/x509_internal.h
index 15efff6097..280d1ae46c 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.26 2023/09/29 15:53:59 beck Exp $ */ 1/* $OpenBSD: x509_internal.h,v 1.27 2023/11/13 10:33:00 tb Exp $ */
2/* 2/*
3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org> 3 * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
4 * 4 *
@@ -96,7 +96,8 @@ int x509_vfy_callback_indicate_completion(X509_STORE_CTX *ctx);
96int x509v3_cache_extensions(X509 *x); 96int x509v3_cache_extensions(X509 *x);
97X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x); 97X509 *x509_vfy_lookup_cert_match(X509_STORE_CTX *ctx, X509 *x);
98 98
99time_t x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notafter); 99int x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notafter,
100 time_t *out);
100 101
101struct x509_verify_ctx *x509_verify_ctx_new_from_xsc(X509_STORE_CTX *xsc); 102struct x509_verify_ctx *x509_verify_ctx_new_from_xsc(X509_STORE_CTX *xsc);
102 103
@@ -133,7 +134,7 @@ int x509_constraints_check(struct x509_constraints_names *names,
133 struct x509_constraints_names *excluded, int *error); 134 struct x509_constraints_names *excluded, int *error);
134int x509_constraints_chain(STACK_OF(X509) *chain, int *error, 135int x509_constraints_chain(STACK_OF(X509) *chain, int *error,
135 int *depth); 136 int *depth);
136void x509_verify_cert_info_populate(X509 *cert); 137int x509_verify_cert_info_populate(X509 *cert);
137int x509_vfy_check_security_level(X509_STORE_CTX *ctx); 138int x509_vfy_check_security_level(X509_STORE_CTX *ctx);
138 139
139__END_HIDDEN_DECLS 140__END_HIDDEN_DECLS
diff --git a/src/lib/libcrypto/x509/x509_purp.c b/src/lib/libcrypto/x509/x509_purp.c
index 0c92dfb19c..999ba639c5 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.29 2023/08/18 08:42:41 tb Exp $ */ 1/* $OpenBSD: x509_purp.c,v 1.30 2023/11/13 10:33:00 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 */
@@ -711,7 +711,8 @@ x509v3_cache_extensions_internal(X509 *x)
711 if (!x509_extension_oids_are_unique(x)) 711 if (!x509_extension_oids_are_unique(x))
712 x->ex_flags |= EXFLAG_INVALID; 712 x->ex_flags |= EXFLAG_INVALID;
713 713
714 x509_verify_cert_info_populate(x); 714 if (!x509_verify_cert_info_populate(x))
715 x->ex_flags |= EXFLAG_INVALID;
715 716
716 x->ex_flags |= EXFLAG_SET; 717 x->ex_flags |= EXFLAG_SET;
717} 718}
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 */
47time_t 48int
48x509_verify_asn1_time_to_time_t(const ASN1_TIME *atime, int notAfter) 49x509_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 */
85void 87int
86x509_verify_cert_info_populate(X509 *cert) 88x509_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
96struct x509_verify_chain * 112struct x509_verify_chain *
diff --git a/src/lib/libcrypto/x509/x509_vfy.c b/src/lib/libcrypto/x509/x509_vfy.c
index c4ba3d5b14..6c0ad78ec8 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.125 2023/06/08 22:02:40 beck Exp $ */ 1/* $OpenBSD: x509_vfy.c,v 1.126 2023/11/13 10:33:00 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 *
@@ -1969,8 +1969,7 @@ X509_cmp_time_internal(const ASN1_TIME *ctm, time_t *cmp_time, int is_notafter)
1969 else 1969 else
1970 compare = *cmp_time; 1970 compare = *cmp_time;
1971 1971
1972 if ((cert_time = x509_verify_asn1_time_to_time_t(ctm, is_notafter)) == 1972 if (!x509_verify_asn1_time_to_time_t(ctm, is_notafter, &cert_time))
1973 -1)
1974 return 0; /* invalid time */ 1973 return 0; /* invalid time */
1975 1974
1976 if (cert_time <= compare) 1975 if (cert_time <= compare)