Skip to content

Commit 084400f

Browse files
evverxgpotter2
authored andcommitted
DNS: add the DNS COOKIE EDNS(0) option
https://datatracker.ietf.org/doc/html/rfc7873#section-4 The patch was cross-checked with Wireshark: ``` tdecode(Ether()/IPv6()/UDP()/DNS(qd=[], ar=[DNSRROPT(rdata=[EDNS0COOKIE(client_cookie=b'\x01'*8, server_cookie=b'\x02'*16)])])) ... Data length: 28 Option: COOKIE Option Code: COOKIE (10) Option Length: 24 Option Data: 010101010101010102020202020202020202020202020202 Client Cookie: 0101010101010101 Server Cookie: 02020202020202020202020202020202 ```
1 parent ba7ff8c commit 084400f

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

scapy/layers/dns.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
StrField,
4747
StrLenField,
4848
UTCTimeField,
49+
XStrFixedLenField,
50+
XStrLenField,
4951
)
5052
from scapy.sendrecv import sr1
5153
from scapy.supersocket import StreamSocket
@@ -559,6 +561,16 @@ class EDNS0ClientSubnet(_EDNS0Dummy):
559561
length_from=lambda p: p.source_plen))]
560562

561563

564+
class EDNS0COOKIE(_EDNS0Dummy):
565+
name = "DNS EDNS0 COOKIE"
566+
fields_desc = [ShortEnumField("optcode", 10, edns0types),
567+
FieldLenField("optlen", None, length_of="server_cookie", fmt="!H",
568+
adjust=lambda pkt, x: x + 8),
569+
XStrFixedLenField("client_cookie", b"\x00" * 8, length=8),
570+
XStrLenField("server_cookie", "",
571+
length_from=lambda pkt: max(0, pkt.optlen - 8))]
572+
573+
562574
# RFC 8914 - Extended DNS Errors
563575

564576
# https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#extended-dns-error-codes
@@ -612,6 +624,7 @@ class EDNS0ExtendedDNSError(_EDNS0Dummy):
612624
6: EDNS0DHU,
613625
7: EDNS0N3U,
614626
8: EDNS0ClientSubnet,
627+
10: EDNS0COOKIE,
615628
15: EDNS0ExtendedDNSError,
616629
}
617630

test/scapy/layers/dns_edns0.uts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,33 @@ d = DNSRROPT(raw_d)
155155
assert EDNS0ClientSubnet in d.rdata[0] and d.rdata[0].family == 2 and d.rdata[0].address == "2001:db8::"
156156

157157

158+
+ EDNS0 - Cookie
159+
160+
= Basic instantiation & dissection
161+
162+
b = b'\x00\n\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00'
163+
164+
p = EDNS0COOKIE()
165+
assert raw(p) == b
166+
167+
p = EDNS0COOKIE(b)
168+
assert p.optcode == 10
169+
assert p.optlen == 8
170+
assert p.client_cookie == b'\x00' * 8
171+
assert p.server_cookie == b''
172+
173+
b = b'\x00\n\x00\x18\x01\x01\x01\x01\x01\x01\x01\x01\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02'
174+
175+
p = EDNS0COOKIE(client_cookie=b'\x01' * 8, server_cookie=b'\x02' * 16)
176+
assert raw(p) == b
177+
178+
p = EDNS0COOKIE(b)
179+
assert p.optcode == 10
180+
assert p.optlen == 24
181+
assert p.client_cookie == b'\x01' * 8
182+
assert p.server_cookie == b'\x02' * 16
183+
184+
158185
+ EDNS0 - Extended DNS Error
159186

160187
= Basic instantiation & dissection

0 commit comments

Comments
 (0)