blob: c1bc529809daad155865ed444049fdb1396b1b21 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef _NET_ESP_H
2#define _NET_ESP_H
3
Herbert Xu9409f382006-08-06 19:49:12 +10004#include <linux/crypto.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#include <net/xfrm.h>
6#include <asm/scatterlist.h>
7
8#define ESP_NUM_FAST_SG 4
9
10struct esp_data
11{
12 struct scatterlist sgbuf[ESP_NUM_FAST_SG];
13
14 /* Confidentiality */
15 struct {
David S. Millere4bec822006-09-22 15:17:35 -070016 int padlen; /* 0..255 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070017 /* ivlen is offset from enc_data, where encrypted data start.
18 * It is logically different of crypto_tfm_alg_ivsize(tfm).
19 * We assume that it is either zero (no ivec), or
20 * >= crypto_tfm_alg_ivsize(tfm). */
21 int ivlen;
David S. Millere4bec822006-09-22 15:17:35 -070022 int ivinitted;
23 u8 *ivec; /* ivec buffer */
Herbert Xu6b7326c2006-07-30 15:41:01 +100024 struct crypto_blkcipher *tfm; /* crypto handle */
Linus Torvalds1da177e2005-04-16 15:20:36 -070025 } conf;
26
27 /* Integrity. It is active when icv_full_len != 0 */
28 struct {
Linus Torvalds1da177e2005-04-16 15:20:36 -070029 u8 *work_icv;
30 int icv_full_len;
31 int icv_trunc_len;
Herbert Xu07d4ee52006-08-20 14:24:50 +100032 struct crypto_hash *tfm;
Linus Torvalds1da177e2005-04-16 15:20:36 -070033 } auth;
34};
35
Linus Torvalds1da177e2005-04-16 15:20:36 -070036extern void *pskb_put(struct sk_buff *skb, struct sk_buff *tail, int len);
37
Herbert Xu07d4ee52006-08-20 14:24:50 +100038static inline int esp_mac_digest(struct esp_data *esp, struct sk_buff *skb,
39 int offset, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Herbert Xu07d4ee52006-08-20 14:24:50 +100041 struct hash_desc desc;
42 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -070043
Herbert Xu07d4ee52006-08-20 14:24:50 +100044 desc.tfm = esp->auth.tfm;
45 desc.flags = 0;
46
47 err = crypto_hash_init(&desc);
48 if (unlikely(err))
49 return err;
50 err = skb_icv_walk(skb, &desc, offset, len, crypto_hash_update);
51 if (unlikely(err))
52 return err;
53 return crypto_hash_final(&desc, esp->auth.work_icv);
Linus Torvalds1da177e2005-04-16 15:20:36 -070054}
55
Herbert Xu87bdc482007-10-10 15:45:25 -070056struct ip_esp_hdr;
57
58static inline struct ip_esp_hdr *ip_esp_hdr(const struct sk_buff *skb)
59{
60 return (struct ip_esp_hdr *)skb_transport_header(skb);
61}
62
Linus Torvalds1da177e2005-04-16 15:20:36 -070063#endif