Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef _NET_AH_H |
2 | #define _NET_AH_H | |
3 | ||
9409f38a | 4 | #include <linux/crypto.h> |
1da177e4 LT |
5 | #include <net/xfrm.h> |
6 | ||
7 | /* This is the maximum truncated ICV length that we know of. */ | |
8 | #define MAX_AH_AUTH_LEN 12 | |
9 | ||
10 | struct ah_data | |
11 | { | |
1da177e4 LT |
12 | u8 *work_icv; |
13 | int icv_full_len; | |
14 | int icv_trunc_len; | |
15 | ||
07d4ee58 | 16 | struct crypto_hash *tfm; |
49cbf952 | 17 | struct crypto_ahash *ahash; |
1da177e4 LT |
18 | }; |
19 | ||
07d4ee58 HX |
20 | static inline int ah_mac_digest(struct ah_data *ahp, struct sk_buff *skb, |
21 | u8 *auth_data) | |
1da177e4 | 22 | { |
07d4ee58 HX |
23 | struct hash_desc desc; |
24 | int err; | |
25 | ||
26 | desc.tfm = ahp->tfm; | |
27 | desc.flags = 0; | |
1da177e4 LT |
28 | |
29 | memset(auth_data, 0, ahp->icv_trunc_len); | |
07d4ee58 HX |
30 | err = crypto_hash_init(&desc); |
31 | if (unlikely(err)) | |
32 | goto out; | |
33 | err = skb_icv_walk(skb, &desc, 0, skb->len, crypto_hash_update); | |
34 | if (unlikely(err)) | |
35 | goto out; | |
36 | err = crypto_hash_final(&desc, ahp->work_icv); | |
37 | ||
38 | out: | |
39 | return err; | |
1da177e4 LT |
40 | } |
41 | ||
87bdc48d HX |
42 | struct ip_auth_hdr; |
43 | ||
44 | static inline struct ip_auth_hdr *ip_auth_hdr(const struct sk_buff *skb) | |
45 | { | |
46 | return (struct ip_auth_hdr *)skb_transport_header(skb); | |
47 | } | |
48 | ||
1da177e4 | 49 | #endif |