< Summary

Information
Class: Renci.SshNet.Security.KeyExchangeDiffieHellmanGroupExchangeShaBase
Assembly: Renci.SshNet
File(s): \home\appveyor\projects\ssh-net\src\Renci.SshNet\Security\KeyExchangeDiffieHellmanGroupExchangeShaBase.cs
Line coverage
100%
Covered lines: 48
Uncovered lines: 0
Coverable lines: 48
Total lines: 115
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
CalculateHash()100%1100%
Start(...)100%1100%
Finish()100%1100%
Session_KeyExchangeDhGroupExchangeGroupReceived(...)100%1100%
Session_KeyExchangeDhGroupExchangeReplyReceived(...)100%1100%

File(s)

\home\appveyor\projects\ssh-net\src\Renci.SshNet\Security\KeyExchangeDiffieHellmanGroupExchangeShaBase.cs

#LineLine coverage
 1using Renci.SshNet.Messages.Transport;
 2
 3namespace Renci.SshNet.Security
 4{
 5    /// <summary>
 6    /// Base class for "diffie-hellman-group-exchange" algorithms.
 7    /// </summary>
 8    internal abstract class KeyExchangeDiffieHellmanGroupExchangeShaBase : KeyExchangeDiffieHellman
 9    {
 10        private const int MinimumGroupSize = 1024;
 11        private const int PreferredGroupSize = 1024;
 12        private const int MaximumProupSize = 8192;
 13
 14        /// <summary>
 15        /// Calculates key exchange hash value.
 16        /// </summary>
 17        /// <returns>
 18        /// Key exchange hash.
 19        /// </returns>
 20        protected override byte[] CalculateHash()
 1221        {
 1222            var groupExchangeHashData = new GroupExchangeHashData
 1223                {
 1224                    ClientVersion = Session.ClientVersion,
 1225                    ServerVersion = Session.ServerVersion,
 1226                    ClientPayload = _clientPayload,
 1227                    ServerPayload = _serverPayload,
 1228                    HostKey = _hostKey,
 1229                    MinimumGroupSize = MinimumGroupSize,
 1230                    PreferredGroupSize = PreferredGroupSize,
 1231                    MaximumGroupSize = MaximumProupSize,
 1232                    Prime = _prime,
 1233                    SubGroup = _group,
 1234                    ClientExchangeValue = _clientExchangeValue,
 1235                    ServerExchangeValue = _serverExchangeValue,
 1236                    SharedKey = SharedKey,
 1237                };
 38
 1239            return Hash(groupExchangeHashData.GetBytes());
 1240        }
 41
 42        /// <summary>
 43        /// Starts key exchange algorithm.
 44        /// </summary>
 45        /// <param name="session">The session.</param>
 46        /// <param name="message">Key exchange init message.</param>
 47        public override void Start(Session session, KeyExchangeInitMessage message)
 648        {
 649            base.Start(session, message);
 50
 51            // Register SSH_MSG_KEX_DH_GEX_GROUP message
 652            Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");
 53
 54            // Subscribe to KeyExchangeDhGroupExchangeGroupReceived events
 655            Session.KeyExchangeDhGroupExchangeGroupReceived += Session_KeyExchangeDhGroupExchangeGroupReceived;
 56
 57            // 1. client sends SSH_MSG_KEY_DH_GEX_REQUEST
 658            SendMessage(new KeyExchangeDhGroupExchangeRequest(MinimumGroupSize, PreferredGroupSize, MaximumProupSize));
 659        }
 60
 61        /// <summary>
 62        /// Finishes key exchange algorithm.
 63        /// </summary>
 64        public override void Finish()
 665        {
 666            base.Finish();
 67
 668            Session.KeyExchangeDhGroupExchangeGroupReceived -= Session_KeyExchangeDhGroupExchangeGroupReceived;
 669            Session.KeyExchangeDhGroupExchangeReplyReceived -= Session_KeyExchangeDhGroupExchangeReplyReceived;
 670        }
 71
 72        private void Session_KeyExchangeDhGroupExchangeGroupReceived(object sender, MessageEventArgs<KeyExchangeDhGroupE
 673        {
 74            // 2. server sends SSH_MSG_KEX_DH_GEX_GROUP
 675            var groupMessage = e.Message;
 76
 77            // Unregister SSH_MSG_KEX_DH_GEX_GROUP message once received
 678            Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_GROUP");
 79
 80            // Unsubscribe from KeyExchangeDhGroupExchangeGroupReceived events
 681            Session.KeyExchangeDhGroupExchangeGroupReceived -= Session_KeyExchangeDhGroupExchangeGroupReceived;
 82
 83            // Register in order to be able to receive SSH_MSG_KEX_DH_GEX_REPLY message
 684            Session.RegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");
 85
 86            // Subscribe to KeyExchangeDhGroupExchangeReplyReceived events
 687            Session.KeyExchangeDhGroupExchangeReplyReceived += Session_KeyExchangeDhGroupExchangeReplyReceived;
 88
 689            _prime = groupMessage.SafePrime;
 690            _group = groupMessage.SubGroup;
 91
 692            PopulateClientExchangeValue();
 93
 94            // 3. client sends SSH_MSG_KEX_DH_GEX_INIT
 695            SendMessage(new KeyExchangeDhGroupExchangeInit(_clientExchangeValue));
 696        }
 97
 98        private void Session_KeyExchangeDhGroupExchangeReplyReceived(object sender, MessageEventArgs<KeyExchangeDhGroupE
 699        {
 100            // 4. server sends SSH_MSG_KEX_DH_GEX_REPLY
 6101            var replyMessage = e.Message;
 102
 103            // Unregister SSH_MSG_KEX_DH_GEX_REPLY message once received
 6104            Session.UnRegisterMessage("SSH_MSG_KEX_DH_GEX_REPLY");
 105
 106            // Unsubscribe from KeyExchangeDhGroupExchangeReplyReceived events
 6107            Session.KeyExchangeDhGroupExchangeReplyReceived -= Session_KeyExchangeDhGroupExchangeReplyReceived;
 108
 6109            HandleServerDhReply(replyMessage.HostKey, replyMessage.F, replyMessage.Signature);
 110
 111            // When SSH_MSG_KEX_DH_GEX_REPLY received key exchange is completed
 6112            Finish();
 6113        }
 114    }
 115}