Blame view

net/mac80211/aes_ccm.c 2.71 KB
f0706e828   Jiri Benc   [MAC80211]: Add m...
1
2
3
4
  /*
   * Copyright 2003-2004, Instant802 Networks, Inc.
   * Copyright 2005-2006, Devicescape Software, Inc.
   *
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
5
6
   * Rewrite: Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
   *
f0706e828   Jiri Benc   [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   Ilpo Järvinen   [NET]: DIV_ROUND_...
11
  #include <linux/kernel.h>
f0706e828   Jiri Benc   [MAC80211]: Add m...
12
  #include <linux/types.h>
f0706e828   Jiri Benc   [MAC80211]: Add m...
13
  #include <linux/err.h>
d8fe0ddd0   Herbert Xu   mac80211: Include...
14
  #include <crypto/aead.h>
f0706e828   Jiri Benc   [MAC80211]: Add m...
15
16
  
  #include <net/mac80211.h>
2c8dccc77   Johannes Berg   mac80211: rename ...
17
  #include "key.h"
f0706e828   Jiri Benc   [MAC80211]: Add m...
18
  #include "aes_ccm.h"
f4a067f9f   Ard Biesheuvel   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   Jiri Benc   [MAC80211]: Add m...
22
  {
957e0fe62   Herbert Xu   mac80211: Switch ...
23
  	struct scatterlist sg[3];
f4a067f9f   Ard Biesheuvel   mac80211: move st...
24
25
26
  	struct aead_request *aead_req;
  	int reqsize = sizeof(*aead_req) + crypto_aead_reqsize(tfm);
  	u8 *__aad;
f0706e828   Jiri Benc   [MAC80211]: Add m...
27

f4a067f9f   Ard Biesheuvel   mac80211: move st...
28
29
30
  	aead_req = kzalloc(reqsize + CCM_AAD_LEN, GFP_ATOMIC);
  	if (!aead_req)
  		return -ENOMEM;
6e1ee5d2e   Jan-Simon Möller   mac80211: remove ...
31

f4a067f9f   Ard Biesheuvel   mac80211: move st...
32
33
  	__aad = (u8 *)aead_req + reqsize;
  	memcpy(__aad, aad, CCM_AAD_LEN);
f0706e828   Jiri Benc   [MAC80211]: Add m...
34

957e0fe62   Herbert Xu   mac80211: Switch ...
35
  	sg_init_table(sg, 3);
f4a067f9f   Ard Biesheuvel   mac80211: move st...
36
  	sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad));
957e0fe62   Herbert Xu   mac80211: Switch ...
37
38
  	sg_set_buf(&sg[1], data, data_len);
  	sg_set_buf(&sg[2], mic, mic_len);
f0706e828   Jiri Benc   [MAC80211]: Add m...
39

6e1ee5d2e   Jan-Simon Möller   mac80211: remove ...
40
  	aead_request_set_tfm(aead_req, tfm);
957e0fe62   Herbert Xu   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   Jiri Benc   [MAC80211]: Add m...
43

6e1ee5d2e   Jan-Simon Möller   mac80211: remove ...
44
  	crypto_aead_encrypt(aead_req);
f4a067f9f   Ard Biesheuvel   mac80211: move st...
45
46
47
  	kzfree(aead_req);
  
  	return 0;
f0706e828   Jiri Benc   [MAC80211]: Add m...
48
  }
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
49
  int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
2b2ba0db1   Jouni Malinen   mac80111: Add CCM...
50
51
  			      u8 *data, size_t data_len, u8 *mic,
  			      size_t mic_len)
f0706e828   Jiri Benc   [MAC80211]: Add m...
52
  {
957e0fe62   Herbert Xu   mac80211: Switch ...
53
  	struct scatterlist sg[3];
f4a067f9f   Ard Biesheuvel   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   Ard Biesheuvel   mac80211: port CC...
58

4f031fa9f   Ronald Wahl   mac80211: Fix reg...
59
60
  	if (data_len == 0)
  		return -EINVAL;
f4a067f9f   Ard Biesheuvel   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   Ard Biesheuvel   mac80211: port CC...
67

957e0fe62   Herbert Xu   mac80211: Switch ...
68
  	sg_init_table(sg, 3);
f4a067f9f   Ard Biesheuvel   mac80211: move st...
69
  	sg_set_buf(&sg[0], &__aad[2], be16_to_cpup((__be16 *)__aad));
957e0fe62   Herbert Xu   mac80211: Switch ...
70
71
  	sg_set_buf(&sg[1], data, data_len);
  	sg_set_buf(&sg[2], mic, mic_len);
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
72

6e1ee5d2e   Jan-Simon Möller   mac80211: remove ...
73
  	aead_request_set_tfm(aead_req, tfm);
957e0fe62   Herbert Xu   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   Ard Biesheuvel   mac80211: port CC...
76

f4a067f9f   Ard Biesheuvel   mac80211: move st...
77
78
79
80
  	err = crypto_aead_decrypt(aead_req);
  	kzfree(aead_req);
  
  	return err;
f0706e828   Jiri Benc   [MAC80211]: Add m...
81
  }
2b2ba0db1   Jouni Malinen   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   Jiri Benc   [MAC80211]: Add m...
85
  {
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
86
87
  	struct crypto_aead *tfm;
  	int err;
f0706e828   Jiri Benc   [MAC80211]: Add m...
88

7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
89
90
91
  	tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
  	if (IS_ERR(tfm))
  		return tfm;
f0706e828   Jiri Benc   [MAC80211]: Add m...
92

2b2ba0db1   Jouni Malinen   mac80111: Add CCM...
93
  	err = crypto_aead_setkey(tfm, key, key_len);
45fd63293   Dan Carpenter   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   Jiri Benc   [MAC80211]: Add m...
101

45fd63293   Dan Carpenter   mac80111: aes_ccm...
102
  free_aead:
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
103
104
  	crypto_free_aead(tfm);
  	return ERR_PTR(err);
f0706e828   Jiri Benc   [MAC80211]: Add m...
105
  }
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
106
  void ieee80211_aes_key_free(struct crypto_aead *tfm)
f0706e828   Jiri Benc   [MAC80211]: Add m...
107
  {
7ec7c4a9a   Ard Biesheuvel   mac80211: port CC...
108
  	crypto_free_aead(tfm);
f0706e828   Jiri Benc   [MAC80211]: Add m...
109
  }