Botan 3.11.0
Crypto and TLS for C&
Botan::Gf448Elem Class Referencefinal

#include <curve448_gf.h>

Public Member Functions

void ct_cond_assign (CT::Mask< uint64_t > mask, const Gf448Elem &other)
 Set this to other if mask is true. Constant time.
void ct_cond_swap (CT::Mask< uint64_t > mask, Gf448Elem &other)
 Swap this and other if mask is set. Constant time.
 Gf448Elem (std::span< const uint64_t, WORDS_448 > data)
 Construct a GF element from a 448-bit integer gives as 7 uint64_t words x in little-endian order.
 Gf448Elem (std::span< const uint8_t, BYTES_448 > x)
 Construct a GF element from a 448-bit integer gives as 56 bytes x in little-endian order.
 Gf448Elem (uint64_t least_sig_word)
 Construct a GF element by passing the least significant 64 bits as a word. All other become zero.
bool is_odd () const
 Return true iff this element is odd. Constant time.
bool is_zero () const
 Return true iff this element is zero. Constant time.
bool operator!= (const Gf448Elem &other) const =default
Gf448Elem operator* (const Gf448Elem &other) const
Gf448Elem operator+ (const Gf448Elem &other) const
Gf448Elem operator- () const
Gf448Elem operator- (const Gf448Elem &other) const
Gf448Elem operator/ (const Gf448Elem &other) const
bool operator== (const Gf448Elem &other) const
std::array< uint8_t, BYTES_448to_bytes () const
 Return the canonical representation of the GF element as 56 bytes in little-endian order.
void to_bytes (std::span< uint8_t, BYTES_448 > out) const
 Store the canonical representation of the GF element as 56 bytes in little-endian order.
std::span< uint64_t, WORDS_448words ()
 Accessor to the internal words of the GF element.
std::span< const uint64_t, WORDS_448words () const
 Constant accessor to the internal words of the GF element.

Static Public Member Functions

static bool bytes_are_canonical_representation (std::span< const uint8_t, BYTES_448 > x)
 Given 56 bytes, checks that the (little endian) number from this bytes is a valid GF element, i.e. is smaller than the prime modulus.
static Gf448Elem one ()
static Gf448Elem zero ()

Detailed Description

