Botan 3.9.0
Crypto and TLS for C&
Botan::DilithiumPolyTraits Class Referencefinal

#include <dilithium_polynomial.h>

Inheritance diagram for Botan::DilithiumPolyTraits:
Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >

Public Types

using T

Static Public Member Functions

static constexpr void barrett_reduce (std::span< T, N > poly)
static constexpr void inverse_ntt (std::span< T, N > coeffs)
static constexpr void ntt (std::span< T, N > coeffs)
static constexpr void poly_add (std::span< T, N > result, std::span< const T, N > lhs, std::span< const T, N > rhs)
static constexpr void poly_cadd_q (std::span< T, N > coeffs)
 Adds Q if the coefficient is negative.
static constexpr void poly_pointwise_montgomery (std::span< T, N > result, std::span< const T, N > lhs, std::span< const T, N > rhs)
static constexpr void poly_sub (std::span< T, N > result, std::span< const T, N > lhs, std::span< const T, N > rhs)
static constexpr void polyvec_pointwise_acc_montgomery (std::span< T, N > w, std::span< const T > u, std::span< const T > v)
 Multiplication and accumulation of 2 polynomial vectors u and v.
static constexpr T to_montgomery (T a)

Static Public Attributes

static constexpr T N
static constexpr T Q

Protected Types

using T2

Static Protected Member Functions

static constexpr T fqmul (T a, T b)
static constexpr std::span< U, Npoly_in_polyvec (std::span< U > polyvec, size_t index)
static constexpr size_t polys_in_polyvec (std::span< const T > polyvec)

Static Protected Attributes

Pre-computed algorithm constants
static constexpr T Q_inverse
static constexpr T MONTY
static constexpr T MONTY_SQUARED
static constexpr T F_WITH_MONTY_SQUARED
static constexpr auto zetas

Friends

class CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >

Detailed Description

Definition at line 22 of file dilithium_polynomial.h.

Member Typedef Documentation

◆ T

using Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::T
inherited

Definition at line 51 of file pqcrystals.h.

◆ T2

using Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::T2
protectedinherited

Definition at line 56 of file pqcrystals.h.

Member Function Documentation

◆ barrett_reduce()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::barrett_reduce ( std::span< T, N > poly)
inlinestaticconstexprinherited

Definition at line 122 of file pqcrystals.h.

◆ fqmul()

constexpr T Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::fqmul ( T a,
T b )
inlinestaticconstexprprotectedinherited

◆ inverse_ntt()

constexpr void Botan::DilithiumPolyTraits::inverse_ntt ( std::span< T, N > coeffs)
inlinestaticconstexpr

NIST FIPS 204, Algorithm 42 (NTT^-1).

The output is effectively multiplied by the montgomery parameter 2^32 mod q so that the input factors 2^(-32) mod q are eliminated. Note that factors 2^(-32) mod q are introduced by multiplication and reduction of values not in montgomery domain.

Produces the result of the inverse NTT transformation with a montgomery factor of (2^32 mod q) added (!). See above.

Definition at line 78 of file dilithium_polynomial.h.

78 {
79 size_t j = 0;
80 size_t k = N;
81 for(size_t len = 1; len < N; len <<= 1) {
82 for(size_t start = 0; start < N; start = j + len) {
83 const T zeta = -zetas[--k];
84 for(j = start; j < start + len; ++j) {
85 T t = coeffs[j];
86 coeffs[j] = t + coeffs[j + len];
87 coeffs[j + len] = t - coeffs[j + len];
88 // Zetas contain the montgomery parameter 2^32 mod q
89 coeffs[j + len] = fqmul(zeta, coeffs[j + len]);
90 }
91 }
92 }
93
94 for(auto& coeff : coeffs) {
95 coeff = fqmul(coeff, F_WITH_MONTY_SQUARED);
96 }
97 }

References Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::F_WITH_MONTY_SQUARED, Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::fqmul(), Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::N, and Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::zetas.

◆ ntt()

constexpr void Botan::DilithiumPolyTraits::ntt ( std::span< T, N > coeffs)
inlinestaticconstexpr

NIST FIPS 204, Algorithm 41 (NTT)

Note: ntt(), inverse_ntt() and operator* have side effects on the montgomery factor of the involved coefficients! It is assumed that EXACTLY ONE vector or matrix multiplication is performed between transforming in and out of NTT domain.

Produces the result of the NTT transformation without any montgomery factors in the coefficients.

Definition at line 50 of file dilithium_polynomial.h.

50 {
51 size_t j = 0;
52 size_t k = 0;
53
54 for(size_t len = N / 2; len > 0; len >>= 1) {
55 for(size_t start = 0; start < N; start = j + len) {
56 const T zeta = zetas[++k];
57 for(j = start; j < start + len; ++j) {
58 // Zetas contain the montgomery parameter 2^32 mod q
59 T t = fqmul(zeta, coeffs[j + len]);
60 coeffs[j + len] = coeffs[j] - t;
61 coeffs[j] = coeffs[j] + t;
62 }
63 }
64 }
65 }

References Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::fqmul(), Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::N, and Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::zetas.

