ipsec: Fix setting the hi-sequence number for decrypt 38/32938/3
authorNeale Ranns <neale@graphiant.com>
Mon, 28 Jun 2021 13:31:28 +0000 (13:31 +0000)
committerBeno�t Ganne <bganne@cisco.com>
Tue, 29 Jun 2021 17:12:28 +0000 (17:12 +0000)
commit5b8911020ee5512d76c8daccaa199878ed7cbc01
tree0c0960f5ffc12f1fe3d1a354a0736bd9ac374a07
parent3871bd3a07dfc775c29ea333d10c05ced2fea80e
ipsec: Fix setting the hi-sequence number for decrypt

Type: fix

two problems;
 1 - just because anti-reply is not enabled doesn't mean the high sequence
number should not be used.
   - fix, there needs to be some means to detect a wrapped packet, so we
use a window size of 2^30.
 2 - The SA object was used as a scratch pad for the high-sequence
number used during decryption. That means that once the batch has been
processed the high-sequence number used is lost. This means it is not
possible to distinguish this case:
      if (seq < IPSEC_SA_ANTI_REPLAY_WINDOW_LOWER_BOUND (tl))
{
  ...
  if (post_decrypt)
    {
      if (hi_seq_used == sa->seq_hi)
/* the high sequence number used to succesfully decrypt this
 * packet is the same as the last-sequnence number of the SA.
 * that means this packet did not cause a wrap.
 * this packet is thus out of window and should be dropped */
return 1;
      else
/* The packet decrypted with a different high sequence number
 * to the SA, that means it is the wrap packet and should be
 * accepted */
return 0;
    }
  - fix: don't use the SA as a scratch pad, use the 'packet_data' - the
same place that is used as the scratch pad for the low sequence number.

other consequences:
 - An SA doesn't have seq and last_seq, it has only seq; the sequence
numnber of the last packet tx'd or rx'd.
 - there's 64bits of space available on the SA's first cache line. move
the AES CTR mode IV there.
 - test the ESN/AR combinations to catch the bugs this fixes. This
doubles the amount of tests, but without AR on they only run for 2
seconds. In the AR tests, the time taken to wait for packets that won't
arrive is dropped from 1 to 0.2 seconds thus reducing the runtime of
these tests from 10-15 to about 5 sceonds.

Signed-off-by: Neale Ranns <neale@graphiant.com>
Change-Id: Iaac78905289a272dc01930d70decd8109cf5e7a5
src/vnet/ipsec/ah_decrypt.c
src/vnet/ipsec/esp.h
src/vnet/ipsec/esp_decrypt.c
src/vnet/ipsec/esp_encrypt.c
src/vnet/ipsec/ipsec_api.c
src/vnet/ipsec/ipsec_format.c
src/vnet/ipsec/ipsec_sa.h
test/template_ipsec.py
test/test_ipsec_esp.py