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/reducer.h>
25#if defined(BOTAN_HAS_LEGACY_EC_POINT)
26class EC_Point_Base_Point_Precompute;
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;
101 std::vector<BigInt>& ws)
const = 0;
105 std::vector<BigInt>& ws)
const = 0;
107#if defined(BOTAN_HAS_LEGACY_EC_POINT)
108 virtual EC_Point to_legacy_point()
const = 0;
130 static std::shared_ptr<EC_Group_Data>
create(
const BigInt&
p,
168#if defined(BOTAN_HAS_LEGACY_EC_POINT)
169 const CurveGFp& curve()
const {
return m_curve; }
171 const EC_Point& base_point()
const {
return m_base_point; }
173 const Montgomery_Params& monty()
const {
return m_monty; }
175 const BigInt& monty_a()
const {
return m_a_r; }
177 const BigInt& monty_b()
const {
return m_b_r; }
179 const Modular_Reducer& mod_order()
const {
return m_mod_order; }
192 size_t p_bits()
const {
return m_p_bits; }
194 size_t p_bytes()
const {
return (m_p_bits + 7) / 8; }
216 std::unique_ptr<EC_Scalar_Data>
scalar_deserialize(std::span<const uint8_t> bytes)
const;
240 std::unique_ptr<EC_Scalar_Data>
scalar_zero()
const;
242 std::unique_ptr<EC_Scalar_Data>
scalar_one()
const;
246 std::vector<BigInt>& ws)
const;
251 std::unique_ptr<EC_AffinePoint_Data>
point_deserialize(std::span<const uint8_t> bytes)
const;
254 std::span<const uint8_t> input,
255 std::span<const uint8_t> domain_sep)
const;
258 std::span<const uint8_t> input,
259 std::span<const uint8_t> domain_sep)
const;
263 std::vector<BigInt>& ws)
const;
299 std::shared_ptr<const PCurve::PrimeOrderCurve> m_pcurve;
301#if defined(BOTAN_HAS_LEGACY_EC_POINT)
303 std::unique_ptr<EC_Point_Base_Point_Precompute> m_base_mult;
314#if defined(BOTAN_HAS_LEGACY_EC_POINT)
329 std::vector<uint8_t> m_der_named_curve;
333 size_t m_order_bytes;
337 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 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 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
virtual void serialize_xy_to(std::span< uint8_t > bytes) const =0
virtual std::unique_ptr< EC_AffinePoint_Data > mul(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const =0
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 > gk_x_mod_order(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) 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
std::unique_ptr< EC_Scalar_Data > scalar_zero() 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
size_t order_bits() const
const BigInt & cofactor() const
std::unique_ptr< EC_AffinePoint_Data > point_g_mul(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) 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
int(* final)(unsigned char *, CTX *)
std::vector< T, secure_allocator< T > > secure_vector