diff options
Diffstat (limited to 'src/lib/pubkey/ecdh')
-rw-r--r-- | src/lib/pubkey/ecdh/ecdh.cpp | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/src/lib/pubkey/ecdh/ecdh.cpp b/src/lib/pubkey/ecdh/ecdh.cpp index 3b0502a36..61d3af816 100644 --- a/src/lib/pubkey/ecdh/ecdh.cpp +++ b/src/lib/pubkey/ecdh/ecdh.cpp @@ -17,38 +17,32 @@ namespace { /** * ECDH operation */ -class ECDH_KA_Operation : public PK_Ops::Key_Agreement +class ECDH_KA_Operation : public PK_Ops::Key_Agreement_with_KDF { public: typedef ECDH_PrivateKey Key_Type; - ECDH_KA_Operation(const ECDH_PrivateKey& key, const std::string&) : + ECDH_KA_Operation(const ECDH_PrivateKey& key, const std::string& kdf) : + PK_Ops::Key_Agreement_with_KDF(kdf), curve(key.domain().get_curve()), cofactor(key.domain().get_cofactor()) { l_times_priv = inverse_mod(cofactor, key.domain().get_order()) * key.private_value(); } - secure_vector<byte> agree(const byte w[], size_t w_len); + secure_vector<byte> raw_agree(const byte w[], size_t w_len) + { + PointGFp point = OS2ECP(w, w_len, curve); + PointGFp S = (cofactor * point) * l_times_priv; + BOTAN_ASSERT(S.on_the_curve(), "ECDH agreed value was on the curve"); + return BigInt::encode_1363(S.get_affine_x(), curve.get_p().bytes()); + } private: const CurveGFp& curve; const BigInt& cofactor; BigInt l_times_priv; }; -secure_vector<byte> ECDH_KA_Operation::agree(const byte w[], size_t w_len) - { - PointGFp point = OS2ECP(w, w_len, curve); - - PointGFp S = (cofactor * point) * l_times_priv; - - BOTAN_ASSERT(S.on_the_curve(), - "ECDH agreed value was on the curve"); - - return BigInt::encode_1363(S.get_affine_x(), - curve.get_p().bytes()); - } - } BOTAN_REGISTER_PK_KEY_AGREE_OP("ECDH", ECDH_KA_Operation); |