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
|
|
|
|
}
|
|
|
|
|
}
|