KeyExchangeEC
using Renci.SshNet.Messages.Transport;
using System;
namespace Renci.SshNet.Security
{
internal abstract class KeyExchangeEC : KeyExchange
{
protected abstract class Impl : IDisposable
{
public abstract byte[] GenerateClientPublicKey();
public abstract byte[] CalculateAgreement(byte[] serverPublicKey);
protected virtual void Dispose(bool disposing)
{
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
protected byte[] _clientPayload;
protected byte[] _serverPayload;
protected byte[] _clientExchangeValue;
protected byte[] _serverExchangeValue;
protected byte[] _hostKey;
protected byte[] _signature;
protected abstract int HashSize { get; }
protected override byte[] CalculateHash()
{
KeyExchangeHashData keyExchangeHashData = new KeyExchangeHashData {
ClientVersion = base.Session.ClientVersion,
ServerVersion = base.Session.ServerVersion,
ClientPayload = _clientPayload,
ServerPayload = _serverPayload,
HostKey = _hostKey,
ClientExchangeValue = _clientExchangeValue,
ServerExchangeValue = _serverExchangeValue,
SharedKey = base.SharedKey
};
return Hash(keyExchangeHashData.GetBytes());
}
protected override bool ValidateExchangeHash()
{
return ValidateExchangeHash(_hostKey, _signature);
}
public override void Start(Session session, KeyExchangeInitMessage message, bool sendClientInitMessage)
{
base.Start(session, message, sendClientInitMessage);
_serverPayload = message.GetBytes();
_clientPayload = base.Session.ClientInitMessage.GetBytes();
}
}
}