blob: 9accb47394882d44d849a452b4f96875451f3a6a [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
Marcel Holtmann17b02e62012-03-01 14:32:37 -080034#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030035
Johan Hedberg065a13e2012-10-11 16:26:06 +020036#define AUTH_REQ_MASK 0x07
37
Johan Hedberg533e35d2014-06-16 19:25:18 +030038enum {
39 SMP_FLAG_TK_VALID,
40 SMP_FLAG_CFM_PENDING,
41 SMP_FLAG_MITM_AUTH,
42 SMP_FLAG_COMPLETE,
43 SMP_FLAG_INITIATOR,
44};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030045
46struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030047 struct l2cap_conn *conn;
48 struct delayed_work security_timer;
Johan Hedberg86d14072014-08-11 22:06:43 +030049 struct work_struct distribute_work;
Johan Hedbergb68fda62014-08-11 22:06:40 +030050
Johan Hedberg4bc58f52014-05-20 09:45:47 +030051 u8 preq[7]; /* SMP Pairing Request */
52 u8 prsp[7]; /* SMP Pairing Response */
53 u8 prnd[16]; /* SMP Pairing Random (local) */
54 u8 rrnd[16]; /* SMP Pairing Random (remote) */
55 u8 pcnf[16]; /* SMP Pairing Confirm */
56 u8 tk[16]; /* SMP Temporary Key */
57 u8 enc_key_size;
58 u8 remote_key_dist;
59 bdaddr_t id_addr;
60 u8 id_addr_type;
61 u8 irk[16];
62 struct smp_csrk *csrk;
63 struct smp_csrk *slave_csrk;
64 struct smp_ltk *ltk;
65 struct smp_ltk *slave_ltk;
66 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030067 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030068
69 struct crypto_blkcipher *tfm_aes;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030070};
71
Johan Hedberg8a2936f2014-06-16 19:25:19 +030072static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030073{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030074 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030075
Johan Hedberg8a2936f2014-06-16 19:25:19 +030076 for (i = 0; i < len; i++)
77 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030078}
79
80static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
81{
82 struct blkcipher_desc desc;
83 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +020084 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +020085 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030086
87 if (tfm == NULL) {
88 BT_ERR("tfm %p", tfm);
89 return -EINVAL;
90 }
91
92 desc.tfm = tfm;
93 desc.flags = 0;
94
Johan Hedberg943a7322014-03-18 12:58:24 +020095 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +030096 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +020097
98 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030099 if (err) {
100 BT_ERR("cipher setkey failed: %d", err);
101 return err;
102 }
103
Johan Hedberg943a7322014-03-18 12:58:24 +0200104 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300105 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200106
107 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300108
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300109 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
110 if (err)
111 BT_ERR("Encrypt data error %d", err);
112
Johan Hedberg943a7322014-03-18 12:58:24 +0200113 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300114 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200115
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300116 return err;
117}
118
Johan Hedberg60478052014-02-18 10:19:31 +0200119static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
120{
Johan Hedberg943a7322014-03-18 12:58:24 +0200121 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200122 int err;
123
124 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200125 memcpy(_res, r, 3);
126 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200127
Johan Hedberg943a7322014-03-18 12:58:24 +0200128 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200129 if (err) {
130 BT_ERR("Encrypt error");
131 return err;
132 }
133
134 /* The output of the random address function ah is:
135 * ah(h, r) = e(k, r') mod 2^24
136 * The output of the security function e is then truncated to 24 bits
137 * by taking the least significant 24 bits of the output of e as the
138 * result of ah.
139 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200140 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200141
142 return 0;
143}
144
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300145bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200146{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300147 struct l2cap_chan *chan = hdev->smp_data;
148 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200149 u8 hash[3];
150 int err;
151
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300152 if (!chan || !chan->data)
153 return false;
154
155 tfm = chan->data;
156
Johan Hedberg60478052014-02-18 10:19:31 +0200157 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
158
159 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
160 if (err)
161 return false;
162
163 return !memcmp(bdaddr->b, hash, 3);
164}
165
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300166int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200167{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300168 struct l2cap_chan *chan = hdev->smp_data;
169 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200170 int err;
171
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300172 if (!chan || !chan->data)
173 return -EOPNOTSUPP;
174
175 tfm = chan->data;
176
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200177 get_random_bytes(&rpa->b[3], 3);
178
179 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
180 rpa->b[5] |= 0x40; /* Set second most significant bit */
181
182 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
183 if (err < 0)
184 return err;
185
186 BT_DBG("RPA %pMR", rpa);
187
188 return 0;
189}
190
Johan Hedbergec70f362014-06-27 14:23:04 +0300191static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
192 u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
193 u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300194{
Johan Hedbergec70f362014-06-27 14:23:04 +0300195 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300196 u8 p1[16], p2[16];
197 int err;
198
Johan Hedbergec70f362014-06-27 14:23:04 +0300199 BT_DBG("%s", hdev->name);
200
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300201 memset(p1, 0, 16);
202
203 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200204 p1[0] = _iat;
205 p1[1] = _rat;
206 memcpy(p1 + 2, preq, 7);
207 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300208
209 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200210 memcpy(p2, ra, 6);
211 memcpy(p2 + 6, ia, 6);
212 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300213
214 /* res = r XOR p1 */
215 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
216
217 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300218 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300219 if (err) {
220 BT_ERR("Encrypt data error");
221 return err;
222 }
223
224 /* res = res XOR p2 */
225 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
226
227 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300228 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300229 if (err)
230 BT_ERR("Encrypt data error");
231
232 return err;
233}
234
Johan Hedbergec70f362014-06-27 14:23:04 +0300235static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
236 u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300237{
Johan Hedbergec70f362014-06-27 14:23:04 +0300238 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300239 int err;
240
Johan Hedbergec70f362014-06-27 14:23:04 +0300241 BT_DBG("%s", hdev->name);
242
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300243 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200244 memcpy(_r, r2, 8);
245 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300246
Johan Hedbergec70f362014-06-27 14:23:04 +0300247 err = smp_e(smp->tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300248 if (err)
249 BT_ERR("Encrypt data error");
250
251 return err;
252}
253
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300254static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
255{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300256 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300257 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300258 struct kvec iv[2];
259 struct msghdr msg;
260
261 if (!chan)
262 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300263
264 BT_DBG("code 0x%2.2x", code);
265
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300266 iv[0].iov_base = &code;
267 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300268
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300269 iv[1].iov_base = data;
270 iv[1].iov_len = len;
271
272 memset(&msg, 0, sizeof(msg));
273
274 msg.msg_iov = (struct iovec *) &iv;
275 msg.msg_iovlen = 2;
276
277 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300278
Johan Hedbergb68fda62014-08-11 22:06:40 +0300279 if (!chan->data)
280 return;
281
282 smp = chan->data;
283
284 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300285 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300286}
287
Brian Gix2b64d152011-12-21 16:12:12 -0800288static __u8 authreq_to_seclevel(__u8 authreq)
289{
290 if (authreq & SMP_AUTH_MITM)
291 return BT_SECURITY_HIGH;
292 else
293 return BT_SECURITY_MEDIUM;
294}
295
296static __u8 seclevel_to_authreq(__u8 sec_level)
297{
298 switch (sec_level) {
299 case BT_SECURITY_HIGH:
300 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
301 case BT_SECURITY_MEDIUM:
302 return SMP_AUTH_BONDING;
303 default:
304 return SMP_AUTH_NONE;
305 }
306}
307
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300308static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700309 struct smp_cmd_pairing *req,
310 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300311{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300312 struct l2cap_chan *chan = conn->smp;
313 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200314 struct hci_conn *hcon = conn->hcon;
315 struct hci_dev *hdev = hcon->hdev;
316 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300317
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300318 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700319 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
320 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300321 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800322 } else {
323 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300324 }
325
Johan Hedbergfd349c02014-02-18 10:19:36 +0200326 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
327 remote_dist |= SMP_DIST_ID_KEY;
328
Johan Hedberg863efaf2014-02-22 19:06:32 +0200329 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
330 local_dist |= SMP_DIST_ID_KEY;
331
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300332 if (rsp == NULL) {
333 req->io_capability = conn->hcon->io_capability;
334 req->oob_flag = SMP_OOB_NOT_PRESENT;
335 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200336 req->init_key_dist = local_dist;
337 req->resp_key_dist = remote_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200338 req->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200339
340 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300341 return;
342 }
343
344 rsp->io_capability = conn->hcon->io_capability;
345 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
346 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200347 rsp->init_key_dist = req->init_key_dist & remote_dist;
348 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200349 rsp->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200350
351 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300352}
353
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300354static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
355{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300356 struct l2cap_chan *chan = conn->smp;
357 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300358
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300359 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700360 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300361 return SMP_ENC_KEY_SIZE;
362
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300363 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300364
365 return 0;
366}
367
Johan Hedberg6f48e262014-08-11 22:06:44 +0300368static void smp_chan_destroy(struct l2cap_conn *conn)
369{
370 struct l2cap_chan *chan = conn->smp;
371 struct smp_chan *smp = chan->data;
372 bool complete;
373
374 BUG_ON(!smp);
375
376 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300377
378 if (work_pending(&smp->distribute_work)) {
379 cancel_work_sync(&smp->distribute_work);
380 if (!chan->data)
381 return;
382 }
383
384 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
385 mgmt_smp_complete(conn->hcon, complete);
386
387 kfree(smp->csrk);
388 kfree(smp->slave_csrk);
389
390 crypto_free_blkcipher(smp->tfm_aes);
391
392 /* If pairing failed clean up any keys we might have */
393 if (!complete) {
394 if (smp->ltk) {
395 list_del(&smp->ltk->list);
396 kfree(smp->ltk);
397 }
398
399 if (smp->slave_ltk) {
400 list_del(&smp->slave_ltk->list);
401 kfree(smp->slave_ltk);
402 }
403
404 if (smp->remote_irk) {
405 list_del(&smp->remote_irk->list);
406 kfree(smp->remote_irk);
407 }
408 }
409
410 chan->data = NULL;
411 kfree(smp);
412 hci_conn_drop(conn->hcon);
413}
414
Johan Hedberg84794e12013-11-06 11:24:57 +0200415static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800416{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200417 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300418 struct l2cap_chan *chan = conn->smp;
419 struct smp_chan *smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200420
Johan Hedberg84794e12013-11-06 11:24:57 +0200421 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800422 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700423 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800424
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700425 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
426 mgmt_auth_failed(hcon->hdev, &hcon->dst, hcon->type, hcon->dst_type,
427 HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300428
Johan Hedbergb68fda62014-08-11 22:06:40 +0300429 if (!chan->data)
430 return;
431
432 smp = chan->data;
433
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700434 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300435 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800436}
437
Brian Gix2b64d152011-12-21 16:12:12 -0800438#define JUST_WORKS 0x00
439#define JUST_CFM 0x01
440#define REQ_PASSKEY 0x02
441#define CFM_PASSKEY 0x03
442#define REQ_OOB 0x04
443#define OVERLAP 0xFF
444
445static const u8 gen_method[5][5] = {
446 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
447 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
448 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
449 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
450 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
451};
452
Johan Hedberg581370c2014-06-17 13:07:38 +0300453static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
454{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300455 /* If either side has unknown io_caps, use JUST_CFM (which gets
456 * converted later to JUST_WORKS if we're initiators.
457 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300458 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
459 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300460 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300461
462 return gen_method[remote_io][local_io];
463}
464
Brian Gix2b64d152011-12-21 16:12:12 -0800465static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
466 u8 local_io, u8 remote_io)
467{
468 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300469 struct l2cap_chan *chan = conn->smp;
470 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800471 u8 method;
472 u32 passkey = 0;
473 int ret = 0;
474
475 /* Initialize key for JUST WORKS */
476 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300477 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800478
479 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
480
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300481 /* If neither side wants MITM, either "just" confirm an incoming
482 * request or use just-works for outgoing ones. The JUST_CFM
483 * will be converted to JUST_WORKS if necessary later in this
484 * function. If either side has MITM look up the method from the
485 * table.
486 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300487 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300488 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800489 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300490 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800491
Johan Hedberga82505c2014-03-24 14:39:07 +0200492 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300493 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200494 method = JUST_WORKS;
495
Johan Hedberg02f3e252014-07-16 15:09:13 +0300496 /* Don't bother user space with no IO capabilities */
497 if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
498 method = JUST_WORKS;
499
Brian Gix2b64d152011-12-21 16:12:12 -0800500 /* If Just Works, Continue with Zero TK */
501 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300502 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800503 return 0;
504 }
505
506 /* Not Just Works/Confirm results in MITM Authentication */
507 if (method != JUST_CFM)
Johan Hedberg4a74d652014-05-20 09:45:50 +0300508 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800509
510 /* If both devices have Keyoard-Display I/O, the master
511 * Confirms and the slave Enters the passkey.
512 */
513 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300514 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800515 method = CFM_PASSKEY;
516 else
517 method = REQ_PASSKEY;
518 }
519
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200520 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800521 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200522 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800523 get_random_bytes(&passkey, sizeof(passkey));
524 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200525 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800526 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300527 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800528 }
529
530 hci_dev_lock(hcon->hdev);
531
532 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700533 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200534 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200535 else if (method == JUST_CFM)
536 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
537 hcon->type, hcon->dst_type,
538 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800539 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200540 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200541 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200542 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800543
544 hci_dev_unlock(hcon->hdev);
545
546 return ret;
547}
548
Johan Hedberg1cc61142014-05-20 09:45:52 +0300549static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300550{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300551 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300552 struct smp_cmd_pairing_confirm cp;
553 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300554
555 BT_DBG("conn %p", conn);
556
Johan Hedbergec70f362014-06-27 14:23:04 +0300557 ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200558 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200559 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
560 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300561 if (ret)
562 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300563
Johan Hedberg4a74d652014-05-20 09:45:50 +0300564 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800565
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300566 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
567
Johan Hedberg1cc61142014-05-20 09:45:52 +0300568 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300569}
570
Johan Hedberg861580a2014-05-20 09:45:51 +0300571static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300572{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300573 struct l2cap_conn *conn = smp->conn;
574 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300575 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300576 int ret;
577
Johan Hedbergec70f362014-06-27 14:23:04 +0300578 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300579 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300580
581 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
582
Johan Hedbergec70f362014-06-27 14:23:04 +0300583 ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200584 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200585 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300586 if (ret)
587 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300588
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300589 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
590 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300591 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300592 }
593
594 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800595 u8 stk[16];
596 __le64 rand = 0;
597 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300598
Johan Hedbergec70f362014-06-27 14:23:04 +0300599 smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300600
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300601 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300602 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300603
Johan Hedberg861580a2014-05-20 09:45:51 +0300604 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
605 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300606
607 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300608 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300609 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300610 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300611 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800612 __le64 rand = 0;
613 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300614
Johan Hedberg943a7322014-03-18 12:58:24 +0200615 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
616 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300617
Johan Hedbergec70f362014-06-27 14:23:04 +0300618 smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300619
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300620 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700621 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300622
Johan Hedbergfff34902014-06-10 15:19:50 +0300623 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
624 auth = 1;
625 else
626 auth = 0;
627
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300628 /* Even though there's no _SLAVE suffix this is the
629 * slave STK we're adding for later lookup (the master
630 * STK never needs to be stored).
631 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700632 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300633 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300634 }
635
Johan Hedberg861580a2014-05-20 09:45:51 +0300636 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300637}
638
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300639static void smp_notify_keys(struct l2cap_conn *conn)
640{
641 struct l2cap_chan *chan = conn->smp;
642 struct smp_chan *smp = chan->data;
643 struct hci_conn *hcon = conn->hcon;
644 struct hci_dev *hdev = hcon->hdev;
645 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
646 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
647 bool persistent;
648
649 if (smp->remote_irk) {
650 mgmt_new_irk(hdev, smp->remote_irk);
651 /* Now that user space can be considered to know the
652 * identity address track the connection based on it
653 * from now on.
654 */
655 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
656 hcon->dst_type = smp->remote_irk->addr_type;
657 l2cap_conn_update_id_addr(hcon);
658
659 /* When receiving an indentity resolving key for
660 * a remote device that does not use a resolvable
661 * private address, just remove the key so that
662 * it is possible to use the controller white
663 * list for scanning.
664 *
665 * Userspace will have been told to not store
666 * this key at this point. So it is safe to
667 * just remove it.
668 */
669 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
670 list_del(&smp->remote_irk->list);
671 kfree(smp->remote_irk);
672 smp->remote_irk = NULL;
673 }
674 }
675
676 /* The LTKs and CSRKs should be persistent only if both sides
677 * had the bonding bit set in their authentication requests.
678 */
679 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
680
681 if (smp->csrk) {
682 smp->csrk->bdaddr_type = hcon->dst_type;
683 bacpy(&smp->csrk->bdaddr, &hcon->dst);
684 mgmt_new_csrk(hdev, smp->csrk, persistent);
685 }
686
687 if (smp->slave_csrk) {
688 smp->slave_csrk->bdaddr_type = hcon->dst_type;
689 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
690 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
691 }
692
693 if (smp->ltk) {
694 smp->ltk->bdaddr_type = hcon->dst_type;
695 bacpy(&smp->ltk->bdaddr, &hcon->dst);
696 mgmt_new_ltk(hdev, smp->ltk, persistent);
697 }
698
699 if (smp->slave_ltk) {
700 smp->slave_ltk->bdaddr_type = hcon->dst_type;
701 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
702 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
703 }
704}
705
Johan Hedberg86d14072014-08-11 22:06:43 +0300706static void smp_distribute_keys(struct work_struct *work)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300707{
Johan Hedberg86d14072014-08-11 22:06:43 +0300708 struct smp_chan *smp = container_of(work, struct smp_chan,
709 distribute_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300710 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300711 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300712 struct hci_conn *hcon = conn->hcon;
713 struct hci_dev *hdev = hcon->hdev;
714 __u8 *keydist;
715
716 BT_DBG("conn %p", conn);
717
718 if (!test_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Johan Hedberg86d14072014-08-11 22:06:43 +0300719 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300720
721 rsp = (void *) &smp->prsp[1];
722
723 /* The responder sends its keys first */
724 if (hcon->out && (smp->remote_key_dist & 0x07))
Johan Hedberg86d14072014-08-11 22:06:43 +0300725 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300726
727 req = (void *) &smp->preq[1];
728
729 if (hcon->out) {
730 keydist = &rsp->init_key_dist;
731 *keydist &= req->init_key_dist;
732 } else {
733 keydist = &rsp->resp_key_dist;
734 *keydist &= req->resp_key_dist;
735 }
736
737 BT_DBG("keydist 0x%x", *keydist);
738
739 if (*keydist & SMP_DIST_ENC_KEY) {
740 struct smp_cmd_encrypt_info enc;
741 struct smp_cmd_master_ident ident;
742 struct smp_ltk *ltk;
743 u8 authenticated;
744 __le16 ediv;
745 __le64 rand;
746
747 get_random_bytes(enc.ltk, sizeof(enc.ltk));
748 get_random_bytes(&ediv, sizeof(ediv));
749 get_random_bytes(&rand, sizeof(rand));
750
751 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
752
753 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
754 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
755 SMP_LTK_SLAVE, authenticated, enc.ltk,
756 smp->enc_key_size, ediv, rand);
757 smp->slave_ltk = ltk;
758
759 ident.ediv = ediv;
760 ident.rand = rand;
761
762 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
763
764 *keydist &= ~SMP_DIST_ENC_KEY;
765 }
766
767 if (*keydist & SMP_DIST_ID_KEY) {
768 struct smp_cmd_ident_addr_info addrinfo;
769 struct smp_cmd_ident_info idinfo;
770
771 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
772
773 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
774
775 /* The hci_conn contains the local identity address
776 * after the connection has been established.
777 *
778 * This is true even when the connection has been
779 * established using a resolvable random address.
780 */
781 bacpy(&addrinfo.bdaddr, &hcon->src);
782 addrinfo.addr_type = hcon->src_type;
783
784 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
785 &addrinfo);
786
787 *keydist &= ~SMP_DIST_ID_KEY;
788 }
789
790 if (*keydist & SMP_DIST_SIGN) {
791 struct smp_cmd_sign_info sign;
792 struct smp_csrk *csrk;
793
794 /* Generate a new random key */
795 get_random_bytes(sign.csrk, sizeof(sign.csrk));
796
797 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
798 if (csrk) {
799 csrk->master = 0x00;
800 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
801 }
802 smp->slave_csrk = csrk;
803
804 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
805
806 *keydist &= ~SMP_DIST_SIGN;
807 }
808
809 /* If there are still keys to be received wait for them */
810 if ((smp->remote_key_dist & 0x07))
Johan Hedberg86d14072014-08-11 22:06:43 +0300811 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300812
813 clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300814 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
815 smp_notify_keys(conn);
816
817 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300818}
819
Johan Hedbergb68fda62014-08-11 22:06:40 +0300820static void smp_timeout(struct work_struct *work)
821{
822 struct smp_chan *smp = container_of(work, struct smp_chan,
823 security_timer.work);
824 struct l2cap_conn *conn = smp->conn;
825
826 BT_DBG("conn %p", conn);
827
Johan Hedberg1e91c292014-08-18 20:33:29 +0300828 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +0300829}
830
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300831static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
832{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300833 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300834 struct smp_chan *smp;
835
Marcel Holtmannf1560462013-10-13 05:43:25 -0700836 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedberg616d55b2014-07-29 14:18:48 +0300837 if (!smp) {
838 clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300839 return NULL;
Johan Hedberg616d55b2014-07-29 14:18:48 +0300840 }
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300841
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);
Johan Hedberg616d55b2014-07-29 14:18:48 +0300846 clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags);
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300847 return NULL;
848 }
849
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300850 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300851 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300852
Johan Hedberg86d14072014-08-11 22:06:43 +0300853 INIT_WORK(&smp->distribute_work, smp_distribute_keys);
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;
Brian Gix2b64d152011-12-21 16:12:12 -0800867
868 BT_DBG("");
869
Johan Hedberg642ac772014-06-27 14:23:06 +0300870 if (!conn || !test_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Brian Gix2b64d152011-12-21 16:12:12 -0800871 return -ENOTCONN;
872
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300873 chan = conn->smp;
874 if (!chan)
875 return -ENOTCONN;
876
877 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800878
879 switch (mgmt_op) {
880 case MGMT_OP_USER_PASSKEY_REPLY:
881 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200882 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800883 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200884 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800885 /* Fall Through */
886 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300887 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800888 break;
889 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
890 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200891 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Brian Gix2b64d152011-12-21 16:12:12 -0800892 return 0;
893 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200894 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Brian Gix2b64d152011-12-21 16:12:12 -0800895 return -EOPNOTSUPP;
896 }
897
898 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300899 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
900 u8 rsp = smp_confirm(smp);
901 if (rsp)
902 smp_failure(conn, rsp);
903 }
Brian Gix2b64d152011-12-21 16:12:12 -0800904
905 return 0;
906}
907
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300908static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300909{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300910 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300911 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300912 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300913 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300914 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300915
916 BT_DBG("conn %p", conn);
917
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200918 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300919 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200920
Johan Hedberg40bef302014-07-16 11:42:27 +0300921 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800922 return SMP_CMD_NOTSUPP;
923
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300924 if (!test_and_set_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300925 smp = smp_chan_create(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300926 } else {
927 struct l2cap_chan *chan = conn->smp;
928 smp = chan->data;
929 }
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300930
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300931 if (!smp)
932 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300933
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300934 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergb3c64102014-07-10 11:02:07 +0300935 (req->auth_req & SMP_AUTH_BONDING))
936 return SMP_PAIRING_NOTSUPP;
937
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300938 smp->preq[0] = SMP_CMD_PAIRING_REQ;
939 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300940 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300941
Brian Gix2b64d152011-12-21 16:12:12 -0800942 /* We didn't start the pairing, so match remote */
Johan Hedberg1ef35822014-05-20 09:45:48 +0300943 auth = req->auth_req;
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300944
Johan Hedbergc7262e72014-06-17 13:07:37 +0300945 sec_level = authreq_to_seclevel(auth);
946 if (sec_level > conn->hcon->pending_sec_level)
947 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +0200948
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300949 /* If we need MITM check that it can be acheived */
950 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
951 u8 method;
952
953 method = get_auth_method(smp, conn->hcon->io_capability,
954 req->io_capability);
955 if (method == JUST_WORKS || method == JUST_CFM)
956 return SMP_AUTH_REQUIREMENTS;
957 }
958
Brian Gix2b64d152011-12-21 16:12:12 -0800959 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300960
961 key_size = min(req->max_key_size, rsp.max_key_size);
962 if (check_enc_key_size(conn, key_size))
963 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300964
Johan Hedberge84a6b12013-12-02 10:49:03 +0200965 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300966
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300967 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
968 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300969
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300970 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300971
Brian Gix2b64d152011-12-21 16:12:12 -0800972 /* Request setup of TK */
973 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
974 if (ret)
975 return SMP_UNSPECIFIED;
976
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300977 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300978}
979
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300980static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300981{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300982 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300983 struct l2cap_chan *chan = conn->smp;
984 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800985 u8 key_size, auth = SMP_AUTH_NONE;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300986 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300987
988 BT_DBG("conn %p", conn);
989
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200990 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300991 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200992
Johan Hedberg40bef302014-07-16 11:42:27 +0300993 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800994 return SMP_CMD_NOTSUPP;
995
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300996 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300997
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300998 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300999
1000 key_size = min(req->max_key_size, rsp->max_key_size);
1001 if (check_enc_key_size(conn, key_size))
1002 return SMP_ENC_KEY_SIZE;
1003
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001004 /* If we need MITM check that it can be acheived */
1005 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1006 u8 method;
1007
1008 method = get_auth_method(smp, req->io_capability,
1009 rsp->io_capability);
1010 if (method == JUST_WORKS || method == JUST_CFM)
1011 return SMP_AUTH_REQUIREMENTS;
1012 }
1013
Johan Hedberge84a6b12013-12-02 10:49:03 +02001014 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001015
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001016 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1017 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001018
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001019 /* Update remote key distribution in case the remote cleared
1020 * some bits that we had enabled in our request.
1021 */
1022 smp->remote_key_dist &= rsp->resp_key_dist;
1023
Brian Gix2b64d152011-12-21 16:12:12 -08001024 if ((req->auth_req & SMP_AUTH_BONDING) &&
Marcel Holtmannf1560462013-10-13 05:43:25 -07001025 (rsp->auth_req & SMP_AUTH_BONDING))
Brian Gix2b64d152011-12-21 16:12:12 -08001026 auth = SMP_AUTH_BONDING;
1027
1028 auth |= (req->auth_req | rsp->auth_req) & SMP_AUTH_MITM;
1029
Johan Hedberg476585e2012-06-06 18:54:15 +08001030 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001031 if (ret)
1032 return SMP_UNSPECIFIED;
1033
Johan Hedberg4a74d652014-05-20 09:45:50 +03001034 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001035
1036 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001037 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001038 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001039
1040 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001041}
1042
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001043static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001044{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001045 struct l2cap_chan *chan = conn->smp;
1046 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001047
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001048 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1049
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001050 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001051 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001052
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001053 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1054 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001055
Johan Hedberg943a7322014-03-18 12:58:24 +02001056 if (conn->hcon->out)
1057 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1058 smp->prnd);
Johan Hedberg4a74d652014-05-20 09:45:50 +03001059 else if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001060 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001061 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001062 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001063
1064 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001065}
1066
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001067static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001068{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001069 struct l2cap_chan *chan = conn->smp;
1070 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001071
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001072 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001073
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001074 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001075 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001076
Johan Hedberg943a7322014-03-18 12:58:24 +02001077 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001078 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001079
Johan Hedberg861580a2014-05-20 09:45:51 +03001080 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001081}
1082
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001083static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001084{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001085 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001086 struct hci_conn *hcon = conn->hcon;
1087
Johan Hedberg98a0b842014-01-30 19:40:00 -08001088 key = hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001089 hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001090 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001091 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001092
Johan Hedberg4dab7862012-06-07 14:58:37 +08001093 if (sec_level > BT_SECURITY_MEDIUM && !key->authenticated)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001094 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001095
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001096 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001097 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001098
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001099 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1100 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001101
Johan Hedbergfe59a052014-07-01 19:14:12 +03001102 /* We never store STKs for master role, so clear this flag */
1103 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1104
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001105 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001106}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001107
Johan Hedberg854f4722014-07-01 18:40:20 +03001108bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level)
1109{
1110 if (sec_level == BT_SECURITY_LOW)
1111 return true;
1112
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001113 /* If we're encrypted with an STK always claim insufficient
1114 * security. This way we allow the connection to be re-encrypted
1115 * with an LTK, even if the LTK provides the same level of
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001116 * security. Only exception is if we don't have an LTK (e.g.
1117 * because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001118 */
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001119 if (test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
1120 hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001121 hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001122 return false;
1123
Johan Hedberg854f4722014-07-01 18:40:20 +03001124 if (hcon->sec_level >= sec_level)
1125 return true;
1126
1127 return false;
1128}
1129
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001130static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001131{
1132 struct smp_cmd_security_req *rp = (void *) skb->data;
1133 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001134 struct hci_conn *hcon = conn->hcon;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001135 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001136 u8 sec_level;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001137
1138 BT_DBG("conn %p", conn);
1139
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001140 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001141 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001142
Johan Hedberg40bef302014-07-16 11:42:27 +03001143 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001144 return SMP_CMD_NOTSUPP;
1145
Johan Hedbergc7262e72014-06-17 13:07:37 +03001146 sec_level = authreq_to_seclevel(rp->auth_req);
Johan Hedberg854f4722014-07-01 18:40:20 +03001147 if (smp_sufficient_security(hcon, sec_level))
1148 return 0;
1149
Johan Hedbergc7262e72014-06-17 13:07:37 +03001150 if (sec_level > hcon->pending_sec_level)
1151 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001152
Johan Hedberg4dab7862012-06-07 14:58:37 +08001153 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001154 return 0;
1155
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001156 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001157 return 0;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001158
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001159 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001160 if (!smp)
1161 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001162
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001163 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedberg616d55b2014-07-29 14:18:48 +03001164 (rp->auth_req & SMP_AUTH_BONDING))
1165 return SMP_PAIRING_NOTSUPP;
1166
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001167 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001168
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001169 memset(&cp, 0, sizeof(cp));
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -03001170 build_pairing_cmd(conn, &cp, NULL, rp->auth_req);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001171
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001172 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1173 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001174
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001175 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001176
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001177 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001178}
1179
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001180int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001181{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001182 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001183 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001184 __u8 authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001185
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001186 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1187
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001188 /* This may be NULL if there's an unexpected disconnection */
1189 if (!conn)
1190 return 1;
1191
Johan Hedberg757aee02013-04-24 13:05:32 +03001192 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001193 return 1;
1194
Johan Hedbergad32a2f2013-05-14 18:05:12 +03001195 if (smp_sufficient_security(hcon, sec_level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001196 return 1;
1197
Johan Hedbergc7262e72014-06-17 13:07:37 +03001198 if (sec_level > hcon->pending_sec_level)
1199 hcon->pending_sec_level = sec_level;
1200
Johan Hedberg40bef302014-07-16 11:42:27 +03001201 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001202 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1203 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001204
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001205 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001206 return 0;
1207
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001208 smp = smp_chan_create(conn);
Brian Gix2b64d152011-12-21 16:12:12 -08001209 if (!smp)
1210 return 1;
1211
1212 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001213
Johan Hedberg79897d22014-06-01 09:45:24 +03001214 /* Require MITM if IO Capability allows or the security level
1215 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02001216 */
Johan Hedberg79897d22014-06-01 09:45:24 +03001217 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03001218 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02001219 authreq |= SMP_AUTH_MITM;
1220
Johan Hedberg40bef302014-07-16 11:42:27 +03001221 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001222 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001223
Brian Gix2b64d152011-12-21 16:12:12 -08001224 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001225 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1226 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001227
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001228 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
1229 } else {
1230 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08001231 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001232 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
1233 }
1234
Johan Hedberg4a74d652014-05-20 09:45:50 +03001235 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergedca7922014-03-24 15:54:11 +02001236
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001237 return 0;
1238}
1239
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001240static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1241{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001242 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001243 struct l2cap_chan *chan = conn->smp;
1244 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001245
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001246 BT_DBG("conn %p", conn);
1247
1248 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001249 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001250
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001251 /* Ignore this PDU if it wasn't requested */
1252 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1253 return 0;
1254
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001255 skb_pull(skb, sizeof(*rp));
1256
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001257 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001258
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001259 return 0;
1260}
1261
1262static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1263{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001264 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001265 struct l2cap_chan *chan = conn->smp;
1266 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001267 struct hci_dev *hdev = conn->hcon->hdev;
1268 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001269 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001270 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001271
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001272 BT_DBG("conn %p", conn);
1273
1274 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001275 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001276
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001277 /* Ignore this PDU if it wasn't requested */
1278 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1279 return 0;
1280
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001281 /* Mark the information as received */
1282 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1283
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001284 skb_pull(skb, sizeof(*rp));
1285
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001286 hci_dev_lock(hdev);
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001287 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001288 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001289 authenticated, smp->tk, smp->enc_key_size,
1290 rp->ediv, rp->rand);
1291 smp->ltk = ltk;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001292 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
Johan Hedberg86d14072014-08-11 22:06:43 +03001293 queue_work(hdev->workqueue, &smp->distribute_work);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001294 hci_dev_unlock(hdev);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001295
1296 return 0;
1297}
1298
Johan Hedbergfd349c02014-02-18 10:19:36 +02001299static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1300{
1301 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001302 struct l2cap_chan *chan = conn->smp;
1303 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001304
1305 BT_DBG("");
1306
1307 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001308 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001309
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001310 /* Ignore this PDU if it wasn't requested */
1311 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1312 return 0;
1313
Johan Hedbergfd349c02014-02-18 10:19:36 +02001314 skb_pull(skb, sizeof(*info));
1315
1316 memcpy(smp->irk, info->irk, 16);
1317
1318 return 0;
1319}
1320
1321static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1322 struct sk_buff *skb)
1323{
1324 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001325 struct l2cap_chan *chan = conn->smp;
1326 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001327 struct hci_conn *hcon = conn->hcon;
Johan Hedberg86d14072014-08-11 22:06:43 +03001328 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001329 bdaddr_t rpa;
1330
1331 BT_DBG("");
1332
1333 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001334 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001335
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001336 /* Ignore this PDU if it wasn't requested */
1337 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1338 return 0;
1339
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001340 /* Mark the information as received */
1341 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1342
Johan Hedbergfd349c02014-02-18 10:19:36 +02001343 skb_pull(skb, sizeof(*info));
1344
Johan Hedberg31dd6242014-06-27 14:23:02 +03001345 hci_dev_lock(hcon->hdev);
1346
Johan Hedberga9a58f82014-02-25 22:24:37 +02001347 /* Strictly speaking the Core Specification (4.1) allows sending
1348 * an empty address which would force us to rely on just the IRK
1349 * as "identity information". However, since such
1350 * implementations are not known of and in order to not over
1351 * complicate our implementation, simply pretend that we never
1352 * received an IRK for such a device.
1353 */
1354 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1355 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001356 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001357 }
1358
Johan Hedbergfd349c02014-02-18 10:19:36 +02001359 bacpy(&smp->id_addr, &info->bdaddr);
1360 smp->id_addr_type = info->addr_type;
1361
1362 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1363 bacpy(&rpa, &hcon->dst);
1364 else
1365 bacpy(&rpa, BDADDR_ANY);
1366
Johan Hedberg23d0e122014-02-19 14:57:46 +02001367 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1368 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001369
Johan Hedberg31dd6242014-06-27 14:23:02 +03001370distribute:
Johan Hedberg86d14072014-08-11 22:06:43 +03001371 queue_work(hdev->workqueue, &smp->distribute_work);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001372
Johan Hedberg31dd6242014-06-27 14:23:02 +03001373 hci_dev_unlock(hcon->hdev);
1374
Johan Hedbergfd349c02014-02-18 10:19:36 +02001375 return 0;
1376}
1377
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001378static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1379{
1380 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001381 struct l2cap_chan *chan = conn->smp;
1382 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001383 struct hci_dev *hdev = conn->hcon->hdev;
1384 struct smp_csrk *csrk;
1385
1386 BT_DBG("conn %p", conn);
1387
1388 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001389 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001390
1391 /* Ignore this PDU if it wasn't requested */
1392 if (!(smp->remote_key_dist & SMP_DIST_SIGN))
1393 return 0;
1394
1395 /* Mark the information as received */
1396 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1397
1398 skb_pull(skb, sizeof(*rp));
1399
1400 hci_dev_lock(hdev);
1401 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1402 if (csrk) {
1403 csrk->master = 0x01;
1404 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1405 }
1406 smp->csrk = csrk;
Johan Hedberg86d14072014-08-11 22:06:43 +03001407 queue_work(hdev->workqueue, &smp->distribute_work);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001408 hci_dev_unlock(hdev);
1409
1410 return 0;
1411}
1412
Johan Hedberg4befb862014-08-11 22:06:38 +03001413static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001414{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001415 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001416 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001417 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001418 int err = 0;
1419
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001420 if (hcon->type != LE_LINK) {
1421 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001422 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001423 }
1424
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001425 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07001426 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001427
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001428 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001429 reason = SMP_PAIRING_NOTSUPP;
1430 goto done;
1431 }
1432
Marcel Holtmann92381f52013-10-03 01:23:08 -07001433 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001434 skb_pull(skb, sizeof(code));
1435
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001436 /*
1437 * The SMP context must be initialized for all other PDUs except
1438 * pairing and security requests. If we get any other PDU when
1439 * not initialized simply disconnect (done if this function
1440 * returns an error).
1441 */
1442 if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ &&
Johan Hedbergd3368602014-08-08 09:28:05 +03001443 !test_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags)) {
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001444 BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001445 err = -EOPNOTSUPP;
1446 goto done;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001447 }
1448
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001449 switch (code) {
1450 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001451 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001452 break;
1453
1454 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001455 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001456 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001457 break;
1458
1459 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001460 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001461 break;
1462
1463 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001464 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001465 break;
1466
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001467 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001468 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001469 break;
1470
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001471 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001472 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001473 break;
1474
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001475 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001476 reason = smp_cmd_encrypt_info(conn, skb);
1477 break;
1478
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001479 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001480 reason = smp_cmd_master_ident(conn, skb);
1481 break;
1482
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001483 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001484 reason = smp_cmd_ident_info(conn, skb);
1485 break;
1486
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001487 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001488 reason = smp_cmd_ident_addr_info(conn, skb);
1489 break;
1490
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001491 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001492 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001493 break;
1494
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001495 default:
1496 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001497 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001498 goto done;
1499 }
1500
1501done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001502 if (!err) {
1503 if (reason)
1504 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001505 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001506 }
1507
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001508 return err;
1509}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001510
Johan Hedberg70db83c2014-08-08 09:37:16 +03001511static void smp_teardown_cb(struct l2cap_chan *chan, int err)
1512{
1513 struct l2cap_conn *conn = chan->conn;
1514
1515 BT_DBG("chan %p", chan);
1516
Johan Hedberg109ec232014-08-11 22:06:42 +03001517 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001518 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001519
Johan Hedberg70db83c2014-08-08 09:37:16 +03001520 conn->smp = NULL;
1521 l2cap_chan_put(chan);
1522}
1523
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001524static void smp_resume_cb(struct l2cap_chan *chan)
1525{
Johan Hedbergb68fda62014-08-11 22:06:40 +03001526 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001527 struct l2cap_conn *conn = chan->conn;
1528 struct hci_conn *hcon = conn->hcon;
Johan Hedberg86d14072014-08-11 22:06:43 +03001529 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001530
1531 BT_DBG("chan %p", chan);
1532
Johan Hedberg86d14072014-08-11 22:06:43 +03001533 if (!smp)
1534 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03001535
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001536 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
1537 return;
1538
Johan Hedberg86d14072014-08-11 22:06:43 +03001539 cancel_delayed_work(&smp->security_timer);
1540
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001541 queue_work(hdev->workqueue, &smp->distribute_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001542}
1543
Johan Hedberg70db83c2014-08-08 09:37:16 +03001544static void smp_ready_cb(struct l2cap_chan *chan)
1545{
1546 struct l2cap_conn *conn = chan->conn;
1547
1548 BT_DBG("chan %p", chan);
1549
1550 conn->smp = chan;
1551 l2cap_chan_hold(chan);
1552}
1553
Johan Hedberg4befb862014-08-11 22:06:38 +03001554static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
1555{
1556 int err;
1557
1558 BT_DBG("chan %p", chan);
1559
1560 err = smp_sig_channel(chan, skb);
1561 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03001562 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03001563
Johan Hedbergb68fda62014-08-11 22:06:40 +03001564 if (smp)
1565 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03001566
Johan Hedberg1e91c292014-08-18 20:33:29 +03001567 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03001568 }
1569
1570 return err;
1571}
1572
Johan Hedberg70db83c2014-08-08 09:37:16 +03001573static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
1574 unsigned long hdr_len,
1575 unsigned long len, int nb)
1576{
1577 struct sk_buff *skb;
1578
1579 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
1580 if (!skb)
1581 return ERR_PTR(-ENOMEM);
1582
1583 skb->priority = HCI_PRIO_MAX;
1584 bt_cb(skb)->chan = chan;
1585
1586 return skb;
1587}
1588
1589static const struct l2cap_ops smp_chan_ops = {
1590 .name = "Security Manager",
1591 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001592 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001593 .alloc_skb = smp_alloc_skb_cb,
1594 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001595 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001596
1597 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001598 .state_change = l2cap_chan_no_state_change,
1599 .close = l2cap_chan_no_close,
1600 .defer = l2cap_chan_no_defer,
1601 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001602 .set_shutdown = l2cap_chan_no_set_shutdown,
1603 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1604 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1605};
1606
1607static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
1608{
1609 struct l2cap_chan *chan;
1610
1611 BT_DBG("pchan %p", pchan);
1612
1613 chan = l2cap_chan_create();
1614 if (!chan)
1615 return NULL;
1616
1617 chan->chan_type = pchan->chan_type;
1618 chan->ops = &smp_chan_ops;
1619 chan->scid = pchan->scid;
1620 chan->dcid = chan->scid;
1621 chan->imtu = pchan->imtu;
1622 chan->omtu = pchan->omtu;
1623 chan->mode = pchan->mode;
1624
1625 BT_DBG("created chan %p", chan);
1626
1627 return chan;
1628}
1629
1630static const struct l2cap_ops smp_root_chan_ops = {
1631 .name = "Security Manager Root",
1632 .new_connection = smp_new_conn_cb,
1633
1634 /* None of these are implemented for the root channel */
1635 .close = l2cap_chan_no_close,
1636 .alloc_skb = l2cap_chan_no_alloc_skb,
1637 .recv = l2cap_chan_no_recv,
1638 .state_change = l2cap_chan_no_state_change,
1639 .teardown = l2cap_chan_no_teardown,
1640 .ready = l2cap_chan_no_ready,
1641 .defer = l2cap_chan_no_defer,
1642 .suspend = l2cap_chan_no_suspend,
1643 .resume = l2cap_chan_no_resume,
1644 .set_shutdown = l2cap_chan_no_set_shutdown,
1645 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1646 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1647};
1648
Johan Hedberg711eafe2014-08-08 09:32:52 +03001649int smp_register(struct hci_dev *hdev)
1650{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001651 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001652 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001653
Johan Hedberg711eafe2014-08-08 09:32:52 +03001654 BT_DBG("%s", hdev->name);
1655
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001656 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1657 if (IS_ERR(tfm_aes)) {
1658 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001659 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03001660 return err;
1661 }
1662
Johan Hedberg70db83c2014-08-08 09:37:16 +03001663 chan = l2cap_chan_create();
1664 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001665 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001666 return -ENOMEM;
1667 }
1668
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001669 chan->data = tfm_aes;
1670
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001671 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001672
1673 l2cap_chan_set_defaults(chan);
1674
1675 bacpy(&chan->src, &hdev->bdaddr);
1676 chan->src_type = BDADDR_LE_PUBLIC;
1677 chan->state = BT_LISTEN;
1678 chan->mode = L2CAP_MODE_BASIC;
1679 chan->imtu = L2CAP_DEFAULT_MTU;
1680 chan->ops = &smp_root_chan_ops;
1681
1682 hdev->smp_data = chan;
1683
Johan Hedberg711eafe2014-08-08 09:32:52 +03001684 return 0;
1685}
1686
1687void smp_unregister(struct hci_dev *hdev)
1688{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001689 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001690 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001691
1692 if (!chan)
1693 return;
1694
1695 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001696
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001697 tfm_aes = chan->data;
1698 if (tfm_aes) {
1699 chan->data = NULL;
1700 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001701 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03001702
1703 hdev->smp_data = NULL;
1704 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001705}