using Renci.SshNet.Abstractions; namespace Renci.SshNet.Messages.Transport { /// /// Represents SSH_MSG_KEXINIT message. /// [Message("SSH_MSG_KEXINIT", 20)] public class KeyExchangeInitMessage : Message, IKeyExchangedAllowed { /// /// Initializes a new instance of the class. /// public KeyExchangeInitMessage() { var cookie = new byte[16]; CryptoAbstraction.GenerateRandom(cookie); Cookie = cookie; } #region Message Properties /// /// Gets session cookie. /// public byte[] Cookie { get; private set; } /// /// Gets or sets supported key exchange algorithms. /// /// /// Supported key exchange algorithms. /// public string[] KeyExchangeAlgorithms { get; set; } /// /// Gets or sets supported server host key algorithms. /// /// /// Supported server host key algorithms. /// public string[] ServerHostKeyAlgorithms { get; set; } /// /// Gets or sets supported encryption algorithms client to server. /// /// /// Supported encryption algorithms client to server. /// public string[] EncryptionAlgorithmsClientToServer { get; set; } /// /// Gets or sets supported encryption algorithms server to client. /// /// /// Supported encryption algorithms server to client. /// public string[] EncryptionAlgorithmsServerToClient { get; set; } /// /// Gets or sets supported hash algorithms client to server. /// /// /// Supported hash algorithms client to server. /// public string[] MacAlgorithmsClientToServer { get; set; } /// /// Gets or sets supported hash algorithms server to client. /// /// /// Supported hash algorithms server to client. /// public string[] MacAlgorithmsServerToClient { get; set; } /// /// Gets or sets supported compression algorithms client to server. /// /// /// Supported compression algorithms client to server. /// public string[] CompressionAlgorithmsClientToServer { get; set; } /// /// Gets or sets supported compression algorithms server to client. /// /// /// Supported compression algorithms server to client. /// public string[] CompressionAlgorithmsServerToClient { get; set; } /// /// Gets or sets supported languages client to server. /// /// /// Supported languages client to server. /// public string[] LanguagesClientToServer { get; set; } /// /// Gets or sets supported languages server to client. /// /// /// The languages server to client. /// public string[] LanguagesServerToClient { get; set; } /// /// Gets or sets a value indicating whether first key exchange packet follows. /// /// /// true if first key exchange packet follows; otherwise, false. /// public bool FirstKexPacketFollows { get; set; } /// /// Gets or sets the reserved value. /// /// /// The reserved value. /// public uint Reserved { get; set; } #endregion /// /// Gets the size of the message in bytes. /// /// /// -1 to indicate that the size of the message cannot be determined, /// or is too costly to calculate. /// protected override int BufferCapacity { get { return -1; } } /// /// Called when type specific data need to be loaded. /// protected override void LoadData() { Cookie = ReadBytes(16); KeyExchangeAlgorithms = ReadNamesList(); ServerHostKeyAlgorithms = ReadNamesList(); EncryptionAlgorithmsClientToServer = ReadNamesList(); EncryptionAlgorithmsServerToClient = ReadNamesList(); MacAlgorithmsClientToServer = ReadNamesList(); MacAlgorithmsServerToClient = ReadNamesList(); CompressionAlgorithmsClientToServer = ReadNamesList(); CompressionAlgorithmsServerToClient = ReadNamesList(); LanguagesClientToServer = ReadNamesList(); LanguagesServerToClient = ReadNamesList(); FirstKexPacketFollows = ReadBoolean(); Reserved = ReadUInt32(); } /// /// Called when type specific data need to be saved. /// protected override void SaveData() { Write(Cookie); Write(KeyExchangeAlgorithms); Write(ServerHostKeyAlgorithms); Write(EncryptionAlgorithmsClientToServer); Write(EncryptionAlgorithmsServerToClient); Write(MacAlgorithmsClientToServer); Write(MacAlgorithmsServerToClient); Write(CompressionAlgorithmsClientToServer); Write(CompressionAlgorithmsServerToClient); Write(LanguagesClientToServer); Write(LanguagesServerToClient); Write(FirstKexPacketFollows); Write(Reserved); } internal override void Process(Session session) { session.OnKeyExchangeInitReceived(this); } } }