<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

BikeKemGenerator

using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Pqc.Crypto.Bike { public sealed class BikeKemGenerator : IEncapsulatedSecretGenerator { private sealed class SecretWithEncapsulationImpl : ISecretWithEncapsulation, IDisposable { private volatile bool hasBeenDestroyed; private byte[] sessionKey; private byte[] cipher_text; public SecretWithEncapsulationImpl(byte[] sessionKey, byte[] cipher_text) { this.sessionKey = sessionKey; this.cipher_text = cipher_text; } public byte[] GetSecret() { CheckDestroyed(); return Arrays.Clone(sessionKey); } public byte[] GetEncapsulation() { CheckDestroyed(); return Arrays.Clone(cipher_text); } public void Dispose() { if (!hasBeenDestroyed) { Arrays.Clear(sessionKey); Arrays.Clear(cipher_text); hasBeenDestroyed = true; } GC.SuppressFinalize(this); } public bool IsDestroyed() { return hasBeenDestroyed; } private void CheckDestroyed() { if (IsDestroyed()) throw new Exception("data has been destroyed"); } } private readonly SecureRandom sr; public BikeKemGenerator(SecureRandom random) { sr = random; } public ISecretWithEncapsulation GenerateEncapsulated(AsymmetricKeyParameter recipientKey) { BikePublicKeyParameters bikePublicKeyParameters = (BikePublicKeyParameters)recipientKey; BikeParameters parameters = bikePublicKeyParameters.Parameters; BikeEngine bikeEngine = parameters.BikeEngine; byte[] array = new byte[parameters.LByte]; byte[] array2 = new byte[parameters.RByte + parameters.LByte]; byte[] publicKey = bikePublicKeyParameters.m_publicKey; bikeEngine.Encaps(array2, array, publicKey, sr); return new SecretWithEncapsulationImpl(Arrays.CopyOfRange(array, 0, parameters.DefaultKeySize / 8), array2); } } }