◆ poly_add()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::poly_add ( std::span< T, N > result,
std::span< const T, N > lhs,
std::span< const T, N > rhs )
inlinestaticconstexprinherited

Definition at line 99 of file pqcrystals.h.

99 {
100 for(size_t i = 0; i < N; ++i) {
101 result[i] = lhs[i] + rhs[i];
102 }
103 }

◆ poly_cadd_q()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::poly_cadd_q ( std::span< T, N > coeffs)
inlinestaticconstexprinherited

Adds Q if the coefficient is negative.

Definition at line 112 of file pqcrystals.h.

112 {
113 for(auto& coeff : coeffs) {
116 coeff += is_negative.if_set_return(Q);
117 }
118 }
static constexpr Mask< T > expand_top_bit(T v)
Definition ct_utils.h:443

◆ poly_in_polyvec()

constexpr std::span< U, N > Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::poly_in_polyvec ( std::span< U > polyvec,
size_t index )
inlinestaticconstexprprotectedinherited
Returns
the index-th polynomial in the polynomial vector polyvec.

Definition at line 89 of file pqcrystals.h.

89 {
90 BOTAN_DEBUG_ASSERT(polyvec.size() % N == 0);
92 auto polyspan = polyvec.subspan(index * N, N);
93 return std::span<U, N>{polyspan.data(), polyspan.size()};
94 }
#define BOTAN_DEBUG_ASSERT(expr)
Definition assert.h:129

◆ poly_pointwise_montgomery()

constexpr void Botan::DilithiumPolyTraits::poly_pointwise_montgomery ( std::span< T, N > result,
std::span< const T, N > lhs,
std::span< const T, N > rhs )
inlinestaticconstexpr

Multiplication of two polynomials lhs and rhs in NTT domain.

Produces the result of the multiplication in NTT domain, with a factor of (2^-32 mod q) in each element due to montgomery reduction.

Definition at line 105 of file dilithium_polynomial.h.

107 {
108 for(size_t i = 0; i < N; ++i) {
109 result[i] = fqmul(lhs[i], rhs[i]);
110 }
111 }

References Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::fqmul(), and Botan::CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >::N.

◆ poly_sub()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::poly_sub ( std::span< T, N > result,
std::span< const T, N > lhs,
std::span< const T, N > rhs )
inlinestaticconstexprinherited

Definition at line 105 of file pqcrystals.h.

105 {
106 for(size_t i = 0; i < N; ++i) {
107 result[i] = lhs[i] - rhs[i];
108 }
109 }

◆ polys_in_polyvec()

constexpr size_t Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::polys_in_polyvec ( std::span< const T > polyvec)
inlinestaticconstexprprotectedinherited
Returns
the number of polynomials in the polynomial vector polyvec.

Definition at line 81 of file pqcrystals.h.

81 {
82 BOTAN_DEBUG_ASSERT(polyvec.size() % N == 0);
83 return polyvec.size() / N;
84 }

◆ polyvec_pointwise_acc_montgomery()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::polyvec_pointwise_acc_montgomery ( std::span< T, N > w,
std::span< const T > u,
std::span< const T > v )
inlinestaticconstexprinherited

Multiplication and accumulation of 2 polynomial vectors u and v.

Definition at line 129 of file pqcrystals.h.

131 {
132 clear_mem(w);
134 for(size_t i = 0; i < polys_in_polyvec(u); ++i) {
136 poly_add(w, w, t);
137 }
139 }
static constexpr void barrett_reduce(std::span< T, N > poly)
Definition pqcrystals.h:122
static constexpr void poly_add(std::span< T, N > result, std::span< const T, N > lhs, std::span< const T, N > rhs)
Definition pqcrystals.h:99
static constexpr size_t polys_in_polyvec(std::span< const T > polyvec)
Definition pqcrystals.h:81
static constexpr std::span< U, N > poly_in_polyvec(std::span< U > polyvec, size_t index)
Definition pqcrystals.h:89
constexpr void clear_mem(T *ptr, size_t n)
Definition mem_ops.h:119

◆ to_montgomery()

constexpr T Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::to_montgomery ( T a)
inlinestaticconstexprinherited

Definition at line 120 of file pqcrystals.h.

120{ return fqmul(a, MONTY_SQUARED); }

◆ CRYSTALS::Trait_Base< DilithiumConstants, DilithiumPolyTraits >

Member Data Documentation

◆ F_WITH_MONTY_SQUARED

T Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::F_WITH_MONTY_SQUARED
staticconstexprprotectedinherited

Definition at line 71 of file pqcrystals.h.

Referenced by Botan::DilithiumPolyTraits::inverse_ntt().

◆ MONTY

T Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::MONTY
staticconstexprprotectedinherited

Definition at line 62 of file pqcrystals.h.

◆ MONTY_SQUARED

T Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::MONTY_SQUARED
staticconstexprprotectedinherited

Definition at line 63 of file pqcrystals.h.

◆ N

◆ Q

◆ Q_inverse

T Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::Q_inverse
staticconstexprprotectedinherited

◆ zetas

auto Botan::CRYSTALS::Trait_Base< ConstantsT, DilithiumPolyTraits >::zetas
staticconstexprprotectedinherited

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