<PackageReference Include="SSH.NET" Version="2016.0.0-beta1" />

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