public void BufferOverflow_Bytes() { var ms = new MemoryStream(new byte[] { 1, 2 }); var reader = new WireReader(ms); ExceptionAssert.Throws <EndOfStreamException>(() => reader.ReadBytes(3)); }
/// <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); }
/// <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); }
/// <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); }
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()); }
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()); }
/// <inheritdoc /> public override void ReadData(WireReader reader, int length) { Padding = reader.ReadBytes(length); }
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(); } }