Coverage Report

Created: 2024-06-28 06:39

/src/botan/build/include/public/botan/x25519.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
* (C) 2014,2024 Jack Lloyd
3
*
4
* Botan is released under the Simplified BSD License (see license.txt)
5
*/
6
7
#ifndef BOTAN_X25519_H_
8
#define BOTAN_X25519_H_
9
10
#include <botan/pk_keys.h>
11
12
namespace Botan {
13
14
class BOTAN_PUBLIC_API(2, 0) X25519_PublicKey : public virtual Public_Key {
15
   public:
16
0
      std::string algo_name() const override { return "X25519"; }
17
18
0
      size_t estimated_strength() const override { return 128; }
19
20
0
      size_t key_length() const override { return 255; }
21
22
      bool check_key(RandomNumberGenerator& rng, bool strong) const override;
23
24
      AlgorithmIdentifier algorithm_identifier() const override;
25
26
      std::vector<uint8_t> raw_public_key_bits() const override;
27
28
      std::vector<uint8_t> public_key_bits() const override;
29
30
207
      std::vector<uint8_t> public_value() const { return m_public; }
31
32
0
      bool supports_operation(PublicKeyOperation op) const override { return (op == PublicKeyOperation::KeyAgreement); }
33
34
      std::unique_ptr<Private_Key> generate_another(RandomNumberGenerator& rng) const final;
35
36
      /**
37
      * Create a X25519 Public Key.
38
      * @param alg_id the X.509 algorithm identifier
39
      * @param key_bits DER encoded public key bits
40
      */
41
      X25519_PublicKey(const AlgorithmIdentifier& alg_id, std::span<const uint8_t> key_bits);
42
43
      /**
44
      * Create a X25519 Public Key.
45
      * @param pub 32-byte raw public key
46
      */
47
      explicit X25519_PublicKey(std::span<const uint8_t> pub);
48
49
   protected:
50
207
      X25519_PublicKey() = default;
51
      std::vector<uint8_t> m_public;
52
};
53
54
BOTAN_DIAGNOSTIC_PUSH
55
BOTAN_DIAGNOSTIC_IGNORE_INHERITED_VIA_DOMINANCE
56
57
class BOTAN_PUBLIC_API(2, 0) X25519_PrivateKey final : public X25519_PublicKey,
58
                                                       public virtual Private_Key,
59
                                                       public virtual PK_Key_Agreement_Key {
60
   public:
61
      /**
62
      * Construct a private key from the specified parameters.
63
      * @param alg_id the X.509 algorithm identifier
64
      * @param key_bits PKCS #8 structure
65
      */
66
      X25519_PrivateKey(const AlgorithmIdentifier& alg_id, std::span<const uint8_t> key_bits);
67
68
      /**
69
      * Generate a private key.
70
      * @param rng the RNG to use
71
      */
72
      explicit X25519_PrivateKey(RandomNumberGenerator& rng);
73
74
      /**
75
      * Construct a private key from the specified parameters.
76
      * @param secret_key the private key
77
      */
78
      explicit X25519_PrivateKey(const secure_vector<uint8_t>& secret_key);
79
80
207
      std::vector<uint8_t> public_value() const override { return X25519_PublicKey::public_value(); }
81
82
      secure_vector<uint8_t> agree(const uint8_t w[], size_t w_len) const;
83
84
0
      secure_vector<uint8_t> raw_private_key_bits() const override { return m_private; }
85
86
0
      BOTAN_DEPRECATED("Use raw_private_key_bits") const secure_vector<uint8_t>& get_x() const { return m_private; }
87
88
      secure_vector<uint8_t> private_key_bits() const override;
89
90
      std::unique_ptr<Public_Key> public_key() const override;
91
92
      bool check_key(RandomNumberGenerator& rng, bool strong) const override;
93
94
      std::unique_ptr<PK_Ops::Key_Agreement> create_key_agreement_op(RandomNumberGenerator& rng,
95
                                                                     std::string_view params,
96
                                                                     std::string_view provider) const override;
97
98
   private:
99
      secure_vector<uint8_t> m_private;
100
};
101
102
BOTAN_DIAGNOSTIC_POP
103
104
/*
105
* The types above are just wrappers for curve25519_donna, plus defining
106
* encodings for public and private keys.
107
*/
108
BOTAN_DEPRECATED_API("Use X25519_PrivateKey or Sodium::crypto_scalarmult_curve25519")
109
void curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32]);
110
111
/**
112
* Exponentiate by the x25519 base point
113
* @param mypublic output value
114
* @param secret random scalar
115
*/
116
BOTAN_DEPRECATED_API("Use X25519_PrivateKey or Sodium::crypto_scalarmult_curve25519_base")
117
void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32]);
118
119
}  // namespace Botan
120
121
#endif