diff options
author | lloyd <[email protected]> | 2015-03-14 04:31:24 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2015-03-14 04:31:24 +0000 |
commit | ccfcb3af8b8404f998aba895ddfc7f3d4405fdd5 (patch) | |
tree | 9b4d1ba62249681622051a92758a3dc3c82bfd6d /src/lib/pubkey/ecdh/ecdh.cpp | |
parent | d8ab5899e9f8c8d9987cec78fed34365b5ad0ee9 (diff) |
In PK encrypt/decrypt move pad calls to the operation. This allows an
op to use a padding scheme outside of our knowledge or control, for
instance an OpenSSL RSA op which uses OpenSSL's padding code. Similar
change for key agreement and KDFs for the same reason.
Add an EME_Raw type; previously this operation was implicit in the
code in pubkey.cpp
Diffstat (limited to 'src/lib/pubkey/ecdh/ecdh.cpp')
-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); |