Botan 3.9.0
Crypto and TLS for C&
pcurves_generic.h
Go to the documentation of this file.
1/*
2* (C) 2025 Jack Lloyd
3*
4* Botan is released under the Simplified BSD License (see license.txt)
5*/
6
7#ifndef BOTAN_PCURVES_GENERIC_H_
8#define BOTAN_PCURVES_GENERIC_H_
9
10#include <botan/internal/pcurves.h>
11
12#include <botan/internal/monty.h>
13#include <memory>
14
15namespace Botan::PCurve {
16
17class GenericCurveParams;
18class GenericScalar;
19class GenericAffinePoint;
20class GenericProjectivePoint;
21class GenericBaseMulTable;
22
24 public std::enable_shared_from_this<GenericPrimeOrderCurve> {
25 public:
26 // This class should only be created via PCurveInstance::from_params
28 const BigInt& a,
29 const BigInt& b,
30 const BigInt& base_x,
31 const BigInt& base_y,
32 const BigInt& order);
33
34 size_t order_bits() const override;
35
36 size_t scalar_bytes() const override;
37
38 size_t field_element_bytes() const override;
39
40 ProjectivePoint mul_by_g(const Scalar& scalar, RandomNumberGenerator& rng) const override;
41
42 ProjectivePoint mul(const AffinePoint& pt, const Scalar& scalar, RandomNumberGenerator& rng) const override;
43
45 const Scalar& scalar,
46 RandomNumberGenerator& rng) const override;
47
48 std::unique_ptr<const PrecomputedMul2Table> mul2_setup_g(const AffinePoint& q) const override;
49
50 std::optional<ProjectivePoint> mul2_vartime(const PrecomputedMul2Table& tableb,
51 const Scalar& x,
52 const Scalar& y) const override;
53
54 std::optional<ProjectivePoint> mul_px_qy(const AffinePoint& p,
55 const Scalar& x,
56 const AffinePoint& q,
57 const Scalar& y,
58 RandomNumberGenerator& rng) const override;
59
61 const Scalar& v,
62 const Scalar& s1,
63 const Scalar& s2) const override;
64
65 Scalar base_point_mul_x_mod_order(const Scalar& scalar, RandomNumberGenerator& rng) const override;
66
67 AffinePoint generator() const override;
68
69 AffinePoint point_to_affine(const ProjectivePoint& pt) const override;
70
71 ProjectivePoint point_add(const AffinePoint& a, const AffinePoint& b) const override;
72
73 AffinePoint point_negate(const AffinePoint& pt) const override;
74
75 bool affine_point_is_identity(const AffinePoint& pt) const override;
76
77 void serialize_point(std::span<uint8_t> bytes, const AffinePoint& pt) const override;
78
79 void serialize_scalar(std::span<uint8_t> bytes, const Scalar& scalar) const override;
80
81 std::optional<Scalar> deserialize_scalar(std::span<const uint8_t> bytes) const override;
82
83 std::optional<Scalar> scalar_from_wide_bytes(std::span<const uint8_t> bytes) const override;
84
85 std::optional<AffinePoint> deserialize_point(std::span<const uint8_t> bytes) const override;
86
87 AffinePoint hash_to_curve_nu(std::function<void(std::span<uint8_t>)> expand_message) const override;
88
89 ProjectivePoint hash_to_curve_ro(std::function<void(std::span<uint8_t>)> expand_message) const override;
90
91 Scalar scalar_add(const Scalar& a, const Scalar& b) const override;
92
93 Scalar scalar_sub(const Scalar& a, const Scalar& b) const override;
94
95 Scalar scalar_mul(const Scalar& a, const Scalar& b) const override;
96
97 Scalar scalar_square(const Scalar& s) const override;
98
99 Scalar scalar_invert(const Scalar& s) const override;
100
101 Scalar scalar_invert_vartime(const Scalar& s) const override;
102
103 Scalar scalar_negate(const Scalar& s) const override;
104
105 bool scalar_is_zero(const Scalar& s) const override;
106
107 bool scalar_equal(const Scalar& a, const Scalar& b) const override;
108
109 Scalar scalar_one() const override;
110
111 Scalar random_scalar(RandomNumberGenerator& rng) const override;
112
113 const GenericCurveParams& _params() const { return *m_params; }
114
116
117 private:
118 PrimeOrderCurve::Scalar stash(const GenericScalar& s) const;
119
120 PrimeOrderCurve::AffinePoint stash(const GenericAffinePoint& pt) const;
121
122 PrimeOrderCurve::ProjectivePoint stash(const GenericProjectivePoint& pt) const;
123
124 GenericScalar from_stash(const PrimeOrderCurve::Scalar& s) const;
125
126 GenericAffinePoint from_stash(const PrimeOrderCurve::AffinePoint& pt) const;
127
128 GenericProjectivePoint from_stash(const PrimeOrderCurve::ProjectivePoint& pt) const;
129
130 std::unique_ptr<GenericCurveParams> m_params;
131 std::unique_ptr<GenericBaseMulTable> m_basemul;
132};
133
134} // namespace Botan::PCurve
135
136#endif
Scalar random_scalar(RandomNumberGenerator &rng) const override
AffinePoint point_negate(const AffinePoint &pt) const override
bool mul2_vartime_x_mod_order_eq(const PrecomputedMul2Table &tableb, const Scalar &v, const Scalar &s1, const Scalar &s2) const override
ProjectivePoint mul_by_g(const Scalar &scalar, RandomNumberGenerator &rng) const override
std::optional< ProjectivePoint > mul_px_qy(const AffinePoint &p, const Scalar &x, const AffinePoint &q, const Scalar &y, RandomNumberGenerator &rng) const override
ProjectivePoint hash_to_curve_ro(std::function< void(std::span< uint8_t >)> expand_message) const override
void serialize_scalar(std::span< uint8_t > bytes, const Scalar &scalar) const override
Scalar scalar_square(const Scalar &s) const override
Scalar squaring.
std::optional< Scalar > deserialize_scalar(std::span< const uint8_t > bytes) const override
std::optional< Scalar > scalar_from_wide_bytes(std::span< const uint8_t > bytes) const override
std::unique_ptr< const PrecomputedMul2Table > mul2_setup_g(const AffinePoint &q) const override
Setup a table for 2-ary multiplication where the first point is the generator.
GenericPrimeOrderCurve(const BigInt &p, const BigInt &a, const BigInt &b, const BigInt &base_x, const BigInt &base_y, const BigInt &order)
AffinePoint generator() const override
Return the standard generator.
const GenericCurveParams & _params() const
AffinePoint hash_to_curve_nu(std::function< void(std::span< uint8_t >)> expand_message) const override
ProjectivePoint point_add(const AffinePoint &a, const AffinePoint &b) const override
Scalar scalar_mul(const Scalar &a, const Scalar &b) const override
Scalar multiplication.
Scalar scalar_invert(const Scalar &s) const override
Scalar inversion.
std::optional< AffinePoint > deserialize_point(std::span< const uint8_t > bytes) const override
std::optional< ProjectivePoint > mul2_vartime(const PrecomputedMul2Table &tableb, const Scalar &x, const Scalar &y) const override
void serialize_point(std::span< uint8_t > bytes, const AffinePoint &pt) const override
bool scalar_is_zero(const Scalar &s) const override
Test if scalar is zero.
Scalar scalar_negate(const Scalar &s) const override
Scalar negation.
secure_vector< uint8_t > mul_x_only(const AffinePoint &pt, const Scalar &scalar, RandomNumberGenerator &rng) const override
ProjectivePoint mul(const AffinePoint &pt, const Scalar &scalar, RandomNumberGenerator &rng) const override
Scalar base_point_mul_x_mod_order(const Scalar &scalar, RandomNumberGenerator &rng) const override
Scalar scalar_invert_vartime(const Scalar &s) const override
Scalar inversion (variable time)
bool affine_point_is_identity(const AffinePoint &pt) const override
size_t scalar_bytes() const override
Return the byte length of the scalar element.
Scalar scalar_sub(const Scalar &a, const Scalar &b) const override
Scalar subtraction.
AffinePoint point_to_affine(const ProjectivePoint &pt) const override
bool scalar_equal(const Scalar &a, const Scalar &b) const override
Test if two scalars are equal.
Scalar scalar_add(const Scalar &a, const Scalar &b) const override
Scalar addition.
size_t order_bits() const override
Return the bit length of the group order.
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:69