| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- using System.Numerics;
- using Renci.SshNet.Messages.Transport;
- namespace Renci.SshNet.Security
- {
- internal abstract class KeyExchangeDiffieHellmanGroupShaBase : KeyExchangeDiffieHellman
- {
- /// <summary>
- /// Gets the group prime.
- /// </summary>
- /// <value>
- /// The group prime.
- /// </value>
- public abstract BigInteger GroupPrime { get; }
- /// <inheritdoc/>
- public override void Start(Session session, KeyExchangeInitMessage message, bool sendClientInitMessage)
- {
- base.Start(session, message, sendClientInitMessage);
- Session.RegisterMessage("SSH_MSG_KEXDH_REPLY");
- Session.KeyExchangeDhReplyMessageReceived += Session_KeyExchangeDhReplyMessageReceived;
- _prime = GroupPrime;
- _group = 2;
- PopulateClientExchangeValue();
- SendMessage(new KeyExchangeDhInitMessage(_clientExchangeValue));
- }
- /// <summary>
- /// Finishes key exchange algorithm.
- /// </summary>
- public override void Finish()
- {
- base.Finish();
- Session.KeyExchangeDhReplyMessageReceived -= Session_KeyExchangeDhReplyMessageReceived;
- }
- /// <summary>
- /// Calculates key exchange hash value.
- /// </summary>
- /// <returns>
- /// Key exchange hash.
- /// </returns>
- protected override byte[] CalculateHash()
- {
- var keyExchangeHashData = new KeyExchangeHashData
- {
- ClientVersion = Session.ClientVersion,
- ServerVersion = Session.ServerVersion,
- ClientPayload = _clientPayload,
- ServerPayload = _serverPayload,
- HostKey = _hostKey,
- ClientExchangeValue = _clientExchangeValue,
- ServerExchangeValue = _serverExchangeValue,
- SharedKey = SharedKey,
- };
- return Hash(keyExchangeHashData.GetBytes());
- }
- private void Session_KeyExchangeDhReplyMessageReceived(object sender, MessageEventArgs<KeyExchangeDhReplyMessage> e)
- {
- var message = e.Message;
- // Unregister message once received
- Session.UnRegisterMessage("SSH_MSG_KEXDH_REPLY");
- HandleServerDhReply(message.HostKey, message.F, message.Signature);
- // When SSH_MSG_KEXDH_REPLY received key exchange is completed
- Finish();
- }
- }
- }
|