@@ -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
0 commit comments