Skip to content

Commit ca5a069

Browse files
phuhavangpotter2
authored andcommitted
Extended Sequence Numbers support in ESP
1 parent 90ec725 commit ca5a069

File tree

2 files changed

+46
-13
lines changed

2 files changed

+46
-13
lines changed

scapy/layers/ipsec.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -674,16 +674,17 @@ def sign(self, pkt, key, esn_en=False, esn=0):
674674
mac = self.new_mac(key)
675675

676676
if pkt.haslayer(ESP):
677-
mac.update(raw(pkt[ESP]))
677+
mac.update(bytes(pkt[ESP]))
678+
if esn_en:
679+
# RFC4303 sect 2.2.1
680+
mac.update(struct.pack('!L', esn))
678681
pkt[ESP].data += mac.finalize()[:self.icv_size]
679682

680683
elif pkt.haslayer(AH):
681-
clone = zero_mutable_fields(pkt.copy(), sending=True)
684+
mac.update(bytes(zero_mutable_fields(pkt.copy(), sending=True)))
682685
if esn_en:
683-
temp = raw(clone) + struct.pack('!L', esn)
684-
else:
685-
temp = raw(clone)
686-
mac.update(temp)
686+
# RFC4302 sect 2.5.1
687+
mac.update(struct.pack('!L', esn))
687688
pkt[AH].icv = mac.finalize()[:self.icv_size]
688689

689690
return pkt
@@ -712,7 +713,10 @@ def verify(self, pkt, key, esn_en=False, esn=0):
712713
pkt_icv = pkt.data[len(pkt.data) - self.icv_size:]
713714
clone = pkt.copy()
714715
clone.data = clone.data[:len(clone.data) - self.icv_size]
715-
temp = raw(clone)
716+
mac.update(bytes(clone))
717+
if esn_en:
718+
# RFC4303 sect 2.2.1
719+
mac.update(struct.pack('!L', esn))
716720

717721
elif pkt.haslayer(AH):
718722
if len(pkt[AH].icv) != self.icv_size:
@@ -721,12 +725,11 @@ def verify(self, pkt, key, esn_en=False, esn=0):
721725
pkt[AH].icv = pkt[AH].icv[:self.icv_size]
722726
pkt_icv = pkt[AH].icv
723727
clone = zero_mutable_fields(pkt.copy(), sending=False)
728+
mac.update(bytes(clone))
724729
if esn_en:
725-
temp = raw(clone) + struct.pack('!L', esn)
726-
else:
727-
temp = raw(clone)
730+
# RFC4302 sect 2.5.1
731+
mac.update(struct.pack('!L', esn))
728732

729-
mac.update(temp)
730733
computed_icv = mac.finalize()[:self.icv_size]
731734

732735
# XXX: Cannot use mac.verify because the ICV can be truncated
@@ -1033,7 +1036,10 @@ def _encrypt_esp(self, pkt, seq_num=None, iv=None, esn_en=None, esn=None):
10331036
esn_en=esn_en or self.esn_en,
10341037
esn=esn or self.esn)
10351038

1036-
self.auth_algo.sign(esp, self.auth_key)
1039+
self.auth_algo.sign(esp,
1040+
self.auth_key,
1041+
esn_en=esn_en or self.esn_en,
1042+
esn=esn or self.esn)
10371043

10381044
if self.nat_t_header:
10391045
nat_t_header = self.nat_t_header.copy()
@@ -1144,7 +1150,9 @@ def _decrypt_esp(self, pkt, verify=True, esn_en=None, esn=None):
11441150

11451151
if verify:
11461152
self.check_spi(pkt)
1147-
self.auth_algo.verify(encrypted, self.auth_key)
1153+
self.auth_algo.verify(encrypted, self.auth_key,
1154+
esn_en=esn_en or self.esn_en,
1155+
esn=esn or self.esn)
11481156

11491157
esp = self.crypt_algo.decrypt(self, encrypted, self.crypt_key,
11501158
self.crypt_icv_size or

test/scapy/layers/ipsec.uts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,6 +1506,31 @@ try:
15061506
except IPSecIntegrityError as err:
15071507
err
15081508

1509+
#######################################
1510+
= IPv4 / ESP - Transport - AES-CBC - HMAC-SHA2-256-128 -- ESN
1511+
1512+
p = IP(src='1.1.1.1', dst='2.2.2.2')
1513+
p /= TCP(sport=45012, dport=80)
1514+
p /= Raw('hello world')
1515+
p = IP(raw(p))
1516+
p
1517+
1518+
enc_key = bytes.fromhex("85ee354b4675a9c5d16e3d6f4118043b")
1519+
auth_key = bytes.fromhex("6f79bf94da7dde3c86009934d9258f1b3fc2f5382aca9c9cb8e216eed235f34c")
1520+
1521+
sa = SecurityAssociation(ESP, spi=0xcf54ccdf, crypt_algo='AES-CBC',
1522+
crypt_key=enc_key,
1523+
auth_algo='SHA2-256-128', auth_key=auth_key,
1524+
esn_en=True, esn=68)
1525+
e = sa.encrypt(p, iv=bytes.fromhex("11223344112233441122334411223344"))
1526+
1527+
1528+
assert bytes(e) == bytes.fromhex("4500006c000100004032745a0101010102020202cf54ccdf0000000111223344112233441122334411223344f5bda519c9ae64f283f0fc18a8d253eca8b34c2120c8958a97ec9d8e67756da2523fce9b5541c57fddf090afc2bfd97e8703203953f853eb61482e4c1384d4c8")
1529+
1530+
* integrity verification should pass
1531+
d = sa.decrypt(e)
1532+
d
1533+
15091534
#######################################
15101535
= IPv4 / ESP - Transport - AES-GCM - NULL
15111536

0 commit comments

Comments
 (0)