docs: def verify(self, pkt, key):
          """
          Check that the integrity check value (icv) of a packet is valid.
  
          @param pkt:    a packet that contains a valid encrypted ESP or AH layer
          @param key:    the authentication key, a byte string
  
          @raise IPSecIntegrityError: if the integrity check fails
          """
          if not self.mac or self.icv_size == 0:
              return
  
          mac = self.new_mac(key)
  
          pkt_icv = 'not found'
          computed_icv = 'not computed'
  
          if isinstance(pkt, ESP):
              pkt_icv = pkt.data[len(pkt.data) - self.icv_size:]
              clone = pkt.copy()
              clone.data = clone.data[:len(clone.data) - self.icv_size]
  
          elif pkt.haslayer(AH):
              if len(pkt[AH].icv) != self.icv_size:
                  # Fill padding since we know the actual icv_size
                  pkt[AH].padding = pkt[AH].icv[self.icv_size:]
                  pkt[AH].icv = pkt[AH].icv[:self.icv_size]
              pkt_icv = pkt[AH].icv
              clone = zero_mutable_fields(pkt.copy(), sending=False)
  
          mac.update(raw(clone))
          computed_icv = mac.finalize()[:self.icv_size]
  
          # XXX: Cannot use mac.verify because the ICV can be truncated
          if pkt_icv != computed_icv:
              raise IPSecIntegrityError('pkt_icv=%r, computed_icv=%r' %
                                        (pkt_icv, computed_icv))