Botan  2.6.0
Crypto and TLS for C++11
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 
13 namespace 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:
54  Curve25519_PublicKey() = default;
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  bool check_key(RandomNumberGenerator& rng, bool strong) const override;
92 
93  std::unique_ptr<PK_Ops::Key_Agreement>
94  create_key_agreement_op(RandomNumberGenerator& rng,
95  const std::string& params,
96  const std::string& provider) const override;
97 
98  private:
99  secure_vector<uint8_t> m_private;
100  };
101 
102 /*
103 * The types above are just wrappers for curve25519_donna, plus defining
104 * encodings for public and private keys.
105 */
106 void BOTAN_PUBLIC_API(2,0) curve25519_donna(uint8_t mypublic[32],
107  const uint8_t secret[32],
108  const uint8_t basepoint[32]);
109 
110 /**
111 * Exponentiate by the x25519 base point
112 * @param mypublic output value
113 * @param secret random scalar
114 */
115 void BOTAN_PUBLIC_API(2,0) curve25519_basepoint(uint8_t mypublic[32],
116  const uint8_t secret[32]);
117 
118 }
119 
120 #endif
Curve25519_PublicKey(const secure_vector< uint8_t > &pub)
Definition: curve25519.h:50
std::vector< uint8_t > public_value() const
Definition: curve25519.h:30
std::string algo_name() const override
Definition: curve25519.h:18
void curve25519_donna(uint8_t mypublic[32], const uint8_t secret[32], const uint8_t basepoint[32])
void curve25519_basepoint(uint8_t mypublic[32], const uint8_t secret[32])
Definition: curve25519.cpp:16
size_t key_length() const override
Definition: curve25519.h:22
size_t estimated_strength() const override
Definition: curve25519.h:20
#define BOTAN_PUBLIC_API(maj, min)
Definition: compiler.h:27
Definition: alg_id.cpp:13
std::vector< uint8_t > m_public
Definition: curve25519.h:55
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 > public_value() const override
Definition: curve25519.h:83
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:88