1*1da177e4SLinus Torvalds #ifndef _NET_ESP_H 2*1da177e4SLinus Torvalds #define _NET_ESP_H 3*1da177e4SLinus Torvalds 4*1da177e4SLinus Torvalds #include <net/xfrm.h> 5*1da177e4SLinus Torvalds #include <asm/scatterlist.h> 6*1da177e4SLinus Torvalds 7*1da177e4SLinus Torvalds #define ESP_NUM_FAST_SG 4 8*1da177e4SLinus Torvalds 9*1da177e4SLinus Torvalds struct esp_data 10*1da177e4SLinus Torvalds { 11*1da177e4SLinus Torvalds struct scatterlist sgbuf[ESP_NUM_FAST_SG]; 12*1da177e4SLinus Torvalds 13*1da177e4SLinus Torvalds /* Confidentiality */ 14*1da177e4SLinus Torvalds struct { 15*1da177e4SLinus Torvalds u8 *key; /* Key */ 16*1da177e4SLinus Torvalds int key_len; /* Key length */ 17*1da177e4SLinus Torvalds u8 *ivec; /* ivec buffer */ 18*1da177e4SLinus Torvalds /* ivlen is offset from enc_data, where encrypted data start. 19*1da177e4SLinus Torvalds * It is logically different of crypto_tfm_alg_ivsize(tfm). 20*1da177e4SLinus Torvalds * We assume that it is either zero (no ivec), or 21*1da177e4SLinus Torvalds * >= crypto_tfm_alg_ivsize(tfm). */ 22*1da177e4SLinus Torvalds int ivlen; 23*1da177e4SLinus Torvalds int padlen; /* 0..255 */ 24*1da177e4SLinus Torvalds struct crypto_tfm *tfm; /* crypto handle */ 25*1da177e4SLinus Torvalds } conf; 26*1da177e4SLinus Torvalds 27*1da177e4SLinus Torvalds /* Integrity. It is active when icv_full_len != 0 */ 28*1da177e4SLinus Torvalds struct { 29*1da177e4SLinus Torvalds u8 *key; /* Key */ 30*1da177e4SLinus Torvalds int key_len; /* Length of the key */ 31*1da177e4SLinus Torvalds u8 *work_icv; 32*1da177e4SLinus Torvalds int icv_full_len; 33*1da177e4SLinus Torvalds int icv_trunc_len; 34*1da177e4SLinus Torvalds void (*icv)(struct esp_data*, 35*1da177e4SLinus Torvalds struct sk_buff *skb, 36*1da177e4SLinus Torvalds int offset, int len, u8 *icv); 37*1da177e4SLinus Torvalds struct crypto_tfm *tfm; 38*1da177e4SLinus Torvalds } auth; 39*1da177e4SLinus Torvalds }; 40*1da177e4SLinus Torvalds 41*1da177e4SLinus Torvalds extern int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len); 42*1da177e4SLinus Torvalds extern int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer); 43*1da177e4SLinus Torvalds extern void *pskb_put(struct sk_buff *skb, struct sk_buff *tail, int len); 44*1da177e4SLinus Torvalds 45*1da177e4SLinus Torvalds static inline void 46*1da177e4SLinus Torvalds esp_hmac_digest(struct esp_data *esp, struct sk_buff *skb, int offset, 47*1da177e4SLinus Torvalds int len, u8 *auth_data) 48*1da177e4SLinus Torvalds { 49*1da177e4SLinus Torvalds struct crypto_tfm *tfm = esp->auth.tfm; 50*1da177e4SLinus Torvalds char *icv = esp->auth.work_icv; 51*1da177e4SLinus Torvalds 52*1da177e4SLinus Torvalds memset(auth_data, 0, esp->auth.icv_trunc_len); 53*1da177e4SLinus Torvalds crypto_hmac_init(tfm, esp->auth.key, &esp->auth.key_len); 54*1da177e4SLinus Torvalds skb_icv_walk(skb, tfm, offset, len, crypto_hmac_update); 55*1da177e4SLinus Torvalds crypto_hmac_final(tfm, esp->auth.key, &esp->auth.key_len, icv); 56*1da177e4SLinus Torvalds memcpy(auth_data, icv, esp->auth.icv_trunc_len); 57*1da177e4SLinus Torvalds } 58*1da177e4SLinus Torvalds 59*1da177e4SLinus Torvalds #endif 60