summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2024-03-26 11:09:37 +0000
committertb <>2024-03-26 11:09:37 +0000
commit62319c0b6abd501459acfd764bc907fa318e7908 (patch)
tree55bf58b00580d5fb147db038af10fae180e8b193 /src/lib
parentfd23854bc7a3f24b804341870d0979d7a3643d3e (diff)
downloadopenbsd-62319c0b6abd501459acfd764bc907fa318e7908.tar.gz
openbsd-62319c0b6abd501459acfd764bc907fa318e7908.tar.bz2
openbsd-62319c0b6abd501459acfd764bc907fa318e7908.zip
Reject setting invalid versions for certs, CRLs and CSRs
The toolkit aspect bites again. Lots of invalid CRLs and CSRs are produced because people neither read the RFCs nor does the toolkit check anything it is fed. Reviewers apparently also aren't capable of remembering that they have three copy-pasted versions of the same API and that adding a version check to one of the might suggest adding one for the other two. This requires ruby-openssl 20240326p0 to pass ok beck job jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libcrypto/x509/x509_set.c8
-rw-r--r--src/lib/libcrypto/x509/x509cset.c8
-rw-r--r--src/lib/libcrypto/x509/x509rset.c5
3 files changed, 18 insertions, 3 deletions
diff --git a/src/lib/libcrypto/x509/x509_set.c b/src/lib/libcrypto/x509/x509_set.c
index b56d30aec5..684a899781 100644
--- a/src/lib/libcrypto/x509/x509_set.c
+++ b/src/lib/libcrypto/x509/x509_set.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_set.c,v 1.26 2023/06/23 08:00:28 tb Exp $ */ 1/* $OpenBSD: x509_set.c,v 1.27 2024/03/26 11:09:37 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 *
@@ -84,6 +84,12 @@ X509_set_version(X509 *x, long version)
84{ 84{
85 if (x == NULL) 85 if (x == NULL)
86 return (0); 86 return (0);
87 /*
88 * RFC 5280, 4.1: versions 1 - 3 are specified as follows.
89 * Version ::= INTEGER { v1(0), v2(1), v3(2) }
90 */
91 if (version < 0 || version > 2)
92 return (0);
87 if (x->cert_info->version == NULL) { 93 if (x->cert_info->version == NULL) {
88 if ((x->cert_info->version = ASN1_INTEGER_new()) == NULL) 94 if ((x->cert_info->version = ASN1_INTEGER_new()) == NULL)
89 return (0); 95 return (0);
diff --git a/src/lib/libcrypto/x509/x509cset.c b/src/lib/libcrypto/x509/x509cset.c
index 7904a7d670..a80d5f21d3 100644
--- a/src/lib/libcrypto/x509/x509cset.c
+++ b/src/lib/libcrypto/x509/x509cset.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509cset.c,v 1.19 2023/02/16 08:38:17 tb Exp $ */ 1/* $OpenBSD: x509cset.c,v 1.20 2024/03/26 11:09:37 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 */
@@ -78,6 +78,12 @@ X509_CRL_set_version(X509_CRL *x, long version)
78{ 78{
79 if (x == NULL) 79 if (x == NULL)
80 return (0); 80 return (0);
81 /*
82 * RFC 5280, 4.1: versions 1 - 3 are specified as follows.
83 * Version ::= INTEGER { v1(0), v2(1), v3(2) }
84 */
85 if (version < 0 || version > 1)
86 return (0);
81 if (x->crl->version == NULL) { 87 if (x->crl->version == NULL) {
82 if ((x->crl->version = ASN1_INTEGER_new()) == NULL) 88 if ((x->crl->version = ASN1_INTEGER_new()) == NULL)
83 return (0); 89 return (0);
diff --git a/src/lib/libcrypto/x509/x509rset.c b/src/lib/libcrypto/x509/x509rset.c
index b05b2a1c91..6ac64f199d 100644
--- a/src/lib/libcrypto/x509/x509rset.c
+++ b/src/lib/libcrypto/x509/x509rset.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509rset.c,v 1.14 2024/03/25 12:10:57 jsing Exp $ */ 1/* $OpenBSD: x509rset.c,v 1.15 2024/03/26 11:09:37 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 *
@@ -70,6 +70,9 @@ X509_REQ_set_version(X509_REQ *x, long version)
70{ 70{
71 if (x == NULL) 71 if (x == NULL)
72 return (0); 72 return (0);
73 /* RFC 2986 section 4.1 only specifies version 1, encoded as a 0. */
74 if (version != 0)
75 return (0);
73 x->req_info->enc.modified = 1; 76 x->req_info->enc.modified = 1;
74 return (ASN1_INTEGER_set(x->req_info->version, version)); 77 return (ASN1_INTEGER_set(x->req_info->version, version));
75} 78}