Botan 3.0.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
16 {
17 public:
18 std::string algo_name() const override { return "Curve25519"; }
19
20 size_t estimated_strength() const override { return 128; }
21
22 size_t key_length() const override { return 255; }
23
24 bool check_key(RandomNumberGenerator& rng, bool strong) const override;
25
26 AlgorithmIdentifier algorithm_identifier() const override;
27
28 std::vector<uint8_t> public_key_bits() const override;
29
30 std::vector<uint8_t> public_value() const { return m_public; }
31
32 bool supports_operation(PublicKeyOperation op) const override
33 {
34 return (op == PublicKeyOperation::KeyAgreement);
35 }
36
37 /**
38 * Create a Curve25519 Public Key.
39 * @param alg_id the X.509 algorithm identifier
40 * @param key_bits DER encoded public key bits
41 */
43 std::span<const uint8_t> key_bits);
44
45 /**
46 * Create a Curve25519 Public Key.
47 * @param pub 32-byte raw public key
48 */
49 explicit Curve25519_PublicKey(const std::vector<uint8_t>& pub) : m_public(pub) {}
50
51 /**
52 * Create a Curve25519 Public Key.
53 * @param pub 32-byte raw public key
54 */
56 m_public(pub.begin(), pub.end()) {}
57
58 protected:
60 std::vector<uint8_t> m_public;
61 };
62
65
67 public virtual Private_Key,
68 public virtual PK_Key_Agreement_Key
69 {
70 public:
71 /**
72 * Construct a private key from the specified parameters.
73 * @param alg_id the X.509 algorithm identifier
74 * @param key_bits PKCS #8 structure
75 */
77 std::span<const uint8_t> key_bits);
78
79 /**
80 * Generate a private key.
81 * @param rng the RNG to use
82 */
84
85 /**
86 * Construct a private key from the specified parameters.
87 * @param secret_key the private key
88 */
89 explicit Curve25519_PrivateKey(const secure_vector<uint8_t>& secret_key);
90
91 std::vector<uint8_t> public_value() const override { return Curve25519_PublicKey::public_value(); }
92
93 secure_vector<uint8_t> agree(const uint8_t w[], size_t w_len) const;
94
95 secure_vector<uint8_t> raw_private_key_bits() const override { return m_private; }
96
97 BOTAN_DEPRECATED("Use raw_private_key_bits")
98 const secure_vector<uint8_t>& get_x() const { return m_private; }
99
100 secure_vector<uint8_t> private_key_bits() const override;
101
102 std::unique_ptr<Public_Key> public_key() const override;
103
104 bool check_key(RandomNumberGenerator& rng, bool strong) const override;
105
106 std::unique_ptr<PK_Ops::Key_Agreement>
107 create_key_agreement_op(RandomNumberGenerator& rng,
108 std::string_view params,
109 std::string_view provider) const override;
110
111 private:
112 secure_vector<uint8_t> m_private;
113 };
114
116
119
120/*
121* The types above are just wrappers for curve25519_donna, plus defining
122* encodings for public and private keys.
123*/
124void BOTAN_PUBLIC_API(2,0) curve25519_donna(uint8_t mypublic[32],
125 const uint8_t secret[32],
126 const uint8_t basepoint[32]);
127
128/**
129* Exponentiate by the x25519 base point
130* @param mypublic output value
131* @param secret random scalar
132*/
133void BOTAN_PUBLIC_API(2,0) curve25519_basepoint(uint8_t mypublic[32],
134 const uint8_t secret[32]);
135
136}
137
138#endif
secure_vector< uint8_t > raw_private_key_bits() const override
Definition: curve25519.h:95
std::vector< uint8_t > public_value() const override
Definition: curve25519.h:91
Curve25519_PublicKey(const std::vector< uint8_t > &pub)
Definition: curve25519.h:49
std::vector< uint8_t > m_public
Definition: curve25519.h:60
std::vector< uint8_t > public_value() const
Definition: curve25519.h:30
bool supports_operation(PublicKeyOperation op) const override
Definition: curve25519.h:32
size_t key_length() const override
Definition: curve25519.h:22
std::string algo_name() const override
Definition: curve25519.h:18
size_t estimated_strength() const override
Definition: curve25519.h:20
Curve25519_PublicKey(const secure_vector< uint8_t > &pub)
Definition: curve25519.h:55
int(* final)(unsigned char *, CTX *)
#define BOTAN_DIAGNOSTIC_POP
Definition: compiler.h:204
#define BOTAN_DIAGNOSTIC_PUSH
Definition: compiler.h:201
#define BOTAN_DIAGNOSTIC_IGNORE_INHERITED_VIA_DOMINANCE
Definition: compiler.h:203
#define BOTAN_PUBLIC_API(maj, min)
Definition: compiler.h:31
Definition: alg_id.cpp:12
PublicKeyOperation
Definition: pk_keys.h:43
Curve25519_PrivateKey X25519_PrivateKey
Definition: curve25519.h:118
BOTAN_DIAGNOSTIC_POP typedef Curve25519_PublicKey X25519_PublicKey
Definition: curve25519.h:117
void curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32])
Definition: donna.cpp:440
void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32])
Definition: curve25519.cpp:17
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:64