7#include <botan/internal/ec_key_data.h>
9#include <botan/exceptn.h>
10#include <botan/mem_ops.h>
27 return std::move(pt_uncompressed).value();
29 return std::move(pt_compressed).value();
31 throw Decoding_Error(
"Failed to deserialize elliptic curve point");
41 m_group(std::move(
group)), m_point(std::move(pt)) {
42#if defined(BOTAN_HAS_LEGACY_EC_POINT)
43 m_legacy_point = m_point.to_legacy_point();
48 BOTAN_ARG_CHECK(!m_point.is_identity(),
"ECC public key cannot be point at infinity");
52 m_group(std::move(
group)), m_scalar(std::move(x)), m_legacy_x(m_scalar.to_bigint()) {
55 BOTAN_ARG_CHECK(m_scalar.is_nonzero(),
"ECC private key cannot be zero");
60EC_Scalar decode_ec_secret_key_scalar(
const EC_Group& group, std::span<const uint8_t> bytes) {
63 if(bytes.size() < order_bytes) {
74 copy_mem(std::span{padded_sk}.last(bytes.size()), bytes);
75 return decode_ec_secret_key_scalar(group, padded_sk);
95 bool with_modular_inverse)
const {
96 auto public_point = [&] {
97 if(with_modular_inverse) {
104 return std::make_shared<EC_PublicKey_Data>(m_group, public_point());
109 return this->
public_key(null_rng, with_modular_inverse);
113 m_scalar.serialize_to(output);
#define BOTAN_ARG_CHECK(expr, msg)
static std::optional< EC_AffinePoint > deserialize_uncompressed(const EC_Group &group, std::span< const uint8_t > bytes)
static EC_AffinePoint g_mul(const EC_Scalar &scalar, RandomNumberGenerator &rng)
Multiply by the group generator returning a complete point.
static std::optional< EC_AffinePoint > deserialize_compressed(const EC_Group &group, std::span< const uint8_t > bytes)
size_t get_order_bytes() const
const EC_Group & group() 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)
const EC_Group & group() const
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)
constexpr void copy_mem(T *out, const T *in, size_t n)
std::vector< T, secure_allocator< T > > secure_vector