Bitcoin Core  26.99.0
P2P Digital Currency
crypto_poly1305.cpp
Go to the documentation of this file.
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>
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 {
15  FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
16 
17  const auto key = ConsumeFixedLengthByteVector<std::byte>(fuzzed_data_provider, Poly1305::KEYLEN);
18  const auto in = ConsumeRandomLengthByteVector<std::byte>(fuzzed_data_provider);
19 
20  std::vector<std::byte> tag_out(Poly1305::TAGLEN);
21  Poly1305{key}.Update(in).Finalize(tag_out);
22 }
23 
24 FUZZ_TARGET(crypto_poly1305_split)
25 {
26  FuzzedDataProvider provider{buffer.data(), buffer.size()};
27 
28  // Read key and instantiate two Poly1305 objects with it.
29  auto key = provider.ConsumeBytes<std::byte>(Poly1305::KEYLEN);
30  key.resize(Poly1305::KEYLEN);
31  Poly1305 poly_full{key}, poly_split{key};
32 
33  // Vector that holds all bytes processed so far.
34  std::vector<std::byte> total_input;
35 
36  // Process input in pieces.
37  LIMITED_WHILE(provider.remaining_bytes(), 100) {
38  auto in = ConsumeRandomLengthByteVector<std::byte>(provider);
39  poly_split.Update(in);
40  // Update total_input to match what was processed.
41  total_input.insert(total_input.end(), in.begin(), in.end());
42  }
43 
44  // Process entire input at once.
45  poly_full.Update(total_input);
46 
47  // Verify both agree.
48  std::array<std::byte, Poly1305::TAGLEN> tag_split, tag_full;
49  poly_split.Finalize(tag_split);
50  poly_full.Finalize(tag_full);
51  assert(tag_full == tag_split);
52 }
std::vector< T > ConsumeBytes(size_t num_bytes)
C++ wrapper with std::byte Span interface around poly1305_donna code.
Definition: poly1305.h:38
static constexpr unsigned KEYLEN
Length of the keys expected by the constructor.
Definition: poly1305.h:46
Poly1305 & Update(Span< const std::byte > msg) noexcept
Process message bytes.
Definition: poly1305.h:56
void Finalize(Span< std::byte > out) noexcept
Write authentication tag to 16-byte out.
Definition: poly1305.h:63
static constexpr unsigned TAGLEN
Length of the output produced by Finalize().
Definition: poly1305.h:43
FUZZ_TARGET(crypto_poly1305)
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition: fuzz.h:23
assert(!tx.IsCoinBase())