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

MLKemEncapsulator

public sealed class MLKemEncapsulator : IKemEncapsulator
using Org.BouncyCastle.Crypto.Kems.MLKem; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Crypto.Kems { public sealed class MLKemEncapsulator : IKemEncapsulator { private readonly MLKemParameters m_parameters; private MLKemPublicKeyParameters m_publicKey; private MLKemEngine m_engine; public int EncapsulationLength => m_engine.CryptoCipherTextBytes; public int SecretLength => m_engine.CryptoBytes; public MLKemEncapsulator(MLKemParameters parameters) { m_parameters = parameters; } public void Init(ICipherParameters parameters) { SecureRandom secureRandom = null; ParametersWithRandom parametersWithRandom = parameters as ParametersWithRandom; if (parametersWithRandom != null) { secureRandom = parametersWithRandom.Random; parameters = parametersWithRandom.Parameters; } MLKemPublicKeyParameters mLKemPublicKeyParameters = parameters as MLKemPublicKeyParameters; if (mLKemPublicKeyParameters == null) throw new ArgumentException("MLKemDecapsulator expects MLKemPublicKeyParameters"); m_publicKey = mLKemPublicKeyParameters; m_engine = GetEngine(m_publicKey.Parameters, CryptoServicesRegistrar.GetSecureRandom(secureRandom)); } public void Encapsulate(byte[] encBuf, int encOff, int encLen, byte[] secBuf, int secOff, int secLen) { Arrays.ValidateSegment(encBuf, encOff, encLen); Arrays.ValidateSegment(secBuf, secOff, secLen); if (EncapsulationLength != encLen) throw new ArgumentException("encLen"); if (SecretLength != secLen) throw new ArgumentException("secLen"); byte[] array = new byte[32]; m_engine.RandomBytes(array, array.Length); m_engine.KemEncrypt(encBuf, encOff, secBuf, secOff, m_publicKey.GetEncoded(), array); } private MLKemEngine GetEngine(MLKemParameters keyParameters, SecureRandom random) { MLKemParameterSet parameterSet = keyParameters.ParameterSet; if (keyParameters.ParameterSet != m_parameters.ParameterSet) throw new ArgumentException("Mismatching key parameter set", "keyParameters"); return parameterSet.GetEngine(random); } } }