diff options
| author | job <> | 2023-04-23 21:31:16 +0000 |
|---|---|---|
| committer | job <> | 2023-04-23 21:31:16 +0000 |
| commit | 182c5d6fe4249dcf1252e2a8985431d3f12968d6 (patch) | |
| tree | 6845cb5f4e2722640f5effb72fa388651a08a748 /src/lib/libcrypto/asn1/x_x509.c | |
| parent | 13ba643374d5ff84130d05ec7c88f7fd1e4c2308 (diff) | |
| download | openbsd-182c5d6fe4249dcf1252e2a8985431d3f12968d6.tar.gz openbsd-182c5d6fe4249dcf1252e2a8985431d3f12968d6.tar.bz2 openbsd-182c5d6fe4249dcf1252e2a8985431d3f12968d6.zip | |
Add compliance checks for the X.509 version field
Check whether the X.509 version is in the range of valid version
values, and also checks whether the version is consistent with fields
new to those versions (such as X.509 v3 extensions).
X.690 section 11.5 states: "The encoding of a set value or a sequence
value shall not include an encoding for any component value which is
equal to its default value." However, enforcing version 1 (value 0) to
be absent reportedly caused some issues as recent as July 2020, so
accept version 1 even if it is explicitly encoded.
OK tb@ beck@
Diffstat (limited to 'src/lib/libcrypto/asn1/x_x509.c')
| -rw-r--r-- | src/lib/libcrypto/asn1/x_x509.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/lib/libcrypto/asn1/x_x509.c b/src/lib/libcrypto/asn1/x_x509.c index 227af88e82..87b714877f 100644 --- a/src/lib/libcrypto/asn1/x_x509.c +++ b/src/lib/libcrypto/asn1/x_x509.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: x_x509.c,v 1.31 2022/11/26 16:08:50 tb Exp $ */ | 1 | /* $OpenBSD: x_x509.c,v 1.32 2023/04/23 21:31:16 job 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 | * |
| @@ -61,6 +61,7 @@ | |||
| 61 | #include <openssl/opensslconf.h> | 61 | #include <openssl/opensslconf.h> |
| 62 | 62 | ||
| 63 | #include <openssl/asn1t.h> | 63 | #include <openssl/asn1t.h> |
| 64 | #include <openssl/err.h> | ||
| 64 | #include <openssl/evp.h> | 65 | #include <openssl/evp.h> |
| 65 | #include <openssl/x509.h> | 66 | #include <openssl/x509.h> |
| 66 | #include <openssl/x509v3.h> | 67 | #include <openssl/x509v3.h> |
| @@ -194,10 +195,34 @@ x509_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) | |||
| 194 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509, ret, &ret->ex_data); | 195 | CRYPTO_new_ex_data(CRYPTO_EX_INDEX_X509, ret, &ret->ex_data); |
| 195 | break; | 196 | break; |
| 196 | 197 | ||
| 197 | case ASN1_OP_D2I_POST: | 198 | case ASN1_OP_D2I_POST: { |
| 199 | const ASN1_BIT_STRING *issuerUID = NULL, *subjectUID = NULL; | ||
| 200 | long version; | ||
| 201 | |||
| 202 | version = X509_get_version(ret); | ||
| 203 | /* accept 0 despite DER requiring omission of default values */ | ||
| 204 | if (version < 0 || version > 2) { | ||
| 205 | X509error(X509_R_INVALID_VERSION); | ||
| 206 | return 0; | ||
| 207 | } | ||
| 208 | |||
| 209 | /* RFC 5280 section 4.1.2.8, these fields require v2 or v3 */ | ||
| 210 | X509_get0_uids(ret, &issuerUID, &subjectUID); | ||
| 211 | if ((issuerUID != NULL || subjectUID != NULL) && version == 0) { | ||
| 212 | X509error(X509_R_INVALID_VERSION); | ||
| 213 | return 0; | ||
| 214 | } | ||
| 215 | |||
| 216 | /* RFC 5280 section 4.1.2.9, extensions require v3. */ | ||
| 217 | if (X509_get_ext_count(ret) != 0 && version != 2) { | ||
| 218 | X509error(X509_R_INVALID_VERSION); | ||
| 219 | return 0; | ||
| 220 | } | ||
| 221 | |||
| 198 | free(ret->name); | 222 | free(ret->name); |
| 199 | ret->name = X509_NAME_oneline(ret->cert_info->subject, NULL, 0); | 223 | ret->name = X509_NAME_oneline(ret->cert_info->subject, NULL, 0); |
| 200 | break; | 224 | break; |
| 225 | } | ||
| 201 | 226 | ||
| 202 | case ASN1_OP_FREE_POST: | 227 | case ASN1_OP_FREE_POST: |
| 203 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509, ret, &ret->ex_data); | 228 | CRYPTO_free_ex_data(CRYPTO_EX_INDEX_X509, ret, &ret->ex_data); |
