예제 #1
0
 public void NameOverRunInRR()
 {
     byte[] packet = new byte[]
     {
         0, 0, 0x80, 0, 0, 0, 0, 1, 0, 0, 0, 0,
         7, (byte)'e', (byte)'x', (byte)'a', (byte)'m', (byte)'p', (byte)'l', (byte)'e',
         3, (byte)'c', (byte)'o', (byte)'m', 0,
         0, 5, 0, 1, 0, 0, 0x12, 0x34, 0, 1,
         3, (byte)'w', (byte)'w', (byte)'w', 0,
     };
     Assert.Throws <InvalidOperationException>(() => DnsParser.ParseMessage(packet, out _));
 }
예제 #2
0
 public void RecursivePointer()
 {
     byte[] packet = new byte[]
     {
         0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
         1, (byte)'a', 2, (byte)'b', (byte)'c', 192, 22,
         0, 1, 0, 1,
         3, (byte)'c', (byte)'o', (byte)'m', 192, 14,
         0, 1, 0, 1,
     };
     Assert.Throws <IndexOutOfRangeException>(() => DnsParser.ParseMessage(packet, out _));
 }
예제 #3
0
        public void EmptyMessage()
        {
            byte[] packet = new byte[]
            {
                0x12, 0x34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            };
            var message = DnsParser.ParseMessage(packet, out int bytesConsumed);

            Assert.Equal(packet.Length, bytesConsumed);

            Assert.Equal(0x1234, message.QueryId);
            Assert.Empty(message.Queries);
            Assert.Null(message.Answers);
            Assert.Null(message.NameServerAuthorities);
            Assert.Null(message.AdditionalRecords);

            TestFormatRoundTrip(packet, message);
        }
예제 #4
0
        public void Query()
        {
            byte[] packet = new byte[]
            {
                0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
                1, (byte)'a', 2, (byte)'b', (byte)'c', 0,
                0, 1, 0, 1,
            };
            var message = DnsParser.ParseMessage(packet, out int bytesConsumed);

            Assert.Equal(packet.Length, bytesConsumed);

            Assert.Equal(1, message.Queries.Count);
            Assert.Equal("a.bc", message.Queries[0].QueryName);
            Assert.Equal(DnsRecordType.A, message.Queries[0].QueryType);
            Assert.Equal(DnsEndpointClass.IN, message.Queries[0].QueryClass);

            TestFormatRoundTrip(packet, message);
        }
예제 #5
0
        public void Flags()
        {
            byte[] packet = new byte[]
            {
                0, 0, 0b_0000_1000, 0b1000_0101, 0, 0, 0, 0, 0, 0, 0, 0,
            };
            var message = DnsParser.ParseMessage(packet, out int bytesConsumed);

            Assert.Equal(packet.Length, bytesConsumed);
            Assert.False(message.IsResponse);
            Assert.Equal(DnsOperation.InverseQuery, message.Operation);
            Assert.False(message.IsAuthoritativeAnswer);
            Assert.False(message.IsTruncated);
            Assert.False(message.IsRecursionDesired);
            Assert.True(message.IsRecursionAvailable);
            Assert.Equal(DnsResponseCode.Refused, message.ResponseCode);

            TestFormatRoundTrip(packet, message);
        }
예제 #6
0
        public void UnicodeDomainName()
        {
            byte[] packet = new byte[]
            {
                0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
                17, (byte)'x', (byte)'n', (byte)'-', (byte)'-', (byte)'r', (byte)'h', (byte)'q', (byte)'r', (byte)'3', (byte)'y',
                (byte)'k', (byte)'w', (byte)'b', (byte)'x', (byte)'v', (byte)'0', (byte)'c',
                3, (byte)'t', (byte)'o', (byte)'p', 0,
                0, 1, 0, 1,
            };
            var message = DnsParser.ParseMessage(packet, out int bytesConsumed);

            Assert.Equal(packet.Length, bytesConsumed);

            Assert.Equal(1, message.Queries.Count);
            Assert.Equal("世界大学.top", message.Queries[0].QueryName);

            TestFormatRoundTrip(packet, message);
        }
예제 #7
0
        public void NamePointerFormatting()
        {
            var message = new DnsMessage()
            {
                Queries = new[]
                {
                    new DnsQuery("example.com", DnsRecordType.A, DnsEndpointClass.IN),
                    new DnsQuery("www.example.com", DnsRecordType.A, DnsEndpointClass.IN),
                    new DnsQuery("com", DnsRecordType.A, DnsEndpointClass.IN),
                }
            };

            byte[] buffer       = new byte[1024];
            int    bytesWritten = DnsParser.FormatMessage(message, buffer, enableNameCompression: true);
            var    message2     = DnsParser.ParseMessage(buffer.AsSpan(0, bytesWritten), out int bytesConsumed);

            Assert.Equal(bytesWritten, bytesConsumed);
            Assert.Equal(3, message2.Queries.Count);
            Assert.Equal("example.com", message2.Queries[0].QueryName);
            Assert.Equal("www.example.com", message2.Queries[1].QueryName);
            Assert.Equal("com", message2.Queries[2].QueryName);
        }
예제 #8
0
        public void NamePointerInCName()
        {
            byte[] packet = new byte[]
            {
                0, 0, 0x80, 0, 0, 0, 0, 1, 0, 0, 0, 0,
                7, (byte)'e', (byte)'x', (byte)'a', (byte)'m', (byte)'p', (byte)'l', (byte)'e',
                3, (byte)'c', (byte)'o', (byte)'m', 0,
                0, 5, 0, 1, 0, 0, 0x12, 0x34, 0, 6,
                3, (byte)'w', (byte)'w', (byte)'w', 192, 12,
            };
            var message = DnsParser.ParseMessage(packet, out int bytesConsumed);

            Assert.Equal(packet.Length, bytesConsumed);

            Assert.True(message.IsResponse);
            Assert.Equal(1, message.Answers.Count);
            Assert.Equal(DnsRecordType.CNAME, message.Answers[0].Type);
            Assert.Equal(DnsEndpointClass.IN, message.Answers[0].EndpointClass);
            Assert.Equal(0x1234, message.Answers[0].AliveSeconds);
            var record = Assert.IsType <DomainNameRecord>(message.Answers[0]);

            Assert.Equal("www.example.com", record.TargetDomainName);
        }
예제 #9
0
        public void NamePointer()
        {
            byte[] packet = new byte[]
            {
                0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
                1, (byte)'a', 2, (byte)'b', (byte)'c', 0,
                0, 1, 0, 1,
                192, 14,
                0, 1, 0, 1,
                7, (byte)'e', (byte)'x', (byte)'a', (byte)'m', (byte)'p', (byte)'l', (byte)'e',
                3, (byte)'c', (byte)'o', (byte)'m', 0,
                0, 1, 0, 1,
            };
            var message = DnsParser.ParseMessage(packet, out int bytesConsumed);

            Assert.Equal(packet.Length, bytesConsumed);

            Assert.Equal(3, message.Queries.Count);
            Assert.Equal("a.bc", message.Queries[0].QueryName);
            Assert.Equal("bc", message.Queries[1].QueryName);
            Assert.Equal("example.com", message.Queries[2].QueryName);

            // No round-trip test for compressed name
        }
예제 #10
0
 public void IncompletePakcet(byte[] packet)
 {
     Assert.ThrowsAny <Exception>(() => DnsParser.ParseMessage(packet, out _));
 }