Hps4096Polynomial
using Org.BouncyCastle.Pqc.Crypto.Ntru.ParameterSets;
namespace Org.BouncyCastle.Pqc.Crypto.Ntru.Polynomials
{
internal class Hps4096Polynomial : HpsPolynomial
{
internal Hps4096Polynomial(NtruParameterSet parameterSet)
: base(parameterSet)
{
}
public override byte[] SqToBytes(int len)
{
byte[] array = new byte[len];
uint q = (uint)ParameterSet.Q();
for (int i = 0; i < ParameterSet.PackDegree() / 2; i++) {
array[3 * i] = (byte)(Polynomial.ModQ((uint)(coeffs[2 * i] & 65535), q) & 255);
array[3 * i + 1] = (byte)((Polynomial.ModQ((uint)(coeffs[2 * i] & 65535), q) >> 8) | ((Polynomial.ModQ((uint)(coeffs[2 * i + 1] & 65535), q) & 15) << 4));
array[3 * i + 2] = (byte)(Polynomial.ModQ((uint)(coeffs[2 * i + 1] & 65535), q) >> 4);
}
return array;
}
public override void SqFromBytes(byte[] a)
{
for (int i = 0; i < ParameterSet.PackDegree() / 2; i++) {
coeffs[2 * i] = (ushort)((a[3 * i] & 255) | (((ushort)(a[3 * i + 1] & 255) & 15) << 8));
coeffs[2 * i + 1] = (ushort)(((a[3 * i + 1] & 255) >> 4) | (((ushort)(a[3 * i + 2] & 255) & 255) << 4));
}
coeffs[ParameterSet.N - 1] = 0;
}
}
}