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>
12#include <botan/internal/mem_utils.h>
26 m_point = other.inner().
clone();
32 m_point.swap(other.m_point);
37 m_point = group.
_data()->point_deserialize(bytes);
39 throw Decoding_Error(
"Failed to deserialize elliptic curve point");
43#if defined(BOTAN_HAS_LEGACY_EC_POINT)
45EC_Point EC_AffinePoint::to_legacy_point()
const {
46 return m_point->to_legacy_point();
68 if(a_is_id || b_is_id) {
69 return (a_is_id == b_is_id);
76 return CT::is_equal(a_xy.data(), b_xy.data(), a_xy.size()).as_bool();
80 const uint8_t id_encoding[1] = {0};
89 throw Internal_Error(
"EC_AffinePoint::generator curve rejected generator");
102 std::vector<uint8_t> sec1(1 + 2 * fe_bytes);
111 return inner().field_element_bytes();
115 return inner().is_identity();
119 std::string_view hash_fn,
120 std::span<const uint8_t> input,
121 std::span<const uint8_t> domain_sep) {
122 auto pt = group.
_data()->point_hash_to_curve_ro(hash_fn, input, domain_sep);
127 std::string_view hash_fn,
128 std::span<const uint8_t> input,
129 std::string_view domain_sep) {
134 std::string_view hash_fn,
135 std::span<const uint8_t> input,
136 std::span<const uint8_t> domain_sep) {
137 auto pt = group.
_data()->point_hash_to_curve_nu(hash_fn, input, domain_sep);
142 std::string_view hash_fn,
143 std::span<const uint8_t> input,
144 std::string_view domain_sep) {
151 if(
auto pt = group.
_data()->point_deserialize(bytes)) {
159 auto pt = scalar.
_inner().
group()->point_g_mul(scalar.inner(), rng);
168 return inner().mul_x_only(scalar.
_inner(), rng);
203 const bool y_is_odd = (enc[enc.size() - 1] & 0x01) == 0x01;
204 enc.front() = y_is_odd ? 0x07 : 0x06;
211 m_point->serialize_x_to(bytes);
216 m_point->serialize_y_to(bytes);
221 m_point->serialize_xy_to(bytes);
226 m_point->serialize_compressed_to(bytes);
231 m_point->serialize_uncompressed_to(bytes);
239 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 const std::shared_ptr< const EC_Group_Data > & group() 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)
static EC_AffinePoint g_mul(const EC_Scalar &scalar, RandomNumberGenerator &rng)
Multiply by the group generator returning a complete point.
T serialize_uncompressed() const
EC_AffinePoint(const EC_Group &group, std::span< const uint8_t > bytes)
EC_AffinePoint mul(const EC_Scalar &scalar, RandomNumberGenerator &rng) const
Multiply a point by a scalar returning a complete point.
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.
void serialize_x_to(std::span< uint8_t > bytes) const
T serialize_compressed() const
void serialize_compressed_to(std::span< uint8_t > bytes) const
secure_vector< uint8_t > mul_x_only(const EC_Scalar &scalar, RandomNumberGenerator &rng) const
Multiply a point by a scalar, returning the byte encoding of the x coordinate only.
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 generator(const EC_Group &group)
Return the standard group generator.
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::span< const uint8_t > as_span_of_bytes(const char *s, size_t len)
std::vector< T, secure_allocator< T > > secure_vector