1 /*
2 * ECDH
3 * (C) 2007 Falko Strenzke, FlexSecure GmbH
4 *          Manuel Hartl, FlexSecure GmbH
5 * (C) 2008-2010 Jack Lloyd
6 *
7 * Botan is released under the Simplified BSD License (see license.txt)
8 */
9 
10 #ifndef BOTAN_ECDH_KEY_H_
11 #define BOTAN_ECDH_KEY_H_
12 
13 #include <botan/ecc_key.h>
14 
15 namespace Botan {
16 
17 /**
18 * This class represents ECDH Public Keys.
19 */
20 class BOTAN_PUBLIC_API(2,0) ECDH_PublicKey : public virtual EC_PublicKey
21    {
22    public:
23       /**
24       * Create an ECDH public key.
25       * @param alg_id algorithm identifier
26       * @param key_bits DER encoded public key bits
27       */
ECDH_PublicKey(const AlgorithmIdentifier & alg_id,const std::vector<uint8_t> & key_bits)28       ECDH_PublicKey(const AlgorithmIdentifier& alg_id,
29                      const std::vector<uint8_t>& key_bits) :
30          EC_PublicKey(alg_id, key_bits) {}
31 
32       /**
33       * Construct a public key from a given public point.
34       * @param dom_par the domain parameters associated with this key
35       * @param public_point the public point defining this key
36       */
ECDH_PublicKey(const EC_Group & dom_par,const PointGFp & public_point)37       ECDH_PublicKey(const EC_Group& dom_par,
38                      const PointGFp& public_point) :
39          EC_PublicKey(dom_par, public_point) {}
40 
41       /**
42       * Get this keys algorithm name.
43       * @return this keys algorithm name
44       */
algo_name()45       std::string algo_name() const override { return "ECDH"; }
46 
47       /**
48       * @return public point value
49       */
public_value()50       std::vector<uint8_t> public_value() const
51          { return public_point().encode(PointGFp::UNCOMPRESSED); }
52 
53       /**
54       * @return public point value
55       */
public_value(PointGFp::Compression_Type format)56       std::vector<uint8_t> public_value(PointGFp::Compression_Type format) const
57          { return public_point().encode(format); }
58 
59    protected:
60       ECDH_PublicKey() = default;
61    };
62 
63 /**
64 * This class represents ECDH Private Keys.
65 */
66 class BOTAN_PUBLIC_API(2,0) ECDH_PrivateKey final : public ECDH_PublicKey,
67                                   public EC_PrivateKey,
68                                   public PK_Key_Agreement_Key
69    {
70    public:
71 
72       /**
73       * Load a private key.
74       * @param alg_id the X.509 algorithm identifier
75       * @param key_bits ECPrivateKey bits
76       */
ECDH_PrivateKey(const AlgorithmIdentifier & alg_id,const secure_vector<uint8_t> & key_bits)77       ECDH_PrivateKey(const AlgorithmIdentifier& alg_id,
78                       const secure_vector<uint8_t>& key_bits) :
79          EC_PrivateKey(alg_id, key_bits) {}
80 
81       /**
82       * Generate a new private key
83       * @param rng a random number generator
84       * @param domain parameters to used for this key
85       * @param x the private key; if zero, a new random key is generated
86       */
87       ECDH_PrivateKey(RandomNumberGenerator& rng,
88                       const EC_Group& domain,
89                       const BigInt& x = 0) :
EC_PrivateKey(rng,domain,x)90          EC_PrivateKey(rng, domain, x) {}
91 
public_value()92       std::vector<uint8_t> public_value() const override
93          { return ECDH_PublicKey::public_value(PointGFp::UNCOMPRESSED); }
94 
public_value(PointGFp::Compression_Type type)95       std::vector<uint8_t> public_value(PointGFp::Compression_Type type) const
96          { return ECDH_PublicKey::public_value(type); }
97 
98       std::unique_ptr<PK_Ops::Key_Agreement>
99          create_key_agreement_op(RandomNumberGenerator& rng,
100                                  const std::string& params,
101                                  const std::string& provider) const override;
102    };
103 
104 }
105 
106 #endif
107