Skip to content

Commit f6baedb

Browse files
committed
local DoH: pad responses, not the incoming query
1 parent c4e1393 commit f6baedb

1 file changed

Lines changed: 35 additions & 5 deletions

File tree

dnscrypt-proxy/local-doh.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,21 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
7272
writer.WriteHeader(500)
7373
return
7474
}
75-
msg := dns.Msg{Data: packet}
75+
msg := dns.Msg{Data: response}
7676
if err := msg.Unpack(); err != nil {
7777
writer.WriteHeader(400)
7878
return
7979
}
80-
responseLen := len(response)
81-
paddedLen := dohPaddedLen(responseLen)
82-
padLen := paddedLen - responseLen
8380
if hasEDNS0Padding {
84-
response, err = addEDNS0PaddingIfNoneFound(&msg, response, padLen)
81+
response, err = addLocalDoHResponsePadding(&msg)
8582
if err != nil {
8683
dlog.Critical(err)
8784
writer.WriteHeader(500)
8885
return
8986
}
9087
} else {
88+
responseLen := len(response)
89+
padLen := dohPaddedLen(responseLen) - responseLen
9190
pad := strings.Repeat("X", padLen)
9291
writer.Header().Set("X-Pad", pad)
9392
}
@@ -97,6 +96,37 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
9796
writer.Write(response)
9897
}
9998

99+
func addLocalDoHResponsePadding(msg *dns.Msg) ([]byte, error) {
100+
original := append([]byte(nil), msg.Data...)
101+
if msg.UDPSize == 0 {
102+
msg.UDPSize = uint16(MaxDNSPacketSize)
103+
}
104+
var paddingRR *dns.PADDING
105+
for _, rr := range msg.Pseudo {
106+
if padding, ok := rr.(*dns.PADDING); ok {
107+
paddingRR = padding
108+
paddingRR.Padding = ""
109+
break
110+
}
111+
}
112+
if paddingRR == nil {
113+
paddingRR = &dns.PADDING{}
114+
msg.Pseudo = append(msg.Pseudo, paddingRR)
115+
}
116+
if err := msg.Pack(); err != nil {
117+
return nil, err
118+
}
119+
if len(msg.Data) > MaxDNSPacketSize {
120+
return original, nil
121+
}
122+
paddingLen := dohPaddedLen(len(msg.Data)) - len(msg.Data)
123+
paddingRR.Padding = strings.Repeat("58", paddingLen)
124+
if err := msg.Pack(); err != nil {
125+
return nil, err
126+
}
127+
return msg.Data, nil
128+
}
129+
100130
func (proxy *Proxy) localDoHListener(acceptPc *net.TCPListener) {
101131
defer acceptPc.Close()
102132
if len(proxy.localDoHCertFile) == 0 || len(proxy.localDoHCertKeyFile) == 0 {

0 commit comments

Comments
 (0)