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

randombit / botan / 21031897445

15 Jan 2026 12:50PM UTC coverage: 90.037% (-0.4%) from 90.395%
21031897445

Pull #5240

github

web-flow
Merge 13ffffdd5 into 32478179d
Pull Request #5240: Some changes to reduce time taken by the coverage build

102027 of 113317 relevant lines covered (90.04%)

11676540.94 hits per line

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

0.0
/src/cli/perf_pk_misc.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/assert.h>
11
   #include <botan/pk_algs.h>
12
   #include <botan/pkcs8.h>
13
   #include <botan/x509_key.h>
14
   #include <botan/internal/fmt.h>
15
#endif
16

17
#if defined(BOTAN_HAS_ECDSA)
18
   #include <botan/ecdsa.h>
19
   #include <botan/pubkey.h>
20
#endif
21

22
namespace Botan_CLI {
23

24
#if defined(BOTAN_HAS_PUBLIC_KEY_CRYPTO)
25

26
class PerfTest_PKKeyParsing final : public PerfTest {
×
27
   public:
28
      void go(const PerfConfig& config) override {
×
29
         const auto runtime = config.runtime();
×
30
         auto& rng = config.rng();
×
31

32
         const std::pair<std::string, std::string> keygen_algos[] = {
×
33
            {"RSA", "2048"},
34
            {"ECDSA", "secp256r1"},
35
            {"ECDSA", "brainpool512r1"},
36
            {"DH", "modp/ietf/2048"},
37
            {"X25519", ""},
38
            {"Ed25519", ""},
39
            {"ML-DSA", "ML-DSA-6x5"},
40
            {"ML-KEM", "ML-KEM-768"},
41
         };
×
42

43
         for(const auto& [algo, params] : keygen_algos) {
×
44
            auto sk = Botan::create_private_key(algo, rng, params);
×
45

46
            if(!sk) {
×
47
               continue;
×
48
            }
49

50
            const auto pk = sk->public_key();
×
51

52
            const std::string nm = params.empty() ? algo : Botan::fmt("{} {}", algo, params);
×
53

54
            auto pk_parse = config.make_timer(nm, 1, "public key parse");
×
55
            const auto pk_bytes = pk->subject_public_key();
×
56
            pk_parse->run_until_elapsed(runtime, [&]() { Botan::X509::load_key(pk_bytes); });
×
57
            config.record_result(*pk_parse);
×
58

59
            auto sk_parse = config.make_timer(nm, 1, "private key parse");
×
60
            const auto sk_bytes = sk->private_key_info();
×
61
            sk_parse->run_until_elapsed(runtime, [&]() { Botan::PKCS8::load_key(sk_bytes); });
×
62
            config.record_result(*sk_parse);
×
63
         }
×
64
      }
×
65
};
66

67
BOTAN_REGISTER_PERF_TEST("key_parsing", PerfTest_PKKeyParsing);
×
68

69
#endif
70

71
#if defined(BOTAN_HAS_RSA)
72

73
class PerfTest_RSAKeyGen final : public PerfTest {
×
74
   public:
75
      void go(const PerfConfig& config) override {
×
76
         const auto runtime = config.runtime();
×
77
         auto& rng = config.rng();
×
78

79
         for(size_t keylen : {1024, 2048, 3072, 4096}) {
×
80
            const std::string nm = Botan::fmt("RSA-{}", keylen);
×
81
            auto keygen_timer = config.make_timer(nm, 1, "keygen");
×
82

83
            while(keygen_timer->under(runtime)) {
×
84
               auto key =
×
85
                  keygen_timer->run([&] { return Botan::create_private_key("RSA", rng, std::to_string(keylen)); });
×
86

87
               BOTAN_ASSERT(key->check_key(rng, true), "Key is ok");
×
88
            }
×
89

90
            config.record_result(*keygen_timer);
×
91
         }
×
92
      }
×
93
};
94

95
BOTAN_REGISTER_PERF_TEST("RSA_keygen", PerfTest_RSAKeyGen);
×
96

97
#endif
98

99
#if defined(BOTAN_HAS_ECDSA)
100

101
class PerfTest_ECDSAKeyRec final : public PerfTest {
×
102
   public:
103
      void go(const PerfConfig& config) override {
×
104
         const auto runtime = config.runtime();
×
105
         auto& rng = config.rng();
×
106

107
         for(const std::string& group_name : config.ecc_groups()) {
×
108
            const auto group = Botan::EC_Group::from_name(group_name);
×
109
            auto recovery_timer = config.make_timer("ECDSA recovery " + group_name);
×
110

111
            while(recovery_timer->under(runtime)) {
×
112
               Botan::ECDSA_PrivateKey key(rng, group);
×
113

114
               std::vector<uint8_t> message(group.get_order_bits() / 8);
×
115
               rng.randomize(message.data(), message.size());
×
116

117
               Botan::PK_Signer signer(key, rng, "Raw");
×
118
               signer.update(message);
×
119
               std::vector<uint8_t> signature = signer.signature(rng);
×
120

121
               Botan::PK_Verifier verifier(key, "Raw", Botan::Signature_Format::Standard, "base");
×
122
               verifier.update(message);
×
123
               BOTAN_ASSERT(verifier.check_signature(signature), "Valid signature");
×
124

125
               Botan::BigInt r(signature.data(), signature.size() / 2);
×
126
               Botan::BigInt s(signature.data() + signature.size() / 2, signature.size() / 2);
×
127

128
               const uint8_t v = key.recovery_param(message, r, s);
×
129

130
               recovery_timer->run([&]() {
×
131
                  const Botan::ECDSA_PublicKey recovered_key(group, message, r, s, v);
×
132
                  BOTAN_ASSERT(recovered_key.public_key_bits() == key.public_key_bits(),
×
133
                               "Recovered public key correctly");
134
               });
×
135
            }
×
136

137
            config.record_result(*recovery_timer);
×
138
         }
×
139
      }
×
140
};
141

142
BOTAN_REGISTER_PERF_TEST("ecdsa_recovery", PerfTest_ECDSAKeyRec);
×
143

144
#endif
145

146
}  // 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