• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 21780928802

07 Feb 2026 01:36PM UTC coverage: 90.068% (+0.003%) from 90.065%
21780928802

Pull #5295

github

web-flow
Merge cbabeb61a into ebf8f0044
Pull Request #5295: Reduce header dependencies in tests and cli

102234 of 113508 relevant lines covered (90.07%)

11464546.51 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

69.23
/src/cli/perf_pk_kem.cpp
1
/*
2
* (C) 2024 Jack Lloyd
3
*
4
* Botan is released under the Simplified BSD License (see license.txt)
5
*/
6

7
#include "perf.h"
8

9
#if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO)
10
   #include <botan/pk_algs.h>
11
   #include <botan/pubkey.h>
12
   #include <botan/rng.h>
13
#endif
14

15
namespace Botan_CLI {
16

17
#if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO)
18

19
class PerfTest_PK_KEM : public PerfTest {
1✔
20
   public:
21
      virtual std::string algo() const = 0;
22

23
      virtual std::vector<std::string> keygen_params(const PerfConfig& /*config*/) const { return {""}; }
×
24

25
      void go(const PerfConfig& config) override {
1✔
26
         const std::string alg = this->algo();
1✔
27

28
         const auto params = this->keygen_params(config);
1✔
29

30
         for(const auto& param : params) {
4✔
31
            const std::string nm = this->format_name(alg, param);
3✔
32
            bench_pk_kem(config, nm, alg, param);
6✔
33
         }
3✔
34
      }
1✔
35

36
      static void bench_pk_kem(const PerfConfig& config,
3✔
37
                               const std::string& nm,
38
                               const std::string& algo,
39
                               const std::string& params,
40
                               const std::string& provider = "") {
41
         const auto msec = config.runtime();
3✔
42
         auto& rng = config.rng();
3✔
43

44
         const std::string kdf = "KDF2(SHA-256)";  // arbitrary choice
3✔
45

46
         auto keygen_timer = config.make_timer(nm, 1, "keygen");
6✔
47

48
         auto sk = keygen_timer->run([&] { return Botan::create_private_key(algo, rng, params); });
6✔
49

50
         if(sk) {
3✔
51
            while(keygen_timer->under(msec)) {
10✔
52
               sk = keygen_timer->run([&] { return Botan::create_private_key(algo, rng, params); });
21✔
53
            }
54

55
            auto pk = sk->public_key();
3✔
56

57
            Botan::PK_KEM_Decryptor dec(*sk, rng, kdf, provider);
3✔
58
            Botan::PK_KEM_Encryptor enc(*pk, kdf, provider);
3✔
59

60
            auto kem_enc_timer = config.make_timer(nm, 1, "KEM encrypt");
6✔
61
            auto kem_dec_timer = config.make_timer(nm, 1, "KEM decrypt");
6✔
62

63
            while(kem_enc_timer->under(msec) && kem_dec_timer->under(msec)) {
23✔
64
               Botan::secure_vector<uint8_t> salt = rng.random_vec(16);
20✔
65

66
               kem_enc_timer->start();
20✔
67
               const auto kem_result = enc.encrypt(rng, 64, salt);
20✔
68
               kem_enc_timer->stop();
20✔
69

70
               kem_dec_timer->start();
20✔
71
               const Botan::secure_vector<uint8_t> dec_shared_key =
20✔
72
                  dec.decrypt(kem_result.encapsulated_shared_key(), 64, salt);
20✔
73
               kem_dec_timer->stop();
20✔
74

75
               if(kem_result.shared_key() != dec_shared_key) {
20✔
76
                  config.error_output() << "KEM mismatch in PK bench\n";
×
77
               }
78
            }
40✔
79
            config.record_result(*keygen_timer);
3✔
80
            config.record_result(*kem_enc_timer);
3✔
81
            config.record_result(*kem_dec_timer);
6✔
82
         }
6✔
83
      }
3✔
84
};
85

86
#endif
87

88
#if defined(BOTAN_HAS_KYBER) || defined(BOTAN_HAS_KYBER_90S)
89

90
class PerfTest_Kyber final : public PerfTest_PK_KEM {
×
91
   public:
92
      std::string algo() const override { return "Kyber"; }
×
93

94
      std::vector<std::string> keygen_params(const PerfConfig& /*config*/) const override {
×
95
         return {
×
96
            "Kyber-512-r3",
97
            "Kyber-512-90s-r3",
98
            "Kyber-768-r3",
99
            "Kyber-768-90s-r3",
100
            "Kyber-1024-r3",
101
            "Kyber-1024-90s-r3",
102
         };
×
103
      }
104
};
105

106
BOTAN_REGISTER_PERF_TEST("Kyber", PerfTest_Kyber);
×
107

108
#endif
109

110
#if defined(BOTAN_HAS_ML_KEM)
111

112
class PerfTest_ML_KEM final : public PerfTest_PK_KEM {
1✔
113
   public:
114
      std::string algo() const override { return "ML-KEM"; }
1✔
115

116
      std::vector<std::string> keygen_params(const PerfConfig& /*config*/) const override {
1✔
117
         return {
1✔
118
            "ML-KEM-512",
119
            "ML-KEM-768",
120
            "ML-KEM-1024",
121
         };
1✔
122
      }
123
};
124

125
BOTAN_REGISTER_PERF_TEST("ML-KEM", PerfTest_ML_KEM);
1✔
126

127
#endif
128

129
#if defined(BOTAN_HAS_FRODOKEM)
130

131
class PerfTest_FrodoKEM final : public PerfTest_PK_KEM {
×
132
   public:
133
      std::string algo() const override { return "FrodoKEM"; }
×
134

135
      std::vector<std::string> keygen_params(const PerfConfig& /*config*/) const override {
×
136
         return {
×
137
            "FrodoKEM-640-SHAKE",
138
            "FrodoKEM-640-AES",
139
            "eFrodoKEM-640-SHAKE",
140
            "eFrodoKEM-640-AES",
141
            "FrodoKEM-976-SHAKE",
142
            "FrodoKEM-976-AES",
143
            "eFrodoKEM-976-SHAKE",
144
            "eFrodoKEM-976-AES",
145
            "FrodoKEM-1344-SHAKE",
146
            "FrodoKEM-1344-AES",
147
            "eFrodoKEM-1344-SHAKE",
148
            "eFrodoKEM-1344-AES",
149
         };
×
150
      }
151
};
152

153
BOTAN_REGISTER_PERF_TEST("FrodoKEM", PerfTest_FrodoKEM);
×
154

155
#endif
156

157
#if defined(BOTAN_HAS_CLASSICMCELIECE)
158

159
class PerfTest_Classic_McEliece final : public PerfTest_PK_KEM {
×
160
   public:
161
      std::string algo() const override { return "ClassicMcEliece"; }
×
162

163
      std::vector<std::string> keygen_params(const PerfConfig& /*config*/) const override {
×
164
         return {
×
165
            "348864",
166
            "348864f",
167
            "460896",
168
            "460896f",
169
            "6688128",
170
            "6688128f",
171
            "6688128pc",
172
            "6688128pcf",
173
            "6960119",
174
            "6960119f",
175
            "6960119pc",
176
            "6960119pcf",
177
            "8192128",
178
            "8192128f",
179
            "8192128pc",
180
            "8192128pcf",
181
         };
×
182
      }
183
};
184

185
BOTAN_REGISTER_PERF_TEST("ClassicMcEliece", PerfTest_Classic_McEliece);
×
186

187
#endif
188

189
}  // namespace Botan_CLI
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc