| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | 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;        /// <summary>        /// Calculates key exchange hash value.        /// </summary>        /// <returns>        /// Key exchange hash.        /// </returns>        protected override byte[] CalculateHash()        {            var hashData = new GroupExchangeHashData                {                    ClientVersion = Session.ClientVersion,                    ServerVersion = Session.ServerVersion,                    ClientPayload = _clientPayload,                    ServerPayload = _serverPayload,                    HostKey = _hostKey,                    MinimumGroupSize = MinimumGroupSize,                    PreferredGroupSize = PreferredGroupSize,                    MaximumGroupSize = MaximumProupSize,                    Prime = _prime,                    SubGroup = _group,                    ClientExchangeValue = _clientExchangeValue,                    ServerExchangeValue = _serverExchangeValue,                    SharedKey = SharedKey,                }.GetBytes();            return this.Hash(hashData);        }        /// <summary>        /// Starts key exchange algorithm        /// </summary>        /// <param name="session">The session.</param>        /// <param name="message">Key exchange init message.</param>        public override void Start(Session session, KeyExchangeInitMessage message)        {            base.Start(session, message);            Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");            Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");            Session.MessageReceived += Session_MessageReceived;            //  1. send SSH_MSG_KEY_DH_GEX_REQUEST            SendMessage(new KeyExchangeDhGroupExchangeRequest(MinimumGroupSize, PreferredGroupSize,                MaximumProupSize));        }        /// <summary>        /// Finishes key exchange algorithm.        /// </summary>        public override void Finish()        {            base.Finish();            Session.MessageReceived -= Session_MessageReceived;        }        private void Session_MessageReceived(object sender, MessageEventArgs<Message> e)        {            var groupMessage = e.Message as KeyExchangeDhGroupExchangeGroup;            if (groupMessage != null)            {                //  Unregister message once received                Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");                //  2. Receive SSH_MSG_KEX_DH_GEX_GROUP                _prime = groupMessage.SafePrime;                _group = groupMessage.SubGroup;                PopulateClientExchangeValue();                //  3. Send SSH_MSG_KEX_DH_GEX_INIT                SendMessage(new KeyExchangeDhGroupExchangeInit(_clientExchangeValue));            }            else            {                var replyMessage = e.Message as KeyExchangeDhGroupExchangeReply;                if (replyMessage != null)                {                    //  Unregister message once received                    Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");                    HandleServerDhReply(replyMessage.HostKey, replyMessage.F, replyMessage.Signature);                    //  When SSH_MSG_KEX_DH_GEX_REPLY received key exchange is completed                    Finish();                }            }        }    }}
 |