poly1305.cpp raw
1 // Copyright (c) 2019-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 <bench/bench.h>
6 #include <crypto/poly1305.h>
7 // IWYU incorrectly suggests removing this header.
8 // See https://github.com/include-what-you-use/include-what-you-use/issues/2014.
9 #include <util/byte_units.h> // IWYU pragma: keep
10
11 #include <cstddef>
12 #include <cstdint>
13 #include <span>
14 #include <vector>
15
16 /* Number of bytes to process per iteration */
17 static constexpr uint64_t BUFFER_SIZE_TINY = 64;
18 static constexpr uint64_t BUFFER_SIZE_SMALL = 256;
19 static constexpr uint64_t BUFFER_SIZE_LARGE{1_MiB};
20
21 static void POLY1305(benchmark::Bench& bench, size_t buffersize)
22 {
23 std::vector<std::byte> tag(Poly1305::TAGLEN, {});
24 std::vector<std::byte> key(Poly1305::KEYLEN, {});
25 std::vector<std::byte> in(buffersize, {});
26 bench.batch(in.size()).unit("byte").run([&] {
27 Poly1305{key}.Update(in).Finalize(tag);
28 });
29 }
30
31 static void POLY1305_64BYTES(benchmark::Bench& bench)
32 {
33 POLY1305(bench, BUFFER_SIZE_TINY);
34 }
35
36 static void POLY1305_256BYTES(benchmark::Bench& bench)
37 {
38 POLY1305(bench, BUFFER_SIZE_SMALL);
39 }
40
41 static void POLY1305_1MB(benchmark::Bench& bench)
42 {
43 POLY1305(bench, BUFFER_SIZE_LARGE);
44 }
45
46 BENCHMARK(POLY1305_64BYTES);
47 BENCHMARK(POLY1305_256BYTES);
48 BENCHMARK(POLY1305_1MB);
49