/ src / bench / chacha20.cpp
chacha20.cpp
 1  // Copyright (c) 2019-2022 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  
 6  #include <bench/bench.h>
 7  #include <crypto/chacha20.h>
 8  #include <crypto/chacha20poly1305.h>
 9  #include <span.h>
10  
11  #include <cstddef>
12  #include <cstdint>
13  #include <vector>
14  
15  /* Number of bytes to process per iteration */
16  static const uint64_t BUFFER_SIZE_TINY  = 64;
17  static const uint64_t BUFFER_SIZE_SMALL = 256;
18  static const uint64_t BUFFER_SIZE_LARGE = 1024*1024;
19  
20  static void CHACHA20(benchmark::Bench& bench, size_t buffersize)
21  {
22      std::vector<std::byte> key(32, {});
23      ChaCha20 ctx(key);
24      ctx.Seek({0, 0}, 0);
25      std::vector<std::byte> in(buffersize, {});
26      std::vector<std::byte> out(buffersize, {});
27      bench.batch(in.size()).unit("byte").run([&] {
28          ctx.Crypt(in, out);
29      });
30  }
31  
32  static void FSCHACHA20POLY1305(benchmark::Bench& bench, size_t buffersize)
33  {
34      std::vector<std::byte> key(32);
35      FSChaCha20Poly1305 ctx(key, 224);
36      std::vector<std::byte> in(buffersize);
37      std::vector<std::byte> aad;
38      std::vector<std::byte> out(buffersize + FSChaCha20Poly1305::EXPANSION);
39      bench.batch(in.size()).unit("byte").run([&] {
40          ctx.Encrypt(in, aad, out);
41      });
42  }
43  
44  static void CHACHA20_64BYTES(benchmark::Bench& bench)
45  {
46      CHACHA20(bench, BUFFER_SIZE_TINY);
47  }
48  
49  static void CHACHA20_256BYTES(benchmark::Bench& bench)
50  {
51      CHACHA20(bench, BUFFER_SIZE_SMALL);
52  }
53  
54  static void CHACHA20_1MB(benchmark::Bench& bench)
55  {
56      CHACHA20(bench, BUFFER_SIZE_LARGE);
57  }
58  
59  static void FSCHACHA20POLY1305_64BYTES(benchmark::Bench& bench)
60  {
61      FSCHACHA20POLY1305(bench, BUFFER_SIZE_TINY);
62  }
63  
64  static void FSCHACHA20POLY1305_256BYTES(benchmark::Bench& bench)
65  {
66      FSCHACHA20POLY1305(bench, BUFFER_SIZE_SMALL);
67  }
68  
69  static void FSCHACHA20POLY1305_1MB(benchmark::Bench& bench)
70  {
71      FSCHACHA20POLY1305(bench, BUFFER_SIZE_LARGE);
72  }
73  
74  BENCHMARK(CHACHA20_64BYTES, benchmark::PriorityLevel::HIGH);
75  BENCHMARK(CHACHA20_256BYTES, benchmark::PriorityLevel::HIGH);
76  BENCHMARK(CHACHA20_1MB, benchmark::PriorityLevel::HIGH);
77  BENCHMARK(FSCHACHA20POLY1305_64BYTES, benchmark::PriorityLevel::HIGH);
78  BENCHMARK(FSCHACHA20POLY1305_256BYTES, benchmark::PriorityLevel::HIGH);
79  BENCHMARK(FSCHACHA20POLY1305_1MB, benchmark::PriorityLevel::HIGH);