7#ifndef BOTAN_EC_INNER_DATA_H_
8#define BOTAN_EC_INNER_DATA_H_
10#include <botan/ec_group.h>
12#include <botan/asn1_obj.h>
13#include <botan/bigint.h>
14#include <botan/internal/monty.h>
15#include <botan/internal/stl_util.h>
19#if defined(BOTAN_HAS_LEGACY_EC_POINT)
20 #include <botan/internal/barrett.h>
25#if defined(BOTAN_HAS_LEGACY_EC_POINT)
41 virtual const std::shared_ptr<const EC_Group_Data>&
group()
const = 0;
43 virtual size_t bytes()
const = 0;
45 virtual std::unique_ptr<EC_Scalar_Data>
clone()
const = 0;
55 virtual std::unique_ptr<EC_Scalar_Data>
negate()
const = 0;
57 virtual std::unique_ptr<EC_Scalar_Data>
invert()
const = 0;
74 virtual const std::shared_ptr<const EC_Group_Data>&
group()
const = 0;
76 virtual std::unique_ptr<EC_AffinePoint_Data>
clone()
const = 0;
104#if defined(BOTAN_HAS_LEGACY_EC_POINT)
105 virtual EC_Point to_legacy_point()
const = 0;
125class EC_Group_Data final :
public std::enable_shared_from_this<EC_Group_Data> {
127 static std::shared_ptr<EC_Group_Data>
create(
const BigInt&
p,
165#if defined(BOTAN_HAS_LEGACY_EC_POINT)
166 const CurveGFp& curve()
const {
return m_curve; }
168 const EC_Point& base_point()
const {
return m_base_point; }
170 const Montgomery_Params& monty()
const {
return m_monty; }
172 const BigInt& monty_a()
const {
return m_a_r; }
174 const BigInt& monty_b()
const {
return m_b_r; }
176 const Barrett_Reduction& mod_order()
const {
return m_mod_order; }
189 size_t p_bits()
const {
return m_p_bits; }
191 size_t p_bytes()
const {
return (m_p_bits + 7) / 8; }
213 std::unique_ptr<EC_Scalar_Data>
scalar_deserialize(std::span<const uint8_t> bytes)
const;
237 std::unique_ptr<EC_Scalar_Data>
scalar_one()
const;
244 std::unique_ptr<EC_AffinePoint_Data>
point_deserialize(std::span<const uint8_t> bytes)
const;
247 std::span<const uint8_t> input,
248 std::span<const uint8_t> domain_sep)
const;
251 std::span<const uint8_t> input,
252 std::span<const uint8_t> domain_sep)
const;
290 std::shared_ptr<const PCurve::PrimeOrderCurve> m_pcurve;
292#if defined(BOTAN_HAS_LEGACY_EC_POINT)
294 std::unique_ptr<EC_Point_Base_Point_Precompute> m_base_mult;
305#if defined(BOTAN_HAS_LEGACY_EC_POINT)
320 std::vector<uint8_t> m_der_named_curve;
324 size_t m_order_bytes;
328 bool m_order_is_less_than_p;
#define BOTAN_ASSERT_NONNULL(ptr)
virtual void serialize_compressed_to(std::span< uint8_t > bytes) const =0
virtual ~EC_AffinePoint_Data()=default
virtual std::unique_ptr< EC_AffinePoint_Data > mul(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng) const =0
virtual secure_vector< uint8_t > mul_x_only(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng) const =0
virtual void serialize_y_to(std::span< uint8_t > bytes) const =0
virtual std::unique_ptr< EC_AffinePoint_Data > clone() const =0
virtual size_t field_element_bytes() const =0
virtual void serialize_uncompressed_to(std::span< uint8_t > bytes) const =0
virtual void serialize_x_to(std::span< uint8_t > bytes) const =0
virtual const std::shared_ptr< const EC_Group_Data > & group() const =0
virtual bool is_identity() const =0
virtual void serialize_xy_to(std::span< uint8_t > bytes) const =0
std::unique_ptr< EC_Scalar_Data > gk_x_mod_order(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng) const
const BigInt & g_x() const
std::unique_ptr< EC_AffinePoint_Data > affine_neg(const EC_AffinePoint_Data &p) const
std::unique_ptr< EC_Scalar_Data > scalar_from_bytes_mod_order(std::span< const uint8_t > bytes) const
std::unique_ptr< EC_AffinePoint_Data > point_deserialize(std::span< const uint8_t > bytes) const
bool a_is_minus_3() const
std::unique_ptr< EC_Scalar_Data > scalar_random(RandomNumberGenerator &rng) const
bool has_cofactor() const
std::unique_ptr< EC_Scalar_Data > scalar_deserialize(std::span< const uint8_t > bytes) const
bool params_match(const BigInt &p, const BigInt &a, const BigInt &b, const BigInt &g_x, const BigInt &g_y, const BigInt &order, const BigInt &cofactor) const
const PCurve::PrimeOrderCurve & pcurve() const
static std::shared_ptr< EC_Group_Data > create(const BigInt &p, const BigInt &a, const BigInt &b, const BigInt &g_x, const BigInt &g_y, const BigInt &order, const BigInt &cofactor, const OID &oid, EC_Group_Source source)
std::unique_ptr< EC_AffinePoint_Data > affine_add(const EC_AffinePoint_Data &p, const EC_AffinePoint_Data &q) const
EC_Group_Data(const BigInt &p, const BigInt &a, const BigInt &b, const BigInt &g_x, const BigInt &g_y, const BigInt &order, const BigInt &cofactor, const OID &oid, EC_Group_Source source)
std::unique_ptr< EC_Scalar_Data > scalar_from_bytes_with_trunc(std::span< const uint8_t > bytes) const
std::unique_ptr< EC_Mul2Table_Data > make_mul2_table(const EC_AffinePoint_Data &pt) const
std::unique_ptr< EC_AffinePoint_Data > mul_px_qy(const EC_AffinePoint_Data &p, const EC_Scalar_Data &x, const EC_AffinePoint_Data &q, const EC_Scalar_Data &y, RandomNumberGenerator &rng) const
std::unique_ptr< EC_Scalar_Data > scalar_one() const
std::unique_ptr< EC_AffinePoint_Data > point_g_mul(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng) const
size_t order_bits() const
const BigInt & cofactor() const
const std::vector< uint8_t > & der_named_curve() const
bool order_is_less_than_p() const
EC_Group_Source source() const
void set_oid(const OID &oid)
EC_Group_Engine engine() const
const BigInt & g_y() const
size_t order_bytes() const
std::unique_ptr< EC_Scalar_Data > scalar_from_bigint(const BigInt &bn) const
std::unique_ptr< EC_AffinePoint_Data > point_hash_to_curve_ro(std::string_view hash_fn, std::span< const uint8_t > input, std::span< const uint8_t > domain_sep) const
std::unique_ptr< EC_AffinePoint_Data > point_hash_to_curve_nu(std::string_view hash_fn, std::span< const uint8_t > input, std::span< const uint8_t > domain_sep) const
const BigInt & order() const
virtual ~EC_Mul2Table_Data()=default
virtual bool mul2_vartime_x_mod_order_eq(const EC_Scalar_Data &v, const EC_Scalar_Data &x, const EC_Scalar_Data &y) const =0
virtual std::unique_ptr< EC_AffinePoint_Data > mul2_vartime(const EC_Scalar_Data &x, const EC_Scalar_Data &y) const =0
virtual void assign(const EC_Scalar_Data &y)=0
virtual const std::shared_ptr< const EC_Group_Data > & group() const =0
virtual std::unique_ptr< EC_Scalar_Data > invert_vartime() const =0
virtual size_t bytes() const =0
virtual std::unique_ptr< EC_Scalar_Data > sub(const EC_Scalar_Data &other) const =0
virtual std::unique_ptr< EC_Scalar_Data > invert() const =0
virtual void serialize_to(std::span< uint8_t > bytes) const =0
virtual std::unique_ptr< EC_Scalar_Data > negate() const =0
virtual std::unique_ptr< EC_Scalar_Data > clone() const =0
virtual std::unique_ptr< EC_Scalar_Data > add(const EC_Scalar_Data &other) const =0
virtual void square_self()=0
virtual bool is_eq(const EC_Scalar_Data &y) const =0
virtual bool is_zero() const =0
virtual ~EC_Scalar_Data()=default
virtual std::unique_ptr< EC_Scalar_Data > mul(const EC_Scalar_Data &other) const =0
std::vector< T, secure_allocator< T > > secure_vector