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