KeyExchangeDiffieHellmanGroupExchangeShaBase
Base class for "diffie-hellman-group-exchange" algorithms.
using Renci.SshNet.Messages.Transport;
namespace Renci.SshNet.Security
{
internal abstract class KeyExchangeDiffieHellmanGroupExchangeShaBase : KeyExchangeDiffieHellman
{
private const int MinimumGroupSize = 1024;
private const int PreferredGroupSize = 1024;
private const int MaximumProupSize = 8192;
protected override byte[] CalculateHash()
{
GroupExchangeHashData groupExchangeHashData = 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
};
return Hash(groupExchangeHashData.GetBytes());
}
public override void Start(Session session, KeyExchangeInitMessage message, bool sendClientInitMessage)
{
base.Start(session, message, sendClientInitMessage);
base.Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");
base.Session.KeyExchangeDhGroupExchangeGroupReceived += Session_KeyExchangeDhGroupExchangeGroupReceived;
SendMessage(new KeyExchangeDhGroupExchangeRequest(1024, 1024, 8192));
}
public override void Finish()
{
base.Finish();
base.Session.KeyExchangeDhGroupExchangeGroupReceived -= Session_KeyExchangeDhGroupExchangeGroupReceived;
base.Session.KeyExchangeDhGroupExchangeReplyReceived -= Session_KeyExchangeDhGroupExchangeReplyReceived;
}
private void Session_KeyExchangeDhGroupExchangeGroupReceived(object sender, MessageEventArgs<KeyExchangeDhGroupExchangeGroup> e)
{
KeyExchangeDhGroupExchangeGroup message = e.Message;
base.Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");
base.Session.KeyExchangeDhGroupExchangeGroupReceived -= Session_KeyExchangeDhGroupExchangeGroupReceived;
base.Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");
base.Session.KeyExchangeDhGroupExchangeReplyReceived += Session_KeyExchangeDhGroupExchangeReplyReceived;
_prime = message.SafePrime;
_group = message.SubGroup;
PopulateClientExchangeValue();
SendMessage(new KeyExchangeDhGroupExchangeInit(_clientExchangeValue));
}
private void Session_KeyExchangeDhGroupExchangeReplyReceived(object sender, MessageEventArgs<KeyExchangeDhGroupExchangeReply> e)
{
KeyExchangeDhGroupExchangeReply message = e.Message;
base.Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");
base.Session.KeyExchangeDhGroupExchangeReplyReceived -= Session_KeyExchangeDhGroupExchangeReplyReceived;
HandleServerDhReply(message.HostKey, message.F, message.Signature);
Finish();
}
}
}