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

MLKemDecapsulator

public sealed class MLKemDecapsulator : IKemDecapsulator
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 MLKemDecapsulator : IKemDecapsulator { private readonly MLKemParameters m_parameters; private MLKemPrivateKeyParameters m_privateKey; private MLKemEngine m_engine; public int EncapsulationLength => m_engine.CryptoCipherTextBytes; public int SecretLength => m_engine.CryptoBytes; public MLKemDecapsulator(MLKemParameters parameters) { m_parameters = parameters; } public void Init(ICipherParameters parameters) { parameters = ParameterUtilities.IgnoreRandom(parameters); MLKemPrivateKeyParameters mLKemPrivateKeyParameters = parameters as MLKemPrivateKeyParameters; if (mLKemPrivateKeyParameters == null) throw new ArgumentException("MLKemDecapsulator expects MLKemPrivateKeyParameters"); m_privateKey = mLKemPrivateKeyParameters; m_engine = GetEngine(m_privateKey.Parameters); } public void Decapsulate(byte[] encBuf, int encOff, int encLen, byte[] secBuf, int secOff, int secLen) { Arrays.ValidateSegment(encBuf, encOff, encLen); Arrays.ValidateSegment(secBuf, secOff, secLen); Decapsulate(encBuf.AsSpan(encOff, encLen), secBuf.AsSpan(secOff, secLen)); } public void Decapsulate(ReadOnlySpan<byte> encapsulation, Span<byte> secret) { if (EncapsulationLength != encapsulation.Length) throw new ArgumentException("encapsulation"); if (SecretLength != secret.Length) throw new ArgumentException("secret"); m_engine.KemDecrypt(secret, encapsulation, m_privateKey.GetEncoded()); } private MLKemEngine GetEngine(MLKemParameters keyParameters) { MLKemParameterSet parameterSet = keyParameters.ParameterSet; if (keyParameters.ParameterSet != m_parameters.ParameterSet) throw new ArgumentException("Mismatching key parameter set", "keyParameters"); return parameterSet.GetEngine(null); } } }