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

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); if (EncapsulationLength != encLen) throw new ArgumentException("encLen"); if (SecretLength != secLen) throw new ArgumentException("secLen"); m_engine.KemDecrypt(secBuf, secOff, encBuf, encOff, 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); } } }