<PackageReference Include="BouncyCastle.Cryptography" Version="2.3.0" />

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; } } }