/src/botan/build/include/botan/curve25519.h
Line  | Count  | Source (jump to first uncovered line)  | 
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  |  |  | 
15  |  | class BOTAN_PUBLIC_API(2,0) Curve25519_PublicKey : public virtual Public_Key  | 
16  |  |    { | 
17  |  |    public:  | 
18  | 0  |       std::string algo_name() const override { return "Curve25519"; } | 
19  |  |  | 
20  | 0  |       size_t estimated_strength() const override { return 128; } | 
21  |  |  | 
22  | 0  |       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  | 71  |       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  |  |       */  | 
37  |  |       Curve25519_PublicKey(const AlgorithmIdentifier& alg_id,  | 
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  | 0  |       explicit Curve25519_PublicKey(const std::vector<uint8_t>& pub) : m_public(pub) {}Unexecuted instantiation: Botan::Curve25519_PublicKey::Curve25519_PublicKey(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> > const&) Unexecuted instantiation: Botan::Curve25519_PublicKey::Curve25519_PublicKey(std::__1::vector<unsigned char, std::__1::allocator<unsigned char> > const&)  | 
45  |  |  | 
46  |  |       /**  | 
47  |  |       * Create a Curve25519 Public Key.  | 
48  |  |       * @param pub 32-byte raw public key  | 
49  |  |       */  | 
50  |  |       explicit Curve25519_PublicKey(const secure_vector<uint8_t>& pub) :  | 
51  | 0  |          m_public(pub.begin(), pub.end()) {} | 
52  |  |  | 
53  |  |    protected:  | 
54  | 71  |       Curve25519_PublicKey() = default;  | 
55  |  |       std::vector<uint8_t> m_public;  | 
56  |  |    };  | 
57  |  |  | 
58  |  | class BOTAN_PUBLIC_API(2,0) Curve25519_PrivateKey final : public Curve25519_PublicKey,  | 
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  |  |       */  | 
68  |  |       Curve25519_PrivateKey(const AlgorithmIdentifier& alg_id,  | 
69  |  |                             const secure_vector<uint8_t>& key_bits);  | 
70  |  |  | 
71  |  |       /**  | 
72  |  |       * Generate a private key.  | 
73  |  |       * @param rng the RNG to use  | 
74  |  |       */  | 
75  |  |       explicit Curve25519_PrivateKey(RandomNumberGenerator& rng);  | 
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  | 71  |       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  | 0  |       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  |  |  | 
104  |  | typedef Curve25519_PublicKey X25519_PublicKey;  | 
105  |  | typedef Curve25519_PrivateKey X25519_PrivateKey;  | 
106  |  |  | 
107  |  | /*  | 
108  |  | * The types above are just wrappers for curve25519_donna, plus defining  | 
109  |  | * encodings for public and private keys.  | 
110  |  | */  | 
111  |  | void 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  |  | */  | 
120  |  | void BOTAN_PUBLIC_API(2,0) curve25519_basepoint(uint8_t mypublic[32],  | 
121  |  |                                     const uint8_t secret[32]);  | 
122  |  |  | 
123  |  | }  | 
124  |  |  | 
125  |  | #endif  |