aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/pubkey/ecdh
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/pubkey/ecdh')
-rw-r--r--src/lib/pubkey/ecdh/ecdh.cpp26
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);