14#ifndef BOTAN_DILITHIUM_POLYNOMIAL_H_
15#define BOTAN_DILITHIUM_POLYNOMIAL_H_
17#include <botan/dilithium.h>
19#include <botan/internal/dilithium_symmetric_primitives.h>
20#include <botan/internal/shake.h>
32 std::array<int32_t, Botan::DilithiumModeConstants::N>
m_coeffs;
40 for(
size_t i = 0; i < this->m_coeffs.size(); ++i)
42 this->m_coeffs[i] = this->m_coeffs[i] + other.
m_coeffs[i];
53 for(
size_t i = 0; i < this->m_coeffs.size(); ++i)
55 this->m_coeffs[i] = this->m_coeffs[i] - other.
m_coeffs[i];
78 size_t ctr = 0, pos = 0;
79 while(ctr < len && pos + 3 <= buflen)
81 uint32_t t = buf[pos++];
82 t |=
static_cast<uint32_t
>(buf[pos++]) << 8;
83 t |=
static_cast<uint32_t
>(buf[pos++]) << 16;
88 p.
m_coeffs[position + ctr++] =
static_cast<int32_t
>(t);
114 size_t ctr = 0, pos = 0;
115 while(ctr < len && pos < buflen)
117 uint32_t t0 = buf[pos] & 0x0F;
118 uint32_t t1 = buf[pos++] >> 4;
126 t0 = t0 - (205 * t0 >> 10) * 5;
127 a.
m_coeffs[offset + ctr++] = 2 - t0;
129 if(t1 < 15 && ctr < len)
131 t1 = t1 - (205 * t1 >> 10) * 5;
132 a.
m_coeffs[offset + ctr++] = 2 - t1;
140 a.
m_coeffs[offset + ctr++] = 4 - t0;
142 if(t1 < 9 && ctr < len)
144 a.
m_coeffs[offset + ctr++] = 4 - t1;
170 auto xof = mode.
XOF_256(seed, nonce);
173 xof->write_keystream(buf.data(), buf.size());
238 auto buf = shake256_hasher.
final();
241 for(
size_t i = 0; i < 8; ++i)
243 signs |=
static_cast<uint64_t
>(buf[i]) << 8 * i;
261 c.
m_coeffs[b] = 1 - 2 * (signs & 1);
291 size_t t = coeff >> 31;
292 t = coeff - (t & 2 * coeff);
317 const auto gamma2 = mode.
gamma2();
319 if(a0 <= gamma2 || a0 > Q_gamma2 || (a0 == Q_gamma2 && a1 == 0))
371 int32_t a1 = (a + 127) >> 7;
374 a1 = (a1 * 1025 + (1 << 21)) >> 22;
380 a1 = (a1 * 11275 + (1 << 23)) >> 24;
381 a1 ^= ((43 - a1) >> 31) & a1;
384 *a0 = a - a1 * 2 *
static_cast<int32_t
>(mode.
gamma2());
414 {
return (a1 + 1) & 15; }
416 {
return (a1 - 1) & 15; }
421 {
return (a1 == 43) ? 0 : a1 + 1; }
423 {
return (a1 == 0) ? 43 : a1 - 1; }
498 for(
size_t len = 128; len > 0; len >>= 1)
503 for(j = start; j < start + len; ++j)
527 int32_t t = (i + (1 << 22)) >> 23;
552 for(j = start; j < start + len; ++j)
647 for(
size_t i = 0; i <
m_coeffs.size(); ++i)
669 r[3 * i + 0] =
static_cast<uint8_t
>(
m_coeffs[4 * i + 0]);
670 r[3 * i + 0] |=
static_cast<uint8_t
>(
m_coeffs[4 * i + 1] << 6);
671 r[3 * i + 1] =
static_cast<uint8_t
>(
m_coeffs[4 * i + 1] >> 2);
672 r[3 * i + 1] |=
static_cast<uint8_t
>(
m_coeffs[4 * i + 2] << 4);
673 r[3 * i + 2] =
static_cast<uint8_t
>(
m_coeffs[4 * i + 2] >> 4);
674 r[3 * i + 2] |=
static_cast<uint8_t
>(
m_coeffs[4 * i + 3] << 2);
682 r[i] =
static_cast<uint8_t
>(
m_coeffs[2 * i + 0] | (
m_coeffs[2 * i + 1] << 4));
706 r.
m_coeffs[8 * i + 0] = (a[3 * i + 0] >> 0) & 7;
707 r.
m_coeffs[8 * i + 1] = (a[3 * i + 0] >> 3) & 7;
708 r.
m_coeffs[8 * i + 2] = ((a[3 * i + 0] >> 6) | (a[3 * i + 1] << 2)) & 7;
709 r.
m_coeffs[8 * i + 3] = (a[3 * i + 1] >> 1) & 7;
710 r.
m_coeffs[8 * i + 4] = (a[3 * i + 1] >> 4) & 7;
711 r.
m_coeffs[8 * i + 5] = ((a[3 * i + 1] >> 7) | (a[3 * i + 2] << 1)) & 7;
712 r.
m_coeffs[8 * i + 6] = (a[3 * i + 2] >> 2) & 7;
713 r.
m_coeffs[8 * i + 7] = (a[3 * i + 2] >> 5) & 7;
730 r.
m_coeffs[2 * i + 0] = a[i] & 0x0F;
762 t[0] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 0]);
763 t[1] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 1]);
764 t[2] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 2]);
765 t[3] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 3]);
766 t[4] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 4]);
767 t[5] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 5]);
768 t[6] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 6]);
769 t[7] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[8 * i + 7]);
771 r[3 * i + 0] = (t[0] >> 0) | (t[1] << 3) | (t[2] << 6);
772 r[3 * i + 1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7);
773 r[3 * i + 2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5);
781 t[0] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[2 * i + 0]);
782 t[1] =
static_cast<uint8_t
>(mode.
eta() -
m_coeffs[2 * i + 1]);
783 r[i] =
static_cast<uint8_t
>(t[0] | (t[1] << 4));
803 r.
m_coeffs[8 * i + 0] = a[13 * i + 0];
804 r.
m_coeffs[8 * i + 0] |=
static_cast<uint32_t
>(a[13 * i + 1]) << 8;
807 r.
m_coeffs[8 * i + 1] = a[13 * i + 1] >> 5;
808 r.
m_coeffs[8 * i + 1] |=
static_cast<uint32_t
>(a[13 * i + 2]) << 3;
809 r.
m_coeffs[8 * i + 1] |=
static_cast<uint32_t
>(a[13 * i + 3]) << 11;
812 r.
m_coeffs[8 * i + 2] = a[13 * i + 3] >> 2;
813 r.
m_coeffs[8 * i + 2] |=
static_cast<uint32_t
>(a[13 * i + 4]) << 6;
816 r.
m_coeffs[8 * i + 3] = a[13 * i + 4] >> 7;
817 r.
m_coeffs[8 * i + 3] |=
static_cast<uint32_t
>(a[13 * i + 5]) << 1;
818 r.
m_coeffs[8 * i + 3] |=
static_cast<uint32_t
>(a[13 * i + 6]) << 9;
821 r.
m_coeffs[8 * i + 4] = a[13 * i + 6] >> 4;
822 r.
m_coeffs[8 * i + 4] |=
static_cast<uint32_t
>(a[13 * i + 7]) << 4;
823 r.
m_coeffs[8 * i + 4] |=
static_cast<uint32_t
>(a[13 * i + 8]) << 12;
826 r.
m_coeffs[8 * i + 5] = a[13 * i + 8] >> 1;
827 r.
m_coeffs[8 * i + 5] |=
static_cast<uint32_t
>(a[13 * i + 9]) << 7;
830 r.
m_coeffs[8 * i + 6] = a[13 * i + 9] >> 6;
831 r.
m_coeffs[8 * i + 6] |=
static_cast<uint32_t
>(a[13 * i + 10]) << 2;
832 r.
m_coeffs[8 * i + 6] |=
static_cast<uint32_t
>(a[13 * i + 11]) << 10;
835 r.
m_coeffs[8 * i + 7] = a[13 * i + 11] >> 3;
836 r.
m_coeffs[8 * i + 7] |=
static_cast<uint32_t
>(a[13 * i + 12]) << 5;
875 r[13 * i + 0] =
static_cast<uint8_t
>(t[0]);
876 r[13 * i + 1] =
static_cast<uint8_t
>(t[0] >> 8);
877 r[13 * i + 1] |=
static_cast<uint8_t
>(t[1] << 5);
878 r[13 * i + 2] =
static_cast<uint8_t
>(t[1] >> 3);
879 r[13 * i + 3] =
static_cast<uint8_t
>(t[1] >> 11);
880 r[13 * i + 3] |=
static_cast<uint8_t
>(t[2] << 2);
881 r[13 * i + 4] =
static_cast<uint8_t
>(t[2] >> 6);
882 r[13 * i + 4] |=
static_cast<uint8_t
>(t[3] << 7);
883 r[13 * i + 5] =
static_cast<uint8_t
>(t[3] >> 1);
884 r[13 * i + 6] =
static_cast<uint8_t
>(t[3] >> 9);
885 r[13 * i + 6] |=
static_cast<uint8_t
>(t[4] << 4);
886 r[13 * i + 7] =
static_cast<uint8_t
>(t[4] >> 4);
887 r[13 * i + 8] =
static_cast<uint8_t
>(t[4] >> 12);
888 r[13 * i + 8] |=
static_cast<uint8_t
>(t[5] << 1);
889 r[13 * i + 9] =
static_cast<uint8_t
>(t[5] >> 7);
890 r[13 * i + 9] |=
static_cast<uint8_t
>(t[6] << 6);
891 r[13 * i + 10] =
static_cast<uint8_t
>(t[6] >> 2);
892 r[13 * i + 11] =
static_cast<uint8_t
>(t[6] >> 10);
893 r[13 * i + 11] |=
static_cast<uint8_t
>(t[7] << 3);
894 r[13 * i + 12] =
static_cast<uint8_t
>(t[7] >> 5);
910 if(mode.
gamma1() == (1 << 17))
914 r.
m_coeffs[4 * i + 0] = a[9 * i + 0];
915 r.
m_coeffs[4 * i + 0] |=
static_cast<uint32_t
>(a[9 * i + 1]) << 8;
916 r.
m_coeffs[4 * i + 0] |=
static_cast<uint32_t
>(a[9 * i + 2]) << 16;
919 r.
m_coeffs[4 * i + 1] = a[9 * i + 2] >> 2;
920 r.
m_coeffs[4 * i + 1] |=
static_cast<uint32_t
>(a[9 * i + 3]) << 6;
921 r.
m_coeffs[4 * i + 1] |=
static_cast<uint32_t
>(a[9 * i + 4]) << 14;
924 r.
m_coeffs[4 * i + 2] = a[9 * i + 4] >> 4;
925 r.
m_coeffs[4 * i + 2] |=
static_cast<uint32_t
>(a[9 * i + 5]) << 4;
926 r.
m_coeffs[4 * i + 2] |=
static_cast<uint32_t
>(a[9 * i + 6]) << 12;
929 r.
m_coeffs[4 * i + 3] = a[9 * i + 6] >> 6;
930 r.
m_coeffs[4 * i + 3] |=
static_cast<uint32_t
>(a[9 * i + 7]) << 2;
931 r.
m_coeffs[4 * i + 3] |=
static_cast<uint32_t
>(a[9 * i + 8]) << 10;
940 else if(mode.
gamma1() == (1 << 19))
944 r.
m_coeffs[2 * i + 0] = a[5 * i + 0];
945 r.
m_coeffs[2 * i + 0] |=
static_cast<uint32_t
>(a[5 * i + 1]) << 8;
946 r.
m_coeffs[2 * i + 0] |=
static_cast<uint32_t
>(a[5 * i + 2]) << 16;
949 r.
m_coeffs[2 * i + 1] = a[5 * i + 2] >> 4;
950 r.
m_coeffs[2 * i + 1] |=
static_cast<uint32_t
>(a[5 * i + 3]) << 4;
951 r.
m_coeffs[2 * i + 1] |=
static_cast<uint32_t
>(a[5 * i + 4]) << 12;
973 if(mode.
gamma1() == (1 << 17))
977 t[0] =
static_cast<uint32_t
>(mode.
gamma1()) -
m_coeffs[4 * i + 0];
978 t[1] =
static_cast<uint32_t
>(mode.
gamma1()) -
m_coeffs[4 * i + 1];
979 t[2] =
static_cast<uint32_t
>(mode.
gamma1()) -
m_coeffs[4 * i + 2];
980 t[3] =
static_cast<uint32_t
>(mode.
gamma1()) -
m_coeffs[4 * i + 3];
982 r[9 * i + 0] =
static_cast<uint8_t
>(t[0]);
983 r[9 * i + 1] =
static_cast<uint8_t
>(t[0] >> 8);
984 r[9 * i + 2] =
static_cast<uint8_t
>(t[0] >> 16);
985 r[9 * i + 2] |=
static_cast<uint8_t
>(t[1] << 2);
986 r[9 * i + 3] =
static_cast<uint8_t
>(t[1] >> 6);
987 r[9 * i + 4] =
static_cast<uint8_t
>(t[1] >> 14);
988 r[9 * i + 4] |=
static_cast<uint8_t
>(t[2] << 4);
989 r[9 * i + 5] =
static_cast<uint8_t
>(t[2] >> 4);
990 r[9 * i + 6] =
static_cast<uint8_t
>(t[2] >> 12);
991 r[9 * i + 6] |=
static_cast<uint8_t
>(t[3] << 6);
992 r[9 * i + 7] =
static_cast<uint8_t
>(t[3] >> 2);
993 r[9 * i + 8] =
static_cast<uint8_t
>(t[3] >> 10);
996 else if(mode.
gamma1() == (1 << 19))
1000 t[0] =
static_cast<uint32_t
>(mode.
gamma1()) -
m_coeffs[2 * i + 0];
1001 t[1] =
static_cast<uint32_t
>(mode.
gamma1()) -
m_coeffs[2 * i + 1];
1003 r[5 * i + 0] =
static_cast<uint8_t
>(t[0]);
1004 r[5 * i + 1] =
static_cast<uint8_t
>(t[0] >> 8);
1005 r[5 * i + 2] =
static_cast<uint8_t
>(t[0] >> 16);
1006 r[5 * i + 2] |=
static_cast<uint8_t
>(t[1] << 4);
1007 r[5 * i + 3] =
static_cast<uint8_t
>(t[1] >> 4);
1008 r[5 * i + 4] =
static_cast<uint8_t
>(t[1] >> 12);
1026 r.
m_coeffs[4 * i + 0] = ((a[5 * i + 0] >> 0) | (
static_cast<uint32_t
>(a[5 * i + 1]) << 8)) & 0x3FF;
1027 r.
m_coeffs[4 * i + 1] = ((a[5 * i + 1] >> 2) | (
static_cast<uint32_t
>(a[5 * i + 2]) << 6)) & 0x3FF;
1028 r.
m_coeffs[4 * i + 2] = ((a[5 * i + 2] >> 4) | (
static_cast<uint32_t
>(a[5 * i + 3]) << 4)) & 0x3FF;
1029 r.
m_coeffs[4 * i + 3] = ((a[5 * i + 3] >> 6) | (
static_cast<uint32_t
>(a[5 * i + 4]) << 2)) & 0x3FF;
1046 r[5 * i + 0] =
static_cast<uint8_t
>((
m_coeffs[4 * i + 0] >> 0));
1047 r[5 * i + 1] =
static_cast<uint8_t
>((
m_coeffs[4 * i + 0] >> 8) | (
m_coeffs[4 * i + 1] << 2));
1048 r[5 * i + 2] =
static_cast<uint8_t
>((
m_coeffs[4 * i + 1] >> 6) | (
m_coeffs[4 * i + 2] << 4));
1049 r[5 * i + 3] =
static_cast<uint8_t
>((
m_coeffs[4 * i + 2] >> 4) | (
m_coeffs[4 * i + 3] << 6));
1050 r[5 * i + 4] =
static_cast<uint8_t
>((
m_coeffs[4 * i + 3] >> 2));
1068 for(
size_t i = 0; i <
m_vec.size(); ++i)
1070 this->m_vec[i] += other.
m_vec[i];
1078 for(
size_t i = 0; i < this->m_vec.size(); ++i)
1080 this->m_vec[i] -= other.
m_vec[i];
1107 std::vector<uint8_t> buf(buflen + 2);
1109 auto xof = mode.
XOF_128(seed, nonce);
1110 xof->write_keystream(buf.data(), buflen);
1117 for(
size_t i = 0; i < off; ++i)
1119 buf[i] = buf[buflen - off + i];
1132 for(
size_t i = 0; i < v.
m_vec.size(); ++i)
1155 u.
m_vec[0].poly_pointwise_montgomery(w, v.
m_vec[0]);
1157 for(
size_t i = 1; i < v.
m_vec.size(); ++i)
1160 u.
m_vec[i].poly_pointwise_montgomery(t, v.
m_vec[i]);
1182 "possible buffer overflow! Wrong PolynomialVector sizes.");
1183 for(
size_t i = 0; i < v1.
m_vec.size(); ++i)
1194 "invalid signature size");
1195 size_t position = 0;
1197 std::copy(sig.begin(), sig.begin() + c.size(), c.begin());
1201 for(
size_t i = 0; i < mode.
l(); ++i)
1209 for(
size_t i = 0; i < mode.
k(); ++i)
1213 h.
m_vec[i].m_coeffs[j] = 0;
1216 if(sig[position + mode.
omega() + i] < k || sig[position + mode.
omega() + i] > mode.
omega())
1221 for(
size_t j = k; j < sig[position + mode.
omega() + i]; ++j)
1224 if(j > k && sig[position + j] <= sig[position + j - 1])
1228 h.
m_vec[i].m_coeffs[sig[position + j]] = 1;
1231 k = sig[position + mode.
omega() + i];
1235 for(
size_t j = k; j < mode.
omega(); ++j)
1237 if(sig[position + j])
1263 for(
size_t i = 0; i < h.
m_vec.size(); ++i)
1279 for(
auto& i :
m_vec)
1305 for(
size_t i = 0; i <
m_vec.size(); ++i)
1309 return std::make_tuple(v1, v0);
1320 for(
auto& i :
m_vec)
1335 for(
auto& i :
m_vec)
1337 i.poly_invntt_tomont();
1353 "possible buffer overflow! Wrong PolynomialVector sizes.");
1354 for(
size_t i = 0; i <
m_vec.size(); ++i)
1368 for(
auto& i :
m_vec)
1378 for(uint16_t i = 0; i < static_cast<uint16_t>(this->m_vec.size()); ++i)
1380 m_vec[i].poly_uniform_gamma1(seed, mode.
l()*nonce + i, mode);
1386 for(
size_t i = 0; i <
m_vec.size(); ++i)
1388 m_vec[i].poly_pointwise_montgomery(r.
m_vec[i], a);
1405 for(
auto& i :
m_vec)
1423 for(
auto& i :
m_vec)
1443 for(
size_t i = 0; i < w.
m_vec.size(); ++i)
1452 for(
size_t i = 0; i <
m_vec.size(); ++i)
1465 for(
size_t i = 0; i < pv.
m_vec.size(); ++i)
1475 for(
size_t i = 0; i <
m_vec.size(); ++i)
1487 for(
size_t i = 0; i < t0.
m_vec.size(); ++i)
1497 for(
size_t i = 0; i <
m_vec.size(); ++i)
1509 for(
size_t i = 0; i < t1.
m_vec.size(); ++i)
1519 for(
size_t i = 0; i <
m_vec.size(); ++i)
1529 for(
size_t i = 0; i < z.
m_vec.size(); ++i)
1550 for(
size_t i = 0; i < mode.
k(); ++i)
1561 std::vector<PolynomialVector> m_mat;
1586 for(uint16_t i = 0; i < mode.
k(); ++i)
1588 for(uint16_t j = 0; j < mode.
l(); ++j)
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ARG_CHECK(expr, msg)
#define BOTAN_ASSERT(expr, assertion_made)
void update(const uint8_t in[], size_t length)
void final(uint8_t out[])
static constexpr int32_t SEEDBYTES
size_t polyz_packedbytes() const
size_t polyw1_packedbytes() const
size_t crypto_bytes() const
static constexpr int32_t POLYT0_PACKEDBYTES
static constexpr int32_t SHAKE256_RATE
size_t polyeta_packedbytes() const
size_t stream128_blockbytes() const
size_t poly_uniform_nblocks() const
static constexpr int32_t Q
static constexpr int32_t POLYT1_PACKEDBYTES
static constexpr int32_t N
size_t stream256_blockbytes() const
std::unique_ptr< StreamCipher > XOF_128(std::span< const uint8_t > seed, uint16_t nonce) const
secure_vector< uint8_t > ExpandMask(const secure_vector< uint8_t > &seed, uint16_t nonce) const
static constexpr int32_t ZETAS[DilithiumModeConstants::N]
static constexpr int32_t CRHBYTES
static constexpr int32_t QINV
std::unique_ptr< StreamCipher > XOF_256(std::span< const uint8_t > seed, uint16_t nonce) const
static constexpr int32_t D
size_t poly_uniform_eta_nblocks() const
const std::vector< PolynomialVector > & get_matrix() const
static PolynomialMatrix generate_matrix(const std::vector< uint8_t > &rho, const DilithiumModeConstants &mode)
PolynomialMatrix()=delete
static PolynomialVector polyvec_unpack_z(const uint8_t *packed_z, const DilithiumModeConstants &mode)
static PolynomialVector unpack_t1(std::span< const uint8_t > packed_t1, const DilithiumModeConstants &mode)
static bool unpack_sig(std::array< uint8_t, DilithiumModeConstants::SEEDBYTES > &c, PolynomialVector &z, PolynomialVector &h, const std::vector< uint8_t > &sig, const DilithiumModeConstants &mode)
secure_vector< uint8_t > polyvec_pack_t0() const
secure_vector< uint8_t > polyvec_pack_eta(const DilithiumModeConstants &mode) const
static PolynomialVector unpack_t0(std::span< const uint8_t > buffer, const DilithiumModeConstants &mode)
std::vector< Polynomial > m_vec
static void polyvec_pointwise_acc_montgomery(Polynomial &w, const PolynomialVector &u, const PolynomialVector &v)
void polyvec_use_hint(PolynomialVector &w, const PolynomialVector &h, const DilithiumModeConstants &mode)
PolynomialVector & operator+=(const PolynomialVector &other)
void polyvecl_uniform_gamma1(const secure_vector< uint8_t > &seed, uint16_t nonce, const DilithiumModeConstants &mode)
PolynomialVector()=default
static void fill_polyvec_uniform_eta(PolynomialVector &v, const secure_vector< uint8_t > &seed, uint16_t nonce, const DilithiumModeConstants &mode)
static void fill_polyvecs_power2round(PolynomialVector &v1, PolynomialVector &v0, const PolynomialVector &v)
PolynomialVector(size_t size)
bool polyvec_chknorm(size_t bound)
static PolynomialVector generate_polyvec_matrix_pointwise_montgomery(const std::vector< PolynomialVector > &mat, const PolynomialVector &v, const DilithiumModeConstants &mode)
void add_polyvec(const PolynomialVector &v)
static Polynomial poly_uniform(const std::vector< uint8_t > &seed, uint16_t nonce, const DilithiumModeConstants &mode)
std::vector< uint8_t > polyvec_pack_t1() const
std::vector< uint8_t > polyvec_pack_w1(const DilithiumModeConstants &mode)
static PolynomialVector unpack_eta(std::span< const uint8_t > buffer, size_t size, const DilithiumModeConstants &mode)
std::tuple< PolynomialVector, PolynomialVector > polyvec_decompose(const DilithiumModeConstants &mode)
PolynomialVector & operator-=(const PolynomialVector &other)
void polyvec_pointwise_poly_montgomery(PolynomialVector &r, const Polynomial &a)
static size_t generate_hint_polyvec(PolynomialVector &h, const PolynomialVector &v0, const PolynomialVector &v1, const DilithiumModeConstants &mode)
static size_t rej_eta(Polynomial &a, size_t offset, size_t len, const secure_vector< uint8_t > &buf, size_t buflen, const DilithiumModeConstants &mode)
void polyt1_pack(uint8_t *r) const
static int32_t power2round(int32_t &a0, int32_t a)
static void polyz_unpack(Polynomial &r, const uint8_t *a, const DilithiumModeConstants &mode)
static void fill_polys_power2round(Polynomial &a1, Polynomial &a0, const Polynomial &a)
static Polynomial polyt0_unpack(std::span< const uint8_t > a)
void polyeta_pack(uint8_t *r, const DilithiumModeConstants &mode) const
void poly_decompose(Polynomial &a1, Polynomial &a0, const DilithiumModeConstants &mode) const
void poly_invntt_tomont()
static Polynomial poly_challenge(const uint8_t *seed, const DilithiumModeConstants &mode)
static void polyt1_unpack(Polynomial &r, const uint8_t *a)
static int32_t use_hint(int32_t a, size_t hint, const DilithiumModeConstants &mode)
void poly_uniform_gamma1(const secure_vector< uint8_t > &seed, uint16_t nonce, const DilithiumModeConstants &mode)
void poly_pointwise_montgomery(Polynomial &output, const Polynomial &second) const
Polynomial & operator+=(const Polynomial &other)
static Polynomial polyeta_unpack(std::span< const uint8_t > a, const DilithiumModeConstants &mode)
static void fill_poly_uniform_eta(Polynomial &a, const secure_vector< uint8_t > &seed, uint16_t nonce, const DilithiumModeConstants &mode)
static int32_t make_hint(size_t a0, size_t a1, const DilithiumModeConstants &mode)
void polyz_pack(uint8_t *r, const DilithiumModeConstants &mode) const
int32_t montgomery_reduce(int64_t a) const
std::array< int32_t, Botan::DilithiumModeConstants::N > m_coeffs
void polyt0_pack(uint8_t *r) const
void polyw1_pack(uint8_t *r, const DilithiumModeConstants &mode)
static int32_t decompose(int32_t *a0, int32_t a, const DilithiumModeConstants &mode)
static bool poly_chknorm(const Polynomial &a, size_t B)
static size_t generate_hint_polynomial(Polynomial &h, const Polynomial &a0, const Polynomial &a1, const DilithiumModeConstants &mode)
Polynomial & operator-=(const Polynomial &other)
static size_t rej_uniform(Polynomial &p, size_t position, size_t len, const uint8_t *buf, size_t buflen)
static void poly_use_hint(Polynomial &b, const Polynomial &a, const Polynomial &h, const DilithiumModeConstants &mode)
std::vector< T, secure_allocator< T > > secure_vector