Made DoT length prefix operations more readable
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user