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 _)); }
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 _)); }
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); }
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); }
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); }
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); }
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); }
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); }
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 }
public void IncompletePakcet(byte[] packet) { Assert.ThrowsAny <Exception>(() => DnsParser.ParseMessage(packet, out _)); }