Botan 3.0.0-alpha0
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 /**
33 * Create a Curve25519 Public Key.
34 * @param alg_id the X.509 algorithm identifier
35 * @param key_bits DER encoded public key bits
36 */
38 const std::vector<uint8_t>& key_bits);
39
40 /**
41 * Create a Curve25519 Public Key.
42 * @param pub 32-byte raw public key
43 */
44 explicit Curve25519_PublicKey(const std::vector<uint8_t>& pub) : m_public(pub) {}
45
46 /**
47 * Create a Curve25519 Public Key.
48 * @param pub 32-byte raw public key
49 */
51 m_public(pub.begin(), pub.end()) {}
52
53 protected:
55 std::vector<uint8_t> m_public;
56 };
57
59 public virtual Private_Key,
60 public virtual PK_Key_Agreement_Key
61 {
62 public:
63 /**
64 * Construct a private key from the specified parameters.
65 * @param alg_id the X.509 algorithm identifier
66 * @param key_bits PKCS #8 structure
67 */
69 const secure_vector<uint8_t>& key_bits);
70
71 /**
72 * Generate a private key.
73 * @param rng the RNG to use
74 */
76
77 /**
78 * Construct a private key from the specified parameters.
79 * @param secret_key the private key
80 */
81 explicit Curve25519_PrivateKey(const secure_vector<uint8_t>& secret_key);
82
83 std::vector<uint8_t> public_value() const override { return Curve25519_PublicKey::public_value(); }
84
85 secure_vector<uint8_t> agree(const uint8_t w[], size_t w_len) const;
86
87 const secure_vector<uint8_t>& get_x() const { return m_private; }
88
89 secure_vector<uint8_t> private_key_bits() const override;
90
91 std::unique_ptr<Public_Key> public_key() const override;
92
93 bool check_key(RandomNumberGenerator& rng, bool strong) const override;
94
95 std::unique_ptr<PK_Ops::Key_Agreement>
96 create_key_agreement_op(RandomNumberGenerator& rng,
97 const std::string& params,
98 const std::string& provider) const override;
99
100 private:
101 secure_vector<uint8_t> m_private;
102 };
103
106
107/*
108* The types above are just wrappers for curve25519_donna, plus defining
109* encodings for public and private keys.
110*/
111void BOTAN_PUBLIC_API(2,0) curve25519_donna(uint8_t mypublic[32],
112 const uint8_t secret[32],
113 const uint8_t basepoint[32]);
114
115/**
116* Exponentiate by the x25519 base point
117* @param mypublic output value
118* @param secret random scalar
119*/
120void BOTAN_PUBLIC_API(2,0) curve25519_basepoint(uint8_t mypublic[32],
121 const uint8_t secret[32]);
122
123}
124
125#endif
std::vector< uint8_t > public_value() const override
Definition: curve25519.h:83
const secure_vector< uint8_t > & get_x() const
Definition: curve25519.h:87
Curve25519_PublicKey(const std::vector< uint8_t > &pub)
Definition: curve25519.h:44
std::vector< uint8_t > m_public
Definition: curve25519.h:55
std::vector< uint8_t > public_value() const
Definition: curve25519.h:30
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:50
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
Definition: compiler.h:31
Definition: alg_id.cpp:13
Curve25519_PrivateKey X25519_PrivateKey
Definition: curve25519.h:105
void curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32])
Definition: donna.cpp:440
Curve25519_PublicKey X25519_PublicKey
Definition: curve25519.h:104
void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32])
Definition: curve25519.cpp:16
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65