diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py index a45044c5532..c811b975e07 100644 --- a/scapy/layers/dns.py +++ b/scapy/layers/dns.py @@ -439,7 +439,7 @@ def i2m(self, pkt, s): edns0types = {0: "Reserved", 1: "LLQ", 2: "UL", 3: "NSID", 4: "Owner", 5: "DAU", 6: "DHU", 7: "N3U", 8: "edns-client-subnet", 10: "COOKIE", - 15: "Extended DNS Error"} + 12: "Padding", 15: "Extended DNS Error"} class _EDNS0Dummy(Packet): @@ -626,6 +626,16 @@ class EDNS0COOKIE(_EDNS0Dummy): length_from=lambda pkt: max(0, pkt.optlen - 8))] +# RFC 7830 - EDNS0 Padding Option + +class EDNS0PADDING(_EDNS0Dummy): + name = "DNS EDNS0 Padding" + fields_desc = [ShortEnumField("optcode", 12, edns0types), + FieldLenField("optlen", None, length_of="padding", fmt="!H"), + StrLenField("padding", "", + length_from=lambda pkt: pkt.optlen)] + + # RFC 8914 - Extended DNS Errors # https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#extended-dns-error-codes @@ -681,6 +691,7 @@ class EDNS0ExtendedDNSError(_EDNS0Dummy): 7: EDNS0N3U, 8: EDNS0ClientSubnet, 10: EDNS0COOKIE, + 12: EDNS0PADDING, 15: EDNS0ExtendedDNSError, } diff --git a/test/scapy/layers/dns_edns0.uts b/test/scapy/layers/dns_edns0.uts index add646d3338..51638e5c505 100644 --- a/test/scapy/layers/dns_edns0.uts +++ b/test/scapy/layers/dns_edns0.uts @@ -182,6 +182,31 @@ assert p.client_cookie == b'\x01' * 8 assert p.server_cookie == b'\x02' * 16 ++ EDNS0 - Padding + += Basic instantiation & dissection + +b = b'\x00\x0c\x00\x00' + +p = EDNS0PADDING() +assert raw(p) == b + +p = EDNS0PADDING(b) +assert p.optcode == 12 +assert p.optlen == 0 +assert p.padding == b'' + +b = b'\x00\x0c\x00\x03\x00\x01\x02' + +p = EDNS0PADDING(padding=b'\x00\x01\x02') +assert raw(p) == b + +p = EDNS0PADDING(b) +assert p.optcode == 12 +assert p.optlen == 3 +assert p.padding == b'\x00\x01\x02' + + + EDNS0 - Extended DNS Error = Basic instantiation & dissection