Botan 3.7.1
Crypto and TLS for C&
Botan::EC_AffinePoint_Data_BN Class Referencefinal

#include <ec_inner_bn.h>

Inheritance diagram for Botan::EC_AffinePoint_Data_BN:
Botan::EC_AffinePoint_Data

Public Member Functions

std::unique_ptr< EC_AffinePoint_Dataclone () const override
 
 EC_AffinePoint_Data_BN (std::shared_ptr< const EC_Group_Data > group, EC_Point pt)
 
 EC_AffinePoint_Data_BN (std::shared_ptr< const EC_Group_Data > group, std::span< const uint8_t > pt)
 
size_t field_element_bytes () const override
 
const std::shared_ptr< const EC_Group_Data > & group () const override
 
bool is_identity () const override
 
std::unique_ptr< EC_AffinePoint_Datamul (const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const override
 
secure_vector< uint8_t > mul_x_only (const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const override
 
void serialize_compressed_to (std::span< uint8_t > bytes) const override
 
void serialize_uncompressed_to (std::span< uint8_t > bytes) const override
 
void serialize_x_to (std::span< uint8_t > bytes) const override
 
void serialize_xy_to (std::span< uint8_t > bytes) const override
 
void serialize_y_to (std::span< uint8_t > bytes) const override
 
EC_Point to_legacy_point () const override
 

Detailed Description

Definition at line 57 of file ec_inner_bn.h.

Constructor & Destructor Documentation

◆ EC_AffinePoint_Data_BN() [1/2]

Botan::EC_AffinePoint_Data_BN::EC_AffinePoint_Data_BN ( std::shared_ptr< const EC_Group_Data > group,
EC_Point pt )

Definition at line 78 of file ec_inner_bn.cpp.

78 :
79 m_group(std::move(group)), m_pt(std::move(pt)) {
80 if(!m_pt.is_zero()) {
81 m_pt.force_affine();
82 m_xy = m_pt.xy_bytes();
83 }
84}
const std::shared_ptr< const EC_Group_Data > & group() const override
secure_vector< uint8_t > xy_bytes() const
Definition ec_point.cpp:583
bool is_zero() const
Definition ec_point.h:162
void force_affine()
Definition ec_point.cpp:545

References Botan::EC_Point::is_zero().

◆ EC_AffinePoint_Data_BN() [2/2]

Botan::EC_AffinePoint_Data_BN::EC_AffinePoint_Data_BN ( std::shared_ptr< const EC_Group_Data > group,
std::span< const uint8_t > pt )

Definition at line 86 of file ec_inner_bn.cpp.

87 :
88 m_group(std::move(group)) {
89 BOTAN_ASSERT_NONNULL(m_group);
90 m_pt = Botan::OS2ECP(pt, m_group->curve());
91 if(!m_pt.is_zero()) {
92 m_xy = m_pt.xy_bytes();
93 }
94}
#define BOTAN_ASSERT_NONNULL(ptr)
Definition assert.h:86
EC_Point OS2ECP(std::span< const uint8_t > data, const CurveGFp &curve)
Definition ec_point.cpp:815

References BOTAN_ASSERT_NONNULL, Botan::EC_Point::is_zero(), Botan::OS2ECP(), and Botan::EC_Point::xy_bytes().

Member Function Documentation

◆ clone()

std::unique_ptr< EC_AffinePoint_Data > Botan::EC_AffinePoint_Data_BN::clone ( ) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 96 of file ec_inner_bn.cpp.

96 {
97 return std::make_unique<EC_AffinePoint_Data_BN>(m_group, m_pt);
98}

◆ field_element_bytes()

size_t Botan::EC_AffinePoint_Data_BN::field_element_bytes ( ) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 140 of file ec_inner_bn.cpp.

140 {
141 return m_group->p_bytes();
142}

Referenced by serialize_compressed_to(), serialize_uncompressed_to(), serialize_x_to(), serialize_xy_to(), and serialize_y_to().

◆ group()

const std::shared_ptr< const EC_Group_Data > & Botan::EC_AffinePoint_Data_BN::group ( ) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 100 of file ec_inner_bn.cpp.

100 {
101 return m_group;
102}

◆ is_identity()

bool Botan::EC_AffinePoint_Data_BN::is_identity ( ) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 144 of file ec_inner_bn.cpp.

144 {
145 return m_xy.empty();
146}

Referenced by serialize_compressed_to(), serialize_uncompressed_to(), serialize_x_to(), serialize_xy_to(), and serialize_y_to().

◆ mul()

std::unique_ptr< EC_AffinePoint_Data > Botan::EC_AffinePoint_Data_BN::mul ( const EC_Scalar_Data & scalar,
RandomNumberGenerator & rng,
std::vector< BigInt > & ws ) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 104 of file ec_inner_bn.cpp.

106 {
107 BOTAN_ARG_CHECK(scalar.group() == m_group, "Curve mismatch");
108 const auto& bn = EC_Scalar_Data_BN::checked_ref(scalar);
109
110 EC_Point_Var_Point_Precompute mul(m_pt, rng, ws);
111
112 // We pass order*cofactor here to "correctly" handle the case where the
113 // point is on the curve but not in the prime order subgroup. This only
114 // matters for groups with cofactor > 1
115 // See https://github.com/randombit/botan/issues/3800
116
117 const auto order = m_group->order() * m_group->cofactor();
118 auto pt = mul.mul(bn.value(), rng, order, ws);
119 return std::make_unique<EC_AffinePoint_Data_BN>(m_group, std::move(pt));
120}
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:29
std::unique_ptr< EC_AffinePoint_Data > mul(const EC_Scalar_Data &scalar, RandomNumberGenerator &rng, std::vector< BigInt > &ws) const override
static const EC_Scalar_Data_BN & checked_ref(const EC_Scalar_Data &data)

References BOTAN_ARG_CHECK, Botan::EC_Scalar_Data_BN::checked_ref(), Botan::EC_Scalar_Data::group(), and mul().

Referenced by mul(), and mul_x_only().

◆ mul_x_only()

secure_vector< uint8_t > Botan::EC_AffinePoint_Data_BN::mul_x_only ( const EC_Scalar_Data & scalar,
RandomNumberGenerator & rng,
std::vector< BigInt > & ws ) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 122 of file ec_inner_bn.cpp.

124 {
125 BOTAN_ARG_CHECK(scalar.group() == m_group, "Curve mismatch");
126 const auto& bn = EC_Scalar_Data_BN::checked_ref(scalar);
127
128 EC_Point_Var_Point_Precompute mul(m_pt, rng, ws);
129
130 // We pass order*cofactor here to "correctly" handle the case where the
131 // point is on the curve but not in the prime order subgroup. This only
132 // matters for groups with cofactor > 1
133 // See https://github.com/randombit/botan/issues/3800
134
135 const auto order = m_group->order() * m_group->cofactor();
136 auto pt = mul.mul(bn.value(), rng, order, ws);
137 return pt.x_bytes();
138}

References BOTAN_ARG_CHECK, Botan::EC_Scalar_Data_BN::checked_ref(), Botan::EC_Scalar_Data::group(), and mul().

◆ serialize_compressed_to()

void Botan::EC_AffinePoint_Data_BN::serialize_compressed_to ( std::span< uint8_t > bytes) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 169 of file ec_inner_bn.cpp.

169 {
171 const size_t fe_bytes = this->field_element_bytes();
172 BOTAN_ARG_CHECK(bytes.size() == 1 + fe_bytes, "Invalid output size");
173 const bool y_is_odd = (m_xy[m_xy.size() - 1] & 0x01) == 0x01;
174
175 BufferStuffer stuffer(bytes);
176 stuffer.append(y_is_odd ? 0x03 : 0x02);
177 serialize_x_to(stuffer.next(fe_bytes));
178}
#define BOTAN_STATE_CHECK(expr)
Definition assert.h:41
void serialize_x_to(std::span< uint8_t > bytes) const override
size_t field_element_bytes() const override
bool is_identity() const override

References Botan::BufferStuffer::append(), BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, field_element_bytes(), is_identity(), Botan::BufferStuffer::next(), and serialize_x_to().

◆ serialize_uncompressed_to()

void Botan::EC_AffinePoint_Data_BN::serialize_uncompressed_to ( std::span< uint8_t > bytes) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 180 of file ec_inner_bn.cpp.

180 {
182 const size_t fe_bytes = this->field_element_bytes();
183 BOTAN_ARG_CHECK(bytes.size() == 1 + 2 * fe_bytes, "Invalid output size");
184 BufferStuffer stuffer(bytes);
185 stuffer.append(0x04);
186 stuffer.append(m_xy);
187}

References Botan::BufferStuffer::append(), BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, field_element_bytes(), and is_identity().

◆ serialize_x_to()

void Botan::EC_AffinePoint_Data_BN::serialize_x_to ( std::span< uint8_t > bytes) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 148 of file ec_inner_bn.cpp.

148 {
150 const size_t fe_bytes = this->field_element_bytes();
151 BOTAN_ARG_CHECK(bytes.size() == fe_bytes, "Invalid output size");
152 copy_mem(bytes, std::span{m_xy}.first(fe_bytes));
153}
constexpr void copy_mem(T *out, const T *in, size_t n)
Definition mem_ops.h:147

References BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, Botan::copy_mem(), field_element_bytes(), and is_identity().

Referenced by serialize_compressed_to().

◆ serialize_xy_to()

void Botan::EC_AffinePoint_Data_BN::serialize_xy_to ( std::span< uint8_t > bytes) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 162 of file ec_inner_bn.cpp.

162 {
164 const size_t fe_bytes = this->field_element_bytes();
165 BOTAN_ARG_CHECK(bytes.size() == 2 * fe_bytes, "Invalid output size");
166 copy_mem(bytes, m_xy);
167}

References BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, Botan::copy_mem(), field_element_bytes(), and is_identity().

◆ serialize_y_to()

void Botan::EC_AffinePoint_Data_BN::serialize_y_to ( std::span< uint8_t > bytes) const
overridevirtual

Implements Botan::EC_AffinePoint_Data.

Definition at line 155 of file ec_inner_bn.cpp.

155 {
157 const size_t fe_bytes = this->field_element_bytes();
158 BOTAN_ARG_CHECK(bytes.size() == fe_bytes, "Invalid output size");
159 copy_mem(bytes, std::span{m_xy}.last(fe_bytes));
160}

References BOTAN_ARG_CHECK, BOTAN_STATE_CHECK, Botan::copy_mem(), field_element_bytes(), and is_identity().

◆ to_legacy_point()

EC_Point Botan::EC_AffinePoint_Data_BN::to_legacy_point ( ) const
inlineoverride

Definition at line 89 of file ec_inner_bn.h.

89{ return m_pt; }

The documentation for this class was generated from the following files: