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