MLKemDecapsulator
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);
}
}
}