aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac802154
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-05-27 04:03:48 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-05-27 23:23:20 -0400
commit25528fdae4abb763c446b2e5081f80ba5a4b6f31 (patch)
tree37f4df61f10548a1c72b4a58a76d568979b737c3 /net/mac802154
parent000ae7b2690e20b45480d2008757d54a66a38397 (diff)
mac802154: Switch to new AEAD interface
This patch makes use of the new AEAD interface which uses a single SG list instead of separate lists for the AD and plain text. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'net/mac802154')
-rw-r--r--net/mac802154/llsec.c41
1 files changed, 14 insertions, 27 deletions
diff --git a/net/mac802154/llsec.c b/net/mac802154/llsec.c
index 3ccf1e9b2229..5210841c3707 100644
--- a/net/mac802154/llsec.c
+++ b/net/mac802154/llsec.c
@@ -650,7 +650,7 @@ llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec,
650 u8 iv[16]; 650 u8 iv[16];
651 unsigned char *data; 651 unsigned char *data;
652 int authlen, assoclen, datalen, rc; 652 int authlen, assoclen, datalen, rc;
653 struct scatterlist src, assoc[2], dst[2]; 653 struct scatterlist sg;
654 struct aead_request *req; 654 struct aead_request *req;
655 655
656 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); 656 authlen = ieee802154_sechdr_authtag_len(&hdr->sec);
@@ -660,30 +660,23 @@ llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec,
660 if (!req) 660 if (!req)
661 return -ENOMEM; 661 return -ENOMEM;
662 662
663 sg_init_table(assoc, 2);
664 sg_set_buf(&assoc[0], skb_mac_header(skb), skb->mac_len);
665 assoclen = skb->mac_len; 663 assoclen = skb->mac_len;
666 664
667 data = skb_mac_header(skb) + skb->mac_len; 665 data = skb_mac_header(skb) + skb->mac_len;
668 datalen = skb_tail_pointer(skb) - data; 666 datalen = skb_tail_pointer(skb) - data;
669 667
670 if (hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC) { 668 skb_put(skb, authlen);
671 sg_set_buf(&assoc[1], data, 0); 669
672 } else { 670 sg_init_one(&sg, skb_mac_header(skb), assoclen + datalen + authlen);
673 sg_set_buf(&assoc[1], data, datalen); 671
672 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) {
674 assoclen += datalen; 673 assoclen += datalen;
675 datalen = 0; 674 datalen = 0;
676 } 675 }
677 676
678 sg_init_one(&src, data, datalen);
679
680 sg_init_table(dst, 2);
681 sg_set_buf(&dst[0], data, datalen);
682 sg_set_buf(&dst[1], skb_put(skb, authlen), authlen);
683
684 aead_request_set_callback(req, 0, NULL, NULL); 677 aead_request_set_callback(req, 0, NULL, NULL);
685 aead_request_set_assoc(req, assoc, assoclen); 678 aead_request_set_crypt(req, &sg, &sg, datalen, iv);
686 aead_request_set_crypt(req, &src, dst, datalen, iv); 679 aead_request_set_ad(req, assoclen);
687 680
688 rc = crypto_aead_encrypt(req); 681 rc = crypto_aead_encrypt(req);
689 682
@@ -859,7 +852,7 @@ llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec,
859 u8 iv[16]; 852 u8 iv[16];
860 unsigned char *data; 853 unsigned char *data;
861 int authlen, datalen, assoclen, rc; 854 int authlen, datalen, assoclen, rc;
862 struct scatterlist src, assoc[2]; 855 struct scatterlist sg;
863 struct aead_request *req; 856 struct aead_request *req;
864 857
865 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); 858 authlen = ieee802154_sechdr_authtag_len(&hdr->sec);
@@ -869,27 +862,21 @@ llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec,
869 if (!req) 862 if (!req)
870 return -ENOMEM; 863 return -ENOMEM;
871 864
872 sg_init_table(assoc, 2);
873 sg_set_buf(&assoc[0], skb_mac_header(skb), skb->mac_len);
874 assoclen = skb->mac_len; 865 assoclen = skb->mac_len;
875 866
876 data = skb_mac_header(skb) + skb->mac_len; 867 data = skb_mac_header(skb) + skb->mac_len;
877 datalen = skb_tail_pointer(skb) - data; 868 datalen = skb_tail_pointer(skb) - data;
878 869
879 if (hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC) { 870 sg_init_one(&sg, skb_mac_header(skb), assoclen + datalen);
880 sg_set_buf(&assoc[1], data, 0); 871
881 } else { 872 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) {
882 sg_set_buf(&assoc[1], data, datalen - authlen);
883 assoclen += datalen - authlen; 873 assoclen += datalen - authlen;
884 data += datalen - authlen;
885 datalen = authlen; 874 datalen = authlen;
886 } 875 }
887 876
888 sg_init_one(&src, data, datalen);
889
890 aead_request_set_callback(req, 0, NULL, NULL); 877 aead_request_set_callback(req, 0, NULL, NULL);
891 aead_request_set_assoc(req, assoc, assoclen); 878 aead_request_set_crypt(req, &sg, &sg, datalen, iv);
892 aead_request_set_crypt(req, &src, &src, datalen, iv); 879 aead_request_set_ad(req, assoclen);
893 880
894 rc = crypto_aead_decrypt(req); 881 rc = crypto_aead_decrypt(req);
895 882