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

BasicAgreementWithKdf

static class BasicAgreementWithKdf
using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Crypto.Agreement.Kdf; using Org.BouncyCastle.Math; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; using System; using Org.BouncyCastle.Math; using System; namespace Org.BouncyCastle.Crypto.Agreement { internal static class BasicAgreementWithKdf { internal static BigInteger CalculateAgreementWithKdf(string algorithm, IDerivationFunction kdf, int fieldSize, BigInteger result) { int defaultKeySize = GeneratorUtilities.GetDefaultKeySize(algorithm); DHKdfParameters parameters = new DHKdfParameters(new DerObjectIdentifier(algorithm), defaultKeySize, BigIntegers.AsUnsignedByteArray(fieldSize, result)); kdf.Init(parameters); byte[] array = new byte[defaultKeySize / 8]; kdf.GenerateBytes(array, 0, array.Length); return new BigInteger(1, array); } } } namespace Org.BouncyCastle.Crypto.Agreement { public class ECMqvWithKdfBasicAgreement : ECMqvBasicAgreement { private readonly string m_algorithm; private readonly IDerivationFunction m_kdf; public ECMqvWithKdfBasicAgreement(string algorithm, IDerivationFunction kdf) { if (algorithm == null) throw new ArgumentNullException("algorithm"); m_algorithm = algorithm; if (kdf == null) throw new ArgumentNullException("kdf"); m_kdf = kdf; } public override BigInteger CalculateAgreement(ICipherParameters pubKey) { BigInteger result = base.CalculateAgreement(pubKey); BigInteger result; return BasicAgreementWithKdf.CalculateAgreementWithKdf(m_algorithm, m_kdf, GetFieldSize(), result); } } }