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