Skip to content

Commit 8e350df

Browse files
tsig fixes
1 parent af08f9c commit 8e350df

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

AcmeCaPlugin/Clients/DNS/Rfc2136DnsProvider.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,14 @@ private byte[] BuildUpdateMessage(string recordName, string txtValue, bool isDel
212212
}
213213

214214
/// <summary>
215-
/// Builds a TSIG record for authentication per RFC 2845.
215+
/// Builds a TSIG record for authentication per RFC 2845/8945.
216216
/// </summary>
217217
private byte[] BuildTsigRecord(byte[] messageData, byte[] transactionId)
218218
{
219219
var tsig = new List<byte>();
220220

221-
// TSIG key name
222-
tsig.AddRange(EncodeDomainName(_tsigKeyName));
221+
// TSIG key name (canonical lowercase form)
222+
tsig.AddRange(EncodeDomainNameLowercase(_tsigKeyName));
223223

224224
// TYPE: TSIG (250)
225225
tsig.Add(0x00); tsig.Add(0xFA);
@@ -233,8 +233,8 @@ private byte[] BuildTsigRecord(byte[] messageData, byte[] transactionId)
233233
// Build RDATA
234234
var rdata = new List<byte>();
235235

236-
// Algorithm name
237-
rdata.AddRange(EncodeDomainName(_tsigAlgorithm));
236+
// Algorithm name (canonical lowercase form)
237+
rdata.AddRange(EncodeDomainNameLowercase(_tsigAlgorithm));
238238

239239
// Time signed (48-bit, seconds since epoch)
240240
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
@@ -275,43 +275,46 @@ private byte[] BuildTsigRecord(byte[] messageData, byte[] transactionId)
275275
}
276276

277277
/// <summary>
278-
/// Builds the data to be signed for TSIG MAC calculation per RFC 2845.
278+
/// Builds the data to be signed for TSIG MAC calculation per RFC 8945 (which obsoletes RFC 2845).
279+
/// For a request, the digest components are:
280+
/// DNS Message (request)
281+
/// TSIG Variables
279282
/// </summary>
280283
private byte[] BuildMacData(byte[] messageData, long timeSigned)
281284
{
282285
var data = new List<byte>();
283286

284-
// DNS message (request MAC is computed over the message without TSIG RR)
287+
// 1. DNS Message (the request without TSIG RR)
285288
data.AddRange(messageData);
286289

287-
// TSIG Variables - per RFC 2845 section 3.4.2
288-
// Key name (in canonical wire format - lowercase)
290+
// 2. TSIG Variables per RFC 8945 Section 4.3.3
291+
// Key name (canonical wire format - lowercase)
289292
data.AddRange(EncodeDomainNameLowercase(_tsigKeyName));
290293

291-
// CLASS (ANY = 255)
294+
// CLASS (ANY = 255) - 16-bit
292295
data.Add(0x00); data.Add(0xFF);
293296

294-
// TTL (always 0 for TSIG)
297+
// TTL (always 0 for TSIG) - 32-bit
295298
data.Add(0x00); data.Add(0x00); data.Add(0x00); data.Add(0x00);
296299

297-
// Algorithm name (in canonical wire format - lowercase)
300+
// Algorithm name (canonical wire format - lowercase)
298301
data.AddRange(EncodeDomainNameLowercase(_tsigAlgorithm));
299302

300-
// Time signed (48-bit)
303+
// Time signed (48-bit, big-endian)
301304
data.Add((byte)((timeSigned >> 40) & 0xFF));
302305
data.Add((byte)((timeSigned >> 32) & 0xFF));
303306
data.Add((byte)((timeSigned >> 24) & 0xFF));
304307
data.Add((byte)((timeSigned >> 16) & 0xFF));
305308
data.Add((byte)((timeSigned >> 8) & 0xFF));
306309
data.Add((byte)(timeSigned & 0xFF));
307310

308-
// Fudge (300 seconds)
311+
// Fudge (300 seconds = 0x012C) - 16-bit
309312
data.Add(0x01); data.Add(0x2C);
310313

311-
// Error (0 = NOERROR)
314+
// Error (0 = NOERROR) - 16-bit
312315
data.Add(0x00); data.Add(0x00);
313316

314-
// Other Len (0)
317+
// Other Len (0) - 16-bit
315318
data.Add(0x00); data.Add(0x00);
316319

317320
// Other Data (empty since Other Len is 0)

0 commit comments

Comments
 (0)