using System; namespace Shadowsocks.Protocol.Socks5 { public class Socks5VersionIdentifierMessage : Socks5Message { // 5 lAuth [Auth] public Memory Auth; public override int Serialize(Memory buffer) { var required = Auth.Length + 2; if (buffer.Length < required) throw Util.BufferTooSmall(required, buffer.Length, nameof(buffer)); buffer.Span[0] = 5; buffer.Span[1] = (byte) Auth.Length; Auth.CopyTo(buffer.Slice(2)); return Auth.Length + 2; } public override (bool success, int length) TryLoad(ReadOnlyMemory buffer) { // need 3 byte if (buffer.Length < 3) return (false, 3); if (buffer.Span[0] != 5) return (false, 0); if (buffer.Span[1] == 0) return (false, 0); if (buffer.Length < buffer.Span[1] + 2) return (false, buffer.Span[1] + 2); Auth = Util.GetArray(buffer[2..(2 + buffer.Span[1])]); return (true, buffer.Span[1] + 2); } public override bool Equals(IProtocolMessage other) { if (other is null) return false; if (ReferenceEquals(this, other)) return true; if (other.GetType() != GetType()) return false; return Util.MemEqual(Auth, ((Socks5VersionIdentifierMessage) other).Auth); } } }