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

NtruKemGenerator

Encapsulate a secret using NTRU. Returns an NtruEncapsulation as encapsulation.
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Pqc.Crypto.Ntru.Owcpa; using Org.BouncyCastle.Pqc.Crypto.Ntru.ParameterSets; using Org.BouncyCastle.Pqc.Crypto.Ntru.Polynomials; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Pqc.Crypto.Ntru { public class NtruKemGenerator : IEncapsulatedSecretGenerator { private readonly SecureRandom m_random; public NtruKemGenerator(SecureRandom random) { if (random == null) throw new ArgumentNullException("random"); m_random = random; } public ISecretWithEncapsulation GenerateEncapsulated(AsymmetricKeyParameter recipientKey) { if (recipientKey == null) throw new ArgumentNullException("recipientKey"); NtruPublicKeyParameters ntruPublicKeyParameters = recipientKey as NtruPublicKeyParameters; if (ntruPublicKeyParameters == null) throw new ArgumentException("recipientKey"); NtruParameterSet parameterSet = ntruPublicKeyParameters.Parameters.ParameterSet; NtruSampling ntruSampling = new NtruSampling(parameterSet); NtruOwcpa ntruOwcpa = new NtruOwcpa(parameterSet); byte[] array = new byte[parameterSet.OwcpaMsgBytes()]; byte[] array2 = new byte[parameterSet.SampleRmBytes()]; m_random.NextBytes(array2); PolynomialPair polynomialPair = ntruSampling.SampleRm(array2); Polynomial polynomial = polynomialPair.R(); Polynomial polynomial2 = polynomialPair.M(); polynomial.S3ToBytes(array, 0); polynomial2.S3ToBytes(array, parameterSet.PackTrinaryBytes()); Sha3Digest sha3Digest = new Sha3Digest(256); byte[] array3 = new byte[sha3Digest.GetDigestSize()]; sha3Digest.BlockUpdate(array, 0, array.Length); sha3Digest.DoFinal(array3, 0); polynomial.Z3ToZq(); byte[] ciphertext = ntruOwcpa.Encrypt(polynomial, polynomial2, ntruPublicKeyParameters.GetEncoded()); byte[] sharedKey = Arrays.CopyOfRange(array3, 0, parameterSet.SharedKeyBytes); Array.Clear(array3, 0, array3.Length); return new NtruEncapsulation(sharedKey, ciphertext); } } }