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