11 #include <botan/ecdsa.h>
12 #include <botan/internal/pk_ops_impl.h>
13 #include <botan/keypair.h>
14 #include <botan/reducer.h>
15 #include <botan/emsa.h>
17 #if defined(BOTAN_HAS_RFC6979_GENERATOR)
18 #include <botan/rfc6979.h>
21 #if defined(BOTAN_HAS_OPENSSL)
22 #include <botan/internal/openssl.h>
49 const std::string& emsa) :
50 PK_Ops::Signature_with_EMSA(emsa),
51 m_order(ecdsa.domain().get_order()),
53 m_x(ecdsa.private_value()),
59 size_t max_input_bits()
const override {
return m_order.bits(); }
61 secure_vector<uint8_t> raw_sign(
const uint8_t msg[],
size_t msg_len,
62 RandomNumberGenerator& rng)
override;
72 secure_vector<uint8_t>
73 ECDSA_Signature_Operation::raw_sign(
const uint8_t msg[],
size_t msg_len,
74 RandomNumberGenerator& rng)
76 const BigInt m(msg, msg_len);
78 #if defined(BOTAN_HAS_RFC6979_GENERATOR)
98 class ECDSA_Verification_Operation :
public PK_Ops::Verification_with_EMSA
101 ECDSA_Verification_Operation(
const ECDSA_PublicKey& ecdsa,
102 const std::string& emsa) :
103 PK_Ops::Verification_with_EMSA(emsa),
106 m_order(ecdsa.domain().get_order()),
112 size_t max_input_bits()
const override {
return m_order.bits(); }
114 bool with_recovery()
const override {
return false; }
116 bool verify(
const uint8_t msg[],
size_t msg_len,
117 const uint8_t sig[],
size_t sig_len)
override;
126 bool ECDSA_Verification_Operation::verify(
const uint8_t msg[],
size_t msg_len,
127 const uint8_t sig[],
size_t sig_len)
132 BigInt e(msg, msg_len);
134 BigInt r(sig, sig_len / 2);
135 BigInt s(sig + sig_len / 2, sig_len / 2);
155 std::unique_ptr<PK_Ops::Verification>
157 const std::string& provider)
const
159 #if defined(BOTAN_HAS_OPENSSL)
160 if(provider ==
"openssl" || provider.empty())
164 return make_openssl_ecdsa_ver_op(*
this, params);
168 if(provider ==
"openssl")
174 if(provider ==
"base" || provider.empty())
175 return std::unique_ptr<PK_Ops::Verification>(
new ECDSA_Verification_Operation(*
this, params));
180 std::unique_ptr<PK_Ops::Signature>
182 const std::string& params,
183 const std::string& provider)
const
185 #if defined(BOTAN_HAS_OPENSSL)
186 if(provider ==
"openssl" || provider.empty())
190 return make_openssl_ecdsa_sig_op(*
this, params);
194 if(provider ==
"openssl")
200 if(provider ==
"base" || provider.empty())
201 return std::unique_ptr<PK_Ops::Signature>(
new ECDSA_Signature_Operation(*
this, params));
bool check_key(RandomNumberGenerator &rng, bool) const override
std::string hash_for_emsa(const std::string &algo_spec)
static BigInt random_integer(RandomNumberGenerator &rng, const BigInt &min, const BigInt &max)
Modular_Reducer m_mod_order
const PointGFp & public_point() const
#define BOTAN_ASSERT(expr, assertion_made)
Blinded_Point_Multiply m_base_point
BigInt multiply(const BigInt &x, const BigInt &y) const
PointGFp blinded_multiply(const BigInt &scalar, RandomNumberGenerator &rng)
bool signature_consistency_check(RandomNumberGenerator &rng, const Private_Key &private_key, const Public_Key &public_key, const std::string &padding)
std::unique_ptr< PK_Ops::Verification > create_verification_op(const std::string ¶ms, const std::string &provider) const override
BigInt reduce(const BigInt &x) const
BigInt inverse_mod(const BigInt &n, const BigInt &mod)
std::unique_ptr< PK_Ops::Signature > create_signature_op(RandomNumberGenerator &rng, const std::string ¶ms, const std::string &provider) const override
BigInt generate_rfc6979_nonce(const BigInt &x, const BigInt &q, const BigInt &h, const std::string &hash)
std::string algo_name() const override
static secure_vector< uint8_t > encode_fixed_length_int_pair(const BigInt &n1, const BigInt &n2, size_t bytes)
const PointGFp & m_public_point
PointGFp multi_exponentiate(const PointGFp &p1, const BigInt &z1, const PointGFp &p2, const BigInt &z2)
BigInt mul_add(const BigInt &a, const BigInt &b, const BigInt &c)