Line data Source code
1 : // Copyright (c) 2020 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #include <crypto/poly1305.h> 6 : #include <test/fuzz/FuzzedDataProvider.h> 7 : #include <test/fuzz/fuzz.h> 8 : #include <test/fuzz/util.h> 9 : 10 : #include <cstdint> 11 : #include <vector> 12 : 13 4 : FUZZ_TARGET(crypto_poly1305) 14 : { 15 0 : FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()}; 16 : 17 0 : const auto key = ConsumeFixedLengthByteVector<std::byte>(fuzzed_data_provider, Poly1305::KEYLEN); 18 0 : const auto in = ConsumeRandomLengthByteVector<std::byte>(fuzzed_data_provider); 19 : 20 0 : std::vector<std::byte> tag_out(Poly1305::TAGLEN); 21 0 : Poly1305{key}.Update(in).Finalize(tag_out); 22 0 : } 23 : 24 4 : FUZZ_TARGET(crypto_poly1305_split) 25 4 : { 26 0 : FuzzedDataProvider provider{buffer.data(), buffer.size()}; 27 : 28 : // Read key and instantiate two Poly1305 objects with it. 29 0 : auto key = provider.ConsumeBytes<std::byte>(Poly1305::KEYLEN); 30 0 : key.resize(Poly1305::KEYLEN); 31 0 : Poly1305 poly_full{key}, poly_split{key}; 32 : 33 : // Vector that holds all bytes processed so far. 34 0 : std::vector<std::byte> total_input; 35 : 36 : // Process input in pieces. 37 0 : LIMITED_WHILE(provider.remaining_bytes(), 100) { 38 0 : auto in = ConsumeRandomLengthByteVector<std::byte>(provider); 39 0 : poly_split.Update(in); 40 : // Update total_input to match what was processed. 41 0 : total_input.insert(total_input.end(), in.begin(), in.end()); 42 0 : } 43 : 44 : // Process entire input at once. 45 0 : poly_full.Update(total_input); 46 : 47 : // Verify both agree. 48 : std::array<std::byte, Poly1305::TAGLEN> tag_split, tag_full; 49 0 : poly_split.Finalize(tag_split); 50 0 : poly_full.Finalize(tag_full); 51 0 : assert(tag_full == tag_split); 52 0 : }