Made DoT length prefix operations more readable

This commit is contained in:
2025-02-27 03:51:00 +00:00
parent f17ff6123c
commit dfdf518ea2

View File

@@ -1,7 +1,9 @@
package dot package dot
import ( import (
"bytes"
"crypto/tls" "crypto/tls"
"encoding/binary"
"fmt" "fmt"
"net" "net"
"os" "os"
@@ -50,13 +52,11 @@ func Run(domain, queryType, server string, dnssec bool) error {
} }
defer tlsConn.Close() defer tlsConn.Close()
// Before sending the DNS message over TLS, prepend the 2-byte length field var lengthPrefixedMessage bytes.Buffer
lengthPrefixedMessage := make([]byte, len(DNSMessage)+2) binary.Write(&lengthPrefixedMessage, binary.BigEndian, uint16(len(DNSMessage)))
lengthPrefixedMessage[0] = byte(len(DNSMessage) >> 8) // High byte lengthPrefixedMessage.Write(DNSMessage)
lengthPrefixedMessage[1] = byte(len(DNSMessage) & 0xFF) // Low byte
copy(lengthPrefixedMessage[2:], DNSMessage)
_, err = tlsConn.Write(lengthPrefixedMessage) _, err = tlsConn.Write(lengthPrefixedMessage.Bytes())
if err != nil { if err != nil {
return fmt.Errorf("failed writing TLS request: %v", err) return fmt.Errorf("failed writing TLS request: %v", err)
} }
@@ -68,8 +68,7 @@ func Run(domain, queryType, server string, dnssec bool) error {
return fmt.Errorf("failed reading response length: %v", err) return fmt.Errorf("failed reading response length: %v", err)
} }
// Calculate the message length from the 2-byte prefix messageLength := binary.BigEndian.Uint16(lengthBuf)
messageLength := int(lengthBuf[0])<<8 | int(lengthBuf[1])
responseBuf := make([]byte, messageLength) responseBuf := make([]byte, messageLength)
n, err := tlsConn.Read(responseBuf) n, err := tlsConn.Read(responseBuf)