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