chacha20.cpp raw

   1  // Copyright (c) 2019-2022 The Limenka 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);
  80