KeyExchangeDiffieHellmanGroupShaBase.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Numerics;
  2. using Renci.SshNet.Messages.Transport;
  3. namespace Renci.SshNet.Security
  4. {
  5. internal abstract class KeyExchangeDiffieHellmanGroupShaBase : KeyExchangeDiffieHellman
  6. {
  7. /// <summary>
  8. /// Gets the group prime.
  9. /// </summary>
  10. /// <value>
  11. /// The group prime.
  12. /// </value>
  13. public abstract BigInteger GroupPrime { get; }
  14. /// <inheritdoc/>
  15. public override void Start(Session session, KeyExchangeInitMessage message, bool sendClientInitMessage)
  16. {
  17. base.Start(session, message, sendClientInitMessage);
  18. Session.RegisterMessage("SSH_MSG_KEXDH_REPLY");
  19. Session.KeyExchangeDhReplyMessageReceived += Session_KeyExchangeDhReplyMessageReceived;
  20. _prime = GroupPrime;
  21. _group = 2;
  22. PopulateClientExchangeValue();
  23. SendMessage(new KeyExchangeDhInitMessage(_clientExchangeValue));
  24. }
  25. /// <summary>
  26. /// Finishes key exchange algorithm.
  27. /// </summary>
  28. public override void Finish()
  29. {
  30. base.Finish();
  31. Session.KeyExchangeDhReplyMessageReceived -= Session_KeyExchangeDhReplyMessageReceived;
  32. }
  33. /// <summary>
  34. /// Calculates key exchange hash value.
  35. /// </summary>
  36. /// <returns>
  37. /// Key exchange hash.
  38. /// </returns>
  39. protected override byte[] CalculateHash()
  40. {
  41. var keyExchangeHashData = new KeyExchangeHashData
  42. {
  43. ClientVersion = Session.ClientVersion,
  44. ServerVersion = Session.ServerVersion,
  45. ClientPayload = _clientPayload,
  46. ServerPayload = _serverPayload,
  47. HostKey = _hostKey,
  48. ClientExchangeValue = _clientExchangeValue,
  49. ServerExchangeValue = _serverExchangeValue,
  50. SharedKey = SharedKey,
  51. };
  52. return Hash(keyExchangeHashData.GetBytes());
  53. }
  54. private void Session_KeyExchangeDhReplyMessageReceived(object sender, MessageEventArgs<KeyExchangeDhReplyMessage> e)
  55. {
  56. var message = e.Message;
  57. // Unregister message once received
  58. Session.UnRegisterMessage("SSH_MSG_KEXDH_REPLY");
  59. HandleServerDhReply(message.HostKey, message.F, message.Signature);
  60. // When SSH_MSG_KEXDH_REPLY received key exchange is completed
  61. Finish();
  62. }
  63. }
  64. }