예제 #1
0
        public async Task No_authentication_should_work()
        {
            var stream   = new BufferReadOnlyStream(5, 1, 0);
            var greeting = await Greeting.ReadFromAsync(stream, this._bufferPool).ConfigureAwait(true);

            greeting.SupportedAuthenticationMethods.Should().Equal(AuthenticationMethod.None);
        }
예제 #2
0
        public void No_supported_authentication_methods_should_throw()
        {
            var         stream = new BufferReadOnlyStream(5, 0, 0);
            Func <Task> act    = () => Greeting.ReadFromAsync(stream, this._bufferPool);

            act.Should().Throw <InvalidDataException>().And.Message.Should().ContainEquivalentOf("authentication methods");
        }
예제 #3
0
        public void Wrong_protocol_version_should_throw()
        {
            var         stream = new BufferReadOnlyStream(4, 1, 0);
            Func <Task> act    = () => Greeting.ReadFromAsync(stream, this._bufferPool);

            act.Should().Throw <InvalidDataException>().And.Message.Should().ContainEquivalentOf("version");
        }
예제 #4
0
        public async Task Domain_address()
        {
            var bytes   = s_ValidDomainBindRequest.ToArray();
            var stream  = new BufferReadOnlyStream(bytes);
            var request = await Command.ReadFromAsync(stream, this._bufferPool).ConfigureAwait(true);

            request.CommandType.Should().Be(CommandType.Bind);
            request.EndPoint.Should().Be(new DnsEndPoint("google.com", 65534));
        }
예제 #5
0
        public async Task Ipv6_address()
        {
            var bytes   = s_ValidIpv6BindRequest.ToArray();
            var stream  = new BufferReadOnlyStream(bytes);
            var request = await Command.ReadFromAsync(stream, this._bufferPool).ConfigureAwait(true);

            request.CommandType.Should().Be(CommandType.Bind);
            request.EndPoint.Should().Be(new IPEndPoint(IPAddress.Parse("102:304:506:708:90a:b0c:d0e:f10"), 65534));
        }
예제 #6
0
        public async Task All_authentication_methods_supported()
        {
            var stream = new BufferReadOnlyStream(
                new[] { 5, 255 }
                .Concat(Enumerable.Range(0, 255))
                .Select(x => (byte)x)
                .ToArray());

            var greeting = await Greeting
                           .ReadFromAsync(stream, this._bufferPool)
                           .ConfigureAwait(true);

            greeting.SupportedAuthenticationMethods
            .Should()
            .Equal(Enumerable.Range(0, 255).Select(x => (AuthenticationMethod)x));
        }
예제 #7
0
        public static DatagramHeader ReadFrom(ArraySegment <byte> buffer, ArrayPool <byte> bufferPool)
        {
            if (buffer.Array == null)
            {
                throw new ArgumentNullException(nameof(buffer.Array));
            }
            if (bufferPool == null)
            {
                throw new ArgumentNullException(nameof(bufferPool));
            }

            // | RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA     |
            // |   2 |    1 |    1 | Variable |        2 | Variable |
            if (buffer.Count < 10)
            {
                throw new InvalidDataException("UDP SOCKS datagram is truncated.");
            }

            if (buffer.Array[buffer.Offset] != 0 ||
                buffer.Array[buffer.Offset + 1] != 0)
            {
                throw new InvalidDataException("UDP SOCKS datagram is corrupt.");
            }

            var fragmentPosition = (byte)(buffer.Array[buffer.Offset + 2] & 127);
            var isFinalFragment  = (buffer.Array[buffer.Offset + 2] & 128) != 0;

            if (isFinalFragment && fragmentPosition == 0)
            {
                throw new InvalidDataException("Zero fragment position but last fragment bit set");
            }

            var addressType = (AddressType)buffer.Array[buffer.Offset + 3];

            var packetStream   = new BufferReadOnlyStream(buffer.Array, buffer.Offset + 4, buffer.Count - 4);
            var remoteEndPoint = packetStream.ReadEndPoint(addressType, bufferPool);

            return(new DatagramHeader(fragmentPosition, isFinalFragment, remoteEndPoint));
        }