using System; using Renci.SshNet.Common; namespace Renci.SshNet.Messages.Transport { /// /// Represents SSH_MSG_KEXECDH_INIT message. /// internal sealed class KeyExchangeEcdhInitMessage : Message, IKeyExchangedAllowed { /// public override string MessageName { get { return "SSH_MSG_KEX_ECDH_INIT"; } } /// public override byte MessageNumber { get { return 30; } } /// /// Gets the client's ephemeral contribution to the ECDH exchange, encoded as an octet string. /// public byte[] QC { get; private set; } /// /// Gets the size of the message in bytes. /// /// /// The size of the messages in bytes. /// protected override int BufferCapacity { get { var capacity = base.BufferCapacity; capacity += 4; // QC length capacity += QC.Length; // QC return capacity; } } /// /// Initializes a new instance of the class. /// public KeyExchangeEcdhInitMessage(byte[] q) { QC = q; } /// /// Initializes a new instance of the class. /// public KeyExchangeEcdhInitMessage(BigInteger d, BigInteger q) { var dBytes = d.ToByteArray().Reverse(); var qBytes = q.ToByteArray().Reverse(); var data = new byte[dBytes.Length + qBytes.Length + 1]; data[0] = 0x04; Buffer.BlockCopy(dBytes, 0, data, 1, dBytes.Length); Buffer.BlockCopy(qBytes, 0, data, dBytes.Length + 1, qBytes.Length); QC = data; } /// /// Called when type specific data need to be loaded. /// protected override void LoadData() { QC = ReadBinary(); } /// /// Called when type specific data need to be saved. /// protected override void SaveData() { WriteBinaryString(QC); } internal override void Process(Session session) { throw new NotImplementedException(); } } }