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

KeyExchangeDiffieHellmanGroupShaBase

using Renci.SshNet.Messages.Transport; using System.Numerics; namespace Renci.SshNet.Security { internal abstract class KeyExchangeDiffieHellmanGroupShaBase : KeyExchangeDiffieHellman { public abstract BigInteger GroupPrime { get; } public override void Start(Session session, KeyExchangeInitMessage message, bool sendClientInitMessage) { base.Start(session, message, sendClientInitMessage); base.Session.RegisterMessage("SSH_MSG_KEXDH_REPLY"); base.Session.KeyExchangeDhReplyMessageReceived += Session_KeyExchangeDhReplyMessageReceived; _prime = GroupPrime; _group = 2; PopulateClientExchangeValue(); SendMessage(new KeyExchangeDhInitMessage(_clientExchangeValue)); } public override void Finish() { base.Finish(); base.Session.KeyExchangeDhReplyMessageReceived -= Session_KeyExchangeDhReplyMessageReceived; } 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()); } private void Session_KeyExchangeDhReplyMessageReceived(object sender, MessageEventArgs<KeyExchangeDhReplyMessage> e) { KeyExchangeDhReplyMessage message = e.Message; base.Session.UnRegisterMessage("SSH_MSG_KEXDH_REPLY"); HandleServerDhReply(message.HostKey, message.F, message.Signature); Finish(); } } }