summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.lgtm.yml14
-rw-r--r--bootstrap.conf6
-rw-r--r--fuzz/gnutls_x509_crl_parser_fuzzer.repro/698e01fdc3f9a4c402424302768da75f2464a63fbin0 -> 554 bytes
-rw-r--r--fuzz/gnutls_x509_crq_parser_fuzzer.repro/609921afff38ec5b52feb7e17aa3035bdce0e0d3bin0 -> 830 bytes
-rw-r--r--lib/gnutls_int.h28
-rw-r--r--lib/hello_ext.c2
-rw-r--r--lib/hello_ext.h4
-rw-r--r--lib/x509/common.c20
-rw-r--r--lib/x509/common.h2
-rw-r--r--lib/x509/crl.c13
-rw-r--r--lib/x509/ocsp.c31
-rw-r--r--lib/x509/output.c24
-rw-r--r--lib/x509/x509.c19
-rw-r--r--tests/cert-tests/data/crl-demo3.pem2
14 files changed, 62 insertions, 103 deletions
diff --git a/.lgtm.yml b/.lgtm.yml
index 82ecb4d8f8..be8dfe1e2e 100644
--- a/.lgtm.yml
+++ b/.lgtm.yml
@@ -2,15 +2,9 @@ extraction:
cpp:
configure:
command:
+ - sed 's/--with-tests/--without-tests/g' -i bootstrap.conf
- "./bootstrap --no-git --skip-po --no-bootstrap-sync --gnulib-srcdir=gnulib"
- - "wget -O nettle-master.zip https://git.lysator.liu.se/nettle/nettle/-/archive/master/nettle-master.zip?foo=`date +%Y%m%d`"
- - "unzip nettle-master.zip"
- - "mv nettle-master nettle"
- - "cd nettle"
- - "bash .bootstrap"
- - "./configure --enable-mini-gmp --disable-documentation"
- - "make"
- - "cd .."
- - "PKG_CONFIG_PATH=\"`pwd`/nettle\" LDFLAGS=\"-L`pwd`/nettle\" ./configure --disable-tests --disable-doc"
+ - "./configure --disable-tests --disable-doc --disable-gtk-doc --disable-dependency-tracking"
index:
- build_command: "LD_LIBRARY_PATH=\"`pwd`/nettle/.lib\" make"
+ build_command:
+ - "make -j4"
diff --git a/bootstrap.conf b/bootstrap.conf
index f47b81aa68..9216ab6cf3 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -28,7 +28,7 @@ required_submodules="tests/suite/tls-fuzzer/python-ecdsa tests/suite/tls-fuzzer/
# Reproduce by: gnulib-tool --import --local-dir=gl/override --lib=libgnu --source-base=gl --m4-base=gl/m4 --doc-base=doc --tests-base=gl/tests --aux-dir=build-aux --with-tests --avoid=alignof-tests --avoid=lock-tests --avoid=lseek-tests --lgpl=2 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files alloca byteswap c-ctype extensions func gendocs getline gettext-h gettimeofday hash-pjw-bare havelib intprops lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings memmem-simple minmax netdb netinet_in pmccabe2html read-file secure_getenv snprintf stdint strcase strndup strtok_r strverscmp sys_socket sys_stat time_r unistd vasprintf vsnprintf warnings
gnulib_modules="
-alloca byteswap c-ctype c-strcase extensions func gendocs getline gettext-h gettimeofday hash hash-pjw-bare havelib arpa_inet inet_ntop inet_pton intprops lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings memmem-simple minmax netdb netinet_in pmccabe2html read-file secure_getenv setsockopt snprintf stdint strcase strdup-posix strndup strtok_r strverscmp sys_socket sys_stat sys_types time_r unistd valgrind-tests vasprintf vsnprintf warnings
+alloca byteswap c-ctype c-strcase extensions func gendocs getline gettext-h gettimeofday hash hash-pjw-bare havelib arpa_inet inet_ntop inet_pton intprops lib-msvc-compat lib-symbol-versions maintainer-makefile manywarnings memmem-simple minmax netdb netinet_in pmccabe2html read-file secure_getenv setsockopt snprintf stdint strcase strdup-posix strndup strtok_r strverscmp sys_socket sys_stat sys_types time_r unistd valgrind-tests vasprintf verify vsnprintf warnings
"
unistring_modules="
@@ -93,9 +93,9 @@ bootstrap_post_import_hook ()
# sed -i 's/malloc-posix//g' ${GNULIB_SRCDIR}/modules/$i
# done
- ${GNULIB_SRCDIR}/gnulib-tool --import --local-dir=lib/unistring/override --lib=libunistring --source-base=lib/unistring --m4-base=lib/unistring/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3orGPLv2 --no-conditional-dependencies --libtool --macro-prefix=unistring ${unistring_modules}
+ ${GNULIB_SRCDIR}/gnulib-tool --import --local-dir=lib/unistring/override --lib=libunistring --source-base=lib/unistring --m4-base=lib/unistring/m4 --doc-base=doc --aux-dir=build-aux --lgpl=3orGPLv2 --no-conditional-dependencies --libtool --without-tests --macro-prefix=unistring ${unistring_modules}
- ${GNULIB_SRCDIR}/gnulib-tool --import --local-dir=src/gl/override --lib=libgnu_gpl --source-base=src/gl --m4-base=src/gl/m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --no-conditional-dependencies --libtool --macro-prefix=ggl --no-vc-files ${src_modules}
+ ${GNULIB_SRCDIR}/gnulib-tool --import --local-dir=src/gl/override --lib=libgnu_gpl --source-base=src/gl --m4-base=src/gl/m4 --doc-base=doc --aux-dir=build-aux --no-conditional-dependencies --libtool --macro-prefix=ggl --without-tests --no-vc-files ${src_modules}
# git -C ${GNULIB_SRCDIR} reset --hard
diff --git a/fuzz/gnutls_x509_crl_parser_fuzzer.repro/698e01fdc3f9a4c402424302768da75f2464a63f b/fuzz/gnutls_x509_crl_parser_fuzzer.repro/698e01fdc3f9a4c402424302768da75f2464a63f
new file mode 100644
index 0000000000..9cc53a3e7d
--- /dev/null
+++ b/fuzz/gnutls_x509_crl_parser_fuzzer.repro/698e01fdc3f9a4c402424302768da75f2464a63f
Binary files differ
diff --git a/fuzz/gnutls_x509_crq_parser_fuzzer.repro/609921afff38ec5b52feb7e17aa3035bdce0e0d3 b/fuzz/gnutls_x509_crq_parser_fuzzer.repro/609921afff38ec5b52feb7e17aa3035bdce0e0d3
new file mode 100644
index 0000000000..4fe047d3c3
--- /dev/null
+++ b/fuzz/gnutls_x509_crq_parser_fuzzer.repro/609921afff38ec5b52feb7e17aa3035bdce0e0d3
Binary files differ
diff --git a/lib/gnutls_int.h b/lib/gnutls_int.h
index d9d851be62..4ea8159979 100644
--- a/lib/gnutls_int.h
+++ b/lib/gnutls_int.h
@@ -146,7 +146,7 @@ typedef int ssize_t;
/* TLS Extensions */
/* we can receive up to MAX_EXT_TYPES extensions.
*/
-#define MAX_EXT_TYPES 32
+#define MAX_EXT_TYPES 64
/* TLS-internal extension (will be parsed after a ciphersuite is selected).
* This amends the gnutls_ext_parse_type_t. Not exported yet to allow more refining
@@ -358,22 +358,24 @@ typedef enum extensions_t {
GNUTLS_EXTENSION_MAX /* not real extension - used for iterators */
} extensions_t;
-#define GNUTLS_EXTENSION_MAX_VALUE 31
-#define ext_track_t uint32_t
+#define GNUTLS_EXTENSION_MAX_VALUE 63
+#define ext_track_t uint64_t
-#if GNUTLS_EXTENSION_MAX >= GNUTLS_EXTENSION_MAX_VALUE
-# error over limit
-#endif
+#include <verify.h>
-#if GNUTLS_EXTENSION_MAX >= MAX_EXT_TYPES
-# error over limit
-#endif
+verify(GNUTLS_EXTENSION_MAX < GNUTLS_EXTENSION_MAX_VALUE);
+verify(GNUTLS_EXTENSION_MAX < MAX_EXT_TYPES);
-/* we must provide at least 16 extensions for users to register */
-#if GNUTLS_EXTENSION_MAX_VALUE - GNUTLS_EXTENSION_MAX < 16
-# error not enough extension types; increase GNUTLS_EXTENSION_MAX_VALUE, MAX_EXT_TYPES and used_exts type
-#endif
+/* we must provide at least 16 extensions for users to register;
+ * increase GNUTLS_EXTENSION_MAX_VALUE, MAX_EXT_TYPES and used_exts
+ * type if this fails
+ */
+verify(GNUTLS_EXTENSION_MAX_VALUE - GNUTLS_EXTENSION_MAX >= 16);
+/* The 'verify' symbol from <verify.h> is used extensively in the
+ * code; undef it to avoid clash
+ */
+#undef verify
typedef enum { CIPHER_STREAM, CIPHER_BLOCK, CIPHER_AEAD } cipher_type_t;
diff --git a/lib/hello_ext.c b/lib/hello_ext.c
index 0c6c0dca01..1df1506e0b 100644
--- a/lib/hello_ext.c
+++ b/lib/hello_ext.c
@@ -520,7 +520,7 @@ int _gnutls_hello_ext_pack(gnutls_session_t session, gnutls_buffer_st *packed)
BUFFER_APPEND_NUM(packed, 0);
for (i = 0; i <= GNUTLS_EXTENSION_MAX_VALUE; i++) {
- if (session->internals.used_exts & (1U << i)) {
+ if (session->internals.used_exts & ((ext_track_t)1 << i)) {
ext = gid_to_ext_entry(session, i);
if (ext == NULL)
diff --git a/lib/hello_ext.h b/lib/hello_ext.h
index 38b28ae069..a7b921875d 100644
--- a/lib/hello_ext.h
+++ b/lib/hello_ext.h
@@ -160,7 +160,7 @@ typedef struct hello_ext_entry_st {
inline static unsigned
_gnutls_hello_ext_is_present(gnutls_session_t session, extensions_t id)
{
- if (session->internals.used_exts & (1U << id))
+ if (session->internals.used_exts & ((ext_track_t)1 << id))
return 1;
return 0;
@@ -184,7 +184,7 @@ unsigned _gnutls_hello_ext_save(gnutls_session_t session,
return 0;
}
- session->internals.used_exts |= (1U << id);
+ session->internals.used_exts |= ((ext_track_t)1 << id);
return 1;
}
diff --git a/lib/x509/common.c b/lib/x509/common.c
index 4939d07d2b..fbc7cc975f 100644
--- a/lib/x509/common.c
+++ b/lib/x509/common.c
@@ -1926,3 +1926,23 @@ gnutls_gost_paramset_t gnutls_oid_to_gost_paramset(const char *oid)
else
return gnutls_assert_val(GNUTLS_GOST_PARAMSET_UNKNOWN);
}
+
+int _gnutls_x509_get_version(ASN1_TYPE root, const char *name)
+{
+ uint8_t version[8];
+ int len, result;
+
+ len = sizeof(version);
+ result = asn1_read_value(root, name, version, &len);
+ if (result != ASN1_SUCCESS) {
+ if (result == ASN1_ELEMENT_NOT_FOUND)
+ return 1; /* the DEFAULT version */
+ gnutls_assert();
+ return _gnutls_asn2err(result);
+ }
+
+ if (len != 1 || version[0] >= 0x80)
+ return gnutls_assert_val(GNUTLS_E_ASN1_DER_ERROR);
+
+ return (int) version[0] + 1;
+}
diff --git a/lib/x509/common.h b/lib/x509/common.h
index 498ccc4e97..54ded21188 100644
--- a/lib/x509/common.h
+++ b/lib/x509/common.h
@@ -264,6 +264,8 @@ int _gnutls_x509_decode_ext(const gnutls_datum_t *der, gnutls_x509_ext_st *out);
int _gnutls_x509_raw_crt_to_raw_pubkey(const gnutls_datum_t * cert,
gnutls_datum_t * rpubkey);
+int _gnutls_x509_get_version(ASN1_TYPE root, const char *name);
+
int x509_crt_to_raw_pubkey(gnutls_x509_crt_t crt,
gnutls_datum_t * rpubkey);
diff --git a/lib/x509/crl.c b/lib/x509/crl.c
index 82deb5e60a..76d90925e8 100644
--- a/lib/x509/crl.c
+++ b/lib/x509/crl.c
@@ -484,23 +484,12 @@ gnutls_x509_crl_get_signature(gnutls_x509_crl_t crl,
**/
int gnutls_x509_crl_get_version(gnutls_x509_crl_t crl)
{
- uint8_t version[8];
- int len, result;
-
if (crl == NULL) {
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
}
- len = sizeof(version);
- if ((result =
- asn1_read_value(crl->crl, "tbsCertList.version", version,
- &len)) != ASN1_SUCCESS) {
- gnutls_assert();
- return _gnutls_asn2err(result);
- }
-
- return (int) version[0] + 1;
+ return _gnutls_x509_get_version(crl->crl, "tbsCertList.version");
}
/**
diff --git a/lib/x509/ocsp.c b/lib/x509/ocsp.c
index 38df56ef1c..caa511e9db 100644
--- a/lib/x509/ocsp.c
+++ b/lib/x509/ocsp.c
@@ -456,25 +456,12 @@ int gnutls_ocsp_resp_export2(gnutls_ocsp_resp_const_t resp, gnutls_datum_t * dat
**/
int gnutls_ocsp_req_get_version(gnutls_ocsp_req_const_t req)
{
- uint8_t version[8];
- int len, ret;
-
if (req == NULL) {
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
}
- len = sizeof(version);
- ret =
- asn1_read_value(req->req, "tbsRequest.version", version, &len);
- if (ret != ASN1_SUCCESS) {
- if (ret == ASN1_ELEMENT_NOT_FOUND)
- return 1; /* the DEFAULT version */
- gnutls_assert();
- return _gnutls_asn2err(ret);
- }
-
- return (int) version[0] + 1;
+ return _gnutls_x509_get_version(req->req, "tbsRequest.version");
}
/**
@@ -1153,26 +1140,12 @@ gnutls_ocsp_resp_get_response(gnutls_ocsp_resp_const_t resp,
**/
int gnutls_ocsp_resp_get_version(gnutls_ocsp_resp_const_t resp)
{
- uint8_t version[8];
- int len, ret;
-
if (resp == NULL) {
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
}
- len = sizeof(version);
- ret =
- asn1_read_value(resp->resp, "tbsResponseData.version", version,
- &len);
- if (ret != ASN1_SUCCESS) {
- if (ret == ASN1_ELEMENT_NOT_FOUND)
- return 1; /* the DEFAULT version */
- gnutls_assert();
- return _gnutls_asn2err(ret);
- }
-
- return (int) version[0] + 1;
+ return _gnutls_x509_get_version(resp->resp, "tbsResponseData.version");
}
/**
diff --git a/lib/x509/output.c b/lib/x509/output.c
index 1e605d8fb6..8084b92b29 100644
--- a/lib/x509/output.c
+++ b/lib/x509/output.c
@@ -1282,12 +1282,12 @@ print_extensions(gnutls_buffer_st * str, const char *prefix, int type,
return;
}
+ if (err == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+ break;
if (err < 0) {
- if (err == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
- break;
addf(str, "error: get_extension_info: %s\n",
gnutls_strerror(err));
- continue;
+ break;
}
if (i == 0)
@@ -2204,9 +2204,7 @@ print_crl(gnutls_buffer_st * str, gnutls_x509_crl_t crl, int notsigned)
/* Version. */
{
int version = gnutls_x509_crl_get_version(crl);
- if (version == GNUTLS_E_ASN1_ELEMENT_NOT_FOUND)
- adds(str, _("\tVersion: 1 (default)\n"));
- else if (version < 0)
+ if (version < 0)
addf(str, "error: get_version: %s\n",
gnutls_strerror(version));
else
@@ -2291,14 +2289,13 @@ print_crl(gnutls_buffer_st * str, gnutls_x509_crl_t crl, int notsigned)
oid,
&sizeof_oid,
&critical);
+ if (err == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+ break;
if (err < 0) {
- if (err ==
- GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
- break;
addf(str,
"error: get_extension_info: %s\n",
gnutls_strerror(err));
- continue;
+ break;
}
if (i == 0)
@@ -2662,14 +2659,13 @@ print_crq(gnutls_buffer_st * str, gnutls_x509_crq_t cert,
gnutls_x509_crq_get_attribute_info(cert, i,
oid,
&sizeof_oid);
+ if (err == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
+ break;
if (err < 0) {
- if (err ==
- GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
- break;
addf(str,
"error: get_extension_info: %s\n",
gnutls_strerror(err));
- continue;
+ break;
}
if (i == 0)
diff --git a/lib/x509/x509.c b/lib/x509/x509.c
index 57c7182894..2091f3ae64 100644
--- a/lib/x509/x509.c
+++ b/lib/x509/x509.c
@@ -1177,29 +1177,12 @@ gnutls_x509_crt_get_signature(gnutls_x509_crt_t cert,
**/
int gnutls_x509_crt_get_version(gnutls_x509_crt_t cert)
{
- uint8_t version[8];
- int len, result;
-
if (cert == NULL) {
gnutls_assert();
return GNUTLS_E_INVALID_REQUEST;
}
- len = sizeof(version);
- if ((result =
- asn1_read_value(cert->cert, "tbsCertificate.version", version,
- &len)) != ASN1_SUCCESS) {
-
- if (result == ASN1_ELEMENT_NOT_FOUND)
- return 1; /* the DEFAULT version */
- gnutls_assert();
- return _gnutls_asn2err(result);
- }
-
- if (len != 1 || version[0] >= 0x80)
- return gnutls_assert_val(GNUTLS_E_CERTIFICATE_ERROR);
-
- return (int) version[0] + 1;
+ return _gnutls_x509_get_version(cert->cert, "tbsCertificate.version");
}
/**
diff --git a/tests/cert-tests/data/crl-demo3.pem b/tests/cert-tests/data/crl-demo3.pem
index 1e04338c67..a91b1f905a 100644
--- a/tests/cert-tests/data/crl-demo3.pem
+++ b/tests/cert-tests/data/crl-demo3.pem
@@ -1,5 +1,5 @@
X.509 Certificate Revocation List Information:
- Version: 1 (default)
+ Version: 1
Issuer: OU=VeriSign Commercial Software Publishers CA,O=VeriSign\, Inc.,L=Internet
Update dates:
Issued: Wed Mar 08 09:00:11 UTC 2017