EonaCat.DnsTester/EonaCat.DnsTester/Helpers/DnsNameParser.cs

64 lines
1.9 KiB
C#
Raw Normal View History

2023-03-01 21:15:40 +01:00
using System.Collections.Generic;
2023-03-02 10:02:06 +01:00
using System.Text;
2023-03-01 21:15:40 +01:00
namespace EonaCat.DnsTester.Helpers
{
public class DnsNameParser
{
public static string ParseName(byte[] responseBytes, ref int offset)
{
2023-07-19 16:35:30 +02:00
var labels = new List<string>();
2023-03-01 21:15:40 +01:00
int length;
while ((length = responseBytes[offset++]) != 0)
{
if ((length & 0xC0) == 0xC0)
{
// The name is compressed
2023-07-19 16:35:30 +02:00
var pointer = ((length & 0x3F) << 8) | responseBytes[offset++];
var savedOffset = offset;
2023-03-01 21:15:40 +01:00
offset = pointer;
labels.AddRange(ParseName(responseBytes, ref offset).Split('.'));
offset = savedOffset;
break;
}
// The name is not compressed
2023-07-19 16:35:30 +02:00
labels.Add(Encoding.ASCII.GetString(responseBytes, offset, length));
2023-03-01 21:15:40 +01:00
offset += length;
}
return string.Join(".", labels);
}
2023-03-02 10:02:06 +01:00
public static string ExtractDomainName(byte[] buffer, ref int offset)
{
2023-07-19 16:35:30 +02:00
var labels = new List<string>();
2023-03-02 10:02:06 +01:00
while (true)
{
2023-07-19 16:35:30 +02:00
var labelLength = buffer[offset++];
2023-03-02 10:02:06 +01:00
if (labelLength == 0)
{
break;
}
if ((labelLength & 0xC0) == 0xC0)
{
// Compressed domain name
2023-07-19 16:35:30 +02:00
var pointer = (int)(((labelLength & 0x3F) << 8) + buffer[offset++]);
2023-03-02 10:02:06 +01:00
labels.Add(ExtractDomainName(buffer, ref pointer));
break;
}
2023-07-19 16:35:30 +02:00
var label = Encoding.ASCII.GetString(buffer, offset, labelLength);
2023-03-02 10:02:06 +01:00
labels.Add(label);
offset += labelLength;
}
return string.Join(".", labels);
}
2023-03-01 21:15:40 +01:00
}
}