Message
Base class for all SSH protocol messages.
            
                using Renci.SshNet.Abstractions;
using Renci.SshNet.Common;
using Renci.SshNet.Compression;
using System.IO;
namespace Renci.SshNet.Messages
{
    public abstract class Message : SshData
    {
        public abstract string MessageName { get; }
        public abstract byte MessageNumber { get; }
        protected override int BufferCapacity => 1;
        protected override void WriteBytes(SshDataStream stream)
        {
            stream.WriteByte(MessageNumber);
            base.WriteBytes(stream);
        }
        internal byte[] GetPacket(byte paddingMultiplier, Compressor compressor, bool excludePacketLengthFieldWhenPadding = false)
        {
            int bufferCapacity = BufferCapacity;
            if (bufferCapacity == -1 || compressor != null) {
                using (SshDataStream sshDataStream = new SshDataStream(64)) {
                    sshDataStream.Seek(9, SeekOrigin.Begin);
                    if (compressor != null) {
                        using (SshDataStream sshDataStream2 = new SshDataStream((bufferCapacity != -1) ? bufferCapacity : 64)) {
                            WriteBytes(sshDataStream2);
                            byte[] array = compressor.Compress(sshDataStream2.ToArray());
                            sshDataStream.Write(array, 0, array.Length);
                        }
                    } else
                        WriteBytes(sshDataStream);
                    bufferCapacity = (int)sshDataStream.Length - 9;
                    int num = bufferCapacity + 4 + 1;
                    byte paddingLength = GetPaddingLength(paddingMultiplier, excludePacketLengthFieldWhenPadding ? (num - 4) : num);
                    byte[] buffer = CryptoAbstraction.GenerateRandom(paddingLength);
                    sshDataStream.Write(buffer, 0, paddingLength);
                    uint packetDataLength = GetPacketDataLength(bufferCapacity, paddingLength);
                    sshDataStream.Seek(4, SeekOrigin.Begin);
                    sshDataStream.Write(packetDataLength);
                    sshDataStream.WriteByte(paddingLength);
                    return sshDataStream.ToArray();
                }
            }
            int num2 = bufferCapacity + 4 + 1;
            byte paddingLength2 = GetPaddingLength(paddingMultiplier, excludePacketLengthFieldWhenPadding ? (num2 - 4) : num2);
            uint packetDataLength2 = GetPacketDataLength(bufferCapacity, paddingLength2);
            using (SshDataStream sshDataStream3 = new SshDataStream(num2 + paddingLength2 + 4)) {
                sshDataStream3.Seek(4, SeekOrigin.Begin);
                sshDataStream3.Write(packetDataLength2);
                sshDataStream3.WriteByte(paddingLength2);
                WriteBytes(sshDataStream3);
                byte[] buffer2 = CryptoAbstraction.GenerateRandom(paddingLength2);
                sshDataStream3.Write(buffer2, 0, paddingLength2);
                return sshDataStream3.ToArray();
            }
        }
        private static uint GetPacketDataLength(int messageLength, byte paddingLength)
        {
            return (uint)(messageLength + paddingLength + 1);
        }
        private static byte GetPaddingLength(byte paddingMultiplier, long packetLength)
        {
            byte b = (byte)(-packetLength & (paddingMultiplier - 1));
            if (b < paddingMultiplier)
                b = (byte)(b + paddingMultiplier);
            return b;
        }
        public override string ToString()
        {
            return MessageName;
        }
        internal abstract void Process(Session session);
    }
}