Merge bitcoin/bitcoin#22942: fuzz: Cleanup muhash fuzz target

0000dca6f0e4dda212bf8adf555b68f2c7464ff8 fuzz: Cleanup muhash fuzz target (MarcoFalke)

Pull request description:

ACKs for top commit:
  fjahr:
    ACK 0000dca6f0e4dda212bf8adf555b68f2c7464ff8

Tree-SHA512: 9893ad5cea0faf94a18a778ae9d62d4a37850b445b6f22fdbe57c882c956c8bca6d03dd040aa4512ce3fba350b186c3d5ed80295b6310bea60197783b50b01b6
This commit is contained in:
MarcoFalke 2021-09-28 08:38:05 +02:00 committed by pasta
parent f9b22b61e6
commit 30c458cc04
No known key found for this signature in database
GPG Key ID: 52527BEDABE87984

View File

@ -12,52 +12,47 @@
FUZZ_TARGET(muhash)
{
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
std::vector<uint8_t> data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
std::vector<uint8_t> data2 = ConsumeRandomLengthByteVector(fuzzed_data_provider);
if (data.empty()) {
data.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
}
if (data2.empty()) {
data2.resize(fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, 4096), fuzzed_data_provider.ConsumeIntegral<uint8_t>());
}
data = ConsumeRandomLengthByteVector(fuzzed_data_provider);
data2 = ConsumeRandomLengthByteVector(fuzzed_data_provider);
std::vector<uint8_t> data{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
std::vector<uint8_t> data2{ConsumeRandomLengthByteVector(fuzzed_data_provider)};
MuHash3072 muhash;
// Test that MuHash result is consistent independent of order of operations
muhash.Insert(data);
muhash.Insert(data2);
const std::string initial_state_hash{"dd5ad2a105c2d29495f577245c357409002329b9f4d6182c0af3dc2f462555c8"};
uint256 out;
muhash.Finalize(out);
muhash = MuHash3072();
muhash.Insert(data2);
muhash.Insert(data);
uint256 out2;
muhash.Finalize(out2);
CallOneOf(
fuzzed_data_provider,
[&] {
// Test that MuHash result is consistent independent of order of operations
muhash.Finalize(out);
muhash = MuHash3072();
muhash.Insert(data2);
muhash.Insert(data);
muhash.Finalize(out2);
},
[&] {
// Test that multiplication with the initial state never changes the finalized result
muhash.Finalize(out);
MuHash3072 muhash3;
muhash3 *= muhash;
muhash3.Finalize(out2);
},
[&] {
// Test that dividing a MuHash by itself brings it back to it's initial state
muhash /= muhash;
muhash.Finalize(out);
out2 = uint256S(initial_state_hash);
},
[&] {
// Test that removing all added elements brings the object back to it's initial state
muhash.Remove(data);
muhash.Remove(data2);
muhash.Finalize(out);
out2 = uint256S(initial_state_hash);
});
assert(out == out2);
MuHash3072 muhash3;
muhash3 *= muhash;
uint256 out3;
muhash3.Finalize(out3);
assert(out == out3);
// Test that removing all added elements brings the object back to it's initial state
muhash /= muhash;
muhash.Finalize(out);
MuHash3072 muhash2;
muhash2.Finalize(out2);
assert(out == out2);
muhash3.Remove(data);
muhash3.Remove(data2);
muhash3.Finalize(out3);
assert(out == out3);
}