summaryrefslogtreecommitdiff
path: root/fuzz/libtasn1_gnutls_der_fuzzer.c
diff options
context:
space:
mode:
Diffstat (limited to 'fuzz/libtasn1_gnutls_der_fuzzer.c')
-rw-r--r--fuzz/libtasn1_gnutls_der_fuzzer.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/fuzz/libtasn1_gnutls_der_fuzzer.c b/fuzz/libtasn1_gnutls_der_fuzzer.c
new file mode 100644
index 0000000..a5e6b9e
--- /dev/null
+++ b/fuzz/libtasn1_gnutls_der_fuzzer.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright(c) 2019 Free Software Foundation, Inc.
+ *
+ * This file is part of libtasn1.
+ *
+ * Libtasn1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Libtasn1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with libtasn1. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * This fuzzer is testing arbitrary DER input data with GnuTLS's ASN.1 definition (lib/gnutls.asn).
+ * So, any issues found here likely have a real world impact on every software using libgnutls.
+ */
+
+#include <config.h>
+
+#include <assert.h> /* assert */
+#include <stdlib.h> /* malloc, free */
+#include <string.h> /* strcmp, memcpy */
+
+#include "libtasn1.h"
+#include "fuzzer.h"
+
+/*
+ * This is a ASN.1 definition array used by GnuTLS.
+ * It is created from lib/gnutls.asn over at the GnuTLS project.
+ */
+const asn1_static_node gnutls_asn1_tab[] = {
+ {"GNUTLS", 536872976, NULL},
+ {NULL, 1073741836, NULL},
+ {"RSAPublicKey", 1610612741, NULL},
+ {"modulus", 1073741827, NULL},
+ {"publicExponent", 3, NULL},
+ {"RSAPrivateKey", 1610612741, NULL},
+ {"version", 1073741827, NULL},
+ {"modulus", 1073741827, NULL},
+ {"publicExponent", 1073741827, NULL},
+ {"privateExponent", 1073741827, NULL},
+ {"prime1", 1073741827, NULL},
+ {"prime2", 1073741827, NULL},
+ {"exponent1", 1073741827, NULL},
+ {"exponent2", 1073741827, NULL},
+ {"coefficient", 1073741827, NULL},
+ {"otherPrimeInfos", 16386, "OtherPrimeInfos"},
+ {"ProvableSeed", 1610612741, NULL},
+ {"algorithm", 1073741836, NULL},
+ {"seed", 7, NULL},
+ {"OtherPrimeInfos", 1612709899, NULL},
+ {"MAX", 1074266122, "1"},
+ {NULL, 2, "OtherPrimeInfo"},
+ {"OtherPrimeInfo", 1610612741, NULL},
+ {"prime", 1073741827, NULL},
+ {"exponent", 1073741827, NULL},
+ {"coefficient", 3, NULL},
+ {"AlgorithmIdentifier", 1610612741, NULL},
+ {"algorithm", 1073741836, NULL},
+ {"parameters", 541081613, NULL},
+ {"algorithm", 1, NULL},
+ {"DigestInfo", 1610612741, NULL},
+ {"digestAlgorithm", 1073741826, "DigestAlgorithmIdentifier"},
+ {"digest", 7, NULL},
+ {"DigestAlgorithmIdentifier", 1073741826, "AlgorithmIdentifier"},
+ {"DSAPublicKey", 1073741827, NULL},
+ {"DSAParameters", 1610612741, NULL},
+ {"p", 1073741827, NULL},
+ {"q", 1073741827, NULL},
+ {"g", 3, NULL},
+ {"DSASignatureValue", 1610612741, NULL},
+ {"r", 1073741827, NULL},
+ {"s", 3, NULL},
+ {"DSAPrivateKey", 1610612741, NULL},
+ {"version", 1073741827, NULL},
+ {"p", 1073741827, NULL},
+ {"q", 1073741827, NULL},
+ {"g", 1073741827, NULL},
+ {"Y", 1073741827, NULL},
+ {"priv", 3, NULL},
+ {"DHParameter", 1610612741, NULL},
+ {"prime", 1073741827, NULL},
+ {"base", 1073741827, NULL},
+ {"privateValueLength", 16387, NULL},
+ {"ECParameters", 1610612754, NULL},
+ {"namedCurve", 12, NULL},
+ {"ECPrivateKey", 1610612741, NULL},
+ {"Version", 1073741827, NULL},
+ {"privateKey", 1073741831, NULL},
+ {"parameters", 1610637314, "ECParameters"},
+ {NULL, 2056, "0"},
+ {"publicKey", 536895494, NULL},
+ {NULL, 2056, "1"},
+ {"PrincipalName", 1610612741, NULL},
+ {"name-type", 1610620931, NULL},
+ {NULL, 2056, "0"},
+ {"name-string", 536879115, NULL},
+ {NULL, 1073743880, "1"},
+ {NULL, 27, NULL},
+ {"KRB5PrincipalName", 1610612741, NULL},
+ {"realm", 1610620955, NULL},
+ {NULL, 2056, "0"},
+ {"principalName", 536879106, "PrincipalName"},
+ {NULL, 2056, "1"},
+ {"RSAPSSParameters", 1610612741, NULL},
+ {"hashAlgorithm", 1610637314, "AlgorithmIdentifier"},
+ {NULL, 2056, "0"},
+ {"maskGenAlgorithm", 1610637314, "AlgorithmIdentifier"},
+ {NULL, 2056, "1"},
+ {"saltLength", 1610653699, NULL},
+ {NULL, 1073741833, "20"},
+ {NULL, 2056, "2"},
+ {"trailerField", 536911875, NULL},
+ {NULL, 1073741833, "1"},
+ {NULL, 2056, "3"},
+ {"GOSTParameters", 1610612741, NULL},
+ {"publicKeyParamSet", 1073741836, NULL},
+ {"digestParamSet", 1073741836, NULL},
+ {"encryptionParamSet", 16396, NULL},
+ {"GOSTPrivateKey", 1073741831, NULL},
+ {"GOSTPrivateKeyOld", 3, NULL},
+ {NULL, 0, NULL}
+};
+
+int
+LLVMFuzzerTestOneInput (const uint8_t * data, size_t size)
+{
+ static asn1_node _gnutls_gnutls_asn = NULL;
+ static int first = 1;
+ asn1_node dn;
+ int res;
+
+ if (size > 10000) /* same as max_len = 10000 in .options file */
+ return 0;
+
+ if (first)
+ {
+ first = 0;
+
+ /* from _gnutls_global_init() */
+ res = asn1_array2tree (gnutls_asn1_tab, &_gnutls_gnutls_asn, NULL);
+ assert (res == ASN1_SUCCESS);
+ }
+
+ /* from gnutls_dh_params_import_pkcs3() */
+ if ((res =
+ asn1_create_element (_gnutls_gnutls_asn, "GNUTLS.DHParameter",
+ &dn)) == ASN1_SUCCESS)
+ {
+ /* from cert_get_issuer_dn() */
+ res = asn1_der_decoding (&dn, data, size, NULL);
+ asn1_delete_structure (&dn);
+ }
+
+ /* from _gnutls_x509_write_gost_params() */
+ if ((res =
+ asn1_create_element (_gnutls_gnutls_asn, "GNUTLS.GOSTParameters",
+ &dn)) == ASN1_SUCCESS)
+ {
+ if ((res =
+ asn1_write_value (dn, "digestParamSet", "1.2.643.7.1.1.2.2",
+ 1)) == ASN1_SUCCESS)
+ {
+ /* from cert_get_issuer_dn() */
+ res = asn1_der_decoding (&dn, data, size, NULL);
+
+ /* from _gnutls_x509_der_encode() */
+ int dersize = 0;
+ if ((res =
+ asn1_der_coding (dn, "", NULL, &dersize,
+ NULL)) == ASN1_MEM_ERROR)
+ {
+ void *der = malloc (dersize);
+ assert (der);
+ res = asn1_der_coding (dn, "", der, &dersize, NULL);
+ free (der);
+ }
+ }
+
+ asn1_delete_structure (&dn);
+ }
+
+ return 0;
+}