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