Skip to content

Commit 9e28d6f

Browse files
committed
dns: add EDNS0 Padding option
https://datatracker.ietf.org/doc/html/rfc7830 specifies the EDNS(0) "Padding" option, which allows DNS clients and servers to pad request and response messages by a variable number of octets. It was cross-checked with TShark ``` >>> tdecode(Ether()/IP()/UDP()/DNS(ar=[DNSRROPT(rdata=[EDNS0PADDING(padding=b'\x00')])])) ... Option: PADDING Option Code: PADDING (12) Option Length: 1 Option Data: 00 Padding: 00 ```
1 parent f4a2ca4 commit 9e28d6f

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

scapy/layers/dns.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ def i2m(self, pkt, s):
439439

440440
edns0types = {0: "Reserved", 1: "LLQ", 2: "UL", 3: "NSID", 4: "Owner",
441441
5: "DAU", 6: "DHU", 7: "N3U", 8: "edns-client-subnet", 10: "COOKIE",
442-
15: "Extended DNS Error"}
442+
12: "Padding", 15: "Extended DNS Error"}
443443

444444

445445
class _EDNS0Dummy(Packet):
@@ -625,6 +625,15 @@ class EDNS0COOKIE(_EDNS0Dummy):
625625
XStrLenField("server_cookie", "",
626626
length_from=lambda pkt: max(0, pkt.optlen - 8))]
627627

628+
# RFC 7830 - EDNS0 Padding Option
629+
630+
class EDNS0PADDING(_EDNS0Dummy):
631+
name = "DNS EDNS0 Padding"
632+
fields_desc = [ShortEnumField("optcode", 12, edns0types),
633+
FieldLenField("optlen", None, length_of="padding", fmt="!H"),
634+
StrLenField("padding", "",
635+
length_from=lambda pkt: pkt.optlen)]
636+
628637

629638
# RFC 8914 - Extended DNS Errors
630639

@@ -681,6 +690,7 @@ class EDNS0ExtendedDNSError(_EDNS0Dummy):
681690
7: EDNS0N3U,
682691
8: EDNS0ClientSubnet,
683692
10: EDNS0COOKIE,
693+
12: EDNS0PADDING,
684694
15: EDNS0ExtendedDNSError,
685695
}
686696

test/scapy/layers/dns_edns0.uts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,31 @@ assert p.client_cookie == b'\x01' * 8
182182
assert p.server_cookie == b'\x02' * 16
183183

184184

185+
+ EDNS0 - Padding
186+
187+
= Basic instantiation & dissection
188+
189+
b = b'\x00\x0c\x00\x00'
190+
191+
p = EDNS0PADDING()
192+
assert raw(p) == b
193+
194+
p = EDNS0PADDING(b)
195+
assert p.optcode == 12
196+
assert p.optlen == 0
197+
assert p.padding == b''
198+
199+
b = b'\x00\x0c\x00\x03\x00\x01\x02'
200+
201+
p = EDNS0PADDING(padding=b'\x00\x01\x02')
202+
assert raw(p) == b
203+
204+
p = EDNS0PADDING(b)
205+
assert p.optcode == 12
206+
assert p.optlen == 3
207+
assert p.padding == b'\x00\x01\x02'
208+
209+
185210
+ EDNS0 - Extended DNS Error
186211

187212
= Basic instantiation & dissection

0 commit comments

Comments
 (0)