MailSharp / MailSharp.DNS / Records / RecordNXT.cs
Code · 76 lines · 2552 bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76using MailSharp.DNS.Records;
using System.Text;
/*
 * http://tools.ietf.org/rfc/rfc2065.txt
 * 
5.2 NXT RDATA Format

   The RDATA for an NXT RR consists simply of a domain name followed by
   a bit map.

   The type number for the NXT RR is 30.

                           1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         next domain name                                      /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                    type bit map                               /
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

   The NXT RR type bit map is one bit per RR type present for the owner
   name similar to the WKS socket bit map.  The first bit represents RR
   type zero (an illegal type which should not be present.) A one bit
   indicates that at least one RR of that type is present for the owner
   name.  A zero indicates that no such RR is present.  All bits not
   specified because they are beyond the end of the bit map are assumed
   to be zero.  Note that bit 30, for NXT, will always be on so the
   minimum bit map length is actually four octets.  The NXT bit map
   should be printed as a list of RR type mnemonics or decimal numbers
   similar to the WKS RR.

   The domain name may be compressed with standard DNS name compression
   when being transmitted over the network.  The size of the bit map can
   be inferred from the RDLENGTH and the length of the next domain name.



 */
namespace MailSharp.DNS.Records;

public record RecordNXT : DnsRecord  // Obsolete (RFC 2535 → vervangen door NSEC in RFC 4034)
{
	public string NextDomainName { get; init; } = string.Empty;
	public List<DnsType> TypeBitMaps { get; init; } = [];

	public RecordNXT(RecordReader rr) : base(rr)
	{
		NextDomainName = rr.ReadDomainName();

		List<DnsType> types = new();
		ushort rdLength = rr.ReadUInt16(-2);
		int start = rr.Position;

		while (rr.Position < start + (rdLength - (rr.Position - start)))
		{
			byte window = rr.ReadByte();
			byte len = rr.ReadByte();

			for (int i = 0; i < len * 8; i++)
			{
				if ((rr.PeekPosition(i / 8) & (0x80 >> (i % 8))) != 0)
					TypeBitMaps.Add((DnsType)(window * 256 + i));
			}
			rr.Position += len;
		}

	}

	public override string ToString()
	{
		var sorted = TypeBitMaps.OrderBy(t => (ushort)t);
		return $"{NextDomainName} {string.Join(" ", sorted)}";
	}


}