7#include <botan/ec_apoint.h>
9#include <botan/ec_group.h>
10#include <botan/ec_scalar.h>
11#include <botan/internal/ec_inner_data.h>
19EC_AffinePoint::EC_AffinePoint(
const EC_AffinePoint& other) : m_point(other.inner().clone()) {}
25 m_point = other.inner().
clone();
31 m_point.swap(other.m_point);
36 m_point = group.
_data()->point_deserialize(bytes);
38 throw Decoding_Error(
"Failed to deserialize elliptic curve point");
42#if defined(BOTAN_HAS_LEGACY_EC_POINT)
44EC_Point EC_AffinePoint::to_legacy_point()
const {
45 return m_point->to_legacy_point();
67 if(a_is_id || b_is_id) {
68 return (a_is_id == b_is_id);
75 return CT::is_equal(a_xy.data(), b_xy.data(), a_xy.size()).as_bool();
79 const uint8_t id_encoding[1] = {0};
88 throw Internal_Error(
"EC_AffinePoint::generator curve rejected generator");
101 std::vector<uint8_t> sec1(1 + 2 * fe_bytes);
118 std::string_view hash_fn,
119 std::span<const uint8_t> input,
120 std::span<const uint8_t> domain_sep) {
121 auto pt = group.
_data()->point_hash_to_curve_ro(hash_fn, input, domain_sep);
126 std::string_view hash_fn,
127 std::span<const uint8_t> input,
128 std::span<const uint8_t> domain_sep) {
129 auto pt = group.
_data()->point_hash_to_curve_nu(hash_fn, input, domain_sep);
136 if(
auto pt = group.
_data()->point_deserialize(bytes)) {
144 auto pt = scalar.
_inner().
group()->point_g_mul(scalar.inner(), rng, ws);
154 std::vector<BigInt>& ws)
const {
190 const bool y_is_odd = (enc[enc.size() - 1] & 0x01) == 0x01;
191 enc.front() = y_is_odd ? 0x07 : 0x06;
198 m_point->serialize_x_to(bytes);
203 m_point->serialize_y_to(bytes);
208 m_point->serialize_xy_to(bytes);
213 m_point->serialize_compressed_to(bytes);
218 m_point->serialize_uncompressed_to(bytes);
226 return inner().
group();
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_STATE_CHECK(expr)
#define BOTAN_ASSERT_NONNULL(ptr)
void serialize_to(std::span< uint8_t > out) const
virtual std::unique_ptr< EC_AffinePoint_Data > clone() const =0
virtual size_t field_element_bytes() const =0
virtual secure_vector< uint8_t > mul_x_only(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const =0
virtual const std::shared_ptr< const EC_Group_Data > & group() const =0
virtual bool is_identity() const =0
static EC_AffinePoint hash_to_curve_ro(const EC_Group &group, std::string_view hash_fn, std::span< const uint8_t > input, std::span< const uint8_t > domain_sep)
EC_AffinePoint negate() const
Point negation.
size_t field_element_bytes() const
void serialize_xy_to(std::span< uint8_t > bytes) const
static EC_AffinePoint hash_to_curve_nu(const EC_Group &group, std::string_view hash_fn, std::span< const uint8_t > input, std::span< const uint8_t > domain_sep)
bool is_identity() const
Return true if this point is the identity element.
static EC_AffinePoint identity(const EC_Group &group)
Return the identity element.
static std::optional< EC_AffinePoint > from_bigint_xy(const EC_Group &group, const BigInt &x, const BigInt &y)
static std::optional< EC_AffinePoint > mul_px_qy(const EC_AffinePoint &p, const EC_Scalar &x, const EC_AffinePoint &q, const EC_Scalar &y, RandomNumberGenerator &rng)
T serialize_uncompressed() const
EC_AffinePoint(const EC_Group &group, std::span< const uint8_t > bytes)
static EC_AffinePoint _from_inner(std::unique_ptr< EC_AffinePoint_Data > inner)
const std::shared_ptr< const EC_Group_Data > & _group() const
static std::optional< EC_AffinePoint > deserialize(const EC_Group &group, std::span< const uint8_t > bytes)
std::vector< uint8_t > serialize(EC_Point_Format format) const
Return an encoding depending on the requested format.
secure_vector< uint8_t > mul_x_only(const EC_Scalar &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const
void serialize_x_to(std::span< uint8_t > bytes) const
T serialize_compressed() const
void serialize_compressed_to(std::span< uint8_t > bytes) const
const EC_AffinePoint_Data & _inner() const
void serialize_uncompressed_to(std::span< uint8_t > bytes) const
void serialize_y_to(std::span< uint8_t > bytes) const
EC_AffinePoint add(const EC_AffinePoint &q) const
EC_AffinePoint & operator=(const EC_AffinePoint &other)
bool operator==(const EC_AffinePoint &other) const
static EC_AffinePoint g_mul(const EC_Scalar &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws)
static EC_AffinePoint generator(const EC_Group &group)
Return the standard group generator.
EC_AffinePoint mul(const EC_Scalar &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const
const BigInt & get_g_y() const
const BigInt & get_p() const
const BigInt & get_g_x() const
const std::shared_ptr< EC_Group_Data > & _data() const
size_t get_p_bytes() const
virtual const std::shared_ptr< const EC_Group_Data > & group() const =0
const EC_Scalar_Data & _inner() const
constexpr CT::Mask< T > is_equal(const T x[], const T y[], size_t len)
std::vector< T, secure_allocator< T > > secure_vector