xref: /openbmc/linux/include/net/ah.h (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds #ifndef _NET_AH_H
2*1da177e4SLinus Torvalds #define _NET_AH_H
3*1da177e4SLinus Torvalds 
4*1da177e4SLinus Torvalds #include <net/xfrm.h>
5*1da177e4SLinus Torvalds 
6*1da177e4SLinus Torvalds /* This is the maximum truncated ICV length that we know of. */
7*1da177e4SLinus Torvalds #define MAX_AH_AUTH_LEN	12
8*1da177e4SLinus Torvalds 
9*1da177e4SLinus Torvalds struct ah_data
10*1da177e4SLinus Torvalds {
11*1da177e4SLinus Torvalds 	u8			*key;
12*1da177e4SLinus Torvalds 	int			key_len;
13*1da177e4SLinus Torvalds 	u8			*work_icv;
14*1da177e4SLinus Torvalds 	int			icv_full_len;
15*1da177e4SLinus Torvalds 	int			icv_trunc_len;
16*1da177e4SLinus Torvalds 
17*1da177e4SLinus Torvalds 	void			(*icv)(struct ah_data*,
18*1da177e4SLinus Torvalds 	                               struct sk_buff *skb, u8 *icv);
19*1da177e4SLinus Torvalds 
20*1da177e4SLinus Torvalds 	struct crypto_tfm	*tfm;
21*1da177e4SLinus Torvalds };
22*1da177e4SLinus Torvalds 
23*1da177e4SLinus Torvalds static inline void
24*1da177e4SLinus Torvalds ah_hmac_digest(struct ah_data *ahp, struct sk_buff *skb, u8 *auth_data)
25*1da177e4SLinus Torvalds {
26*1da177e4SLinus Torvalds 	struct crypto_tfm *tfm = ahp->tfm;
27*1da177e4SLinus Torvalds 
28*1da177e4SLinus Torvalds 	memset(auth_data, 0, ahp->icv_trunc_len);
29*1da177e4SLinus Torvalds 	crypto_hmac_init(tfm, ahp->key, &ahp->key_len);
30*1da177e4SLinus Torvalds 	skb_icv_walk(skb, tfm, 0, skb->len, crypto_hmac_update);
31*1da177e4SLinus Torvalds 	crypto_hmac_final(tfm, ahp->key, &ahp->key_len, ahp->work_icv);
32*1da177e4SLinus Torvalds 	memcpy(auth_data, ahp->work_icv, ahp->icv_trunc_len);
33*1da177e4SLinus Torvalds }
34*1da177e4SLinus Torvalds 
35*1da177e4SLinus Torvalds #endif
36