| /* |
| * 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_TYPE _gnutls_gnutls_asn = ASN1_TYPE_EMPTY; |
| static int first = 1; |
| ASN1_TYPE 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; |
| } |