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);
}
}
}