diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2015-05-27 04:03:48 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2015-05-27 23:23:20 -0400 |
commit | 25528fdae4abb763c446b2e5081f80ba5a4b6f31 (patch) | |
tree | 37f4df61f10548a1c72b4a58a76d568979b737c3 /net/mac802154 | |
parent | 000ae7b2690e20b45480d2008757d54a66a38397 (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.c | 41 |
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 | ||