This class represents a GF element in the field GF(2^448 - 2^224 - 1). Computations are performed using optimized operations as defined in the paper: "Reduction Modulo 2^448 - 2^224 - 1" by Kaushik Nath and Palash Sarkar (https://eprint.iacr.org/2019/1304).

The representation of the field element is a 448-bit uint, stored in little-endian order as 7*64bit words. Note that the internal representation is not necessarily canonical, i.e. the value might be larger than the prime modulus. When calling the to_bytes() method, the canonical representation is returned.

Definition at line 36 of file curve448_gf.h.

Constructor & Destructor Documentation

◆ Gf448Elem() [1/3]

Botan::Gf448Elem::Gf448Elem ( std::span< const uint8_t, BYTES_448 > x)
explicit

Construct a GF element from a 448-bit integer gives as 56 bytes x in little-endian order.

Definition at line 356 of file curve448_gf.cpp.

356 {
357 load_le(m_x, x);
358}
constexpr auto load_le(ParamTs &&... params)
Definition loadstor.h:495

References Botan::load_le().

Referenced by ct_cond_assign(), ct_cond_swap(), one(), operator!=(), operator*(), operator+(), operator-(), operator-(), operator/(), operator==(), and zero().

◆ Gf448Elem() [2/3]

Botan::Gf448Elem::Gf448Elem ( std::span< const uint64_t, WORDS_448 > data)
inlineexplicit

Construct a GF element from a 448-bit integer gives as 7 uint64_t words x in little-endian order.

Definition at line 48 of file curve448_gf.h.

48{ copy_mem(m_x, data); }
constexpr void copy_mem(T *out, const T *in, size_t n)
Definition mem_ops.h:144

References Botan::copy_mem().

◆ Gf448Elem() [3/3]

Botan::Gf448Elem::Gf448Elem ( uint64_t least_sig_word)
explicit

Construct a GF element by passing the least significant 64 bits as a word. All other become zero.

Definition at line 360 of file curve448_gf.cpp.

360 {
361 clear_mem(m_x);
362 m_x[0] = least_sig_word;
363}
constexpr void clear_mem(T *ptr, size_t n)
Definition mem_ops.h:118

References Botan::clear_mem().

Member Function Documentation

◆ bytes_are_canonical_representation()

bool Botan::Gf448Elem::bytes_are_canonical_representation ( std::span< const uint8_t, BYTES_448 > x)
static

Given 56 bytes, checks that the (little endian) number from this bytes is a valid GF element, i.e. is smaller than the prime modulus.

Definition at line 433 of file curve448_gf.cpp.

433 {
434 const auto x_words = load_le<std::array<uint64_t, WORDS_448>>(x);
435 const auto x_words_canonical = to_canonical(x_words);
436 return CT::is_equal(x_words.data(), x_words_canonical.data(), WORDS_448).as_bool();
437}
constexpr CT::Mask< T > is_equal(const T x[], const T y[], size_t len)
Definition ct_utils.h:798
constexpr size_t WORDS_448
Definition curve448_gf.h:23

References Botan::CT::is_equal(), Botan::load_le(), and Botan::WORDS_448.

Referenced by Botan::Ed448Point::decode().

◆ ct_cond_assign()

void Botan::Gf448Elem::ct_cond_assign ( CT::Mask< uint64_t > mask,
const Gf448Elem & other )

Set this to other if mask is true. Constant time.

Definition at line 381 of file curve448_gf.cpp.

381 {
382 mask.select_n(m_x.data(), other.m_x.data(), m_x.data(), WORDS_448);
383}

References Gf448Elem(), Botan::CT::Mask< T >::select_n(), and Botan::WORDS_448.

◆ ct_cond_swap()

void Botan::Gf448Elem::ct_cond_swap ( CT::Mask< uint64_t > mask,
Gf448Elem & other )

Swap this and other if mask is set. Constant time.

Definition at line 375 of file curve448_gf.cpp.

375 {
376 for(size_t i = 0; i < WORDS_448; ++i) {
377 mask.conditional_swap(m_x[i], other.m_x[i]);
378 }
379}

References Botan::CT::Mask< T >::conditional_swap(), Gf448Elem(), and Botan::WORDS_448.

Referenced by Botan::x448().

◆ is_odd()

bool Botan::Gf448Elem::is_odd ( ) const

Return true iff this element is odd. Constant time.

Definition at line 428 of file curve448_gf.cpp.

428 {
429 const auto canonical_form = to_canonical(m_x);
430 return (canonical_form[0] & 1) == 1;
431}

Referenced by Botan::Ed448Point::decode(), and Botan::Ed448Point::encode().

◆ is_zero()

bool Botan::Gf448Elem::is_zero ( ) const

Return true iff this element is zero. Constant time.

Definition at line 422 of file curve448_gf.cpp.

422 {
423 const auto canonical_form = to_canonical(m_x);
424
425 return CT::all_zeros(canonical_form.data(), WORDS_448).as_bool();
426}
constexpr CT::Mask< T > all_zeros(const T elem[], size_t len)
Definition ct_utils.h:785

References Botan::CT::all_zeros(), and Botan::WORDS_448.

◆ one()

Gf448Elem Botan::Gf448Elem::one ( )
inlinestatic

Return the constant value one

Definition at line 64 of file curve448_gf.h.

64{ return Gf448Elem(1); }
Gf448Elem(std::span< const uint8_t, BYTES_448 > x)
Construct a GF element from a 448-bit integer gives as 56 bytes x in little-endian order.

References Gf448Elem().

Referenced by Botan::Ed448Point::decode(), Botan::Ed448Point::identity(), and Botan::x448().

◆ operator!=()

bool Botan::Gf448Elem::operator!= ( const Gf448Elem & other) const
default

References Gf448Elem().

◆ operator*()

Gf448Elem Botan::Gf448Elem::operator* ( const Gf448Elem & other) const

Definition at line 403 of file curve448_gf.cpp.

403 {
404 Gf448Elem res(0);
405 gf_mul(res.m_x, m_x, other.m_x);
406 return res;
407}

References Gf448Elem().

◆ operator+()

Gf448Elem Botan::Gf448Elem::operator+ ( const Gf448Elem & other) const

Definition at line 385 of file curve448_gf.cpp.

385 {
386 Gf448Elem res(0);
387 gf_add(res.m_x, m_x, other.m_x);
388 return res;
389}

References Gf448Elem().

◆ operator-() [1/2]

Gf448Elem Botan::Gf448Elem::operator- ( ) const

Definition at line 397 of file curve448_gf.cpp.

397 {
398 Gf448Elem res(0);
399 gf_sub(res.m_x, res.m_x, m_x);
400 return res;
401}

References Gf448Elem().

◆ operator-() [2/2]

Gf448Elem Botan::Gf448Elem::operator- ( const Gf448Elem & other) const

Definition at line 391 of file curve448_gf.cpp.

391 {
392 Gf448Elem res(0);
393 gf_sub(res.m_x, m_x, other.m_x);
394 return res;
395}

References Gf448Elem().

◆ operator/()

Gf448Elem Botan::Gf448Elem::operator/ ( const Gf448Elem & other) const

Definition at line 409 of file curve448_gf.cpp.

409 {
410 Gf448Elem res(0);
411 gf_inv(res.m_x, other.m_x);
412 gf_mul(res.m_x, m_x, res.m_x);
413 return res;
414}

References Gf448Elem().

◆ operator==()

bool Botan::Gf448Elem::operator== ( const Gf448Elem & other) const

Definition at line 416 of file curve448_gf.cpp.

416 {
417 const auto canonical_form_this = to_canonical(m_x);
418 const auto canonical_form_other = to_canonical(other.m_x);
419 return CT::is_equal(canonical_form_this.data(), canonical_form_other.data(), WORDS_448).as_bool();
420}

References Gf448Elem(), Botan::CT::is_equal(), and Botan::WORDS_448.

◆ to_bytes() [1/2]

std::array< uint8_t, BYTES_448 > Botan::Gf448Elem::to_bytes ( ) const

Return the canonical representation of the GF element as 56 bytes in little-endian order.

Definition at line 369 of file curve448_gf.cpp.

369 {
370 std::array<uint8_t, BYTES_448> bytes{};
371 to_bytes(bytes);
372 return bytes;
373}
std::array< uint8_t, BYTES_448 > to_bytes() const
Return the canonical representation of the GF element as 56 bytes in little-endian order.

References to_bytes().

Referenced by to_bytes().

◆ to_bytes() [2/2]

void Botan::Gf448Elem::to_bytes ( std::span< uint8_t, BYTES_448 > out) const

Store the canonical representation of the GF element as 56 bytes in little-endian order.

Parameters
outThe 56 byte output buffer.

Definition at line 365 of file curve448_gf.cpp.

365 {
366 store_le(out, to_canonical(m_x));
367}
constexpr auto store_le(ParamTs &&... params)
Definition loadstor.h:736

References Botan::store_le().

Referenced by Botan::Ed448Point::encode().

◆ words() [1/2]

std::span< uint64_t, WORDS_448 > Botan::Gf448Elem::words ( )
inline

Accessor to the internal words of the GF element.

Note that the internal representation is not necessarily canonical, i.e. the value might be larger than the prime modulus.

Definition at line 120 of file curve448_gf.h.

120{ return m_x; }

Referenced by Botan::mul_a24(), Botan::root(), and Botan::square().

◆ words() [2/2]

std::span< const uint64_t, WORDS_448 > Botan::Gf448Elem::words ( ) const
inline

Constant accessor to the internal words of the GF element.

Note that the internal representation is not necessarily canonical, i.e. the value might be larger than the prime modulus.

Definition at line 128 of file curve448_gf.h.

128{ return m_x; }

◆ zero()

Gf448Elem Botan::Gf448Elem::zero ( )
inlinestatic

Return the constant value zero

Definition at line 59 of file curve448_gf.h.

59{ return Gf448Elem(0); }

References Gf448Elem().

Referenced by Botan::Ed448Point::identity(), and Botan::x448().


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