<PackageReference Include="SSH.NET" Version="2024.0.0" />

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