/root/bitcoin/src/test/fuzz/crypto_poly1305.cpp
Line | Count | Source (jump to first uncovered line) |
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 | | FUZZ_TARGET(crypto_poly1305) |
14 | 0 | { |
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 | | FUZZ_TARGET(crypto_poly1305_split) |
25 | 0 | { |
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 | 0 | 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 | } |