Blame view
net/mac80211/aes_ccm.c
2.71 KB
f0706e828 [MAC80211]: Add m... |
1 2 3 4 |
/* * Copyright 2003-2004, Instant802 Networks, Inc. * Copyright 2005-2006, Devicescape Software, Inc. * |
7ec7c4a9a mac80211: port CC... |
5 6 |
* Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org> * |
f0706e828 [MAC80211]: Add m... |
7 8 9 10 |
* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ |
172589ccd [NET]: DIV_ROUND_... |
11 |
#include <linux/kernel.h> |
f0706e828 [MAC80211]: Add m... |
12 |
#include <linux/types.h> |
f0706e828 [MAC80211]: Add m... |
13 |
#include <linux/err.h> |
d8fe0ddd0 mac80211: Include... |
14 |
#include <crypto/aead.h> |
f0706e828 [MAC80211]: Add m... |
15 16 |
#include <net/mac80211.h> |
2c8dccc77 mac80211: rename ... |
17 |
#include "key.h" |
f0706e828 [MAC80211]: Add m... |
18 |
#include "aes_ccm.h" |
f4a067f9f mac80211: move st... |
19 20 21 |
int ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, u8 *data, size_t data_len, u8 *mic, size_t mic_len) |
f0706e828 [MAC80211]: Add m... |
22 |
{ |
957e0fe62 mac80211: Switch ... |
23 |
struct scatterlist sg[3]; |
f4a067f9f mac80211: move st... |
24 25 26 |
struct aead_request *aead_req; int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); u8 *__aad; |
f0706e828 [MAC80211]: Add m... |
27 |
|
f4a067f9f mac80211: move st... |
28 29 30 |
aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); if (!aead_req) return -ENOMEM; |
6e1ee5d2e mac80211: remove ... |
31 |
|
f4a067f9f mac80211: move st... |
32 33 |
__aad = (u8 *)aead_req + reqsize; memcpy(__aad, aad, CCM_AAD_LEN); |
f0706e828 [MAC80211]: Add m... |
34 |
|
957e0fe62 mac80211: Switch ... |
35 |
sg_init_table(sg, 3); |
f4a067f9f mac80211: move st... |
36 |
sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); |
957e0fe62 mac80211: Switch ... |
37 38 |
sg_set_buf(&sg[1], data, data_len); sg_set_buf(&sg[2], mic, mic_len); |
f0706e828 [MAC80211]: Add m... |
39 |
|
6e1ee5d2e mac80211: remove ... |
40 |
aead_request_set_tfm(aead_req, tfm); |
957e0fe62 mac80211: Switch ... |
41 42 |
aead_request_set_crypt(aead_req, sg, sg, data_len, b_0); aead_request_set_ad(aead_req, sg[0].length); |
f0706e828 [MAC80211]: Add m... |
43 |
|
6e1ee5d2e mac80211: remove ... |
44 |
crypto_aead_encrypt(aead_req); |
f4a067f9f mac80211: move st... |
45 46 47 |
kzfree(aead_req); return 0; |
f0706e828 [MAC80211]: Add m... |
48 |
} |
7ec7c4a9a mac80211: port CC... |
49 |
int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad, |
2b2ba0db1 mac80111: Add CCM... |
50 51 |
u8 *data, size_t data_len, u8 *mic, size_t mic_len) |
f0706e828 [MAC80211]: Add m... |
52 |
{ |
957e0fe62 mac80211: Switch ... |
53 |
struct scatterlist sg[3]; |
f4a067f9f mac80211: move st... |
54 55 56 57 |
struct aead_request *aead_req; int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm); u8 *__aad; int err; |
7ec7c4a9a mac80211: port CC... |
58 |
|
4f031fa9f mac80211: Fix reg... |
59 60 |
if (data_len == 0) return -EINVAL; |
f4a067f9f mac80211: move st... |
61 62 63 64 65 66 |
aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC); if (!aead_req) return -ENOMEM; __aad = (u8 *)aead_req + reqsize; memcpy(__aad, aad, CCM_AAD_LEN); |
7ec7c4a9a mac80211: port CC... |
67 |
|
957e0fe62 mac80211: Switch ... |
68 |
sg_init_table(sg, 3); |
f4a067f9f mac80211: move st... |
69 |
sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad)); |
957e0fe62 mac80211: Switch ... |
70 71 |
sg_set_buf(&sg[1], data, data_len); sg_set_buf(&sg[2], mic, mic_len); |
7ec7c4a9a mac80211: port CC... |
72 |
|
6e1ee5d2e mac80211: remove ... |
73 |
aead_request_set_tfm(aead_req, tfm); |
957e0fe62 mac80211: Switch ... |
74 75 |
aead_request_set_crypt(aead_req, sg, sg, data_len + mic_len, b_0); aead_request_set_ad(aead_req, sg[0].length); |
7ec7c4a9a mac80211: port CC... |
76 |
|
f4a067f9f mac80211: move st... |
77 78 79 80 |
err = crypto_aead_decrypt(aead_req); kzfree(aead_req); return err; |
f0706e828 [MAC80211]: Add m... |
81 |
} |
2b2ba0db1 mac80111: Add CCM... |
82 83 84 |
struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[], size_t key_len, size_t mic_len) |
f0706e828 [MAC80211]: Add m... |
85 |
{ |
7ec7c4a9a mac80211: port CC... |
86 87 |
struct crypto_aead *tfm; int err; |
f0706e828 [MAC80211]: Add m... |
88 |
|
7ec7c4a9a mac80211: port CC... |
89 90 91 |
tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC); if (IS_ERR(tfm)) return tfm; |
f0706e828 [MAC80211]: Add m... |
92 |
|
2b2ba0db1 mac80111: Add CCM... |
93 |
err = crypto_aead_setkey(tfm, key, key_len); |
45fd63293 mac80111: aes_ccm... |
94 95 96 97 98 99 100 |
if (err) goto free_aead; err = crypto_aead_setauthsize(tfm, mic_len); if (err) goto free_aead; return tfm; |
f0706e828 [MAC80211]: Add m... |
101 |
|
45fd63293 mac80111: aes_ccm... |
102 |
free_aead: |
7ec7c4a9a mac80211: port CC... |
103 104 |
crypto_free_aead(tfm); return ERR_PTR(err); |
f0706e828 [MAC80211]: Add m... |
105 |
} |
7ec7c4a9a mac80211: port CC... |
106 |
void ieee80211_aes_key_free(struct crypto_aead *tfm) |
f0706e828 [MAC80211]: Add m... |
107 |
{ |
7ec7c4a9a mac80211: port CC... |
108 |
crypto_free_aead(tfm); |
f0706e828 [MAC80211]: Add m... |
109 |
} |