blob: 3700dd8d9d0be206ac4b6db1e8c6a592c21338a5 [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 Hedberg065a13e2012-10-11 16:26:06 +020038#define AUTH_REQ_MASK 0x07
Johan Hedberg88d3a8a2014-09-05 22:19:53 +030039#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020040
Johan Hedberg533e35d2014-06-16 19:25:18 +030041enum {
42 SMP_FLAG_TK_VALID,
43 SMP_FLAG_CFM_PENDING,
44 SMP_FLAG_MITM_AUTH,
45 SMP_FLAG_COMPLETE,
46 SMP_FLAG_INITIATOR,
47};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030048
49struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030050 struct l2cap_conn *conn;
51 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030052 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030053
Johan Hedberg4bc58f52014-05-20 09:45:47 +030054 u8 preq[7]; /* SMP Pairing Request */
55 u8 prsp[7]; /* SMP Pairing Response */
56 u8 prnd[16]; /* SMP Pairing Random (local) */
57 u8 rrnd[16]; /* SMP Pairing Random (remote) */
58 u8 pcnf[16]; /* SMP Pairing Confirm */
59 u8 tk[16]; /* SMP Temporary Key */
60 u8 enc_key_size;
61 u8 remote_key_dist;
62 bdaddr_t id_addr;
63 u8 id_addr_type;
64 u8 irk[16];
65 struct smp_csrk *csrk;
66 struct smp_csrk *slave_csrk;
67 struct smp_ltk *ltk;
68 struct smp_ltk *slave_ltk;
69 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030070 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030071
72 struct crypto_blkcipher *tfm_aes;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030073};
74
Johan Hedberg8a2936f2014-06-16 19:25:19 +030075static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030076{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030077 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030078
Johan Hedberg8a2936f2014-06-16 19:25:19 +030079 for (i = 0; i < len; i++)
80 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030081}
82
83static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
84{
85 struct blkcipher_desc desc;
86 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +020087 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +020088 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030089
90 if (tfm == NULL) {
91 BT_ERR("tfm %p", tfm);
92 return -EINVAL;
93 }
94
95 desc.tfm = tfm;
96 desc.flags = 0;
97
Johan Hedberg943a7322014-03-18 12:58:24 +020098 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +030099 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200100
101 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300102 if (err) {
103 BT_ERR("cipher setkey failed: %d", err);
104 return err;
105 }
106
Johan Hedberg943a7322014-03-18 12:58:24 +0200107 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300108 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200109
110 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300111
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300112 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
113 if (err)
114 BT_ERR("Encrypt data error %d", err);
115
Johan Hedberg943a7322014-03-18 12:58:24 +0200116 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300117 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200118
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300119 return err;
120}
121
Johan Hedberg60478052014-02-18 10:19:31 +0200122static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
123{
Johan Hedberg943a7322014-03-18 12:58:24 +0200124 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200125 int err;
126
127 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200128 memcpy(_res, r, 3);
129 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200130
Johan Hedberg943a7322014-03-18 12:58:24 +0200131 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200132 if (err) {
133 BT_ERR("Encrypt error");
134 return err;
135 }
136
137 /* The output of the random address function ah is:
138 * ah(h, r) = e(k, r') mod 2^24
139 * The output of the security function e is then truncated to 24 bits
140 * by taking the least significant 24 bits of the output of e as the
141 * result of ah.
142 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200143 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200144
145 return 0;
146}
147
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300148bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200149{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300150 struct l2cap_chan *chan = hdev->smp_data;
151 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200152 u8 hash[3];
153 int err;
154
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300155 if (!chan || !chan->data)
156 return false;
157
158 tfm = chan->data;
159
Johan Hedberg60478052014-02-18 10:19:31 +0200160 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
161
162 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
163 if (err)
164 return false;
165
166 return !memcmp(bdaddr->b, hash, 3);
167}
168
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300169int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200170{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300171 struct l2cap_chan *chan = hdev->smp_data;
172 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200173 int err;
174
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300175 if (!chan || !chan->data)
176 return -EOPNOTSUPP;
177
178 tfm = chan->data;
179
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200180 get_random_bytes(&rpa->b[3], 3);
181
182 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
183 rpa->b[5] |= 0x40; /* Set second most significant bit */
184
185 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
186 if (err < 0)
187 return err;
188
189 BT_DBG("RPA %pMR", rpa);
190
191 return 0;
192}
193
Johan Hedbergec70f362014-06-27 14:23:04 +0300194static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
195 u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
196 u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300197{
Johan Hedbergec70f362014-06-27 14:23:04 +0300198 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300199 u8 p1[16], p2[16];
200 int err;
201
Johan Hedbergec70f362014-06-27 14:23:04 +0300202 BT_DBG("%s", hdev->name);
203
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300204 memset(p1, 0, 16);
205
206 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200207 p1[0] = _iat;
208 p1[1] = _rat;
209 memcpy(p1 + 2, preq, 7);
210 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300211
212 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200213 memcpy(p2, ra, 6);
214 memcpy(p2 + 6, ia, 6);
215 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300216
217 /* res = r XOR p1 */
218 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
219
220 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300221 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300222 if (err) {
223 BT_ERR("Encrypt data error");
224 return err;
225 }
226
227 /* res = res XOR p2 */
228 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
229
230 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300231 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300232 if (err)
233 BT_ERR("Encrypt data error");
234
235 return err;
236}
237
Johan Hedbergec70f362014-06-27 14:23:04 +0300238static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
239 u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300240{
Johan Hedbergec70f362014-06-27 14:23:04 +0300241 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300242 int err;
243
Johan Hedbergec70f362014-06-27 14:23:04 +0300244 BT_DBG("%s", hdev->name);
245
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300246 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200247 memcpy(_r, r2, 8);
248 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300249
Johan Hedbergec70f362014-06-27 14:23:04 +0300250 err = smp_e(smp->tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300251 if (err)
252 BT_ERR("Encrypt data error");
253
254 return err;
255}
256
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300257static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
258{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300259 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300260 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300261 struct kvec iv[2];
262 struct msghdr msg;
263
264 if (!chan)
265 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300266
267 BT_DBG("code 0x%2.2x", code);
268
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300269 iv[0].iov_base = &code;
270 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300271
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300272 iv[1].iov_base = data;
273 iv[1].iov_len = len;
274
275 memset(&msg, 0, sizeof(msg));
276
277 msg.msg_iov = (struct iovec *) &iv;
278 msg.msg_iovlen = 2;
279
280 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300281
Johan Hedbergb68fda62014-08-11 22:06:40 +0300282 if (!chan->data)
283 return;
284
285 smp = chan->data;
286
287 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300288 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300289}
290
Brian Gix2b64d152011-12-21 16:12:12 -0800291static __u8 authreq_to_seclevel(__u8 authreq)
292{
293 if (authreq & SMP_AUTH_MITM)
294 return BT_SECURITY_HIGH;
295 else
296 return BT_SECURITY_MEDIUM;
297}
298
299static __u8 seclevel_to_authreq(__u8 sec_level)
300{
301 switch (sec_level) {
302 case BT_SECURITY_HIGH:
303 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
304 case BT_SECURITY_MEDIUM:
305 return SMP_AUTH_BONDING;
306 default:
307 return SMP_AUTH_NONE;
308 }
309}
310
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300311static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700312 struct smp_cmd_pairing *req,
313 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300314{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300315 struct l2cap_chan *chan = conn->smp;
316 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200317 struct hci_conn *hcon = conn->hcon;
318 struct hci_dev *hdev = hcon->hdev;
319 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300320
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300321 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700322 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
323 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300324 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800325 } else {
326 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300327 }
328
Johan Hedbergfd349c02014-02-18 10:19:36 +0200329 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
330 remote_dist |= SMP_DIST_ID_KEY;
331
Johan Hedberg863efaf2014-02-22 19:06:32 +0200332 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
333 local_dist |= SMP_DIST_ID_KEY;
334
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300335 if (rsp == NULL) {
336 req->io_capability = conn->hcon->io_capability;
337 req->oob_flag = SMP_OOB_NOT_PRESENT;
338 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200339 req->init_key_dist = local_dist;
340 req->resp_key_dist = remote_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200341 req->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200342
343 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300344 return;
345 }
346
347 rsp->io_capability = conn->hcon->io_capability;
348 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
349 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200350 rsp->init_key_dist = req->init_key_dist & remote_dist;
351 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200352 rsp->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200353
354 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300355}
356
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300357static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
358{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300359 struct l2cap_chan *chan = conn->smp;
360 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300361
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300362 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700363 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300364 return SMP_ENC_KEY_SIZE;
365
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300366 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300367
368 return 0;
369}
370
Johan Hedberg6f48e262014-08-11 22:06:44 +0300371static void smp_chan_destroy(struct l2cap_conn *conn)
372{
373 struct l2cap_chan *chan = conn->smp;
374 struct smp_chan *smp = chan->data;
375 bool complete;
376
377 BUG_ON(!smp);
378
379 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300380
Johan Hedberg6f48e262014-08-11 22:06:44 +0300381 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
382 mgmt_smp_complete(conn->hcon, complete);
383
384 kfree(smp->csrk);
385 kfree(smp->slave_csrk);
386
387 crypto_free_blkcipher(smp->tfm_aes);
388
389 /* If pairing failed clean up any keys we might have */
390 if (!complete) {
391 if (smp->ltk) {
392 list_del(&smp->ltk->list);
393 kfree(smp->ltk);
394 }
395
396 if (smp->slave_ltk) {
397 list_del(&smp->slave_ltk->list);
398 kfree(smp->slave_ltk);
399 }
400
401 if (smp->remote_irk) {
402 list_del(&smp->remote_irk->list);
403 kfree(smp->remote_irk);
404 }
405 }
406
407 chan->data = NULL;
408 kfree(smp);
409 hci_conn_drop(conn->hcon);
410}
411
Johan Hedberg84794e12013-11-06 11:24:57 +0200412static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800413{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200414 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300415 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200416
Johan Hedberg84794e12013-11-06 11:24:57 +0200417 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800418 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700419 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800420
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700421 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700422 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300423
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300424 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300425 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800426}
427
Brian Gix2b64d152011-12-21 16:12:12 -0800428#define JUST_WORKS 0x00
429#define JUST_CFM 0x01
430#define REQ_PASSKEY 0x02
431#define CFM_PASSKEY 0x03
432#define REQ_OOB 0x04
433#define OVERLAP 0xFF
434
435static const u8 gen_method[5][5] = {
436 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
437 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
438 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
439 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
440 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
441};
442
Johan Hedberg581370c2014-06-17 13:07:38 +0300443static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
444{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300445 /* If either side has unknown io_caps, use JUST_CFM (which gets
446 * converted later to JUST_WORKS if we're initiators.
447 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300448 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
449 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300450 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300451
452 return gen_method[remote_io][local_io];
453}
454
Brian Gix2b64d152011-12-21 16:12:12 -0800455static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
456 u8 local_io, u8 remote_io)
457{
458 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300459 struct l2cap_chan *chan = conn->smp;
460 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800461 u8 method;
462 u32 passkey = 0;
463 int ret = 0;
464
465 /* Initialize key for JUST WORKS */
466 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300467 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800468
469 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
470
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300471 /* If neither side wants MITM, either "just" confirm an incoming
472 * request or use just-works for outgoing ones. The JUST_CFM
473 * will be converted to JUST_WORKS if necessary later in this
474 * function. If either side has MITM look up the method from the
475 * table.
476 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300477 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300478 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800479 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300480 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800481
Johan Hedberga82505c2014-03-24 14:39:07 +0200482 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300483 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200484 method = JUST_WORKS;
485
Johan Hedberg02f3e252014-07-16 15:09:13 +0300486 /* Don't bother user space with no IO capabilities */
487 if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
488 method = JUST_WORKS;
489
Brian Gix2b64d152011-12-21 16:12:12 -0800490 /* If Just Works, Continue with Zero TK */
491 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300492 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800493 return 0;
494 }
495
496 /* Not Just Works/Confirm results in MITM Authentication */
497 if (method != JUST_CFM)
Johan Hedberg4a74d652014-05-20 09:45:50 +0300498 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800499
500 /* If both devices have Keyoard-Display I/O, the master
501 * Confirms and the slave Enters the passkey.
502 */
503 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300504 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800505 method = CFM_PASSKEY;
506 else
507 method = REQ_PASSKEY;
508 }
509
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200510 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800511 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200512 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800513 get_random_bytes(&passkey, sizeof(passkey));
514 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200515 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800516 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300517 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800518 }
519
520 hci_dev_lock(hcon->hdev);
521
522 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700523 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200524 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200525 else if (method == JUST_CFM)
526 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
527 hcon->type, hcon->dst_type,
528 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800529 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200530 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200531 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200532 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800533
534 hci_dev_unlock(hcon->hdev);
535
536 return ret;
537}
538
Johan Hedberg1cc61142014-05-20 09:45:52 +0300539static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300540{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300541 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300542 struct smp_cmd_pairing_confirm cp;
543 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300544
545 BT_DBG("conn %p", conn);
546
Johan Hedbergec70f362014-06-27 14:23:04 +0300547 ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200548 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200549 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
550 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300551 if (ret)
552 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300553
Johan Hedberg4a74d652014-05-20 09:45:50 +0300554 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800555
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300556 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
557
Johan Hedbergb28b4942014-09-05 22:19:55 +0300558 if (conn->hcon->out)
559 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
560 else
561 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
562
Johan Hedberg1cc61142014-05-20 09:45:52 +0300563 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300564}
565
Johan Hedberg861580a2014-05-20 09:45:51 +0300566static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300567{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300568 struct l2cap_conn *conn = smp->conn;
569 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300570 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300571 int ret;
572
Johan Hedbergec70f362014-06-27 14:23:04 +0300573 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300574 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300575
576 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
577
Johan Hedbergec70f362014-06-27 14:23:04 +0300578 ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200579 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200580 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300581 if (ret)
582 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300583
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300584 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
585 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300586 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300587 }
588
589 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800590 u8 stk[16];
591 __le64 rand = 0;
592 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300593
Johan Hedbergec70f362014-06-27 14:23:04 +0300594 smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300595
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300596 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300597 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300598
Johan Hedberg861580a2014-05-20 09:45:51 +0300599 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
600 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300601
602 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300603 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300604 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300605 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300606 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800607 __le64 rand = 0;
608 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300609
Johan Hedberg943a7322014-03-18 12:58:24 +0200610 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
611 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300612
Johan Hedbergec70f362014-06-27 14:23:04 +0300613 smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300614
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300615 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700616 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300617
Johan Hedbergfff34902014-06-10 15:19:50 +0300618 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
619 auth = 1;
620 else
621 auth = 0;
622
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300623 /* Even though there's no _SLAVE suffix this is the
624 * slave STK we're adding for later lookup (the master
625 * STK never needs to be stored).
626 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700627 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300628 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300629 }
630
Johan Hedberg861580a2014-05-20 09:45:51 +0300631 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300632}
633
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300634static void smp_notify_keys(struct l2cap_conn *conn)
635{
636 struct l2cap_chan *chan = conn->smp;
637 struct smp_chan *smp = chan->data;
638 struct hci_conn *hcon = conn->hcon;
639 struct hci_dev *hdev = hcon->hdev;
640 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
641 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
642 bool persistent;
643
644 if (smp->remote_irk) {
645 mgmt_new_irk(hdev, smp->remote_irk);
646 /* Now that user space can be considered to know the
647 * identity address track the connection based on it
648 * from now on.
649 */
650 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
651 hcon->dst_type = smp->remote_irk->addr_type;
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300652 queue_work(hdev->workqueue, &conn->id_addr_update_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300653
654 /* When receiving an indentity resolving key for
655 * a remote device that does not use a resolvable
656 * private address, just remove the key so that
657 * it is possible to use the controller white
658 * list for scanning.
659 *
660 * Userspace will have been told to not store
661 * this key at this point. So it is safe to
662 * just remove it.
663 */
664 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
665 list_del(&smp->remote_irk->list);
666 kfree(smp->remote_irk);
667 smp->remote_irk = NULL;
668 }
669 }
670
671 /* The LTKs and CSRKs should be persistent only if both sides
672 * had the bonding bit set in their authentication requests.
673 */
674 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
675
676 if (smp->csrk) {
677 smp->csrk->bdaddr_type = hcon->dst_type;
678 bacpy(&smp->csrk->bdaddr, &hcon->dst);
679 mgmt_new_csrk(hdev, smp->csrk, persistent);
680 }
681
682 if (smp->slave_csrk) {
683 smp->slave_csrk->bdaddr_type = hcon->dst_type;
684 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
685 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
686 }
687
688 if (smp->ltk) {
689 smp->ltk->bdaddr_type = hcon->dst_type;
690 bacpy(&smp->ltk->bdaddr, &hcon->dst);
691 mgmt_new_ltk(hdev, smp->ltk, persistent);
692 }
693
694 if (smp->slave_ltk) {
695 smp->slave_ltk->bdaddr_type = hcon->dst_type;
696 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
697 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
698 }
699}
700
Johan Hedbergb28b4942014-09-05 22:19:55 +0300701static void smp_allow_key_dist(struct smp_chan *smp)
702{
703 /* Allow the first expected phase 3 PDU. The rest of the PDUs
704 * will be allowed in each PDU handler to ensure we receive
705 * them in the correct order.
706 */
707 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
708 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
709 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
710 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
711 else if (smp->remote_key_dist & SMP_DIST_SIGN)
712 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
713}
714
Johan Hedbergd6268e82014-09-05 22:19:51 +0300715static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300716{
717 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300718 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300719 struct hci_conn *hcon = conn->hcon;
720 struct hci_dev *hdev = hcon->hdev;
721 __u8 *keydist;
722
723 BT_DBG("conn %p", conn);
724
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300725 rsp = (void *) &smp->prsp[1];
726
727 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +0300728 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
729 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +0300730 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300731 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300732
733 req = (void *) &smp->preq[1];
734
735 if (hcon->out) {
736 keydist = &rsp->init_key_dist;
737 *keydist &= req->init_key_dist;
738 } else {
739 keydist = &rsp->resp_key_dist;
740 *keydist &= req->resp_key_dist;
741 }
742
743 BT_DBG("keydist 0x%x", *keydist);
744
745 if (*keydist & SMP_DIST_ENC_KEY) {
746 struct smp_cmd_encrypt_info enc;
747 struct smp_cmd_master_ident ident;
748 struct smp_ltk *ltk;
749 u8 authenticated;
750 __le16 ediv;
751 __le64 rand;
752
753 get_random_bytes(enc.ltk, sizeof(enc.ltk));
754 get_random_bytes(&ediv, sizeof(ediv));
755 get_random_bytes(&rand, sizeof(rand));
756
757 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
758
759 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
760 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
761 SMP_LTK_SLAVE, authenticated, enc.ltk,
762 smp->enc_key_size, ediv, rand);
763 smp->slave_ltk = ltk;
764
765 ident.ediv = ediv;
766 ident.rand = rand;
767
768 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
769
770 *keydist &= ~SMP_DIST_ENC_KEY;
771 }
772
773 if (*keydist & SMP_DIST_ID_KEY) {
774 struct smp_cmd_ident_addr_info addrinfo;
775 struct smp_cmd_ident_info idinfo;
776
777 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
778
779 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
780
781 /* The hci_conn contains the local identity address
782 * after the connection has been established.
783 *
784 * This is true even when the connection has been
785 * established using a resolvable random address.
786 */
787 bacpy(&addrinfo.bdaddr, &hcon->src);
788 addrinfo.addr_type = hcon->src_type;
789
790 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
791 &addrinfo);
792
793 *keydist &= ~SMP_DIST_ID_KEY;
794 }
795
796 if (*keydist & SMP_DIST_SIGN) {
797 struct smp_cmd_sign_info sign;
798 struct smp_csrk *csrk;
799
800 /* Generate a new random key */
801 get_random_bytes(sign.csrk, sizeof(sign.csrk));
802
803 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
804 if (csrk) {
805 csrk->master = 0x00;
806 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
807 }
808 smp->slave_csrk = csrk;
809
810 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
811
812 *keydist &= ~SMP_DIST_SIGN;
813 }
814
815 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +0300816 if (smp->remote_key_dist & KEY_DIST_MASK) {
817 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +0300818 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300819 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300820
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300821 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
822 smp_notify_keys(conn);
823
824 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300825}
826
Johan Hedbergb68fda62014-08-11 22:06:40 +0300827static void smp_timeout(struct work_struct *work)
828{
829 struct smp_chan *smp = container_of(work, struct smp_chan,
830 security_timer.work);
831 struct l2cap_conn *conn = smp->conn;
832
833 BT_DBG("conn %p", conn);
834
Johan Hedberg1e91c292014-08-18 20:33:29 +0300835 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +0300836}
837
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300838static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
839{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300840 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300841 struct smp_chan *smp;
842
Marcel Holtmannf1560462013-10-13 05:43:25 -0700843 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300844 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300845 return NULL;
846
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300847 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
848 if (IS_ERR(smp->tfm_aes)) {
849 BT_ERR("Unable to create ECB crypto context");
850 kfree(smp);
851 return NULL;
852 }
853
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300854 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300855 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300856
Johan Hedbergb28b4942014-09-05 22:19:55 +0300857 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
858
Johan Hedbergb68fda62014-08-11 22:06:40 +0300859 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
860
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300861 hci_conn_hold(conn->hcon);
862
863 return smp;
864}
865
Brian Gix2b64d152011-12-21 16:12:12 -0800866int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
867{
Johan Hedbergb10e8012014-06-27 14:23:07 +0300868 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300869 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -0800870 struct smp_chan *smp;
871 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300872 int err;
Brian Gix2b64d152011-12-21 16:12:12 -0800873
874 BT_DBG("");
875
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300876 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -0800877 return -ENOTCONN;
878
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300879 chan = conn->smp;
880 if (!chan)
881 return -ENOTCONN;
882
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300883 l2cap_chan_lock(chan);
884 if (!chan->data) {
885 err = -ENOTCONN;
886 goto unlock;
887 }
888
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300889 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800890
891 switch (mgmt_op) {
892 case MGMT_OP_USER_PASSKEY_REPLY:
893 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200894 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800895 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200896 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800897 /* Fall Through */
898 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300899 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800900 break;
901 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
902 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200903 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300904 err = 0;
905 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800906 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200907 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300908 err = -EOPNOTSUPP;
909 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800910 }
911
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300912 err = 0;
913
Brian Gix2b64d152011-12-21 16:12:12 -0800914 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300915 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
916 u8 rsp = smp_confirm(smp);
917 if (rsp)
918 smp_failure(conn, rsp);
919 }
Brian Gix2b64d152011-12-21 16:12:12 -0800920
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300921unlock:
922 l2cap_chan_unlock(chan);
923 return err;
Brian Gix2b64d152011-12-21 16:12:12 -0800924}
925
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300926static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300927{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300928 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300929 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300930 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300931 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300932 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300933 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300934
935 BT_DBG("conn %p", conn);
936
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200937 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300938 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200939
Johan Hedberg40bef302014-07-16 11:42:27 +0300940 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800941 return SMP_CMD_NOTSUPP;
942
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300943 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300944 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300945 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300946 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300947
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300948 if (!smp)
949 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300950
Johan Hedbergc05b9332014-09-10 17:37:42 -0700951 /* We didn't start the pairing, so match remote */
952 auth = req->auth_req & AUTH_REQ_MASK;
953
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300954 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -0700955 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +0300956 return SMP_PAIRING_NOTSUPP;
957
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300958 smp->preq[0] = SMP_CMD_PAIRING_REQ;
959 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300960 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300961
Johan Hedberg1afc2a12014-09-10 17:37:44 -0700962 if (conn->hcon->io_capability == 0x03)
963 sec_level = BT_SECURITY_MEDIUM;
964 else
965 sec_level = authreq_to_seclevel(auth);
966
Johan Hedbergc7262e72014-06-17 13:07:37 +0300967 if (sec_level > conn->hcon->pending_sec_level)
968 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +0200969
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300970 /* If we need MITM check that it can be acheived */
971 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
972 u8 method;
973
974 method = get_auth_method(smp, conn->hcon->io_capability,
975 req->io_capability);
976 if (method == JUST_WORKS || method == JUST_CFM)
977 return SMP_AUTH_REQUIREMENTS;
978 }
979
Brian Gix2b64d152011-12-21 16:12:12 -0800980 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300981
982 key_size = min(req->max_key_size, rsp.max_key_size);
983 if (check_enc_key_size(conn, key_size))
984 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300985
Johan Hedberge84a6b12013-12-02 10:49:03 +0200986 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300987
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300988 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
989 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300990
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300991 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedbergb28b4942014-09-05 22:19:55 +0300992 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300993
Brian Gix2b64d152011-12-21 16:12:12 -0800994 /* Request setup of TK */
995 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
996 if (ret)
997 return SMP_UNSPECIFIED;
998
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300999 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001000}
1001
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001002static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001003{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001004 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001005 struct l2cap_chan *chan = conn->smp;
1006 struct smp_chan *smp = chan->data;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001007 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001008 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001009
1010 BT_DBG("conn %p", conn);
1011
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001012 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001013 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001014
Johan Hedberg40bef302014-07-16 11:42:27 +03001015 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001016 return SMP_CMD_NOTSUPP;
1017
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001018 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001019
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001020 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001021
1022 key_size = min(req->max_key_size, rsp->max_key_size);
1023 if (check_enc_key_size(conn, key_size))
1024 return SMP_ENC_KEY_SIZE;
1025
Johan Hedbergc05b9332014-09-10 17:37:42 -07001026 auth = rsp->auth_req & AUTH_REQ_MASK;
1027
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001028 /* If we need MITM check that it can be acheived */
1029 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1030 u8 method;
1031
1032 method = get_auth_method(smp, req->io_capability,
1033 rsp->io_capability);
1034 if (method == JUST_WORKS || method == JUST_CFM)
1035 return SMP_AUTH_REQUIREMENTS;
1036 }
1037
Johan Hedberge84a6b12013-12-02 10:49:03 +02001038 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001039
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001040 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1041 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001042
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001043 /* Update remote key distribution in case the remote cleared
1044 * some bits that we had enabled in our request.
1045 */
1046 smp->remote_key_dist &= rsp->resp_key_dist;
1047
Johan Hedbergc05b9332014-09-10 17:37:42 -07001048 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001049
Johan Hedberg476585e2012-06-06 18:54:15 +08001050 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001051 if (ret)
1052 return SMP_UNSPECIFIED;
1053
Johan Hedberg4a74d652014-05-20 09:45:50 +03001054 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001055
1056 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001057 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001058 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001059
1060 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001061}
1062
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001063static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001064{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001065 struct l2cap_chan *chan = conn->smp;
1066 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001067
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001068 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1069
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001070 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001071 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001072
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001073 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1074 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001075
Johan Hedbergb28b4942014-09-05 22:19:55 +03001076 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001077 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1078 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001079 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1080 return 0;
1081 }
1082
1083 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001084 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001085 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001086 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001087
1088 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001089}
1090
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001091static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001092{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001093 struct l2cap_chan *chan = conn->smp;
1094 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001095
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001096 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001097
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001098 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001099 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001100
Johan Hedberg943a7322014-03-18 12:58:24 +02001101 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001102 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001103
Johan Hedberg861580a2014-05-20 09:45:51 +03001104 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001105}
1106
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001107static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001108{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001109 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001110 struct hci_conn *hcon = conn->hcon;
1111
Johan Hedberg98a0b842014-01-30 19:40:00 -08001112 key = hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001113 hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001114 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001115 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001116
Johan Hedberga6f78332014-09-10 17:37:45 -07001117 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001118 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001119
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001120 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001121 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001122
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001123 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1124 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001125
Johan Hedbergfe59a052014-07-01 19:14:12 +03001126 /* We never store STKs for master role, so clear this flag */
1127 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1128
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001129 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001130}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001131
Johan Hedberg854f4722014-07-01 18:40:20 +03001132bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level)
1133{
1134 if (sec_level == BT_SECURITY_LOW)
1135 return true;
1136
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001137 /* If we're encrypted with an STK always claim insufficient
1138 * security. This way we allow the connection to be re-encrypted
1139 * with an LTK, even if the LTK provides the same level of
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001140 * security. Only exception is if we don't have an LTK (e.g.
1141 * because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001142 */
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001143 if (test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
1144 hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001145 hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001146 return false;
1147
Johan Hedberg854f4722014-07-01 18:40:20 +03001148 if (hcon->sec_level >= sec_level)
1149 return true;
1150
1151 return false;
1152}
1153
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001154static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001155{
1156 struct smp_cmd_security_req *rp = (void *) skb->data;
1157 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001158 struct hci_conn *hcon = conn->hcon;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001159 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07001160 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001161
1162 BT_DBG("conn %p", conn);
1163
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001164 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001165 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001166
Johan Hedberg40bef302014-07-16 11:42:27 +03001167 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001168 return SMP_CMD_NOTSUPP;
1169
Johan Hedbergc05b9332014-09-10 17:37:42 -07001170 auth = rp->auth_req & AUTH_REQ_MASK;
1171
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001172 if (hcon->io_capability == 0x03)
1173 sec_level = BT_SECURITY_MEDIUM;
1174 else
1175 sec_level = authreq_to_seclevel(auth);
1176
Johan Hedberg854f4722014-07-01 18:40:20 +03001177 if (smp_sufficient_security(hcon, sec_level))
1178 return 0;
1179
Johan Hedbergc7262e72014-06-17 13:07:37 +03001180 if (sec_level > hcon->pending_sec_level)
1181 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001182
Johan Hedberg4dab7862012-06-07 14:58:37 +08001183 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001184 return 0;
1185
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001186 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001187 if (!smp)
1188 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001189
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001190 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001191 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03001192 return SMP_PAIRING_NOTSUPP;
1193
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001194 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001195
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001196 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07001197 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001198
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001199 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1200 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001201
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001202 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001203 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001204
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001205 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001206}
1207
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001208int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001209{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001210 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001211 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001212 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001213 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001214 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001215
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001216 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1217
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001218 /* This may be NULL if there's an unexpected disconnection */
1219 if (!conn)
1220 return 1;
1221
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001222 chan = conn->smp;
1223
Johan Hedberg757aee02013-04-24 13:05:32 +03001224 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001225 return 1;
1226
Johan Hedbergad32a2f2013-05-14 18:05:12 +03001227 if (smp_sufficient_security(hcon, sec_level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001228 return 1;
1229
Johan Hedbergc7262e72014-06-17 13:07:37 +03001230 if (sec_level > hcon->pending_sec_level)
1231 hcon->pending_sec_level = sec_level;
1232
Johan Hedberg40bef302014-07-16 11:42:27 +03001233 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001234 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1235 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001236
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001237 l2cap_chan_lock(chan);
1238
1239 /* If SMP is already in progress ignore this request */
1240 if (chan->data) {
1241 ret = 0;
1242 goto unlock;
1243 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001244
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001245 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001246 if (!smp) {
1247 ret = 1;
1248 goto unlock;
1249 }
Brian Gix2b64d152011-12-21 16:12:12 -08001250
1251 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001252
Johan Hedberg79897d22014-06-01 09:45:24 +03001253 /* Require MITM if IO Capability allows or the security level
1254 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02001255 */
Johan Hedberg79897d22014-06-01 09:45:24 +03001256 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03001257 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02001258 authreq |= SMP_AUTH_MITM;
1259
Johan Hedberg40bef302014-07-16 11:42:27 +03001260 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001261 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001262
Brian Gix2b64d152011-12-21 16:12:12 -08001263 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001264 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1265 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001266
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001267 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001268 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001269 } else {
1270 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08001271 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001272 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001273 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001274 }
1275
Johan Hedberg4a74d652014-05-20 09:45:50 +03001276 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001277 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02001278
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001279unlock:
1280 l2cap_chan_unlock(chan);
1281 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001282}
1283
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001284static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1285{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001286 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001287 struct l2cap_chan *chan = conn->smp;
1288 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001289
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001290 BT_DBG("conn %p", conn);
1291
1292 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001293 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001294
Johan Hedbergb28b4942014-09-05 22:19:55 +03001295 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001296
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001297 skb_pull(skb, sizeof(*rp));
1298
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001299 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001300
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001301 return 0;
1302}
1303
1304static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1305{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001306 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001307 struct l2cap_chan *chan = conn->smp;
1308 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001309 struct hci_dev *hdev = conn->hcon->hdev;
1310 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001311 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001312 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001313
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001314 BT_DBG("conn %p", conn);
1315
1316 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001317 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001318
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001319 /* Mark the information as received */
1320 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1321
Johan Hedbergb28b4942014-09-05 22:19:55 +03001322 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1323 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07001324 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1325 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001326
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001327 skb_pull(skb, sizeof(*rp));
1328
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001329 hci_dev_lock(hdev);
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001330 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001331 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001332 authenticated, smp->tk, smp->enc_key_size,
1333 rp->ediv, rp->rand);
1334 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001335 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03001336 smp_distribute_keys(smp);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001337 hci_dev_unlock(hdev);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001338
1339 return 0;
1340}
1341
Johan Hedbergfd349c02014-02-18 10:19:36 +02001342static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1343{
1344 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001345 struct l2cap_chan *chan = conn->smp;
1346 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001347
1348 BT_DBG("");
1349
1350 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001351 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001352
Johan Hedbergb28b4942014-09-05 22:19:55 +03001353 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001354
Johan Hedbergfd349c02014-02-18 10:19:36 +02001355 skb_pull(skb, sizeof(*info));
1356
1357 memcpy(smp->irk, info->irk, 16);
1358
1359 return 0;
1360}
1361
1362static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1363 struct sk_buff *skb)
1364{
1365 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001366 struct l2cap_chan *chan = conn->smp;
1367 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001368 struct hci_conn *hcon = conn->hcon;
1369 bdaddr_t rpa;
1370
1371 BT_DBG("");
1372
1373 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001374 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001375
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001376 /* Mark the information as received */
1377 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1378
Johan Hedbergb28b4942014-09-05 22:19:55 +03001379 if (smp->remote_key_dist & SMP_DIST_SIGN)
1380 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1381
Johan Hedbergfd349c02014-02-18 10:19:36 +02001382 skb_pull(skb, sizeof(*info));
1383
Johan Hedberg31dd6242014-06-27 14:23:02 +03001384 hci_dev_lock(hcon->hdev);
1385
Johan Hedberga9a58f82014-02-25 22:24:37 +02001386 /* Strictly speaking the Core Specification (4.1) allows sending
1387 * an empty address which would force us to rely on just the IRK
1388 * as "identity information". However, since such
1389 * implementations are not known of and in order to not over
1390 * complicate our implementation, simply pretend that we never
1391 * received an IRK for such a device.
1392 */
1393 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1394 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001395 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001396 }
1397
Johan Hedbergfd349c02014-02-18 10:19:36 +02001398 bacpy(&smp->id_addr, &info->bdaddr);
1399 smp->id_addr_type = info->addr_type;
1400
1401 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1402 bacpy(&rpa, &hcon->dst);
1403 else
1404 bacpy(&rpa, BDADDR_ANY);
1405
Johan Hedberg23d0e122014-02-19 14:57:46 +02001406 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1407 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001408
Johan Hedberg31dd6242014-06-27 14:23:02 +03001409distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001410 if (!(smp->remote_key_dist & KEY_DIST_MASK))
1411 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001412
Johan Hedberg31dd6242014-06-27 14:23:02 +03001413 hci_dev_unlock(hcon->hdev);
1414
Johan Hedbergfd349c02014-02-18 10:19:36 +02001415 return 0;
1416}
1417
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001418static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1419{
1420 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001421 struct l2cap_chan *chan = conn->smp;
1422 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001423 struct hci_dev *hdev = conn->hcon->hdev;
1424 struct smp_csrk *csrk;
1425
1426 BT_DBG("conn %p", conn);
1427
1428 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001429 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001430
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001431 /* Mark the information as received */
1432 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1433
1434 skb_pull(skb, sizeof(*rp));
1435
1436 hci_dev_lock(hdev);
1437 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1438 if (csrk) {
1439 csrk->master = 0x01;
1440 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1441 }
1442 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03001443 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001444 hci_dev_unlock(hdev);
1445
1446 return 0;
1447}
1448
Johan Hedberg4befb862014-08-11 22:06:38 +03001449static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001450{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001451 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001452 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001453 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001454 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001455 int err = 0;
1456
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001457 if (hcon->type != LE_LINK) {
1458 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001459 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001460 }
1461
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001462 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07001463 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001464
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001465 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001466 reason = SMP_PAIRING_NOTSUPP;
1467 goto done;
1468 }
1469
Marcel Holtmann92381f52013-10-03 01:23:08 -07001470 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001471 skb_pull(skb, sizeof(code));
1472
Johan Hedbergb28b4942014-09-05 22:19:55 +03001473 smp = chan->data;
1474
1475 if (code > SMP_CMD_MAX)
1476 goto drop;
1477
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07001478 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03001479 goto drop;
1480
1481 /* If we don't have a context the only allowed commands are
1482 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001483 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001484 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
1485 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001486
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001487 switch (code) {
1488 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001489 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001490 break;
1491
1492 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001493 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001494 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001495 break;
1496
1497 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001498 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001499 break;
1500
1501 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001502 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001503 break;
1504
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001505 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001506 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001507 break;
1508
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001509 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001510 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001511 break;
1512
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001513 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001514 reason = smp_cmd_encrypt_info(conn, skb);
1515 break;
1516
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001517 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001518 reason = smp_cmd_master_ident(conn, skb);
1519 break;
1520
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001521 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001522 reason = smp_cmd_ident_info(conn, skb);
1523 break;
1524
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001525 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001526 reason = smp_cmd_ident_addr_info(conn, skb);
1527 break;
1528
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001529 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001530 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001531 break;
1532
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001533 default:
1534 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001535 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001536 goto done;
1537 }
1538
1539done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001540 if (!err) {
1541 if (reason)
1542 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001543 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001544 }
1545
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001546 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001547
1548drop:
1549 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
1550 code, &hcon->dst);
1551 kfree_skb(skb);
1552 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001553}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001554
Johan Hedberg70db83c2014-08-08 09:37:16 +03001555static void smp_teardown_cb(struct l2cap_chan *chan, int err)
1556{
1557 struct l2cap_conn *conn = chan->conn;
1558
1559 BT_DBG("chan %p", chan);
1560
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001561 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001562 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001563
Johan Hedberg70db83c2014-08-08 09:37:16 +03001564 conn->smp = NULL;
1565 l2cap_chan_put(chan);
1566}
1567
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001568static void smp_resume_cb(struct l2cap_chan *chan)
1569{
Johan Hedbergb68fda62014-08-11 22:06:40 +03001570 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001571 struct l2cap_conn *conn = chan->conn;
1572 struct hci_conn *hcon = conn->hcon;
1573
1574 BT_DBG("chan %p", chan);
1575
Johan Hedberg86d14072014-08-11 22:06:43 +03001576 if (!smp)
1577 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03001578
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001579 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
1580 return;
1581
Johan Hedberg86d14072014-08-11 22:06:43 +03001582 cancel_delayed_work(&smp->security_timer);
1583
Johan Hedbergd6268e82014-09-05 22:19:51 +03001584 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001585}
1586
Johan Hedberg70db83c2014-08-08 09:37:16 +03001587static void smp_ready_cb(struct l2cap_chan *chan)
1588{
1589 struct l2cap_conn *conn = chan->conn;
1590
1591 BT_DBG("chan %p", chan);
1592
1593 conn->smp = chan;
1594 l2cap_chan_hold(chan);
1595}
1596
Johan Hedberg4befb862014-08-11 22:06:38 +03001597static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
1598{
1599 int err;
1600
1601 BT_DBG("chan %p", chan);
1602
1603 err = smp_sig_channel(chan, skb);
1604 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03001605 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03001606
Johan Hedbergb68fda62014-08-11 22:06:40 +03001607 if (smp)
1608 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03001609
Johan Hedberg1e91c292014-08-18 20:33:29 +03001610 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03001611 }
1612
1613 return err;
1614}
1615
Johan Hedberg70db83c2014-08-08 09:37:16 +03001616static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
1617 unsigned long hdr_len,
1618 unsigned long len, int nb)
1619{
1620 struct sk_buff *skb;
1621
1622 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
1623 if (!skb)
1624 return ERR_PTR(-ENOMEM);
1625
1626 skb->priority = HCI_PRIO_MAX;
1627 bt_cb(skb)->chan = chan;
1628
1629 return skb;
1630}
1631
1632static const struct l2cap_ops smp_chan_ops = {
1633 .name = "Security Manager",
1634 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001635 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001636 .alloc_skb = smp_alloc_skb_cb,
1637 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001638 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001639
1640 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001641 .state_change = l2cap_chan_no_state_change,
1642 .close = l2cap_chan_no_close,
1643 .defer = l2cap_chan_no_defer,
1644 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001645 .set_shutdown = l2cap_chan_no_set_shutdown,
1646 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1647 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1648};
1649
1650static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
1651{
1652 struct l2cap_chan *chan;
1653
1654 BT_DBG("pchan %p", pchan);
1655
1656 chan = l2cap_chan_create();
1657 if (!chan)
1658 return NULL;
1659
1660 chan->chan_type = pchan->chan_type;
1661 chan->ops = &smp_chan_ops;
1662 chan->scid = pchan->scid;
1663 chan->dcid = chan->scid;
1664 chan->imtu = pchan->imtu;
1665 chan->omtu = pchan->omtu;
1666 chan->mode = pchan->mode;
1667
1668 BT_DBG("created chan %p", chan);
1669
1670 return chan;
1671}
1672
1673static const struct l2cap_ops smp_root_chan_ops = {
1674 .name = "Security Manager Root",
1675 .new_connection = smp_new_conn_cb,
1676
1677 /* None of these are implemented for the root channel */
1678 .close = l2cap_chan_no_close,
1679 .alloc_skb = l2cap_chan_no_alloc_skb,
1680 .recv = l2cap_chan_no_recv,
1681 .state_change = l2cap_chan_no_state_change,
1682 .teardown = l2cap_chan_no_teardown,
1683 .ready = l2cap_chan_no_ready,
1684 .defer = l2cap_chan_no_defer,
1685 .suspend = l2cap_chan_no_suspend,
1686 .resume = l2cap_chan_no_resume,
1687 .set_shutdown = l2cap_chan_no_set_shutdown,
1688 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1689 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1690};
1691
Johan Hedberg711eafe2014-08-08 09:32:52 +03001692int smp_register(struct hci_dev *hdev)
1693{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001694 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001695 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001696
Johan Hedberg711eafe2014-08-08 09:32:52 +03001697 BT_DBG("%s", hdev->name);
1698
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001699 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1700 if (IS_ERR(tfm_aes)) {
1701 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001702 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03001703 return err;
1704 }
1705
Johan Hedberg70db83c2014-08-08 09:37:16 +03001706 chan = l2cap_chan_create();
1707 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001708 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001709 return -ENOMEM;
1710 }
1711
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001712 chan->data = tfm_aes;
1713
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001714 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001715
1716 l2cap_chan_set_defaults(chan);
1717
1718 bacpy(&chan->src, &hdev->bdaddr);
1719 chan->src_type = BDADDR_LE_PUBLIC;
1720 chan->state = BT_LISTEN;
1721 chan->mode = L2CAP_MODE_BASIC;
1722 chan->imtu = L2CAP_DEFAULT_MTU;
1723 chan->ops = &smp_root_chan_ops;
1724
1725 hdev->smp_data = chan;
1726
Johan Hedberg711eafe2014-08-08 09:32:52 +03001727 return 0;
1728}
1729
1730void smp_unregister(struct hci_dev *hdev)
1731{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001732 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001733 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001734
1735 if (!chan)
1736 return;
1737
1738 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001739
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001740 tfm_aes = chan->data;
1741 if (tfm_aes) {
1742 chan->data = NULL;
1743 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001744 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03001745
1746 hdev->smp_data = NULL;
1747 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001748}