diff options
author | Steffen Klassert <steffen.klassert@secunet.com> | 2012-09-03 20:03:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-09-04 14:09:45 -0400 |
commit | 3b59df46a449ec9975146d71318c4777ad086744 (patch) | |
tree | 8ba7e6186ef90c4bffe553504c33f40054704f94 /include | |
parent | 37159ef2c1ae1e696b24b260b241209a19f92c60 (diff) |
xfrm: Workaround incompatibility of ESN and async crypto
ESN for esp is defined in RFC 4303. This RFC assumes that the
sequence number counters are always up to date. However,
this is not true if an async crypto algorithm is employed.
If the sequence number counters are not up to date on sequence
number check, we may incorrectly update the upper 32 bit of
the sequence number. This leads to a DOS.
We workaround this by comparing the upper sequence number,
(used for authentication) with the upper sequence number
computed after the async processing. We drop the packet
if these numbers are different.
To do this, we introduce a recheck function that does this
check in the ESN case.
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/net/xfrm.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 976a81abe1a2..639dd1316d37 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
@@ -273,6 +273,9 @@ struct xfrm_replay { | |||
273 | int (*check)(struct xfrm_state *x, | 273 | int (*check)(struct xfrm_state *x, |
274 | struct sk_buff *skb, | 274 | struct sk_buff *skb, |
275 | __be32 net_seq); | 275 | __be32 net_seq); |
276 | int (*recheck)(struct xfrm_state *x, | ||
277 | struct sk_buff *skb, | ||
278 | __be32 net_seq); | ||
276 | void (*notify)(struct xfrm_state *x, int event); | 279 | void (*notify)(struct xfrm_state *x, int event); |
277 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); | 280 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); |
278 | }; | 281 | }; |