PolyVec
class PolyVec
namespace Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium
{
internal class PolyVec
{
private readonly Poly[] m_vec;
internal Poly this[int index] {
get {
return m_vec[index];
}
set {
m_vec[index] = value;
}
}
internal int Length => m_vec.Length;
internal PolyVec(DilithiumEngine engine, int length)
{
m_vec = new Poly[length];
for (int i = 0; i < length; i++) {
m_vec[i] = new Poly(engine);
}
}
internal void Add(PolyVec v)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].Add(v.m_vec[i]);
}
}
internal bool CheckNorm(int bound)
{
for (int i = 0; i < m_vec.Length; i++) {
if (m_vec[i].CheckNorm(bound))
return true;
}
return false;
}
internal void CopyTo(PolyVec z)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].CopyTo(z.m_vec[i]);
}
}
internal void ConditionalAddQ()
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].ConditionalAddQ();
}
}
internal void Decompose(PolyVec v)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].Decompose(v.m_vec[i]);
}
}
internal void InverseNttToMont()
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].InverseNttToMont();
}
}
internal int MakeHint(PolyVec v0, PolyVec v1)
{
int num = 0;
for (int i = 0; i < m_vec.Length; i++) {
num += m_vec[i].PolyMakeHint(v0.m_vec[i], v1.m_vec[i]);
}
return num;
}
internal void Ntt()
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].PolyNtt();
}
}
internal void PackW1(DilithiumEngine engine, byte[] r, int rOff)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].PackW1(r, rOff + i * engine.PolyW1PackedBytes);
}
}
internal void PointwisePolyMontgomery(Poly a, PolyVec v)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].PointwiseMontgomery(a, v.m_vec[i]);
}
}
internal void Power2Round(PolyVec v)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].Power2Round(v.m_vec[i]);
}
}
internal void Reduce()
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].ReducePoly();
}
}
internal void ShiftLeft()
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].ShiftLeft();
}
}
internal void Subtract(PolyVec v)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].Subtract(v.m_vec[i]);
}
}
internal void UniformBlocks(byte[] rho, int t)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].UniformBlocks(rho, (ushort)(t + i));
}
}
internal void UniformEta(byte[] seed, ushort nonce)
{
for (int i = 0; i < m_vec.Length; i++) {
Poly obj = m_vec[i];
ushort num = nonce;
nonce = (ushort)(num + 1);
obj.UniformEta(seed, num);
}
}
internal void UniformGamma1(byte[] seed, ushort nonce)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].UniformGamma1(seed, (ushort)(m_vec.Length * nonce + i));
}
}
internal void UseHint(PolyVec a, PolyVec h)
{
for (int i = 0; i < m_vec.Length; i++) {
m_vec[i].PolyUseHint(a.m_vec[i], h.m_vec[i]);
}
}
}
}