diff --git a/fuzzing/fuzz_drbg.cpp b/fuzzing/fuzz_drbg.cpp new file mode 100644 index 00000000..6eff92d3 --- /dev/null +++ b/fuzzing/fuzz_drbg.cpp @@ -0,0 +1,76 @@ +// Copyright 2025 Matt Borland +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace boost::crypt; + +// Type list to store hasher types +template +struct type_list {}; + +// Helper to iterate over types +template class F> +struct for_each_type; + +template class F, typename... Ts> +struct for_each_type, F> { + static void apply(const std::uint8_t* data, std::size_t size) { + (F::apply(data, size), ...); + } +}; + +// Functor to process each hash type +template +struct process_hash { + static void apply(const std::uint8_t* data, std::size_t size) { + auto c_data = reinterpret_cast(data); + std::string c_data_str{c_data, size}; + std::span c_data_span{data, size}; + std::string_view c_data_str_view{c_data_str}; + + DRBGType drbg_tester; + drbg_tester.init(c_data_span, c_data_span, c_data_span); + std::vector return_vector(size); + [[maybe_unused]] const auto code = drbg_tester.generate(return_vector, size); + drbg_tester.reseed(c_data_str, c_data_str_view); + drbg_tester.generate(return_vector, size); + } +}; + +extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data, std::size_t size) { + if (data == nullptr || size == 0) { + return 0; + } + + try { + using hasher_types = type_list< + sha1_hmac_drbg, + sha512_hmac_drbg, + sha3_256_hmac_drbg, + sha1_hash_drbg, + sha512_hash_drbg, + sha3_256_hash_drbg + >; + + for_each_type::apply(data, size); + } + catch (...) { + return 0; // Silent failure for fuzzing + } + + return 0; +} diff --git a/fuzzing/seedcorpus/fuzz_sha512_hmac_drbg/sha512_hmac_drbg.txt b/fuzzing/seedcorpus/fuzz_drbg/drbg.txt similarity index 100% rename from fuzzing/seedcorpus/fuzz_sha512_hmac_drbg/sha512_hmac_drbg.txt rename to fuzzing/seedcorpus/fuzz_drbg/drbg.txt