<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

TlsHybridAgreement

public sealed class TlsHybridAgreement : TlsAgreement
using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Tls.Crypto { public sealed class TlsHybridAgreement : TlsAgreement { private readonly TlsCrypto m_crypto; private readonly TlsAgreement m_firstAgreement; private readonly TlsAgreement m_secondAgreement; private readonly int m_peerValueSplit; public TlsHybridAgreement(TlsCrypto crypto, TlsAgreement firstAgreement, TlsAgreement secondAgreement, int peerValueSplit) { if (crypto == null) throw new ArgumentNullException("crypto"); m_crypto = crypto; if (firstAgreement == null) throw new ArgumentNullException("firstAgreement"); m_firstAgreement = firstAgreement; if (secondAgreement == null) throw new ArgumentNullException("secondAgreement"); m_secondAgreement = secondAgreement; m_peerValueSplit = peerValueSplit; } public byte[] GenerateEphemeral() { byte[] a = m_firstAgreement.GenerateEphemeral(); byte[] b = m_secondAgreement.GenerateEphemeral(); return Arrays.Concatenate(a, b); } public void ReceivePeerValue(byte[] peerValue) { if (peerValue.Length < m_peerValueSplit) throw new ArgumentException("too short", "peerValue"); m_firstAgreement.ReceivePeerValue(Arrays.CopyOfRange(peerValue, 0, m_peerValueSplit)); m_secondAgreement.ReceivePeerValue(Arrays.CopyOfRange(peerValue, m_peerValueSplit, peerValue.Length)); } public TlsSecret CalculateSecret() { TlsSecret s = m_firstAgreement.CalculateSecret(); TlsSecret s2 = m_secondAgreement.CalculateSecret(); return m_crypto.CreateHybridSecret(s, s2); } } }