Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
test
fuzz
crypto_poly1305.cpp
Go to the documentation of this file.
1
// Copyright (c) 2020-present 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
{
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
}
FuzzedDataProvider.h
FuzzedDataProvider
Definition
FuzzedDataProvider.h:32
FuzzedDataProvider::ConsumeBytes
std::vector< T > ConsumeBytes(size_t num_bytes)
Definition
FuzzedDataProvider.h:109
FuzzedDataProvider::remaining_bytes
size_t remaining_bytes()
Definition
FuzzedDataProvider.h:85
Poly1305
C++ wrapper with std::byte span interface around poly1305_donna code.
Definition
poly1305.h:39
Poly1305::Finalize
void Finalize(std::span< std::byte > out) noexcept
Write authentication tag to 16-byte out.
Definition
poly1305.h:64
Poly1305::Update
Poly1305 & Update(std::span< const std::byte > msg) noexcept
Process message bytes.
Definition
poly1305.h:57
Poly1305::KEYLEN
static constexpr unsigned KEYLEN
Length of the keys expected by the constructor.
Definition
poly1305.h:47
Poly1305::TAGLEN
static constexpr unsigned TAGLEN
Length of the output produced by Finalize().
Definition
poly1305.h:44
fuzz.h
FUZZ_TARGET
#define FUZZ_TARGET(...)
Definition
fuzz.h:35
LIMITED_WHILE
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
Definition
fuzz.h:22
poly1305.h
util.h
ConsumeFixedLengthByteVector
std::vector< B > ConsumeFixedLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const size_t length) noexcept
Returns a byte vector of specified size regardless of the number of remaining bytes available from th...
Definition
util.h:252
ConsumeRandomLengthByteVector
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
Definition
util.h:57
assert
assert(!tx.IsCoinBase())
Generated on
for Bitcoin Core by
1.17.0