예제 #1
0
        public void BufferOverflow_Bytes()
        {
            var ms     = new MemoryStream(new byte[] { 1, 2 });
            var reader = new WireReader(ms);

            ExceptionAssert.Throws <EndOfStreamException>(() => reader.ReadBytes(3));
        }
예제 #2
0
        /// <inheritdoc />
        public override void ReadData(WireReader reader, int length)
        {
            var end = reader.Position + length;

            Flags     = (DNSKEYFlags)reader.ReadUInt16();
            Protocol  = reader.ReadByte();
            Algorithm = (SecurityAlgorithm)reader.ReadByte();
            PublicKey = reader.ReadBytes(end - reader.Position);
        }
예제 #3
0
        /// <inheritdoc />
        public override void ReadData(WireReader reader, int length)
        {
            var end = reader.Position + length;

            KeyTag        = reader.ReadUInt16();
            Algorithm     = (SecurityAlgorithm)reader.ReadByte();
            HashAlgorithm = (DigestType)reader.ReadByte();
            Digest        = reader.ReadBytes(end - reader.Position);
        }
예제 #4
0
        /// <inheritdoc />
        public override void ReadData(WireReader reader, int length)
        {
            var end = reader.Position + length;

            TypeCovered         = (DnsType)reader.ReadUInt16();
            Algorithm           = (SecurityAlgorithm)reader.ReadByte();
            Labels              = reader.ReadByte();
            OriginalTTL         = reader.ReadTimeSpan32();
            SignatureExpiration = reader.ReadDateTime32();
            SignatureInception  = reader.ReadDateTime32();
            KeyTag              = reader.ReadUInt16();
            SignerName          = reader.ReadDomainName();
            Signature           = reader.ReadBytes(end - reader.Position);
        }
예제 #5
0
        public void Writing_Past_MaxPointer()
        {
            var ms     = new MemoryStream();
            var writer = new WireWriter(ms);

            writer.WriteBytes(new byte[0x4000]);
            writer.WriteDomainName("a");
            writer.WriteDomainName("b");
            writer.WriteDomainName("b");

            ms.Position = 0;
            var reader = new WireReader(ms);

            reader.ReadBytes(0x4000);
            Assert.AreEqual("a", reader.ReadDomainName());
            Assert.AreEqual("b", reader.ReadDomainName());
            Assert.AreEqual("b", reader.ReadDomainName());
        }
예제 #6
0
        public void Roundtrip()
        {
            var someBytes = new byte[] { 1, 2, 3 };
            var someDate  = new DateTime(1997, 1, 21, 3, 4, 5, DateTimeKind.Utc);

            var ms     = new MemoryStream();
            var writer = new WireWriter(ms);

            writer.WriteDomainName("emanon.org");
            writer.WriteString("alpha");
            writer.WriteTimeSpan32(TimeSpan.FromHours(3));
            writer.WriteUInt16(ushort.MaxValue);
            writer.WriteUInt32(uint.MaxValue);
            writer.WriteUInt48(0XFFFFFFFFFFFFul);
            writer.WriteBytes(someBytes);
            writer.WriteByteLengthPrefixedBytes(someBytes);
            writer.WriteByteLengthPrefixedBytes(null);
            writer.WriteIPAddress(IPAddress.Parse("127.0.0.1"));
            writer.WriteIPAddress(IPAddress.Parse("2406:e001:13c7:1:7173:ef8:852f:25cb"));
            writer.WriteDateTime32(someDate);
            writer.WriteDateTime48(someDate);

            ms.Position = 0;
            var reader = new WireReader(ms);

            Assert.AreEqual("emanon.org", reader.ReadDomainName());
            Assert.AreEqual("alpha", reader.ReadString());
            Assert.AreEqual(TimeSpan.FromHours(3), reader.ReadTimeSpan32());
            Assert.AreEqual(ushort.MaxValue, reader.ReadUInt16());
            Assert.AreEqual(uint.MaxValue, reader.ReadUInt32());
            Assert.AreEqual(0XFFFFFFFFFFFFul, reader.ReadUInt48());
            CollectionAssert.AreEqual(someBytes, reader.ReadBytes(3));
            CollectionAssert.AreEqual(someBytes, reader.ReadByteLengthPrefixedBytes());
            CollectionAssert.AreEqual(new byte[0], reader.ReadByteLengthPrefixedBytes());
            Assert.AreEqual(IPAddress.Parse("127.0.0.1"), reader.ReadIPAddress());
            Assert.AreEqual(IPAddress.Parse("2406:e001:13c7:1:7173:ef8:852f:25cb"), reader.ReadIPAddress(16));
            Assert.AreEqual(someDate, reader.ReadDateTime32());
            Assert.AreEqual(someDate, reader.ReadDateTime48());
        }
예제 #7
0
 /// <inheritdoc />
 public override void ReadData(WireReader reader, int length)
 {
     Padding = reader.ReadBytes(length);
 }
예제 #8
0
        void ReadResponses(Stream stream)
        {
            var reader = new WireReader(stream);

            while (stream.CanRead)
            {
                try
                {
                    var length = reader.ReadUInt16();
                    if (length < Message.MinLength)
                    {
                        throw new InvalidDataException("DNS response is too small.");
                    }
                    if (length > Message.MaxLength)
                    {
                        throw new InvalidDataException("DNS response exceeded max length.");
                    }
                    Message response;
                    var     packet = reader.ReadBytes(length);
                    try
                    {
                        // TODO: Should work, but doesn't
                        //var response = (Message)new Message().Read(reader);
                        response = (Message) new Message().Read(packet);
                    }
                    catch (Exception e)
                    {
                        log.Error($"Failed to read response {Convert.ToBase64String(packet)}", e);
                        continue;
                    }

                    // Find matching request.
                    if (log.IsDebugEnabled)
                    {
                        log.Debug($"Got response #{response.Id} {response.Status}");
                    }
                    if (log.IsTraceEnabled)
                    {
                        log.Trace(response);
                    }
                    if (!OutstandingRequests.TryGetValue(response.Id, out var task))
                    {
                        log.Warn("DNS response is missing a matching request ID.");
                        continue;
                    }

                    // Continue the request.
                    task.SetResult(response);
                }
                catch (EndOfStreamException)
                {
                    stream.Dispose();
                }
                catch (Exception e)
                {
#if NETSTANDARD14
                    if (stream.CanRead)
#else
                    if (stream.CanRead && !(e.InnerException is ThreadAbortException))
#endif
                    {
                        log.Error(e);
                    }
                    stream.Dispose();
                }
            }

            // Cancel any outstanding queries.
            foreach (var task in OutstandingRequests.Values)
            {
                task.SetCanceled();
            }
        }