blob: 3808ade96d08c288af24584091b0df73cd2cd1f3 [file] [log] [blame]
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
8
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
21*/
22
Gustavo Padovan8c520a52012-05-23 04:04:22 -030023#include <linux/crypto.h>
24#include <linux/scatterlist.h>
25#include <crypto/b128ops.h>
26
Anderson Brigliaeb492e02011-06-09 18:50:40 -030027#include <net/bluetooth/bluetooth.h>
28#include <net/bluetooth/hci_core.h>
29#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080030#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070031
32#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030033
Johan Hedbergb28b4942014-09-05 22:19:55 +030034#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030035
Marcel Holtmann17b02e62012-03-01 14:32:37 -080036#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030037
Johan Hedberg0edb14d2014-05-26 13:29:28 +030038#define AUTH_REQ_MASK(dev) (test_bit(HCI_SC_ENABLED, &(dev)->dev_flags) ? \
39 0x1f : 0x07)
40#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020041
Johan Hedberg533e35d2014-06-16 19:25:18 +030042enum {
43 SMP_FLAG_TK_VALID,
44 SMP_FLAG_CFM_PENDING,
45 SMP_FLAG_MITM_AUTH,
46 SMP_FLAG_COMPLETE,
47 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030048 SMP_FLAG_SC,
Johan Hedberg533e35d2014-06-16 19:25:18 +030049};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030050
51struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030052 struct l2cap_conn *conn;
53 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030054 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030055
Johan Hedberg4bc58f52014-05-20 09:45:47 +030056 u8 preq[7]; /* SMP Pairing Request */
57 u8 prsp[7]; /* SMP Pairing Response */
58 u8 prnd[16]; /* SMP Pairing Random (local) */
59 u8 rrnd[16]; /* SMP Pairing Random (remote) */
60 u8 pcnf[16]; /* SMP Pairing Confirm */
61 u8 tk[16]; /* SMP Temporary Key */
62 u8 enc_key_size;
63 u8 remote_key_dist;
64 bdaddr_t id_addr;
65 u8 id_addr_type;
66 u8 irk[16];
67 struct smp_csrk *csrk;
68 struct smp_csrk *slave_csrk;
69 struct smp_ltk *ltk;
70 struct smp_ltk *slave_ltk;
71 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030072 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030073
74 struct crypto_blkcipher *tfm_aes;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030075};
76
Johan Hedberg8a2936f2014-06-16 19:25:19 +030077static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030078{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030079 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030080
Johan Hedberg8a2936f2014-06-16 19:25:19 +030081 for (i = 0; i < len; i++)
82 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030083}
84
85static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
86{
87 struct blkcipher_desc desc;
88 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +020089 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +020090 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030091
92 if (tfm == NULL) {
93 BT_ERR("tfm %p", tfm);
94 return -EINVAL;
95 }
96
97 desc.tfm = tfm;
98 desc.flags = 0;
99
Johan Hedberg943a7322014-03-18 12:58:24 +0200100 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300101 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200102
103 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300104 if (err) {
105 BT_ERR("cipher setkey failed: %d", err);
106 return err;
107 }
108
Johan Hedberg943a7322014-03-18 12:58:24 +0200109 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300110 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200111
112 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300113
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300114 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
115 if (err)
116 BT_ERR("Encrypt data error %d", err);
117
Johan Hedberg943a7322014-03-18 12:58:24 +0200118 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300119 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200120
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300121 return err;
122}
123
Johan Hedberg60478052014-02-18 10:19:31 +0200124static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
125{
Johan Hedberg943a7322014-03-18 12:58:24 +0200126 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200127 int err;
128
129 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200130 memcpy(_res, r, 3);
131 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200132
Johan Hedberg943a7322014-03-18 12:58:24 +0200133 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200134 if (err) {
135 BT_ERR("Encrypt error");
136 return err;
137 }
138
139 /* The output of the random address function ah is:
140 * ah(h, r) = e(k, r') mod 2^24
141 * The output of the security function e is then truncated to 24 bits
142 * by taking the least significant 24 bits of the output of e as the
143 * result of ah.
144 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200145 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200146
147 return 0;
148}
149
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300150bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200151{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300152 struct l2cap_chan *chan = hdev->smp_data;
153 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200154 u8 hash[3];
155 int err;
156
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300157 if (!chan || !chan->data)
158 return false;
159
160 tfm = chan->data;
161
Johan Hedberg60478052014-02-18 10:19:31 +0200162 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
163
164 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
165 if (err)
166 return false;
167
168 return !memcmp(bdaddr->b, hash, 3);
169}
170
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300171int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200172{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300173 struct l2cap_chan *chan = hdev->smp_data;
174 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200175 int err;
176
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300177 if (!chan || !chan->data)
178 return -EOPNOTSUPP;
179
180 tfm = chan->data;
181
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200182 get_random_bytes(&rpa->b[3], 3);
183
184 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
185 rpa->b[5] |= 0x40; /* Set second most significant bit */
186
187 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
188 if (err < 0)
189 return err;
190
191 BT_DBG("RPA %pMR", rpa);
192
193 return 0;
194}
195
Johan Hedberge491eaf2014-10-25 21:15:37 +0200196static int smp_c1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r[16],
197 u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat,
198 bdaddr_t *ra, u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300199{
200 u8 p1[16], p2[16];
201 int err;
202
203 memset(p1, 0, 16);
204
205 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200206 p1[0] = _iat;
207 p1[1] = _rat;
208 memcpy(p1 + 2, preq, 7);
209 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300210
211 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200212 memcpy(p2, ra, 6);
213 memcpy(p2 + 6, ia, 6);
214 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300215
216 /* res = r XOR p1 */
217 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
218
219 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200220 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300221 if (err) {
222 BT_ERR("Encrypt data error");
223 return err;
224 }
225
226 /* res = res XOR p2 */
227 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
228
229 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200230 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300231 if (err)
232 BT_ERR("Encrypt data error");
233
234 return err;
235}
236
Johan Hedberge491eaf2014-10-25 21:15:37 +0200237static int smp_s1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r1[16],
238 u8 r2[16], u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300239{
240 int err;
241
242 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200243 memcpy(_r, r2, 8);
244 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300245
Johan Hedberge491eaf2014-10-25 21:15:37 +0200246 err = smp_e(tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300247 if (err)
248 BT_ERR("Encrypt data error");
249
250 return err;
251}
252
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300253static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
254{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300255 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300256 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300257 struct kvec iv[2];
258 struct msghdr msg;
259
260 if (!chan)
261 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300262
263 BT_DBG("code 0x%2.2x", code);
264
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300265 iv[0].iov_base = &code;
266 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300267
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300268 iv[1].iov_base = data;
269 iv[1].iov_len = len;
270
271 memset(&msg, 0, sizeof(msg));
272
273 msg.msg_iov = (struct iovec *) &iv;
274 msg.msg_iovlen = 2;
275
276 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300277
Johan Hedbergb68fda62014-08-11 22:06:40 +0300278 if (!chan->data)
279 return;
280
281 smp = chan->data;
282
283 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300284 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300285}
286
Brian Gix2b64d152011-12-21 16:12:12 -0800287static __u8 authreq_to_seclevel(__u8 authreq)
288{
289 if (authreq & SMP_AUTH_MITM)
290 return BT_SECURITY_HIGH;
291 else
292 return BT_SECURITY_MEDIUM;
293}
294
295static __u8 seclevel_to_authreq(__u8 sec_level)
296{
297 switch (sec_level) {
298 case BT_SECURITY_HIGH:
299 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
300 case BT_SECURITY_MEDIUM:
301 return SMP_AUTH_BONDING;
302 default:
303 return SMP_AUTH_NONE;
304 }
305}
306
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300307static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700308 struct smp_cmd_pairing *req,
309 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300310{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300311 struct l2cap_chan *chan = conn->smp;
312 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200313 struct hci_conn *hcon = conn->hcon;
314 struct hci_dev *hdev = hcon->hdev;
315 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300316
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300317 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700318 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
319 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300320 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800321 } else {
322 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300323 }
324
Johan Hedbergfd349c02014-02-18 10:19:36 +0200325 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
326 remote_dist |= SMP_DIST_ID_KEY;
327
Johan Hedberg863efaf2014-02-22 19:06:32 +0200328 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
329 local_dist |= SMP_DIST_ID_KEY;
330
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300331 if (rsp == NULL) {
332 req->io_capability = conn->hcon->io_capability;
333 req->oob_flag = SMP_OOB_NOT_PRESENT;
334 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200335 req->init_key_dist = local_dist;
336 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300337 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200338
339 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300340 return;
341 }
342
343 rsp->io_capability = conn->hcon->io_capability;
344 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
345 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200346 rsp->init_key_dist = req->init_key_dist & remote_dist;
347 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300348 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200349
350 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300351}
352
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300353static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
354{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300355 struct l2cap_chan *chan = conn->smp;
356 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300357
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300358 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700359 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300360 return SMP_ENC_KEY_SIZE;
361
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300362 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300363
364 return 0;
365}
366
Johan Hedberg6f48e262014-08-11 22:06:44 +0300367static void smp_chan_destroy(struct l2cap_conn *conn)
368{
369 struct l2cap_chan *chan = conn->smp;
370 struct smp_chan *smp = chan->data;
371 bool complete;
372
373 BUG_ON(!smp);
374
375 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300376
Johan Hedberg6f48e262014-08-11 22:06:44 +0300377 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
378 mgmt_smp_complete(conn->hcon, complete);
379
380 kfree(smp->csrk);
381 kfree(smp->slave_csrk);
382
383 crypto_free_blkcipher(smp->tfm_aes);
384
385 /* If pairing failed clean up any keys we might have */
386 if (!complete) {
387 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200388 list_del_rcu(&smp->ltk->list);
389 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300390 }
391
392 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200393 list_del_rcu(&smp->slave_ltk->list);
394 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300395 }
396
397 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200398 list_del_rcu(&smp->remote_irk->list);
399 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300400 }
401 }
402
403 chan->data = NULL;
404 kfree(smp);
405 hci_conn_drop(conn->hcon);
406}
407
Johan Hedberg84794e12013-11-06 11:24:57 +0200408static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800409{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200410 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300411 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200412
Johan Hedberg84794e12013-11-06 11:24:57 +0200413 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800414 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700415 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800416
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700417 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700418 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300419
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300420 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300421 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800422}
423
Brian Gix2b64d152011-12-21 16:12:12 -0800424#define JUST_WORKS 0x00
425#define JUST_CFM 0x01
426#define REQ_PASSKEY 0x02
427#define CFM_PASSKEY 0x03
428#define REQ_OOB 0x04
429#define OVERLAP 0xFF
430
431static const u8 gen_method[5][5] = {
432 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
433 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
434 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
435 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
436 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
437};
438
Johan Hedberg581370c2014-06-17 13:07:38 +0300439static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
440{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300441 /* If either side has unknown io_caps, use JUST_CFM (which gets
442 * converted later to JUST_WORKS if we're initiators.
443 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300444 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
445 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300446 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300447
448 return gen_method[remote_io][local_io];
449}
450
Brian Gix2b64d152011-12-21 16:12:12 -0800451static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
452 u8 local_io, u8 remote_io)
453{
454 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300455 struct l2cap_chan *chan = conn->smp;
456 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800457 u8 method;
458 u32 passkey = 0;
459 int ret = 0;
460
461 /* Initialize key for JUST WORKS */
462 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300463 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800464
465 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
466
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300467 /* If neither side wants MITM, either "just" confirm an incoming
468 * request or use just-works for outgoing ones. The JUST_CFM
469 * will be converted to JUST_WORKS if necessary later in this
470 * function. If either side has MITM look up the method from the
471 * table.
472 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300473 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300474 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800475 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300476 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800477
Johan Hedberga82505c2014-03-24 14:39:07 +0200478 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300479 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200480 method = JUST_WORKS;
481
Johan Hedberg02f3e252014-07-16 15:09:13 +0300482 /* Don't bother user space with no IO capabilities */
483 if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
484 method = JUST_WORKS;
485
Brian Gix2b64d152011-12-21 16:12:12 -0800486 /* If Just Works, Continue with Zero TK */
487 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300488 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800489 return 0;
490 }
491
492 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300493 if (method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300494 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300495 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
496 hcon->pending_sec_level = BT_SECURITY_HIGH;
497 }
Brian Gix2b64d152011-12-21 16:12:12 -0800498
499 /* If both devices have Keyoard-Display I/O, the master
500 * Confirms and the slave Enters the passkey.
501 */
502 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300503 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800504 method = CFM_PASSKEY;
505 else
506 method = REQ_PASSKEY;
507 }
508
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200509 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800510 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200511 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800512 get_random_bytes(&passkey, sizeof(passkey));
513 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200514 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800515 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300516 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800517 }
518
Brian Gix2b64d152011-12-21 16:12:12 -0800519 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700520 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200521 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200522 else if (method == JUST_CFM)
523 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
524 hcon->type, hcon->dst_type,
525 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800526 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200527 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200528 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200529 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800530
Brian Gix2b64d152011-12-21 16:12:12 -0800531 return ret;
532}
533
Johan Hedberg1cc61142014-05-20 09:45:52 +0300534static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300535{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300536 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300537 struct smp_cmd_pairing_confirm cp;
538 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300539
540 BT_DBG("conn %p", conn);
541
Johan Hedberge491eaf2014-10-25 21:15:37 +0200542 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200543 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200544 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
545 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300546 if (ret)
547 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300548
Johan Hedberg4a74d652014-05-20 09:45:50 +0300549 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800550
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300551 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
552
Johan Hedbergb28b4942014-09-05 22:19:55 +0300553 if (conn->hcon->out)
554 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
555 else
556 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
557
Johan Hedberg1cc61142014-05-20 09:45:52 +0300558 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300559}
560
Johan Hedberg861580a2014-05-20 09:45:51 +0300561static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300562{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300563 struct l2cap_conn *conn = smp->conn;
564 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300565 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300566 int ret;
567
Johan Hedbergec70f362014-06-27 14:23:04 +0300568 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300569 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300570
571 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
572
Johan Hedberge491eaf2014-10-25 21:15:37 +0200573 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200574 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200575 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300576 if (ret)
577 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300578
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300579 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
580 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300581 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300582 }
583
584 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800585 u8 stk[16];
586 __le64 rand = 0;
587 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300588
Johan Hedberge491eaf2014-10-25 21:15:37 +0200589 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300590
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300591 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300592 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300593
Johan Hedberg861580a2014-05-20 09:45:51 +0300594 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
595 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300596
597 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300598 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300599 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300600 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300601 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800602 __le64 rand = 0;
603 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300604
Johan Hedberg943a7322014-03-18 12:58:24 +0200605 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
606 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300607
Johan Hedberge491eaf2014-10-25 21:15:37 +0200608 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300609
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300610 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700611 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300612
Johan Hedbergfff34902014-06-10 15:19:50 +0300613 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
614 auth = 1;
615 else
616 auth = 0;
617
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300618 /* Even though there's no _SLAVE suffix this is the
619 * slave STK we're adding for later lookup (the master
620 * STK never needs to be stored).
621 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700622 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300623 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300624 }
625
Johan Hedberg861580a2014-05-20 09:45:51 +0300626 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300627}
628
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300629static void smp_notify_keys(struct l2cap_conn *conn)
630{
631 struct l2cap_chan *chan = conn->smp;
632 struct smp_chan *smp = chan->data;
633 struct hci_conn *hcon = conn->hcon;
634 struct hci_dev *hdev = hcon->hdev;
635 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
636 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
637 bool persistent;
638
639 if (smp->remote_irk) {
640 mgmt_new_irk(hdev, smp->remote_irk);
641 /* Now that user space can be considered to know the
642 * identity address track the connection based on it
643 * from now on.
644 */
645 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
646 hcon->dst_type = smp->remote_irk->addr_type;
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300647 queue_work(hdev->workqueue, &conn->id_addr_update_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300648
649 /* When receiving an indentity resolving key for
650 * a remote device that does not use a resolvable
651 * private address, just remove the key so that
652 * it is possible to use the controller white
653 * list for scanning.
654 *
655 * Userspace will have been told to not store
656 * this key at this point. So it is safe to
657 * just remove it.
658 */
659 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200660 list_del_rcu(&smp->remote_irk->list);
661 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300662 smp->remote_irk = NULL;
663 }
664 }
665
666 /* The LTKs and CSRKs should be persistent only if both sides
667 * had the bonding bit set in their authentication requests.
668 */
669 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
670
671 if (smp->csrk) {
672 smp->csrk->bdaddr_type = hcon->dst_type;
673 bacpy(&smp->csrk->bdaddr, &hcon->dst);
674 mgmt_new_csrk(hdev, smp->csrk, persistent);
675 }
676
677 if (smp->slave_csrk) {
678 smp->slave_csrk->bdaddr_type = hcon->dst_type;
679 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
680 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
681 }
682
683 if (smp->ltk) {
684 smp->ltk->bdaddr_type = hcon->dst_type;
685 bacpy(&smp->ltk->bdaddr, &hcon->dst);
686 mgmt_new_ltk(hdev, smp->ltk, persistent);
687 }
688
689 if (smp->slave_ltk) {
690 smp->slave_ltk->bdaddr_type = hcon->dst_type;
691 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
692 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
693 }
694}
695
Johan Hedbergb28b4942014-09-05 22:19:55 +0300696static void smp_allow_key_dist(struct smp_chan *smp)
697{
698 /* Allow the first expected phase 3 PDU. The rest of the PDUs
699 * will be allowed in each PDU handler to ensure we receive
700 * them in the correct order.
701 */
702 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
703 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
704 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
705 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
706 else if (smp->remote_key_dist & SMP_DIST_SIGN)
707 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
708}
709
Johan Hedbergd6268e82014-09-05 22:19:51 +0300710static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300711{
712 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300713 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300714 struct hci_conn *hcon = conn->hcon;
715 struct hci_dev *hdev = hcon->hdev;
716 __u8 *keydist;
717
718 BT_DBG("conn %p", conn);
719
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300720 rsp = (void *) &smp->prsp[1];
721
722 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +0300723 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
724 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +0300725 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300726 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300727
728 req = (void *) &smp->preq[1];
729
730 if (hcon->out) {
731 keydist = &rsp->init_key_dist;
732 *keydist &= req->init_key_dist;
733 } else {
734 keydist = &rsp->resp_key_dist;
735 *keydist &= req->resp_key_dist;
736 }
737
738 BT_DBG("keydist 0x%x", *keydist);
739
740 if (*keydist & SMP_DIST_ENC_KEY) {
741 struct smp_cmd_encrypt_info enc;
742 struct smp_cmd_master_ident ident;
743 struct smp_ltk *ltk;
744 u8 authenticated;
745 __le16 ediv;
746 __le64 rand;
747
748 get_random_bytes(enc.ltk, sizeof(enc.ltk));
749 get_random_bytes(&ediv, sizeof(ediv));
750 get_random_bytes(&rand, sizeof(rand));
751
752 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
753
754 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
755 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
756 SMP_LTK_SLAVE, authenticated, enc.ltk,
757 smp->enc_key_size, ediv, rand);
758 smp->slave_ltk = ltk;
759
760 ident.ediv = ediv;
761 ident.rand = rand;
762
763 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
764
765 *keydist &= ~SMP_DIST_ENC_KEY;
766 }
767
768 if (*keydist & SMP_DIST_ID_KEY) {
769 struct smp_cmd_ident_addr_info addrinfo;
770 struct smp_cmd_ident_info idinfo;
771
772 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
773
774 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
775
776 /* The hci_conn contains the local identity address
777 * after the connection has been established.
778 *
779 * This is true even when the connection has been
780 * established using a resolvable random address.
781 */
782 bacpy(&addrinfo.bdaddr, &hcon->src);
783 addrinfo.addr_type = hcon->src_type;
784
785 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
786 &addrinfo);
787
788 *keydist &= ~SMP_DIST_ID_KEY;
789 }
790
791 if (*keydist & SMP_DIST_SIGN) {
792 struct smp_cmd_sign_info sign;
793 struct smp_csrk *csrk;
794
795 /* Generate a new random key */
796 get_random_bytes(sign.csrk, sizeof(sign.csrk));
797
798 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
799 if (csrk) {
800 csrk->master = 0x00;
801 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
802 }
803 smp->slave_csrk = csrk;
804
805 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
806
807 *keydist &= ~SMP_DIST_SIGN;
808 }
809
810 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +0300811 if (smp->remote_key_dist & KEY_DIST_MASK) {
812 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +0300813 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300814 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300815
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300816 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
817 smp_notify_keys(conn);
818
819 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300820}
821
Johan Hedbergb68fda62014-08-11 22:06:40 +0300822static void smp_timeout(struct work_struct *work)
823{
824 struct smp_chan *smp = container_of(work, struct smp_chan,
825 security_timer.work);
826 struct l2cap_conn *conn = smp->conn;
827
828 BT_DBG("conn %p", conn);
829
Johan Hedberg1e91c292014-08-18 20:33:29 +0300830 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +0300831}
832
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300833static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
834{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300835 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300836 struct smp_chan *smp;
837
Marcel Holtmannf1560462013-10-13 05:43:25 -0700838 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300839 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300840 return NULL;
841
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300842 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
843 if (IS_ERR(smp->tfm_aes)) {
844 BT_ERR("Unable to create ECB crypto context");
845 kfree(smp);
846 return NULL;
847 }
848
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300849 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300850 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300851
Johan Hedbergb28b4942014-09-05 22:19:55 +0300852 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
853
Johan Hedbergb68fda62014-08-11 22:06:40 +0300854 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
855
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300856 hci_conn_hold(conn->hcon);
857
858 return smp;
859}
860
Brian Gix2b64d152011-12-21 16:12:12 -0800861int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
862{
Johan Hedbergb10e8012014-06-27 14:23:07 +0300863 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300864 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -0800865 struct smp_chan *smp;
866 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300867 int err;
Brian Gix2b64d152011-12-21 16:12:12 -0800868
869 BT_DBG("");
870
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300871 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -0800872 return -ENOTCONN;
873
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300874 chan = conn->smp;
875 if (!chan)
876 return -ENOTCONN;
877
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300878 l2cap_chan_lock(chan);
879 if (!chan->data) {
880 err = -ENOTCONN;
881 goto unlock;
882 }
883
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300884 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800885
886 switch (mgmt_op) {
887 case MGMT_OP_USER_PASSKEY_REPLY:
888 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200889 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800890 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200891 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800892 /* Fall Through */
893 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300894 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800895 break;
896 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
897 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200898 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300899 err = 0;
900 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800901 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200902 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300903 err = -EOPNOTSUPP;
904 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800905 }
906
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300907 err = 0;
908
Brian Gix2b64d152011-12-21 16:12:12 -0800909 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300910 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
911 u8 rsp = smp_confirm(smp);
912 if (rsp)
913 smp_failure(conn, rsp);
914 }
Brian Gix2b64d152011-12-21 16:12:12 -0800915
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300916unlock:
917 l2cap_chan_unlock(chan);
918 return err;
Brian Gix2b64d152011-12-21 16:12:12 -0800919}
920
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300921static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300922{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300923 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300924 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300925 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300926 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300927 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300928 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300929
930 BT_DBG("conn %p", conn);
931
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200932 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300933 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200934
Johan Hedberg40bef302014-07-16 11:42:27 +0300935 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800936 return SMP_CMD_NOTSUPP;
937
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300938 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300939 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300940 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300941 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300942
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300943 if (!smp)
944 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300945
Johan Hedbergc05b9332014-09-10 17:37:42 -0700946 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300947 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -0700948
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300949 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -0700950 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +0300951 return SMP_PAIRING_NOTSUPP;
952
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300953 smp->preq[0] = SMP_CMD_PAIRING_REQ;
954 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300955 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300956
Johan Hedberg5be5e272014-09-10 17:58:54 -0700957 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -0700958 sec_level = BT_SECURITY_MEDIUM;
959 else
960 sec_level = authreq_to_seclevel(auth);
961
Johan Hedbergc7262e72014-06-17 13:07:37 +0300962 if (sec_level > conn->hcon->pending_sec_level)
963 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +0200964
Stephen Hemminger49c922b2014-10-27 21:12:20 -0700965 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300966 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
967 u8 method;
968
969 method = get_auth_method(smp, conn->hcon->io_capability,
970 req->io_capability);
971 if (method == JUST_WORKS || method == JUST_CFM)
972 return SMP_AUTH_REQUIREMENTS;
973 }
974
Brian Gix2b64d152011-12-21 16:12:12 -0800975 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300976
Johan Hedberg65668772014-05-16 11:03:34 +0300977 if (rsp.auth_req & SMP_AUTH_SC)
978 set_bit(SMP_FLAG_SC, &smp->flags);
979
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300980 key_size = min(req->max_key_size, rsp.max_key_size);
981 if (check_enc_key_size(conn, key_size))
982 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300983
Johan Hedberge84a6b12013-12-02 10:49:03 +0200984 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300985
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300986 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
987 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300988
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300989 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedbergb28b4942014-09-05 22:19:55 +0300990 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300991
Brian Gix2b64d152011-12-21 16:12:12 -0800992 /* Request setup of TK */
993 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
994 if (ret)
995 return SMP_UNSPECIFIED;
996
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300997 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300998}
999
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001000static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001001{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001002 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001003 struct l2cap_chan *chan = conn->smp;
1004 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001005 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001006 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001007 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001008
1009 BT_DBG("conn %p", conn);
1010
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001011 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001012 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001013
Johan Hedberg40bef302014-07-16 11:42:27 +03001014 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001015 return SMP_CMD_NOTSUPP;
1016
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001017 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001018
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001019 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001020
1021 key_size = min(req->max_key_size, rsp->max_key_size);
1022 if (check_enc_key_size(conn, key_size))
1023 return SMP_ENC_KEY_SIZE;
1024
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001025 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001026
Johan Hedberg65668772014-05-16 11:03:34 +03001027 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1028 set_bit(SMP_FLAG_SC, &smp->flags);
1029
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001030 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001031 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1032 u8 method;
1033
1034 method = get_auth_method(smp, req->io_capability,
1035 rsp->io_capability);
1036 if (method == JUST_WORKS || method == JUST_CFM)
1037 return SMP_AUTH_REQUIREMENTS;
1038 }
1039
Johan Hedberge84a6b12013-12-02 10:49:03 +02001040 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001041
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001042 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1043 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001044
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001045 /* Update remote key distribution in case the remote cleared
1046 * some bits that we had enabled in our request.
1047 */
1048 smp->remote_key_dist &= rsp->resp_key_dist;
1049
Johan Hedbergc05b9332014-09-10 17:37:42 -07001050 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001051
Johan Hedberg476585e2012-06-06 18:54:15 +08001052 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001053 if (ret)
1054 return SMP_UNSPECIFIED;
1055
Johan Hedberg4a74d652014-05-20 09:45:50 +03001056 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001057
1058 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001059 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001060 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001061
1062 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001063}
1064
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001065static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001066{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001067 struct l2cap_chan *chan = conn->smp;
1068 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001069
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001070 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1071
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001072 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001073 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001074
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001075 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1076 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001077
Johan Hedbergb28b4942014-09-05 22:19:55 +03001078 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001079 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1080 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001081 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1082 return 0;
1083 }
1084
1085 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001086 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001087 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001088 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001089
1090 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001091}
1092
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001093static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001094{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001095 struct l2cap_chan *chan = conn->smp;
1096 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001097
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001098 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001099
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001100 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001101 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001102
Johan Hedberg943a7322014-03-18 12:58:24 +02001103 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001104 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001105
Johan Hedberg861580a2014-05-20 09:45:51 +03001106 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001107}
1108
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001109static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001110{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001111 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001112 struct hci_conn *hcon = conn->hcon;
1113
Johan Hedberg98a0b842014-01-30 19:40:00 -08001114 key = hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001115 hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001116 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001117 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001118
Johan Hedberga6f78332014-09-10 17:37:45 -07001119 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001120 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001121
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001122 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001123 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001124
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001125 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1126 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001127
Johan Hedbergfe59a052014-07-01 19:14:12 +03001128 /* We never store STKs for master role, so clear this flag */
1129 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1130
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001131 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001132}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001133
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001134bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
1135 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03001136{
1137 if (sec_level == BT_SECURITY_LOW)
1138 return true;
1139
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001140 /* If we're encrypted with an STK but the caller prefers using
1141 * LTK claim insufficient security. This way we allow the
1142 * connection to be re-encrypted with an LTK, even if the LTK
1143 * provides the same level of security. Only exception is if we
1144 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001145 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001146 if (key_pref == SMP_USE_LTK &&
1147 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001148 hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001149 hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001150 return false;
1151
Johan Hedberg854f4722014-07-01 18:40:20 +03001152 if (hcon->sec_level >= sec_level)
1153 return true;
1154
1155 return false;
1156}
1157
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001158static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001159{
1160 struct smp_cmd_security_req *rp = (void *) skb->data;
1161 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001162 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001163 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001164 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07001165 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001166
1167 BT_DBG("conn %p", conn);
1168
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001169 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001170 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001171
Johan Hedberg40bef302014-07-16 11:42:27 +03001172 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001173 return SMP_CMD_NOTSUPP;
1174
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001175 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001176
Johan Hedberg5be5e272014-09-10 17:58:54 -07001177 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001178 sec_level = BT_SECURITY_MEDIUM;
1179 else
1180 sec_level = authreq_to_seclevel(auth);
1181
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001182 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03001183 return 0;
1184
Johan Hedbergc7262e72014-06-17 13:07:37 +03001185 if (sec_level > hcon->pending_sec_level)
1186 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001187
Johan Hedberg4dab7862012-06-07 14:58:37 +08001188 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001189 return 0;
1190
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001191 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001192 if (!smp)
1193 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001194
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001195 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001196 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03001197 return SMP_PAIRING_NOTSUPP;
1198
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001199 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001200
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001201 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07001202 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001203
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001204 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1205 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001206
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001207 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001208 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001209
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001210 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001211}
1212
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001213int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001214{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001215 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001216 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001217 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001218 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001219 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001220
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001221 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1222
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001223 /* This may be NULL if there's an unexpected disconnection */
1224 if (!conn)
1225 return 1;
1226
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001227 chan = conn->smp;
1228
Johan Hedberg757aee02013-04-24 13:05:32 +03001229 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001230 return 1;
1231
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001232 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001233 return 1;
1234
Johan Hedbergc7262e72014-06-17 13:07:37 +03001235 if (sec_level > hcon->pending_sec_level)
1236 hcon->pending_sec_level = sec_level;
1237
Johan Hedberg40bef302014-07-16 11:42:27 +03001238 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001239 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1240 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001241
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001242 l2cap_chan_lock(chan);
1243
1244 /* If SMP is already in progress ignore this request */
1245 if (chan->data) {
1246 ret = 0;
1247 goto unlock;
1248 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001249
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001250 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001251 if (!smp) {
1252 ret = 1;
1253 goto unlock;
1254 }
Brian Gix2b64d152011-12-21 16:12:12 -08001255
1256 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001257
Johan Hedberg79897d22014-06-01 09:45:24 +03001258 /* Require MITM if IO Capability allows or the security level
1259 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02001260 */
Johan Hedberg79897d22014-06-01 09:45:24 +03001261 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03001262 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02001263 authreq |= SMP_AUTH_MITM;
1264
Johan Hedberg40bef302014-07-16 11:42:27 +03001265 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001266 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001267
Brian Gix2b64d152011-12-21 16:12:12 -08001268 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001269 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1270 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001271
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001272 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001273 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001274 } else {
1275 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08001276 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001277 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001278 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001279 }
1280
Johan Hedberg4a74d652014-05-20 09:45:50 +03001281 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001282 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02001283
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001284unlock:
1285 l2cap_chan_unlock(chan);
1286 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001287}
1288
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001289static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1290{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001291 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001292 struct l2cap_chan *chan = conn->smp;
1293 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001294
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001295 BT_DBG("conn %p", conn);
1296
1297 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001298 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001299
Johan Hedbergb28b4942014-09-05 22:19:55 +03001300 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001301
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001302 skb_pull(skb, sizeof(*rp));
1303
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001304 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001305
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001306 return 0;
1307}
1308
1309static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1310{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001311 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001312 struct l2cap_chan *chan = conn->smp;
1313 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001314 struct hci_dev *hdev = conn->hcon->hdev;
1315 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001316 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001317 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001318
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001319 BT_DBG("conn %p", conn);
1320
1321 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001322 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001323
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001324 /* Mark the information as received */
1325 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1326
Johan Hedbergb28b4942014-09-05 22:19:55 +03001327 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1328 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07001329 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1330 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001331
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001332 skb_pull(skb, sizeof(*rp));
1333
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001334 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001335 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001336 authenticated, smp->tk, smp->enc_key_size,
1337 rp->ediv, rp->rand);
1338 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001339 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03001340 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001341
1342 return 0;
1343}
1344
Johan Hedbergfd349c02014-02-18 10:19:36 +02001345static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1346{
1347 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001348 struct l2cap_chan *chan = conn->smp;
1349 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001350
1351 BT_DBG("");
1352
1353 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001354 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001355
Johan Hedbergb28b4942014-09-05 22:19:55 +03001356 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001357
Johan Hedbergfd349c02014-02-18 10:19:36 +02001358 skb_pull(skb, sizeof(*info));
1359
1360 memcpy(smp->irk, info->irk, 16);
1361
1362 return 0;
1363}
1364
1365static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1366 struct sk_buff *skb)
1367{
1368 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001369 struct l2cap_chan *chan = conn->smp;
1370 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001371 struct hci_conn *hcon = conn->hcon;
1372 bdaddr_t rpa;
1373
1374 BT_DBG("");
1375
1376 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001377 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001378
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001379 /* Mark the information as received */
1380 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1381
Johan Hedbergb28b4942014-09-05 22:19:55 +03001382 if (smp->remote_key_dist & SMP_DIST_SIGN)
1383 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1384
Johan Hedbergfd349c02014-02-18 10:19:36 +02001385 skb_pull(skb, sizeof(*info));
1386
Johan Hedberga9a58f82014-02-25 22:24:37 +02001387 /* Strictly speaking the Core Specification (4.1) allows sending
1388 * an empty address which would force us to rely on just the IRK
1389 * as "identity information". However, since such
1390 * implementations are not known of and in order to not over
1391 * complicate our implementation, simply pretend that we never
1392 * received an IRK for such a device.
1393 */
1394 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1395 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001396 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001397 }
1398
Johan Hedbergfd349c02014-02-18 10:19:36 +02001399 bacpy(&smp->id_addr, &info->bdaddr);
1400 smp->id_addr_type = info->addr_type;
1401
1402 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1403 bacpy(&rpa, &hcon->dst);
1404 else
1405 bacpy(&rpa, BDADDR_ANY);
1406
Johan Hedberg23d0e122014-02-19 14:57:46 +02001407 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1408 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001409
Johan Hedberg31dd6242014-06-27 14:23:02 +03001410distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001411 if (!(smp->remote_key_dist & KEY_DIST_MASK))
1412 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001413
1414 return 0;
1415}
1416
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001417static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1418{
1419 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001420 struct l2cap_chan *chan = conn->smp;
1421 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001422 struct smp_csrk *csrk;
1423
1424 BT_DBG("conn %p", conn);
1425
1426 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001427 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001428
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001429 /* Mark the information as received */
1430 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1431
1432 skb_pull(skb, sizeof(*rp));
1433
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001434 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1435 if (csrk) {
1436 csrk->master = 0x01;
1437 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1438 }
1439 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03001440 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001441
1442 return 0;
1443}
1444
Johan Hedberg4befb862014-08-11 22:06:38 +03001445static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001446{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001447 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001448 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001449 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001450 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001451 int err = 0;
1452
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001453 if (hcon->type != LE_LINK) {
1454 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001455 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001456 }
1457
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001458 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07001459 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001460
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001461 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001462 reason = SMP_PAIRING_NOTSUPP;
1463 goto done;
1464 }
1465
Marcel Holtmann92381f52013-10-03 01:23:08 -07001466 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001467 skb_pull(skb, sizeof(code));
1468
Johan Hedbergb28b4942014-09-05 22:19:55 +03001469 smp = chan->data;
1470
1471 if (code > SMP_CMD_MAX)
1472 goto drop;
1473
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07001474 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03001475 goto drop;
1476
1477 /* If we don't have a context the only allowed commands are
1478 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001479 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001480 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
1481 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001482
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001483 switch (code) {
1484 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001485 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001486 break;
1487
1488 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001489 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001490 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001491 break;
1492
1493 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001494 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001495 break;
1496
1497 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001498 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001499 break;
1500
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001501 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001502 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001503 break;
1504
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001505 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001506 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001507 break;
1508
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001509 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001510 reason = smp_cmd_encrypt_info(conn, skb);
1511 break;
1512
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001513 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001514 reason = smp_cmd_master_ident(conn, skb);
1515 break;
1516
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001517 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001518 reason = smp_cmd_ident_info(conn, skb);
1519 break;
1520
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001521 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001522 reason = smp_cmd_ident_addr_info(conn, skb);
1523 break;
1524
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001525 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001526 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001527 break;
1528
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001529 default:
1530 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001531 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001532 goto done;
1533 }
1534
1535done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001536 if (!err) {
1537 if (reason)
1538 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001539 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001540 }
1541
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001542 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001543
1544drop:
1545 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
1546 code, &hcon->dst);
1547 kfree_skb(skb);
1548 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001549}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001550
Johan Hedberg70db83c2014-08-08 09:37:16 +03001551static void smp_teardown_cb(struct l2cap_chan *chan, int err)
1552{
1553 struct l2cap_conn *conn = chan->conn;
1554
1555 BT_DBG("chan %p", chan);
1556
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001557 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001558 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001559
Johan Hedberg70db83c2014-08-08 09:37:16 +03001560 conn->smp = NULL;
1561 l2cap_chan_put(chan);
1562}
1563
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001564static void smp_resume_cb(struct l2cap_chan *chan)
1565{
Johan Hedbergb68fda62014-08-11 22:06:40 +03001566 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001567 struct l2cap_conn *conn = chan->conn;
1568 struct hci_conn *hcon = conn->hcon;
1569
1570 BT_DBG("chan %p", chan);
1571
Johan Hedberg86d14072014-08-11 22:06:43 +03001572 if (!smp)
1573 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03001574
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001575 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
1576 return;
1577
Johan Hedberg86d14072014-08-11 22:06:43 +03001578 cancel_delayed_work(&smp->security_timer);
1579
Johan Hedbergd6268e82014-09-05 22:19:51 +03001580 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001581}
1582
Johan Hedberg70db83c2014-08-08 09:37:16 +03001583static void smp_ready_cb(struct l2cap_chan *chan)
1584{
1585 struct l2cap_conn *conn = chan->conn;
1586
1587 BT_DBG("chan %p", chan);
1588
1589 conn->smp = chan;
1590 l2cap_chan_hold(chan);
1591}
1592
Johan Hedberg4befb862014-08-11 22:06:38 +03001593static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
1594{
1595 int err;
1596
1597 BT_DBG("chan %p", chan);
1598
1599 err = smp_sig_channel(chan, skb);
1600 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03001601 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03001602
Johan Hedbergb68fda62014-08-11 22:06:40 +03001603 if (smp)
1604 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03001605
Johan Hedberg1e91c292014-08-18 20:33:29 +03001606 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03001607 }
1608
1609 return err;
1610}
1611
Johan Hedberg70db83c2014-08-08 09:37:16 +03001612static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
1613 unsigned long hdr_len,
1614 unsigned long len, int nb)
1615{
1616 struct sk_buff *skb;
1617
1618 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
1619 if (!skb)
1620 return ERR_PTR(-ENOMEM);
1621
1622 skb->priority = HCI_PRIO_MAX;
1623 bt_cb(skb)->chan = chan;
1624
1625 return skb;
1626}
1627
1628static const struct l2cap_ops smp_chan_ops = {
1629 .name = "Security Manager",
1630 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001631 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001632 .alloc_skb = smp_alloc_skb_cb,
1633 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001634 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001635
1636 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001637 .state_change = l2cap_chan_no_state_change,
1638 .close = l2cap_chan_no_close,
1639 .defer = l2cap_chan_no_defer,
1640 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001641 .set_shutdown = l2cap_chan_no_set_shutdown,
1642 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1643 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1644};
1645
1646static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
1647{
1648 struct l2cap_chan *chan;
1649
1650 BT_DBG("pchan %p", pchan);
1651
1652 chan = l2cap_chan_create();
1653 if (!chan)
1654 return NULL;
1655
1656 chan->chan_type = pchan->chan_type;
1657 chan->ops = &smp_chan_ops;
1658 chan->scid = pchan->scid;
1659 chan->dcid = chan->scid;
1660 chan->imtu = pchan->imtu;
1661 chan->omtu = pchan->omtu;
1662 chan->mode = pchan->mode;
1663
Johan Hedbergabe84902014-11-12 22:22:21 +02001664 /* Other L2CAP channels may request SMP routines in order to
1665 * change the security level. This means that the SMP channel
1666 * lock must be considered in its own category to avoid lockdep
1667 * warnings.
1668 */
1669 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
1670
Johan Hedberg70db83c2014-08-08 09:37:16 +03001671 BT_DBG("created chan %p", chan);
1672
1673 return chan;
1674}
1675
1676static const struct l2cap_ops smp_root_chan_ops = {
1677 .name = "Security Manager Root",
1678 .new_connection = smp_new_conn_cb,
1679
1680 /* None of these are implemented for the root channel */
1681 .close = l2cap_chan_no_close,
1682 .alloc_skb = l2cap_chan_no_alloc_skb,
1683 .recv = l2cap_chan_no_recv,
1684 .state_change = l2cap_chan_no_state_change,
1685 .teardown = l2cap_chan_no_teardown,
1686 .ready = l2cap_chan_no_ready,
1687 .defer = l2cap_chan_no_defer,
1688 .suspend = l2cap_chan_no_suspend,
1689 .resume = l2cap_chan_no_resume,
1690 .set_shutdown = l2cap_chan_no_set_shutdown,
1691 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1692 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1693};
1694
Johan Hedberg711eafe2014-08-08 09:32:52 +03001695int smp_register(struct hci_dev *hdev)
1696{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001697 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001698 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001699
Johan Hedberg711eafe2014-08-08 09:32:52 +03001700 BT_DBG("%s", hdev->name);
1701
Johan Hedbergadae20c2014-11-13 14:37:48 +02001702 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001703 if (IS_ERR(tfm_aes)) {
1704 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001705 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03001706 return err;
1707 }
1708
Johan Hedberg70db83c2014-08-08 09:37:16 +03001709 chan = l2cap_chan_create();
1710 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001711 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001712 return -ENOMEM;
1713 }
1714
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001715 chan->data = tfm_aes;
1716
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001717 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001718
1719 l2cap_chan_set_defaults(chan);
1720
1721 bacpy(&chan->src, &hdev->bdaddr);
1722 chan->src_type = BDADDR_LE_PUBLIC;
1723 chan->state = BT_LISTEN;
1724 chan->mode = L2CAP_MODE_BASIC;
1725 chan->imtu = L2CAP_DEFAULT_MTU;
1726 chan->ops = &smp_root_chan_ops;
1727
Johan Hedbergabe84902014-11-12 22:22:21 +02001728 /* Set correct nesting level for a parent/listening channel */
1729 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
1730
Johan Hedberg70db83c2014-08-08 09:37:16 +03001731 hdev->smp_data = chan;
1732
Johan Hedberg711eafe2014-08-08 09:32:52 +03001733 return 0;
1734}
1735
1736void smp_unregister(struct hci_dev *hdev)
1737{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001738 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001739 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001740
1741 if (!chan)
1742 return;
1743
1744 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001745
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001746 tfm_aes = chan->data;
1747 if (tfm_aes) {
1748 chan->data = NULL;
1749 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001750 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03001751
1752 hdev->smp_data = NULL;
1753 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001754}