KeyExchangeDiffieHellmanGroupExchangeShaBase
Base class for "diffie-hellman-group-exchange" algorithms.
using Renci.SshNet.Messages;
using Renci.SshNet.Messages.Transport;
namespace Renci.SshNet.Security
{
public abstract class KeyExchangeDiffieHellmanGroupExchangeShaBase : KeyExchangeDiffieHellman
{
private const int MinimumGroupSize = 1024;
private const int PreferredGroupSize = 1024;
private const int MaximumProupSize = 8192;
protected override byte[] CalculateHash()
{
byte[] bytes = new GroupExchangeHashData {
ClientVersion = base.Session.ClientVersion,
ServerVersion = base.Session.ServerVersion,
ClientPayload = _clientPayload,
ServerPayload = _serverPayload,
HostKey = _hostKey,
MinimumGroupSize = 1024,
PreferredGroupSize = 1024,
MaximumGroupSize = 8192,
Prime = _prime,
SubGroup = _group,
ClientExchangeValue = _clientExchangeValue,
ServerExchangeValue = _serverExchangeValue,
SharedKey = base.SharedKey
}.GetBytes();
return Hash(bytes);
}
public override void Start(Session session, KeyExchangeInitMessage message)
{
base.Start(session, message);
base.Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");
base.Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");
base.Session.MessageReceived += Session_MessageReceived;
SendMessage(new KeyExchangeDhGroupExchangeRequest(1024, 1024, 8192));
}
public override void Finish()
{
base.Finish();
base.Session.MessageReceived -= Session_MessageReceived;
}
private void Session_MessageReceived(object sender, MessageEventArgs<Message> e)
{
KeyExchangeDhGroupExchangeGroup keyExchangeDhGroupExchangeGroup = e.Message as KeyExchangeDhGroupExchangeGroup;
if (keyExchangeDhGroupExchangeGroup != null) {
base.Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");
_prime = keyExchangeDhGroupExchangeGroup.SafePrime;
_group = keyExchangeDhGroupExchangeGroup.SubGroup;
PopulateClientExchangeValue();
SendMessage(new KeyExchangeDhGroupExchangeInit(_clientExchangeValue));
} else {
KeyExchangeDhGroupExchangeReply keyExchangeDhGroupExchangeReply = e.Message as KeyExchangeDhGroupExchangeReply;
if (keyExchangeDhGroupExchangeReply != null) {
base.Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");
HandleServerDhReply(keyExchangeDhGroupExchangeReply.HostKey, keyExchangeDhGroupExchangeReply.F, keyExchangeDhGroupExchangeReply.Signature);
Finish();
}
}
}
}
}