]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - net/ipv6/esp6.c
mac80211: fix TX aggregation start/stop callback race
[karo-tx-linux.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 xfrm_state *x,
174                                              struct ip_esp_hdr *esph,
175                                              __be32 *seqhi)
176 {
177         /* For ESN we move the header forward by 4 bytes to
178          * accomodate the high bits.  We will move it back after
179          * encryption.
180          */
181         if ((x->props.flags & XFRM_STATE_ESN)) {
182                 struct xfrm_offload *xo = xfrm_offload(skb);
183
184                 esph = (void *)(skb_transport_header(skb) - sizeof(__be32));
185                 *seqhi = esph->spi;
186                 if (xo)
187                         esph->seq_no = htonl(xo->seq.hi);
188                 else
189                         esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.hi);
190         }
191
192         esph->spi = x->id.spi;
193
194         return esph;
195 }
196
197 static void esp_output_done_esn(struct crypto_async_request *base, int err)
198 {
199         struct sk_buff *skb = base->data;
200
201         esp_output_restore_header(skb);
202         esp_output_done(base, err);
203 }
204
205 static void esp_output_fill_trailer(u8 *tail, int tfclen, int plen, __u8 proto)
206 {
207         /* Fill padding... */
208         if (tfclen) {
209                 memset(tail, 0, tfclen);
210                 tail += tfclen;
211         }
212         do {
213                 int i;
214                 for (i = 0; i < plen - 2; i++)
215                         tail[i] = i + 1;
216         } while (0);
217         tail[plen - 2] = plen - 2;
218         tail[plen - 1] = proto;
219 }
220
221 int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *esp)
222 {
223         u8 *tail;
224         u8 *vaddr;
225         int nfrags;
226         struct page *page;
227         struct ip_esp_hdr *esph;
228         struct sk_buff *trailer;
229         int tailen = esp->tailen;
230
231         esph = ip_esp_hdr(skb);
232
233         if (!skb_cloned(skb)) {
234                 if (tailen <= skb_availroom(skb)) {
235                         nfrags = 1;
236                         trailer = skb;
237                         tail = skb_tail_pointer(trailer);
238
239                         goto skip_cow;
240                 } else if ((skb_shinfo(skb)->nr_frags < MAX_SKB_FRAGS)
241                            && !skb_has_frag_list(skb)) {
242                         int allocsize;
243                         struct sock *sk = skb->sk;
244                         struct page_frag *pfrag = &x->xfrag;
245
246                         esp->inplace = false;
247
248                         allocsize = ALIGN(tailen, L1_CACHE_BYTES);
249
250                         spin_lock_bh(&x->lock);
251
252                         if (unlikely(!skb_page_frag_refill(allocsize, pfrag, GFP_ATOMIC))) {
253                                 spin_unlock_bh(&x->lock);
254                                 goto cow;
255                         }
256
257                         page = pfrag->page;
258                         get_page(page);
259
260                         vaddr = kmap_atomic(page);
261
262                         tail = vaddr + pfrag->offset;
263
264                         esp_output_fill_trailer(tail, esp->tfclen, esp->plen, esp->proto);
265
266                         kunmap_atomic(vaddr);
267
268                         spin_unlock_bh(&x->lock);
269
270                         nfrags = skb_shinfo(skb)->nr_frags;
271
272                         __skb_fill_page_desc(skb, nfrags, page, pfrag->offset,
273                                              tailen);
274                         skb_shinfo(skb)->nr_frags = ++nfrags;
275
276                         pfrag->offset = pfrag->offset + allocsize;
277                         nfrags++;
278
279                         skb->len += tailen;
280                         skb->data_len += tailen;
281                         skb->truesize += tailen;
282                         if (sk)
283                                 atomic_add(tailen, &sk->sk_wmem_alloc);
284
285                         goto out;
286                 }
287         }
288
289 cow:
290         nfrags = skb_cow_data(skb, tailen, &trailer);
291         if (nfrags < 0)
292                 goto out;
293         tail = skb_tail_pointer(trailer);
294
295 skip_cow:
296         esp_output_fill_trailer(tail, esp->tfclen, esp->plen, esp->proto);
297         pskb_put(skb, trailer, tailen);
298
299 out:
300         return nfrags;
301 }
302 EXPORT_SYMBOL_GPL(esp6_output_head);
303
304 int esp6_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *esp)
305 {
306         u8 *iv;
307         int alen;
308         void *tmp;
309         int ivlen;
310         int assoclen;
311         int seqhilen;
312         __be32 *seqhi;
313         struct page *page;
314         struct ip_esp_hdr *esph;
315         struct aead_request *req;
316         struct crypto_aead *aead;
317         struct scatterlist *sg, *dsg;
318         int err = -ENOMEM;
319
320         assoclen = sizeof(struct ip_esp_hdr);
321         seqhilen = 0;
322
323         if (x->props.flags & XFRM_STATE_ESN) {
324                 seqhilen += sizeof(__be32);
325                 assoclen += sizeof(__be32);
326         }
327
328         aead = x->data;
329         alen = crypto_aead_authsize(aead);
330         ivlen = crypto_aead_ivsize(aead);
331
332         tmp = esp_alloc_tmp(aead, esp->nfrags + 2, seqhilen);
333         if (!tmp)
334                 goto error;
335
336         seqhi = esp_tmp_seqhi(tmp);
337         iv = esp_tmp_iv(aead, tmp, seqhilen);
338         req = esp_tmp_req(aead, iv);
339         sg = esp_req_sg(aead, req);
340
341         if (esp->inplace)
342                 dsg = sg;
343         else
344                 dsg = &sg[esp->nfrags];
345
346         esph = esp_output_set_esn(skb, x, ip_esp_hdr(skb), seqhi);
347
348         sg_init_table(sg, esp->nfrags);
349         skb_to_sgvec(skb, sg,
350                      (unsigned char *)esph - skb->data,
351                      assoclen + ivlen + esp->clen + alen);
352
353         if (!esp->inplace) {
354                 int allocsize;
355                 struct page_frag *pfrag = &x->xfrag;
356
357                 allocsize = ALIGN(skb->data_len, L1_CACHE_BYTES);
358
359                 spin_lock_bh(&x->lock);
360                 if (unlikely(!skb_page_frag_refill(allocsize, pfrag, GFP_ATOMIC))) {
361                         spin_unlock_bh(&x->lock);
362                         goto error;
363                 }
364
365                 skb_shinfo(skb)->nr_frags = 1;
366
367                 page = pfrag->page;
368                 get_page(page);
369                 /* replace page frags in skb with new page */
370                 __skb_fill_page_desc(skb, 0, page, pfrag->offset, skb->data_len);
371                 pfrag->offset = pfrag->offset + allocsize;
372                 spin_unlock_bh(&x->lock);
373
374                 sg_init_table(dsg, skb_shinfo(skb)->nr_frags + 1);
375                 skb_to_sgvec(skb, dsg,
376                              (unsigned char *)esph - skb->data,
377                              assoclen + ivlen + esp->clen + alen);
378         }
379
380         if ((x->props.flags & XFRM_STATE_ESN))
381                 aead_request_set_callback(req, 0, esp_output_done_esn, skb);
382         else
383                 aead_request_set_callback(req, 0, esp_output_done, skb);
384
385         aead_request_set_crypt(req, sg, dsg, ivlen + esp->clen, iv);
386         aead_request_set_ad(req, assoclen);
387
388         memset(iv, 0, ivlen);
389         memcpy(iv + ivlen - min(ivlen, 8), (u8 *)&esp->seqno + 8 - min(ivlen, 8),
390                min(ivlen, 8));
391
392         ESP_SKB_CB(skb)->tmp = tmp;
393         err = crypto_aead_encrypt(req);
394
395         switch (err) {
396         case -EINPROGRESS:
397                 goto error;
398
399         case -EBUSY:
400                 err = NET_XMIT_DROP;
401                 break;
402
403         case 0:
404                 if ((x->props.flags & XFRM_STATE_ESN))
405                         esp_output_restore_header(skb);
406         }
407
408         if (sg != dsg)
409                 esp_ssg_unref(x, tmp);
410         kfree(tmp);
411
412 error:
413         return err;
414 }
415 EXPORT_SYMBOL_GPL(esp6_output_tail);
416
417 static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
418 {
419         int alen;
420         int blksize;
421         struct ip_esp_hdr *esph;
422         struct crypto_aead *aead;
423         struct esp_info esp;
424
425         esp.inplace = true;
426
427         esp.proto = *skb_mac_header(skb);
428         *skb_mac_header(skb) = IPPROTO_ESP;
429
430         /* skb is pure payload to encrypt */
431
432         aead = x->data;
433         alen = crypto_aead_authsize(aead);
434
435         esp.tfclen = 0;
436         if (x->tfcpad) {
437                 struct xfrm_dst *dst = (struct xfrm_dst *)skb_dst(skb);
438                 u32 padto;
439
440                 padto = min(x->tfcpad, esp6_get_mtu(x, dst->child_mtu_cached));
441                 if (skb->len < padto)
442                         esp.tfclen = padto - skb->len;
443         }
444         blksize = ALIGN(crypto_aead_blocksize(aead), 4);
445         esp.clen = ALIGN(skb->len + 2 + esp.tfclen, blksize);
446         esp.plen = esp.clen - skb->len - esp.tfclen;
447         esp.tailen = esp.tfclen + esp.plen + alen;
448
449         esp.nfrags = esp6_output_head(x, skb, &esp);
450         if (esp.nfrags < 0)
451                 return esp.nfrags;
452
453         esph = ip_esp_hdr(skb);
454         esph->spi = x->id.spi;
455
456         esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.output.low);
457         esp.seqno = cpu_to_be64(XFRM_SKB_CB(skb)->seq.output.low +
458                             ((u64)XFRM_SKB_CB(skb)->seq.output.hi << 32));
459
460         skb_push(skb, -skb_network_offset(skb));
461
462         return esp6_output_tail(x, skb, &esp);
463 }
464
465 int esp6_input_done2(struct sk_buff *skb, int err)
466 {
467         struct xfrm_state *x = xfrm_input_state(skb);
468         struct xfrm_offload *xo = xfrm_offload(skb);
469         struct crypto_aead *aead = x->data;
470         int alen = crypto_aead_authsize(aead);
471         int hlen = sizeof(struct ip_esp_hdr) + crypto_aead_ivsize(aead);
472         int elen = skb->len - hlen;
473         int hdr_len = skb_network_header_len(skb);
474         int padlen;
475         u8 nexthdr[2];
476
477         if (!xo || (xo && !(xo->flags & CRYPTO_DONE)))
478                 kfree(ESP_SKB_CB(skb)->tmp);
479
480         if (unlikely(err))
481                 goto out;
482
483         if (skb_copy_bits(skb, skb->len - alen - 2, nexthdr, 2))
484                 BUG();
485
486         err = -EINVAL;
487         padlen = nexthdr[0];
488         if (padlen + 2 + alen >= elen) {
489                 net_dbg_ratelimited("ipsec esp packet is garbage padlen=%d, elen=%d\n",
490                                     padlen + 2, elen - alen);
491                 goto out;
492         }
493
494         /* ... check padding bits here. Silly. :-) */
495
496         pskb_trim(skb, skb->len - alen - padlen - 2);
497         __skb_pull(skb, hlen);
498         if (x->props.mode == XFRM_MODE_TUNNEL)
499                 skb_reset_transport_header(skb);
500         else
501                 skb_set_transport_header(skb, -hdr_len);
502
503         err = nexthdr[1];
504
505         /* RFC4303: Drop dummy packets without any error */
506         if (err == IPPROTO_NONE)
507                 err = -EINVAL;
508
509 out:
510         return err;
511 }
512 EXPORT_SYMBOL_GPL(esp6_input_done2);
513
514 static void esp_input_done(struct crypto_async_request *base, int err)
515 {
516         struct sk_buff *skb = base->data;
517
518         xfrm_input_resume(skb, esp6_input_done2(skb, err));
519 }
520
521 static void esp_input_restore_header(struct sk_buff *skb)
522 {
523         esp_restore_header(skb, 0);
524         __skb_pull(skb, 4);
525 }
526
527 static void esp_input_set_header(struct sk_buff *skb, __be32 *seqhi)
528 {
529         struct xfrm_state *x = xfrm_input_state(skb);
530         struct ip_esp_hdr *esph = (struct ip_esp_hdr *)skb->data;
531
532         /* For ESN we move the header forward by 4 bytes to
533          * accomodate the high bits.  We will move it back after
534          * decryption.
535          */
536         if ((x->props.flags & XFRM_STATE_ESN)) {
537                 esph = (void *)skb_push(skb, 4);
538                 *seqhi = esph->spi;
539                 esph->spi = esph->seq_no;
540                 esph->seq_no = XFRM_SKB_CB(skb)->seq.input.hi;
541         }
542 }
543
544 static void esp_input_done_esn(struct crypto_async_request *base, int err)
545 {
546         struct sk_buff *skb = base->data;
547
548         esp_input_restore_header(skb);
549         esp_input_done(base, err);
550 }
551
552 static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
553 {
554         struct ip_esp_hdr *esph;
555         struct crypto_aead *aead = x->data;
556         struct aead_request *req;
557         struct sk_buff *trailer;
558         int ivlen = crypto_aead_ivsize(aead);
559         int elen = skb->len - sizeof(*esph) - ivlen;
560         int nfrags;
561         int assoclen;
562         int seqhilen;
563         int ret = 0;
564         void *tmp;
565         __be32 *seqhi;
566         u8 *iv;
567         struct scatterlist *sg;
568
569         if (!pskb_may_pull(skb, sizeof(*esph) + ivlen)) {
570                 ret = -EINVAL;
571                 goto out;
572         }
573
574         if (elen <= 0) {
575                 ret = -EINVAL;
576                 goto out;
577         }
578
579         assoclen = sizeof(*esph);
580         seqhilen = 0;
581
582         if (x->props.flags & XFRM_STATE_ESN) {
583                 seqhilen += sizeof(__be32);
584                 assoclen += seqhilen;
585         }
586
587         if (!skb_cloned(skb)) {
588                 if (!skb_is_nonlinear(skb)) {
589                         nfrags = 1;
590
591                         goto skip_cow;
592                 } else if (!skb_has_frag_list(skb)) {
593                         nfrags = skb_shinfo(skb)->nr_frags;
594                         nfrags++;
595
596                         goto skip_cow;
597                 }
598         }
599
600         nfrags = skb_cow_data(skb, 0, &trailer);
601         if (nfrags < 0) {
602                 ret = -EINVAL;
603                 goto out;
604         }
605
606 skip_cow:
607         ret = -ENOMEM;
608         tmp = esp_alloc_tmp(aead, nfrags, seqhilen);
609         if (!tmp)
610                 goto out;
611
612         ESP_SKB_CB(skb)->tmp = tmp;
613         seqhi = esp_tmp_seqhi(tmp);
614         iv = esp_tmp_iv(aead, tmp, seqhilen);
615         req = esp_tmp_req(aead, iv);
616         sg = esp_req_sg(aead, req);
617
618         esp_input_set_header(skb, seqhi);
619
620         sg_init_table(sg, nfrags);
621         skb_to_sgvec(skb, sg, 0, skb->len);
622
623         skb->ip_summed = CHECKSUM_NONE;
624
625         if ((x->props.flags & XFRM_STATE_ESN))
626                 aead_request_set_callback(req, 0, esp_input_done_esn, skb);
627         else
628                 aead_request_set_callback(req, 0, esp_input_done, skb);
629
630         aead_request_set_crypt(req, sg, sg, elen + ivlen, iv);
631         aead_request_set_ad(req, assoclen);
632
633         ret = crypto_aead_decrypt(req);
634         if (ret == -EINPROGRESS)
635                 goto out;
636
637         if ((x->props.flags & XFRM_STATE_ESN))
638                 esp_input_restore_header(skb);
639
640         ret = esp6_input_done2(skb, ret);
641
642 out:
643         return ret;
644 }
645
646 static u32 esp6_get_mtu(struct xfrm_state *x, int mtu)
647 {
648         struct crypto_aead *aead = x->data;
649         u32 blksize = ALIGN(crypto_aead_blocksize(aead), 4);
650         unsigned int net_adj;
651
652         if (x->props.mode != XFRM_MODE_TUNNEL)
653                 net_adj = sizeof(struct ipv6hdr);
654         else
655                 net_adj = 0;
656
657         return ((mtu - x->props.header_len - crypto_aead_authsize(aead) -
658                  net_adj) & ~(blksize - 1)) + net_adj - 2;
659 }
660
661 static int esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
662                     u8 type, u8 code, int offset, __be32 info)
663 {
664         struct net *net = dev_net(skb->dev);
665         const struct ipv6hdr *iph = (const struct ipv6hdr *)skb->data;
666         struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset);
667         struct xfrm_state *x;
668
669         if (type != ICMPV6_PKT_TOOBIG &&
670             type != NDISC_REDIRECT)
671                 return 0;
672
673         x = xfrm_state_lookup(net, skb->mark, (const xfrm_address_t *)&iph->daddr,
674                               esph->spi, IPPROTO_ESP, AF_INET6);
675         if (!x)
676                 return 0;
677
678         if (type == NDISC_REDIRECT)
679                 ip6_redirect(skb, net, skb->dev->ifindex, 0,
680                              sock_net_uid(net, NULL));
681         else
682                 ip6_update_pmtu(skb, net, info, 0, 0, sock_net_uid(net, NULL));
683         xfrm_state_put(x);
684
685         return 0;
686 }
687
688 static void esp6_destroy(struct xfrm_state *x)
689 {
690         struct crypto_aead *aead = x->data;
691
692         if (!aead)
693                 return;
694
695         crypto_free_aead(aead);
696 }
697
698 static int esp_init_aead(struct xfrm_state *x)
699 {
700         char aead_name[CRYPTO_MAX_ALG_NAME];
701         struct crypto_aead *aead;
702         int err;
703         u32 mask = 0;
704
705         err = -ENAMETOOLONG;
706         if (snprintf(aead_name, CRYPTO_MAX_ALG_NAME, "%s(%s)",
707                      x->geniv, x->aead->alg_name) >= CRYPTO_MAX_ALG_NAME)
708                 goto error;
709
710         if (x->xso.offload_handle)
711                 mask |= CRYPTO_ALG_ASYNC;
712
713         aead = crypto_alloc_aead(aead_name, 0, mask);
714         err = PTR_ERR(aead);
715         if (IS_ERR(aead))
716                 goto error;
717
718         x->data = aead;
719
720         err = crypto_aead_setkey(aead, x->aead->alg_key,
721                                  (x->aead->alg_key_len + 7) / 8);
722         if (err)
723                 goto error;
724
725         err = crypto_aead_setauthsize(aead, x->aead->alg_icv_len / 8);
726         if (err)
727                 goto error;
728
729 error:
730         return err;
731 }
732
733 static int esp_init_authenc(struct xfrm_state *x)
734 {
735         struct crypto_aead *aead;
736         struct crypto_authenc_key_param *param;
737         struct rtattr *rta;
738         char *key;
739         char *p;
740         char authenc_name[CRYPTO_MAX_ALG_NAME];
741         unsigned int keylen;
742         int err;
743         u32 mask = 0;
744
745         err = -EINVAL;
746         if (!x->ealg)
747                 goto error;
748
749         err = -ENAMETOOLONG;
750
751         if ((x->props.flags & XFRM_STATE_ESN)) {
752                 if (snprintf(authenc_name, CRYPTO_MAX_ALG_NAME,
753                              "%s%sauthencesn(%s,%s)%s",
754                              x->geniv ?: "", x->geniv ? "(" : "",
755                              x->aalg ? x->aalg->alg_name : "digest_null",
756                              x->ealg->alg_name,
757                              x->geniv ? ")" : "") >= CRYPTO_MAX_ALG_NAME)
758                         goto error;
759         } else {
760                 if (snprintf(authenc_name, CRYPTO_MAX_ALG_NAME,
761                              "%s%sauthenc(%s,%s)%s",
762                              x->geniv ?: "", x->geniv ? "(" : "",
763                              x->aalg ? x->aalg->alg_name : "digest_null",
764                              x->ealg->alg_name,
765                              x->geniv ? ")" : "") >= CRYPTO_MAX_ALG_NAME)
766                         goto error;
767         }
768
769         if (x->xso.offload_handle)
770                 mask |= CRYPTO_ALG_ASYNC;
771
772         aead = crypto_alloc_aead(authenc_name, 0, mask);
773         err = PTR_ERR(aead);
774         if (IS_ERR(aead))
775                 goto error;
776
777         x->data = aead;
778
779         keylen = (x->aalg ? (x->aalg->alg_key_len + 7) / 8 : 0) +
780                  (x->ealg->alg_key_len + 7) / 8 + RTA_SPACE(sizeof(*param));
781         err = -ENOMEM;
782         key = kmalloc(keylen, GFP_KERNEL);
783         if (!key)
784                 goto error;
785
786         p = key;
787         rta = (void *)p;
788         rta->rta_type = CRYPTO_AUTHENC_KEYA_PARAM;
789         rta->rta_len = RTA_LENGTH(sizeof(*param));
790         param = RTA_DATA(rta);
791         p += RTA_SPACE(sizeof(*param));
792
793         if (x->aalg) {
794                 struct xfrm_algo_desc *aalg_desc;
795
796                 memcpy(p, x->aalg->alg_key, (x->aalg->alg_key_len + 7) / 8);
797                 p += (x->aalg->alg_key_len + 7) / 8;
798
799                 aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
800                 BUG_ON(!aalg_desc);
801
802                 err = -EINVAL;
803                 if (aalg_desc->uinfo.auth.icv_fullbits / 8 !=
804                     crypto_aead_authsize(aead)) {
805                         pr_info("ESP: %s digestsize %u != %hu\n",
806                                 x->aalg->alg_name,
807                                 crypto_aead_authsize(aead),
808                                 aalg_desc->uinfo.auth.icv_fullbits / 8);
809                         goto free_key;
810                 }
811
812                 err = crypto_aead_setauthsize(
813                         aead, x->aalg->alg_trunc_len / 8);
814                 if (err)
815                         goto free_key;
816         }
817
818         param->enckeylen = cpu_to_be32((x->ealg->alg_key_len + 7) / 8);
819         memcpy(p, x->ealg->alg_key, (x->ealg->alg_key_len + 7) / 8);
820
821         err = crypto_aead_setkey(aead, key, keylen);
822
823 free_key:
824         kfree(key);
825
826 error:
827         return err;
828 }
829
830 static int esp6_init_state(struct xfrm_state *x)
831 {
832         struct crypto_aead *aead;
833         u32 align;
834         int err;
835
836         if (x->encap)
837                 return -EINVAL;
838
839         x->data = NULL;
840
841         if (x->aead)
842                 err = esp_init_aead(x);
843         else
844                 err = esp_init_authenc(x);
845
846         if (err)
847                 goto error;
848
849         aead = x->data;
850
851         x->props.header_len = sizeof(struct ip_esp_hdr) +
852                               crypto_aead_ivsize(aead);
853         switch (x->props.mode) {
854         case XFRM_MODE_BEET:
855                 if (x->sel.family != AF_INET6)
856                         x->props.header_len += IPV4_BEET_PHMAXLEN +
857                                                (sizeof(struct ipv6hdr) - sizeof(struct iphdr));
858                 break;
859         case XFRM_MODE_TRANSPORT:
860                 break;
861         case XFRM_MODE_TUNNEL:
862                 x->props.header_len += sizeof(struct ipv6hdr);
863                 break;
864         default:
865                 goto error;
866         }
867
868         align = ALIGN(crypto_aead_blocksize(aead), 4);
869         x->props.trailer_len = align + 1 + crypto_aead_authsize(aead);
870
871 error:
872         return err;
873 }
874
875 static int esp6_rcv_cb(struct sk_buff *skb, int err)
876 {
877         return 0;
878 }
879
880 static const struct xfrm_type esp6_type = {
881         .description    = "ESP6",
882         .owner          = THIS_MODULE,
883         .proto          = IPPROTO_ESP,
884         .flags          = XFRM_TYPE_REPLAY_PROT,
885         .init_state     = esp6_init_state,
886         .destructor     = esp6_destroy,
887         .get_mtu        = esp6_get_mtu,
888         .input          = esp6_input,
889         .output         = esp6_output,
890         .hdr_offset     = xfrm6_find_1stfragopt,
891 };
892
893 static struct xfrm6_protocol esp6_protocol = {
894         .handler        =       xfrm6_rcv,
895         .cb_handler     =       esp6_rcv_cb,
896         .err_handler    =       esp6_err,
897         .priority       =       0,
898 };
899
900 static int __init esp6_init(void)
901 {
902         if (xfrm_register_type(&esp6_type, AF_INET6) < 0) {
903                 pr_info("%s: can't add xfrm type\n", __func__);
904                 return -EAGAIN;
905         }
906         if (xfrm6_protocol_register(&esp6_protocol, IPPROTO_ESP) < 0) {
907                 pr_info("%s: can't add protocol\n", __func__);
908                 xfrm_unregister_type(&esp6_type, AF_INET6);
909                 return -EAGAIN;
910         }
911
912         return 0;
913 }
914
915 static void __exit esp6_fini(void)
916 {
917         if (xfrm6_protocol_deregister(&esp6_protocol, IPPROTO_ESP) < 0)
918                 pr_info("%s: can't remove protocol\n", __func__);
919         if (xfrm_unregister_type(&esp6_type, AF_INET6) < 0)
920                 pr_info("%s: can't remove xfrm type\n", __func__);
921 }
922
923 module_init(esp6_init);
924 module_exit(esp6_fini);
925
926 MODULE_LICENSE("GPL");
927 MODULE_ALIAS_XFRM_TYPE(AF_INET6, XFRM_PROTO_ESP);