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

#include <kyber_polynomial.h>

Inheritance diagram for Botan::KyberPolyTraits:
Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >

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 > p)
static constexpr void ntt (std::span< T, N > p)
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< KyberConstants, KyberPolyTraits >

Detailed Description

Definition at line 25 of file kyber_polynomial.h.

Member Typedef Documentation

◆ T

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

Definition at line 51 of file pqcrystals.h.

◆ T2

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

Definition at line 56 of file pqcrystals.h.

Member Function Documentation

◆ barrett_reduce()

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

Definition at line 122 of file pqcrystals.h.

Referenced by Botan::KyberPolyTraits::ntt().

◆ fqmul()

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

◆ inverse_ntt()

constexpr void Botan::KyberPolyTraits::inverse_ntt ( std::span< T, N > p)
inlinestaticconstexpr

NIST FIPS 203, Algorithm 10 (NTT^-1)

The output is effectively multiplied by the montgomery parameter 2^16 mod q so that the input factors 2^(-16) mod q are eliminated. Note that factors 2^(-16) 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^16 mod q) added (!). See above.

Definition at line 77 of file kyber_polynomial.h.

77 {
78 for(size_t len = 2, i = 127; len <= N / 2; len *= 2) {
79 for(size_t start = 0, j = 0; start < N; start = j + len) {
80 const auto zeta = zetas[i--];
81 for(j = start; j < start + len; ++j) {
82 const auto t = p[j];
83 p[j] = barrett_reduce_coefficient(static_cast<T>(t + p[j + len]));
84 p[j + len] = fqmul(zeta, static_cast<T>(p[j + len] - t));
85 }
86 }
87 }
88
89 for(auto& c : p) {
91 }
92 }

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

◆ ntt()

constexpr void Botan::KyberPolyTraits::ntt ( std::span< T, N > p)
inlinestaticconstexpr

NIST FIPS 203, Algorithm 9 (NTT)

Produces the result of the NTT transformation without any montgomery factors in the coefficients. Zetas are pre-computed and stored in the zetas array. The zeta values contain the montgomery factor 2^16 mod q.

Definition at line 51 of file kyber_polynomial.h.

51 {
52 for(size_t len = N / 2, i = 0; len >= 2; len /= 2) {
53 for(size_t start = 0, j = 0; start < N; start = j + len) {
54 const auto zeta = zetas[++i];
55 for(j = start; j < start + len; ++j) {
56 const auto t = fqmul(zeta, p[j + len]);
57 p[j + len] = static_cast<T>(p[j] - t);
58 p[j] = static_cast<T>(p[j] + t);
59 }
60 }
61 }
62
64 }
static constexpr void barrett_reduce(std::span< T, N > poly)
Definition pqcrystals.h:122

References Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >::barrett_reduce(), Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >::fqmul(), Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >::N, and Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >::zetas.

◆ poly_add()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, KyberPolyTraits >::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, KyberPolyTraits >::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, KyberPolyTraits >::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::KyberPolyTraits::poly_pointwise_montgomery ( std::span< T, N > result,
std::span< const T, N > lhs,
std::span< const T, N > rhs )
inlinestaticconstexpr

NIST FIPS 203, Algorithms 11 (MultiplyNTTs) and 12 (BaseCaseMultiply)

The result contains factors of 2^(-16) mod q (i.e. the inverse montgomery factor). This factor is eliminated by the inverse NTT transformation, see above.

NIST FIPS 203, Algorithm 12 (BaseCaseMultiply)

Definition at line 100 of file kyber_polynomial.h.

102 {
103 /**
104 * NIST FIPS 203, Algorithm 12 (BaseCaseMultiply)
105 */
106 auto basemul = [](const auto a, const auto b, const T zeta) -> std::tuple<T, T> {
107 return {static_cast<T>(fqmul(a[0], b[0]) + fqmul(fqmul(a[1], b[1]), zeta)),
108 static_cast<T>(fqmul(a[0], b[1]) + fqmul(a[1], b[0]))};
109 };
110
111 auto Tq_elem_count = [](auto p) { return p.size() / 2; };
112
113 auto Tq_elem = [](auto p, size_t i) {
114 if constexpr(std::is_const_v<typename decltype(p)::element_type>) {
115 return std::array<T, 2>{p[2 * i], p[2 * i + 1]};
116 } else {
117 return std::tuple<T&, T&>{p[2 * i], p[2 * i + 1]};
118 }
119 };
120
121 for(size_t i = 0; i < Tq_elem_count(result) / 2; ++i) {
122 const T zeta = zetas[64 + i];
123 const T nzeta = static_cast<T>(-zeta);
124 Tq_elem(result, 2 * i) = basemul(Tq_elem(lhs, 2 * i), Tq_elem(rhs, 2 * i), zeta);
125 Tq_elem(result, 2 * i + 1) = basemul(Tq_elem(lhs, 2 * i + 1), Tq_elem(rhs, 2 * i + 1), nzeta);
126 }
127 }

References Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >::fqmul(), and Botan::CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >::zetas.

◆ poly_sub()

constexpr void Botan::CRYSTALS::Trait_Base< ConstantsT, KyberPolyTraits >::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, KyberPolyTraits >::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, KyberPolyTraits >::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 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, KyberPolyTraits >::to_montgomery ( T a)
inlinestaticconstexprinherited

Definition at line 120 of file pqcrystals.h.

120{ return fqmul(a, MONTY_SQUARED); }

◆ CRYSTALS::Trait_Base< KyberConstants, KyberPolyTraits >

Member Data Documentation

◆ F_WITH_MONTY_SQUARED

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

Definition at line 71 of file pqcrystals.h.

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

◆ MONTY

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

Definition at line 62 of file pqcrystals.h.

◆ MONTY_SQUARED

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

Definition at line 63 of file pqcrystals.h.

◆ N

T Botan::CRYSTALS::Trait_Base< ConstantsT, KyberPolyTraits >::N
staticconstexprinherited

◆ Q

T Botan::CRYSTALS::Trait_Base< ConstantsT, KyberPolyTraits >::Q
staticconstexprinherited

◆ Q_inverse

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

◆ zetas

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

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