7#include <botan/internal/ec_key_data.h>
14 m_group(std::move(group)), m_point(m_group, bytes) {
15#if defined(BOTAN_HAS_LEGACY_EC_POINT)
16 m_legacy_point = m_point.to_legacy_point();
21 m_group(std::move(group)), m_scalar(std::move(x)), m_legacy_x(m_scalar.to_bigint()) {}
25EC_Scalar decode_ec_secret_key_scalar(
const EC_Group& group, std::span<const uint8_t> bytes) {
28 if(bytes.size() < order_bytes) {
39 copy_mem(std::span{padded_sk}.last(bytes.size()), bytes);
40 return decode_ec_secret_key_scalar(group, padded_sk);
46 throw Decoding_Error(
"EC private key is invalid for this group");
53 m_group(std::move(group)),
54 m_scalar(decode_ec_secret_key_scalar(m_group, bytes)),
55 m_legacy_x(m_scalar.to_bigint()) {}
58 bool with_modular_inverse)
const {
59 auto public_point = [&] {
60 std::vector<BigInt> ws;
61 if(with_modular_inverse) {
68 return std::make_shared<EC_PublicKey_Data>(m_group, public_point());
73 return this->
public_key(null_rng, with_modular_inverse);
static EC_AffinePoint g_mul(const EC_Scalar &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws)
size_t get_order_bytes() const
void serialize_to(std::span< uint8_t > output) const
std::shared_ptr< EC_PublicKey_Data > public_key(RandomNumberGenerator &rng, bool with_modular_inverse) const
EC_PrivateKey_Data(EC_Group group, EC_Scalar x)
EC_PublicKey_Data(EC_Group group, EC_AffinePoint pt)
static std::optional< EC_Scalar > deserialize(const EC_Group &group, std::span< const uint8_t > bytes)
void serialize_to(std::span< uint8_t > bytes) const
std::vector< T, secure_allocator< T > > secure_vector
constexpr void copy_mem(T *out, const T *in, size_t n)