The IPsec authentication before decryption used a different replay
authorbluhm <bluhm@openbsd.org>
Sun, 18 Jul 2021 14:38:20 +0000 (14:38 +0000)
committerbluhm <bluhm@openbsd.org>
Sun, 18 Jul 2021 14:38:20 +0000 (14:38 +0000)
commit25a9c1bd139a3d65f7ca723f0d90e0ad33f44452
tree9114b2a314d7458d86e31d57f9550eeaeb8ec166
parent890792c406db027068dc2f831e22b1bb6966177e
The IPsec authentication before decryption used a different replay
counter than after decryption.  This could result in "esp_input_cb:
authentication failed for packet in SA" errors.  As we run crypto
operations async, thousands of packets are stored in the crypto
task.  During the queueing the replay counter of the tdb can change.
Then the higher 32 bits may increment although the lower 32 bits
did not wrap.
checkreplaywindow() must be called twice per packet with the same
replay counter.  Store the value in struct tdb_crypto while dangling
in the task queue and doing crypto operations.
tested by Hrvoje Popovski; joint work with tobhe@
sys/netinet/ip_ah.c
sys/netinet/ip_esp.c
sys/netinet/ip_ipsp.h