xfrm: Add an IPsec hardware offloading API
[linux-2.6-block.git] / net / ipv6 / esp6.c
1 /*
2  * Copyright (C)2002 USAGI/WIDE Project
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  *
17  * Authors
18  *
19  *      Mitsuru KANDA @USAGI       : IPv6 Support
20  *      Kazunori MIYAZAWA @USAGI   :
21  *      Kunihiro Ishiguro <kunihiro@ipinfusion.com>
22  *
23  *      This file is derived from net/ipv4/esp.c
24  */
25
26 #define pr_fmt(fmt) "IPv6: " fmt
27
28 #include <crypto/aead.h>
29 #include <crypto/authenc.h>
30 #include <linux/err.h>
31 #include <linux/module.h>
32 #include <net/ip.h>
33 #include <net/xfrm.h>
34 #include <net/esp.h>
35 #include <linux/scatterlist.h>
36 #include <linux/kernel.h>
37 #include <linux/pfkeyv2.h>
38 #include <linux/random.h>
39 #include <linux/slab.h>
40 #include <linux/spinlock.h>
41 #include <net/ip6_route.h>
42 #include <net/icmp.h>
43 #include <net/ipv6.h>
44 #include <net/protocol.h>
45 #include <linux/icmpv6.h>
46
47 #include <linux/highmem.h>
48
49 struct esp_skb_cb {
50         struct xfrm_skb_cb xfrm;
51         void *tmp;
52 };
53
54 #define ESP_SKB_CB(__skb) ((struct esp_skb_cb *)&((__skb)->cb[0]))
55
56 static u32 esp6_get_mtu(struct xfrm_state *x, int mtu);
57
58 /*
59  * Allocate an AEAD request structure with extra space for SG and IV.
60  *
61  * For alignment considerations the upper 32 bits of the sequence number are
62  * placed at the front, if present. Followed by the IV, the request and finally
63  * the SG list.
64  *
65  * TODO: Use spare space in skb for this where possible.
66  */
67 static void *esp_alloc_tmp(struct crypto_aead *aead, int nfrags, int seqihlen)
68 {
69         unsigned int len;
70
71         len = seqihlen;
72
73         len += crypto_aead_ivsize(aead);
74
75         if (len) {
76                 len += crypto_aead_alignmask(aead) &
77                        ~(crypto_tfm_ctx_alignment() - 1);
78                 len = ALIGN(len, crypto_tfm_ctx_alignment());
79         }
80
81         len += sizeof(struct aead_request) + crypto_aead_reqsize(aead);
82         len = ALIGN(len, __alignof__(struct scatterlist));
83
84         len += sizeof(struct scatterlist) * nfrags;
85
86         return kmalloc(len, GFP_ATOMIC);
87 }
88
89 static inline __be32 *esp_tmp_seqhi(void *tmp)
90 {
91         return PTR_ALIGN((__be32 *)tmp, __alignof__(__be32));
92 }
93
94 static inline u8 *esp_tmp_iv(struct crypto_aead *aead, void *tmp, int seqhilen)
95 {
96         return crypto_aead_ivsize(aead) ?
97                PTR_ALIGN((u8 *)tmp + seqhilen,
98                          crypto_aead_alignmask(aead) + 1) : tmp + seqhilen;
99 }
100
101 static inline struct aead_request *esp_tmp_req(struct crypto_aead *aead, u8 *iv)
102 {
103         struct aead_request *req;
104
105         req = (void *)PTR_ALIGN(iv + crypto_aead_ivsize(aead),
106                                 crypto_tfm_ctx_alignment());
107         aead_request_set_tfm(req, aead);
108         return req;
109 }
110
111 static inline struct scatterlist *esp_req_sg(struct crypto_aead *aead,
112                                              struct aead_request *req)
113 {
114         return (void *)ALIGN((unsigned long)(req + 1) +
115                              crypto_aead_reqsize(aead),
116                              __alignof__(struct scatterlist));
117 }
118
119 static void esp_ssg_unref(struct xfrm_state *x, void *tmp)
120 {
121         __be32 *seqhi;
122         struct crypto_aead *aead = x->data;
123         int seqhilen = 0;
124         u8 *iv;
125         struct aead_request *req;
126         struct scatterlist *sg;
127
128         if (x->props.flags & XFRM_STATE_ESN)
129                 seqhilen += sizeof(__be32);
130
131         seqhi = esp_tmp_seqhi(tmp);
132         iv = esp_tmp_iv(aead, tmp, seqhilen);
133         req = esp_tmp_req(aead, iv);
134
135         /* Unref skb_frag_pages in the src scatterlist if necessary.
136          * Skip the first sg which comes from skb->data.
137          */
138         if (req->src != req->dst)
139                 for (sg = sg_next(req->src); sg; sg = sg_next(sg))
140                         put_page(sg_page(sg));
141 }
142
143 static void esp_output_done(struct crypto_async_request *base, int err)
144 {
145         struct sk_buff *skb = base->data;
146         void *tmp;
147         struct dst_entry *dst = skb_dst(skb);
148         struct xfrm_state *x = dst->xfrm;
149
150         tmp = ESP_SKB_CB(skb)->tmp;
151         esp_ssg_unref(x, tmp);
152         kfree(tmp);
153         xfrm_output_resume(skb, err);
154 }
155
156 /* Move ESP header back into place. */
157 static void esp_restore_header(struct sk_buff *skb, unsigned int offset)
158 {
159         struct ip_esp_hdr *esph = (void *)(skb->data + offset);
160         void *tmp = ESP_SKB_CB(skb)->tmp;
161         __be32 *seqhi = esp_tmp_seqhi(tmp);
162
163         esph->seq_no = esph->spi;
164         esph->spi = *seqhi;
165 }
166
167 static void esp_output_restore_header(struct sk_buff *skb)
168 {
169         esp_restore_header(skb, skb_transport_offset(skb) - sizeof(__be32));
170 }
171
172 static struct ip_esp_hdr *esp_output_set_esn(struct sk_buff *skb,
173                                              struct ip_esp_hdr *esph,
174                                              __be32 *seqhi)
175 {
176         struct xfrm_state *x = skb_dst(skb)->xfrm;
177
178         /* For ESN we move the header forward by 4 bytes to
179          * accomodate the high bits.  We will move it back after
180          * encryption.
181          */
182         if ((x->props.flags & XFRM_STATE_ESN)) {
183                 esph = (void *)(skb_transport_header(skb) - sizeof(__be32));
184                 *seqhi = esph->spi;
185                 esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.hi);
186         }
187
188         esph->spi = x->id.spi;
189
190         return esph;
191 }
192
193 static void esp_output_done_esn(struct crypto_async_request *base, int err)
194 {
195         struct sk_buff *skb = base->data;
196
197         esp_output_restore_header(skb);
198         esp_output_done(base, err);
199 }
200
201 static void esp_output_fill_trailer(u8 *tail, int tfclen, int plen, __u8 proto)
202 {
203         /* Fill padding... */
204         if (tfclen) {
205                 memset(tail, 0, tfclen);
206                 tail += tfclen;
207         }
208         do {
209                 int i;
210                 for (i = 0; i < plen - 2; i++)
211                         tail[i] = i + 1;
212         } while (0);
213         tail[plen - 2] = plen - 2;
214         tail[plen - 1] = proto;
215 }
216
217 static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
218 {
219         int err;
220         struct ip_esp_hdr *esph;
221         struct crypto_aead *aead;
222         struct aead_request *req;
223         struct scatterlist *sg, *dsg;
224         struct sk_buff *trailer;
225         struct page *page;
226         void *tmp;
227         int blksize;
228         int clen;
229         int alen;
230         int plen;
231         int ivlen;
232         int tfclen;
233         int nfrags;
234         int assoclen;
235         int seqhilen;
236         int tailen;
237         u8 *iv;
238         u8 *tail;
239         u8 *vaddr;
240         __be32 *seqhi;
241         __be64 seqno;
242         __u8 proto = *skb_mac_header(skb);
243
244         /* skb is pure payload to encrypt */
245         aead = x->data;
246         alen = crypto_aead_authsize(aead);
247         ivlen = crypto_aead_ivsize(aead);
248
249         tfclen = 0;
250         if (x->tfcpad) {
251                 struct xfrm_dst *dst = (struct xfrm_dst *)skb_dst(skb);
252                 u32 padto;
253
254                 padto = min(x->tfcpad, esp6_get_mtu(x, dst->child_mtu_cached));
255                 if (skb->len < padto)
256                         tfclen = padto - skb->len;
257         }
258         blksize = ALIGN(crypto_aead_blocksize(aead), 4);
259         clen = ALIGN(skb->len + 2 + tfclen, blksize);
260         plen = clen - skb->len - tfclen;
261         tailen = tfclen + plen + alen;
262
263         assoclen = sizeof(*esph);
264         seqhilen = 0;
265
266         if (x->props.flags & XFRM_STATE_ESN) {
267                 seqhilen += sizeof(__be32);
268                 assoclen += seqhilen;
269         }
270
271         *skb_mac_header(skb) = IPPROTO_ESP;
272         esph = ip_esp_hdr(skb);
273
274         if (!skb_cloned(skb)) {
275                 if (tailen <= skb_availroom(skb)) {
276                         nfrags = 1;
277                         trailer = skb;
278                         tail = skb_tail_pointer(trailer);
279
280                         goto skip_cow;
281                 } else if ((skb_shinfo(skb)->nr_frags < MAX_SKB_FRAGS)
282                            && !skb_has_frag_list(skb)) {
283                         int allocsize;
284                         struct sock *sk = skb->sk;
285                         struct page_frag *pfrag = &x->xfrag;
286
287                         allocsize = ALIGN(tailen, L1_CACHE_BYTES);
288
289                         spin_lock_bh(&x->lock);
290
291                         if (unlikely(!skb_page_frag_refill(allocsize, pfrag, GFP_ATOMIC))) {
292                                 spin_unlock_bh(&x->lock);
293                                 goto cow;
294                         }
295
296                         page = pfrag->page;
297                         get_page(page);
298
299                         vaddr = kmap_atomic(page);
300
301                         tail = vaddr + pfrag->offset;
302
303                         esp_output_fill_trailer(tail, tfclen, plen, proto);
304
305                         kunmap_atomic(vaddr);
306
307                         nfrags = skb_shinfo(skb)->nr_frags;
308
309                         __skb_fill_page_desc(skb, nfrags, page, pfrag->offset,
310                                              tailen);
311                         skb_shinfo(skb)->nr_frags = ++nfrags;
312
313                         pfrag->offset = pfrag->offset + allocsize;
314                         nfrags++;
315
316                         skb->len += tailen;
317                         skb->data_len += tailen;
318                         skb->truesize += tailen;
319                         if (sk)
320                                 atomic_add(tailen, &sk->sk_wmem_alloc);
321
322                         skb_push(skb, -skb_network_offset(skb));
323
324                         esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low);
325                         esph->spi = x->id.spi;
326
327                         tmp = esp_alloc_tmp(aead, nfrags + 2, seqhilen);
328                         if (!tmp) {
329                                 spin_unlock_bh(&x->lock);
330                                 err = -ENOMEM;
331                                 goto error;
332                         }
333                         seqhi = esp_tmp_seqhi(tmp);
334                         iv = esp_tmp_iv(aead, tmp, seqhilen);
335                         req = esp_tmp_req(aead, iv);
336                         sg = esp_req_sg(aead, req);
337                         dsg = &sg[nfrags];
338
339                         esph = esp_output_set_esn(skb, esph, seqhi);
340
341                         sg_init_table(sg, nfrags);
342                         skb_to_sgvec(skb, sg,
343                                      (unsigned char *)esph - skb->data,
344                                      assoclen + ivlen + clen + alen);
345
346                         allocsize = ALIGN(skb->data_len, L1_CACHE_BYTES);
347
348                         if (unlikely(!skb_page_frag_refill(allocsize, pfrag, GFP_ATOMIC))) {
349                                 spin_unlock_bh(&x->lock);
350                                 err = -ENOMEM;
351                                 goto error;
352                         }
353
354                         skb_shinfo(skb)->nr_frags = 1;
355
356                         page = pfrag->page;
357                         get_page(page);
358                         /* replace page frags in skb with new page */
359                         __skb_fill_page_desc(skb, 0, page, pfrag->offset, skb->data_len);
360                         pfrag->offset = pfrag->offset + allocsize;
361
362                         sg_init_table(dsg, skb_shinfo(skb)->nr_frags + 1);
363                         skb_to_sgvec(skb, dsg,
364                                      (unsigned char *)esph - skb->data,
365                                      assoclen + ivlen + clen + alen);
366
367                         spin_unlock_bh(&x->lock);
368
369                         goto skip_cow2;
370                 }
371         }
372
373 cow:
374         err = skb_cow_data(skb, tailen, &trailer);
375         if (err < 0)
376                 goto error;
377         nfrags = err;
378
379         tail = skb_tail_pointer(trailer);
380         esph = ip_esp_hdr(skb);
381
382 skip_cow:
383         esp_output_fill_trailer(tail, tfclen, plen, proto);
384
385         pskb_put(skb, trailer, clen - skb->len + alen);
386         skb_push(skb, -skb_network_offset(skb));
387
388         esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low);
389         esph->spi = x->id.spi;
390
391         tmp = esp_alloc_tmp(aead, nfrags, seqhilen);
392         if (!tmp) {
393                 err = -ENOMEM;
394                 goto error;
395         }
396
397         seqhi = esp_tmp_seqhi(tmp);
398         iv = esp_tmp_iv(aead, tmp, seqhilen);
399         req = esp_tmp_req(aead, iv);
400         sg = esp_req_sg(aead, req);
401         dsg = sg;
402
403         esph = esp_output_set_esn(skb, esph, seqhi);
404
405         sg_init_table(sg, nfrags);
406         skb_to_sgvec(skb, sg,
407                      (unsigned char *)esph - skb->data,
408                      assoclen + ivlen + clen + alen);
409
410 skip_cow2:
411         if ((x->props.flags & XFRM_STATE_ESN))
412                 aead_request_set_callback(req, 0, esp_output_done_esn, skb);
413         else
414                 aead_request_set_callback(req, 0, esp_output_done, skb);
415
416         aead_request_set_crypt(req, sg, dsg, ivlen + clen, iv);
417         aead_request_set_ad(req, assoclen);
418
419         seqno = cpu_to_be64(XFRM_SKB_CB(skb)->seq.output.low +
420                             ((u64)XFRM_SKB_CB(skb)->seq.output.hi << 32));
421
422         memset(iv, 0, ivlen);
423         memcpy(iv + ivlen - min(ivlen, 8), (u8 *)&seqno + 8 - min(ivlen, 8),
424                min(ivlen, 8));
425
426         ESP_SKB_CB(skb)->tmp = tmp;
427         err = crypto_aead_encrypt(req);
428
429         switch (err) {
430         case -EINPROGRESS:
431                 goto error;
432
433         case -EBUSY:
434                 err = NET_XMIT_DROP;
435                 break;
436
437         case 0:
438                 if ((x->props.flags & XFRM_STATE_ESN))
439                         esp_output_restore_header(skb);
440         }
441
442         if (sg != dsg)
443                 esp_ssg_unref(x, tmp);
444         kfree(tmp);
445
446 error:
447         return err;
448 }
449
450 static int esp_input_done2(struct sk_buff *skb, int err)
451 {
452         struct xfrm_state *x = xfrm_input_state(skb);
453         struct xfrm_offload *xo = xfrm_offload(skb);
454         struct crypto_aead *aead = x->data;
455         int alen = crypto_aead_authsize(aead);
456         int hlen = sizeof(struct ip_esp_hdr) + crypto_aead_ivsize(aead);
457         int elen = skb->len - hlen;
458         int hdr_len = skb_network_header_len(skb);
459         int padlen;
460         u8 nexthdr[2];
461
462         if (!xo || (xo && !(xo->flags & CRYPTO_DONE)))
463                 kfree(ESP_SKB_CB(skb)->tmp);
464
465         if (unlikely(err))
466                 goto out;
467
468         if (skb_copy_bits(skb, skb->len - alen - 2, nexthdr, 2))
469                 BUG();
470
471         err = -EINVAL;
472         padlen = nexthdr[0];
473         if (padlen + 2 + alen >= elen) {
474                 net_dbg_ratelimited("ipsec esp packet is garbage padlen=%d, elen=%d\n",
475                                     padlen + 2, elen - alen);
476                 goto out;
477         }
478
479         /* ... check padding bits here. Silly. :-) */
480
481         pskb_trim(skb, skb->len - alen - padlen - 2);
482         __skb_pull(skb, hlen);
483         if (x->props.mode == XFRM_MODE_TUNNEL)
484                 skb_reset_transport_header(skb);
485         else
486                 skb_set_transport_header(skb, -hdr_len);
487
488         err = nexthdr[1];
489
490         /* RFC4303: Drop dummy packets without any error */
491         if (err == IPPROTO_NONE)
492                 err = -EINVAL;
493
494 out:
495         return err;
496 }
497
498 static void esp_input_done(struct crypto_async_request *base, int err)
499 {
500         struct sk_buff *skb = base->data;
501
502         xfrm_input_resume(skb, esp_input_done2(skb, err));
503 }
504
505 static void esp_input_restore_header(struct sk_buff *skb)
506 {
507         esp_restore_header(skb, 0);
508         __skb_pull(skb, 4);
509 }
510
511 static void esp_input_set_header(struct sk_buff *skb, __be32 *seqhi)
512 {
513         struct xfrm_state *x = xfrm_input_state(skb);
514         struct ip_esp_hdr *esph = (struct ip_esp_hdr *)skb->data;
515
516         /* For ESN we move the header forward by 4 bytes to
517          * accomodate the high bits.  We will move it back after
518          * decryption.
519          */
520         if ((x->props.flags & XFRM_STATE_ESN)) {
521                 esph = (void *)skb_push(skb, 4);
522                 *seqhi = esph->spi;
523                 esph->spi = esph->seq_no;
524                 esph->seq_no = XFRM_SKB_CB(skb)->seq.input.hi;
525         }
526 }
527
528 static void esp_input_done_esn(struct crypto_async_request *base, int err)
529 {
530         struct sk_buff *skb = base->data;
531
532         esp_input_restore_header(skb);
533         esp_input_done(base, err);
534 }
535
536 static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
537 {
538         struct ip_esp_hdr *esph;
539         struct crypto_aead *aead = x->data;
540         struct aead_request *req;
541         struct sk_buff *trailer;
542         int ivlen = crypto_aead_ivsize(aead);
543         int elen = skb->len - sizeof(*esph) - ivlen;
544         int nfrags;
545         int assoclen;
546         int seqhilen;
547         int ret = 0;
548         void *tmp;
549         __be32 *seqhi;
550         u8 *iv;
551         struct scatterlist *sg;
552
553         if (!pskb_may_pull(skb, sizeof(*esph) + ivlen)) {
554                 ret = -EINVAL;
555                 goto out;
556         }
557
558         if (elen <= 0) {
559                 ret = -EINVAL;
560                 goto out;
561         }
562
563         assoclen = sizeof(*esph);
564         seqhilen = 0;
565
566         if (x->props.flags & XFRM_STATE_ESN) {
567                 seqhilen += sizeof(__be32);
568                 assoclen += seqhilen;
569         }
570
571         if (!skb_cloned(skb)) {
572                 if (!skb_is_nonlinear(skb)) {
573                         nfrags = 1;
574
575                         goto skip_cow;
576                 } else if (!skb_has_frag_list(skb)) {
577                         nfrags = skb_shinfo(skb)->nr_frags;
578                         nfrags++;
579
580                         goto skip_cow;
581                 }
582         }
583
584         nfrags = skb_cow_data(skb, 0, &trailer);
585         if (nfrags < 0) {
586                 ret = -EINVAL;
587                 goto out;
588         }
589
590 skip_cow:
591         ret = -ENOMEM;
592         tmp = esp_alloc_tmp(aead, nfrags, seqhilen);
593         if (!tmp)
594                 goto out;
595
596         ESP_SKB_CB(skb)->tmp = tmp;
597         seqhi = esp_tmp_seqhi(tmp);
598         iv = esp_tmp_iv(aead, tmp, seqhilen);
599         req = esp_tmp_req(aead, iv);
600         sg = esp_req_sg(aead, req);
601
602         esp_input_set_header(skb, seqhi);
603
604         sg_init_table(sg, nfrags);
605         skb_to_sgvec(skb, sg, 0, skb->len);
606
607         skb->ip_summed = CHECKSUM_NONE;
608
609         if ((x->props.flags & XFRM_STATE_ESN))
610                 aead_request_set_callback(req, 0, esp_input_done_esn, skb);
611         else
612                 aead_request_set_callback(req, 0, esp_input_done, skb);
613
614         aead_request_set_crypt(req, sg, sg, elen + ivlen, iv);
615         aead_request_set_ad(req, assoclen);
616
617         ret = crypto_aead_decrypt(req);
618         if (ret == -EINPROGRESS)
619                 goto out;
620
621         if ((x->props.flags & XFRM_STATE_ESN))
622                 esp_input_restore_header(skb);
623
624         ret = esp_input_done2(skb, ret);
625
626 out:
627         return ret;
628 }
629
630 static u32 esp6_get_mtu(struct xfrm_state *x, int mtu)
631 {
632         struct crypto_aead *aead = x->data;
633         u32 blksize = ALIGN(crypto_aead_blocksize(aead), 4);
634         unsigned int net_adj;
635
636         if (x->props.mode != XFRM_MODE_TUNNEL)
637                 net_adj = sizeof(struct ipv6hdr);
638         else
639                 net_adj = 0;
640
641         return ((mtu - x->props.header_len - crypto_aead_authsize(aead) -
642                  net_adj) & ~(blksize - 1)) + net_adj - 2;
643 }
644
645 static int esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
646                     u8 type, u8 code, int offset, __be32 info)
647 {
648         struct net *net = dev_net(skb->dev);
649         const struct ipv6hdr *iph = (const struct ipv6hdr *)skb->data;
650         struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset);
651         struct xfrm_state *x;
652
653         if (type != ICMPV6_PKT_TOOBIG &&
654             type != NDISC_REDIRECT)
655                 return 0;
656
657         x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
658                               esph->spi, IPPROTO_ESP, AF_INET6);
659         if (!x)
660                 return 0;
661
662         if (type == NDISC_REDIRECT)
663                 ip6_redirect(skb, net, skb->dev->ifindex, 0,
664                              sock_net_uid(net, NULL));
665         else
666                 ip6_update_pmtu(skb, net, info, 0, 0, sock_net_uid(net, NULL));
667         xfrm_state_put(x);
668
669         return 0;
670 }
671
672 static void esp6_destroy(struct xfrm_state *x)
673 {
674         struct crypto_aead *aead = x->data;
675
676         if (!aead)
677                 return;
678
679         crypto_free_aead(aead);
680 }
681
682 static int esp_init_aead(struct xfrm_state *x)
683 {
684         char aead_name[CRYPTO_MAX_ALG_NAME];
685         struct crypto_aead *aead;
686         int err;
687
688         err = -ENAMETOOLONG;
689         if (snprintf(aead_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
690                      x->geniv, x->aead->alg_name) >= CRYPTO_MAX_ALG_NAME)
691                 goto error;
692
693         aead = crypto_alloc_aead(aead_name, 0, 0);
694         err = PTR_ERR(aead);
695         if (IS_ERR(aead))
696                 goto error;
697
698         x->data = aead;
699
700         err = crypto_aead_setkey(aead, x->aead->alg_key,
701                                  (x->aead->alg_key_len + 7) / 8);
702         if (err)
703                 goto error;
704
705         err = crypto_aead_setauthsize(aead, x->aead->alg_icv_len / 8);
706         if (err)
707                 goto error;
708
709 error:
710         return err;
711 }
712
713 static int esp_init_authenc(struct xfrm_state *x)
714 {
715         struct crypto_aead *aead;
716         struct crypto_authenc_key_param *param;
717         struct rtattr *rta;
718         char *key;
719         char *p;
720         char authenc_name[CRYPTO_MAX_ALG_NAME];
721         unsigned int keylen;
722         int err;
723
724         err = -EINVAL;
725         if (!x->ealg)
726                 goto error;
727
728         err = -ENAMETOOLONG;
729
730         if ((x->props.flags & XFRM_STATE_ESN)) {
731                 if (snprintf(authenc_name, CRYPTO_MAX_ALG_NAME,
732                              "%s%sauthencesn(%s,%s)%s",
733                              x->geniv ?: "", x->geniv ? "(" : "",
734                              x->aalg ? x->aalg->alg_name : "digest_null",
735                              x->ealg->alg_name,
736                              x->geniv ? ")" : "") >= CRYPTO_MAX_ALG_NAME)
737                         goto error;
738         } else {
739                 if (snprintf(authenc_name, CRYPTO_MAX_ALG_NAME,
740                              "%s%sauthenc(%s,%s)%s",
741                              x->geniv ?: "", x->geniv ? "(" : "",
742                              x->aalg ? x->aalg->alg_name : "digest_null",
743                              x->ealg->alg_name,
744                              x->geniv ? ")" : "") >= CRYPTO_MAX_ALG_NAME)
745                         goto error;
746         }
747
748         aead = crypto_alloc_aead(authenc_name, 0, 0);
749         err = PTR_ERR(aead);
750         if (IS_ERR(aead))
751                 goto error;
752
753         x->data = aead;
754
755         keylen = (x->aalg ? (x->aalg->alg_key_len + 7) / 8 : 0) +
756                  (x->ealg->alg_key_len + 7) / 8 + RTA_SPACE(sizeof(*param));
757         err = -ENOMEM;
758         key = kmalloc(keylen, GFP_KERNEL);
759         if (!key)
760                 goto error;
761
762         p = key;
763         rta = (void *)p;
764         rta->rta_type = CRYPTO_AUTHENC_KEYA_PARAM;
765         rta->rta_len = RTA_LENGTH(sizeof(*param));
766         param = RTA_DATA(rta);
767         p += RTA_SPACE(sizeof(*param));
768
769         if (x->aalg) {
770                 struct xfrm_algo_desc *aalg_desc;
771
772                 memcpy(p, x->aalg->alg_key, (x->aalg->alg_key_len + 7) / 8);
773                 p += (x->aalg->alg_key_len + 7) / 8;
774
775                 aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
776                 BUG_ON(!aalg_desc);
777
778                 err = -EINVAL;
779                 if (aalg_desc->uinfo.auth.icv_fullbits / 8 !=
780                     crypto_aead_authsize(aead)) {
781                         pr_info("ESP: %s digestsize %u != %hu\n",
782                                 x->aalg->alg_name,
783                                 crypto_aead_authsize(aead),
784                                 aalg_desc->uinfo.auth.icv_fullbits / 8);
785                         goto free_key;
786                 }
787
788                 err = crypto_aead_setauthsize(
789                         aead, x->aalg->alg_trunc_len / 8);
790                 if (err)
791                         goto free_key;
792         }
793
794         param->enckeylen = cpu_to_be32((x->ealg->alg_key_len + 7) / 8);
795         memcpy(p, x->ealg->alg_key, (x->ealg->alg_key_len + 7) / 8);
796
797         err = crypto_aead_setkey(aead, key, keylen);
798
799 free_key:
800         kfree(key);
801
802 error:
803         return err;
804 }
805
806 static int esp6_init_state(struct xfrm_state *x)
807 {
808         struct crypto_aead *aead;
809         u32 align;
810         int err;
811
812         if (x->encap)
813                 return -EINVAL;
814
815         x->data = NULL;
816
817         if (x->aead)
818                 err = esp_init_aead(x);
819         else
820                 err = esp_init_authenc(x);
821
822         if (err)
823                 goto error;
824
825         aead = x->data;
826
827         x->props.header_len = sizeof(struct ip_esp_hdr) +
828                               crypto_aead_ivsize(aead);
829         switch (x->props.mode) {
830         case XFRM_MODE_BEET:
831                 if (x->sel.family != AF_INET6)
832                         x->props.header_len += IPV4_BEET_PHMAXLEN +
833                                                (sizeof(struct ipv6hdr) - sizeof(struct iphdr));
834                 break;
835         case XFRM_MODE_TRANSPORT:
836                 break;
837         case XFRM_MODE_TUNNEL:
838                 x->props.header_len += sizeof(struct ipv6hdr);
839                 break;
840         default:
841                 goto error;
842         }
843
844         align = ALIGN(crypto_aead_blocksize(aead), 4);
845         x->props.trailer_len = align + 1 + crypto_aead_authsize(aead);
846
847 error:
848         return err;
849 }
850
851 static int esp6_rcv_cb(struct sk_buff *skb, int err)
852 {
853         return 0;
854 }
855
856 static const struct xfrm_type esp6_type = {
857         .description    = "ESP6",
858         .owner          = THIS_MODULE,
859         .proto          = IPPROTO_ESP,
860         .flags          = XFRM_TYPE_REPLAY_PROT,
861         .init_state     = esp6_init_state,
862         .destructor     = esp6_destroy,
863         .get_mtu        = esp6_get_mtu,
864         .input          = esp6_input,
865         .output         = esp6_output,
866         .hdr_offset     = xfrm6_find_1stfragopt,
867 };
868
869 static struct xfrm6_protocol esp6_protocol = {
870         .handler        =       xfrm6_rcv,
871         .cb_handler     =       esp6_rcv_cb,
872         .err_handler    =       esp6_err,
873         .priority       =       0,
874 };
875
876 static int __init esp6_init(void)
877 {
878         if (xfrm_register_type(&esp6_type, AF_INET6) < 0) {
879                 pr_info("%s: can't add xfrm type\n", __func__);
880                 return -EAGAIN;
881         }
882         if (xfrm6_protocol_register(&esp6_protocol, IPPROTO_ESP) < 0) {
883                 pr_info("%s: can't add protocol\n", __func__);
884                 xfrm_unregister_type(&esp6_type, AF_INET6);
885                 return -EAGAIN;
886         }
887
888         return 0;
889 }
890
891 static void __exit esp6_fini(void)
892 {
893         if (xfrm6_protocol_deregister(&esp6_protocol, IPPROTO_ESP) < 0)
894                 pr_info("%s: can't remove protocol\n", __func__);
895         if (xfrm_unregister_type(&esp6_type, AF_INET6) < 0)
896                 pr_info("%s: can't remove xfrm type\n", __func__);
897 }
898
899 module_init(esp6_init);
900 module_exit(esp6_fini);
901
902 MODULE_LICENSE("GPL");
903 MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_ESP);