Skip to content

Commit 0350778

Browse files
authored
Update inet.py
Fix UDP packet unable to calculate validity when carrying AH extension header
1 parent d71014a commit 0350778

File tree

1 file changed

+18
-0
lines changed

1 file changed

+18
-0
lines changed

scapy/layers/inet.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,12 @@ def post_build(self, p, pay):
755755
elif conf.ipv6_enabled and isinstance(self.underlayer, scapy.layers.inet6.IPv6) or isinstance(self.underlayer, scapy.layers.inet6._IPv6ExtHdr): # noqa: E501
756756
ck = scapy.layers.inet6.in6_chksum(socket.IPPROTO_TCP, self.underlayer, p) # noqa: E501
757757
p = p[:16] + struct.pack("!H", ck) + p[18:]
758+
elif self.underlayer.name == "AH" and isinstance(self.underlayer.underlayer, IP):
759+
ck = in4_chksum(socket.IPPROTO_TCP, self.underlayer.underlayer, p)
760+
p = p[:16] + struct.pack("!H", ck) + p[18:]
761+
elif self.underlayer.name == "AH" and (conf.ipv6_enabled and isinstance(self.underlayer.underlayer, scapy.layers.inet6.IPv6) or isinstance(self.underlayer.underlayer, scapy.layers.inet6._IPv6ExtHdr)): # noqa: E501
762+
ck = scapy.layers.inet6.in6_chksum(socket.IPPROTO_TCP, self.underlayer.underlayer, p) # noqa: E501
763+
p = p[:16] + struct.pack("!H", ck) + p[18:]
758764
else:
759765
log_runtime.info(
760766
"No IP underlayer to compute checksum. Leaving null."
@@ -833,6 +839,18 @@ def post_build(self, p, pay):
833839
if ck == 0:
834840
ck = 0xFFFF
835841
p = p[:6] + struct.pack("!H", ck) + p[8:]
842+
elif self.underlayer.name == "AH" and isinstance(self.underlayer.underlayer, IP):
843+
ck = in4_chksum(socket.IPPROTO_UDP, self.underlayer.underlayer, p)
844+
# According to RFC768 if the result checksum is 0, it should be set to 0xFFFF # noqa: E501
845+
if ck == 0:
846+
ck = 0xFFFF
847+
p = p[:6] + struct.pack("!H", ck) + p[8:]
848+
elif self.underlayer.name == "AH" and (isinstance(self.underlayer.underlayer, scapy.layers.inet6.IPv6) or isinstance(self.underlayer.underlayer, scapy.layers.inet6._IPv6ExtHdr)): # noqa: E501
849+
ck = scapy.layers.inet6.in6_chksum(socket.IPPROTO_UDP, self.underlayer.underlayer, p) # noqa: E501
850+
# According to RFC2460 if the result checksum is 0, it should be set to 0xFFFF # noqa: E501
851+
if ck == 0:
852+
ck = 0xFFFF
853+
p = p[:6] + struct.pack("!H", ck) + p[8:]
836854
else:
837855
log_runtime.info(
838856
"No IP underlayer to compute checksum. Leaving null."

0 commit comments

Comments
 (0)