PolyVec
class PolyVec
namespace Org.BouncyCastle.Pqc.Crypto.Crystals.Dilithium
{
internal class PolyVec
{
internal readonly Poly[] Vec;
internal PolyVec(DilithiumEngine engine, int length)
{
Vec = new Poly[length];
for (int i = 0; i < length; i++) {
Vec[i] = new Poly(engine);
}
}
internal void Add(PolyVec v)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].Add(v.Vec[i]);
}
}
internal bool CheckNorm(int bound)
{
for (int i = 0; i < Vec.Length; i++) {
if (Vec[i].CheckNorm(bound))
return true;
}
return false;
}
internal void CopyTo(PolyVec z)
{
for (int i = 0; i < Vec.Length; i++) {
for (int j = 0; j < 256; j++) {
z.Vec[i].Coeffs[j] = Vec[i].Coeffs[j];
}
}
}
internal void ConditionalAddQ()
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].ConditionalAddQ();
}
}
internal void Decompose(PolyVec v)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].Decompose(v.Vec[i]);
}
}
internal void InverseNttToMont()
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].InverseNttToMont();
}
}
internal int MakeHint(PolyVec v0, PolyVec v1)
{
int num = 0;
for (int i = 0; i < Vec.Length; i++) {
num += Vec[i].PolyMakeHint(v0.Vec[i], v1.Vec[i]);
}
return num;
}
internal void Ntt()
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].PolyNtt();
}
}
internal void PackW1(DilithiumEngine engine, byte[] r)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].PackW1(r, i * engine.PolyW1PackedBytes);
}
}
internal void PointwisePolyMontgomery(Poly a, PolyVec v)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].PointwiseMontgomery(a, v.Vec[i]);
}
}
internal void Power2Round(PolyVec v)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].Power2Round(v.Vec[i]);
}
}
internal void Reduce()
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].ReducePoly();
}
}
internal void ShiftLeft()
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].ShiftLeft();
}
}
internal void Subtract(PolyVec v)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].Subtract(v.Vec[i]);
}
}
internal void UniformEta(byte[] seed, ushort nonce)
{
for (int i = 0; i < Vec.Length; i++) {
Poly obj = 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 < Vec.Length; i++) {
Vec[i].UniformGamma1(seed, (ushort)(Vec.Length * nonce + i));
}
}
internal void UseHint(PolyVec a, PolyVec h)
{
for (int i = 0; i < Vec.Length; i++) {
Vec[i].PolyUseHint(a.Vec[i], h.Vec[i]);
}
}
}
}