xref: /openbmc/linux/include/net/ah.h (revision 9409f38a)
11da177e4SLinus Torvalds #ifndef _NET_AH_H
21da177e4SLinus Torvalds #define _NET_AH_H
31da177e4SLinus Torvalds 
49409f38aSHerbert Xu #include <linux/crypto.h>
51da177e4SLinus Torvalds #include <net/xfrm.h>
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds /* This is the maximum truncated ICV length that we know of. */
81da177e4SLinus Torvalds #define MAX_AH_AUTH_LEN	12
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds struct ah_data
111da177e4SLinus Torvalds {
121da177e4SLinus Torvalds 	u8			*key;
131da177e4SLinus Torvalds 	int			key_len;
141da177e4SLinus Torvalds 	u8			*work_icv;
151da177e4SLinus Torvalds 	int			icv_full_len;
161da177e4SLinus Torvalds 	int			icv_trunc_len;
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds 	void			(*icv)(struct ah_data*,
191da177e4SLinus Torvalds 	                               struct sk_buff *skb, u8 *icv);
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds 	struct crypto_tfm	*tfm;
221da177e4SLinus Torvalds };
231da177e4SLinus Torvalds 
241da177e4SLinus Torvalds static inline void
251da177e4SLinus Torvalds ah_hmac_digest(struct ah_data *ahp, struct sk_buff *skb, u8 *auth_data)
261da177e4SLinus Torvalds {
271da177e4SLinus Torvalds 	struct crypto_tfm *tfm = ahp->tfm;
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds 	memset(auth_data, 0, ahp->icv_trunc_len);
301da177e4SLinus Torvalds 	crypto_hmac_init(tfm, ahp->key, &ahp->key_len);
311da177e4SLinus Torvalds 	skb_icv_walk(skb, tfm, 0, skb->len, crypto_hmac_update);
321da177e4SLinus Torvalds 	crypto_hmac_final(tfm, ahp->key, &ahp->key_len, ahp->work_icv);
331da177e4SLinus Torvalds 	memcpy(auth_data, ahp->work_icv, ahp->icv_trunc_len);
341da177e4SLinus Torvalds }
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds #endif
37