blob: c71589f4b435ea1567e91023d094853af1b8ebe7 [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;
49
Johan Hedberg4bc58f52014-05-20 09:45:47 +030050 u8 preq[7]; /* SMP Pairing Request */
51 u8 prsp[7]; /* SMP Pairing Response */
52 u8 prnd[16]; /* SMP Pairing Random (local) */
53 u8 rrnd[16]; /* SMP Pairing Random (remote) */
54 u8 pcnf[16]; /* SMP Pairing Confirm */
55 u8 tk[16]; /* SMP Temporary Key */
56 u8 enc_key_size;
57 u8 remote_key_dist;
58 bdaddr_t id_addr;
59 u8 id_addr_type;
60 u8 irk[16];
61 struct smp_csrk *csrk;
62 struct smp_csrk *slave_csrk;
63 struct smp_ltk *ltk;
64 struct smp_ltk *slave_ltk;
65 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030066 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030067
68 struct crypto_blkcipher *tfm_aes;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030069};
70
Johan Hedberg8a2936f2014-06-16 19:25:19 +030071static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030072{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030073 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030074
Johan Hedberg8a2936f2014-06-16 19:25:19 +030075 for (i = 0; i < len; i++)
76 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030077}
78
79static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
80{
81 struct blkcipher_desc desc;
82 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +020083 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +020084 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030085
86 if (tfm == NULL) {
87 BT_ERR("tfm %p", tfm);
88 return -EINVAL;
89 }
90
91 desc.tfm = tfm;
92 desc.flags = 0;
93
Johan Hedberg943a7322014-03-18 12:58:24 +020094 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +030095 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +020096
97 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030098 if (err) {
99 BT_ERR("cipher setkey failed: %d", err);
100 return err;
101 }
102
Johan Hedberg943a7322014-03-18 12:58:24 +0200103 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300104 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200105
106 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300107
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300108 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
109 if (err)
110 BT_ERR("Encrypt data error %d", err);
111
Johan Hedberg943a7322014-03-18 12:58:24 +0200112 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300113 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200114
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300115 return err;
116}
117
Johan Hedberg60478052014-02-18 10:19:31 +0200118static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
119{
Johan Hedberg943a7322014-03-18 12:58:24 +0200120 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200121 int err;
122
123 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200124 memcpy(_res, r, 3);
125 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200126
Johan Hedberg943a7322014-03-18 12:58:24 +0200127 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200128 if (err) {
129 BT_ERR("Encrypt error");
130 return err;
131 }
132
133 /* The output of the random address function ah is:
134 * ah(h, r) = e(k, r') mod 2^24
135 * The output of the security function e is then truncated to 24 bits
136 * by taking the least significant 24 bits of the output of e as the
137 * result of ah.
138 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200139 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200140
141 return 0;
142}
143
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300144bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200145{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300146 struct l2cap_chan *chan = hdev->smp_data;
147 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200148 u8 hash[3];
149 int err;
150
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300151 if (!chan || !chan->data)
152 return false;
153
154 tfm = chan->data;
155
Johan Hedberg60478052014-02-18 10:19:31 +0200156 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
157
158 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
159 if (err)
160 return false;
161
162 return !memcmp(bdaddr->b, hash, 3);
163}
164
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300165int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200166{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300167 struct l2cap_chan *chan = hdev->smp_data;
168 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200169 int err;
170
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300171 if (!chan || !chan->data)
172 return -EOPNOTSUPP;
173
174 tfm = chan->data;
175
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200176 get_random_bytes(&rpa->b[3], 3);
177
178 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
179 rpa->b[5] |= 0x40; /* Set second most significant bit */
180
181 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
182 if (err < 0)
183 return err;
184
185 BT_DBG("RPA %pMR", rpa);
186
187 return 0;
188}
189
Johan Hedbergec70f362014-06-27 14:23:04 +0300190static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
191 u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
192 u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300193{
Johan Hedbergec70f362014-06-27 14:23:04 +0300194 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300195 u8 p1[16], p2[16];
196 int err;
197
Johan Hedbergec70f362014-06-27 14:23:04 +0300198 BT_DBG("%s", hdev->name);
199
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300200 memset(p1, 0, 16);
201
202 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200203 p1[0] = _iat;
204 p1[1] = _rat;
205 memcpy(p1 + 2, preq, 7);
206 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300207
208 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200209 memcpy(p2, ra, 6);
210 memcpy(p2 + 6, ia, 6);
211 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300212
213 /* res = r XOR p1 */
214 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
215
216 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300217 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300218 if (err) {
219 BT_ERR("Encrypt data error");
220 return err;
221 }
222
223 /* res = res XOR p2 */
224 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
225
226 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300227 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300228 if (err)
229 BT_ERR("Encrypt data error");
230
231 return err;
232}
233
Johan Hedbergec70f362014-06-27 14:23:04 +0300234static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
235 u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300236{
Johan Hedbergec70f362014-06-27 14:23:04 +0300237 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300238 int err;
239
Johan Hedbergec70f362014-06-27 14:23:04 +0300240 BT_DBG("%s", hdev->name);
241
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300242 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200243 memcpy(_r, r2, 8);
244 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300245
Johan Hedbergec70f362014-06-27 14:23:04 +0300246 err = smp_e(smp->tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300247 if (err)
248 BT_ERR("Encrypt data error");
249
250 return err;
251}
252
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300253static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
254{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300255 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300256 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300257 struct kvec iv[2];
258 struct msghdr msg;
259
260 if (!chan)
261 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300262
263 BT_DBG("code 0x%2.2x", code);
264
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300265 iv[0].iov_base = &code;
266 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300267
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300268 iv[1].iov_base = data;
269 iv[1].iov_len = len;
270
271 memset(&msg, 0, sizeof(msg));
272
273 msg.msg_iov = (struct iovec *) &iv;
274 msg.msg_iovlen = 2;
275
276 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300277
Johan Hedbergb68fda62014-08-11 22:06:40 +0300278 if (!chan->data)
279 return;
280
281 smp = chan->data;
282
283 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300284 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300285}
286
Brian Gix2b64d152011-12-21 16:12:12 -0800287static __u8 authreq_to_seclevel(__u8 authreq)
288{
289 if (authreq & SMP_AUTH_MITM)
290 return BT_SECURITY_HIGH;
291 else
292 return BT_SECURITY_MEDIUM;
293}
294
295static __u8 seclevel_to_authreq(__u8 sec_level)
296{
297 switch (sec_level) {
298 case BT_SECURITY_HIGH:
299 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
300 case BT_SECURITY_MEDIUM:
301 return SMP_AUTH_BONDING;
302 default:
303 return SMP_AUTH_NONE;
304 }
305}
306
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300307static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700308 struct smp_cmd_pairing *req,
309 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300310{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300311 struct l2cap_chan *chan = conn->smp;
312 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200313 struct hci_conn *hcon = conn->hcon;
314 struct hci_dev *hdev = hcon->hdev;
315 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300316
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300317 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700318 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
319 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300320 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800321 } else {
322 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300323 }
324
Johan Hedbergfd349c02014-02-18 10:19:36 +0200325 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
326 remote_dist |= SMP_DIST_ID_KEY;
327
Johan Hedberg863efaf2014-02-22 19:06:32 +0200328 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
329 local_dist |= SMP_DIST_ID_KEY;
330
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300331 if (rsp == NULL) {
332 req->io_capability = conn->hcon->io_capability;
333 req->oob_flag = SMP_OOB_NOT_PRESENT;
334 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200335 req->init_key_dist = local_dist;
336 req->resp_key_dist = remote_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200337 req->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200338
339 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300340 return;
341 }
342
343 rsp->io_capability = conn->hcon->io_capability;
344 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
345 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200346 rsp->init_key_dist = req->init_key_dist & remote_dist;
347 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200348 rsp->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200349
350 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300351}
352
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300353static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
354{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300355 struct l2cap_chan *chan = conn->smp;
356 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300357
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300358 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700359 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300360 return SMP_ENC_KEY_SIZE;
361
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300362 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300363
364 return 0;
365}
366
Johan Hedberg6f48e262014-08-11 22:06:44 +0300367static void smp_chan_destroy(struct l2cap_conn *conn)
368{
369 struct l2cap_chan *chan = conn->smp;
370 struct smp_chan *smp = chan->data;
371 bool complete;
372
373 BUG_ON(!smp);
374
375 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300376
Johan Hedberg6f48e262014-08-11 22:06:44 +0300377 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
378 mgmt_smp_complete(conn->hcon, complete);
379
380 kfree(smp->csrk);
381 kfree(smp->slave_csrk);
382
383 crypto_free_blkcipher(smp->tfm_aes);
384
385 /* If pairing failed clean up any keys we might have */
386 if (!complete) {
387 if (smp->ltk) {
388 list_del(&smp->ltk->list);
389 kfree(smp->ltk);
390 }
391
392 if (smp->slave_ltk) {
393 list_del(&smp->slave_ltk->list);
394 kfree(smp->slave_ltk);
395 }
396
397 if (smp->remote_irk) {
398 list_del(&smp->remote_irk->list);
399 kfree(smp->remote_irk);
400 }
401 }
402
403 chan->data = NULL;
404 kfree(smp);
405 hci_conn_drop(conn->hcon);
406}
407
Johan Hedberg84794e12013-11-06 11:24:57 +0200408static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800409{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200410 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300411 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200412
Johan Hedberg84794e12013-11-06 11:24:57 +0200413 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800414 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700415 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800416
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700417 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
418 mgmt_auth_failed(hcon->hdev, &hcon->dst, hcon->type, hcon->dst_type,
419 HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300420
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300421 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300422 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800423}
424
Brian Gix2b64d152011-12-21 16:12:12 -0800425#define JUST_WORKS 0x00
426#define JUST_CFM 0x01
427#define REQ_PASSKEY 0x02
428#define CFM_PASSKEY 0x03
429#define REQ_OOB 0x04
430#define OVERLAP 0xFF
431
432static const u8 gen_method[5][5] = {
433 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
434 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
435 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
436 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
437 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
438};
439
Johan Hedberg581370c2014-06-17 13:07:38 +0300440static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
441{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300442 /* If either side has unknown io_caps, use JUST_CFM (which gets
443 * converted later to JUST_WORKS if we're initiators.
444 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300445 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
446 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300447 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300448
449 return gen_method[remote_io][local_io];
450}
451
Brian Gix2b64d152011-12-21 16:12:12 -0800452static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
453 u8 local_io, u8 remote_io)
454{
455 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300456 struct l2cap_chan *chan = conn->smp;
457 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800458 u8 method;
459 u32 passkey = 0;
460 int ret = 0;
461
462 /* Initialize key for JUST WORKS */
463 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300464 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800465
466 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
467
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300468 /* If neither side wants MITM, either "just" confirm an incoming
469 * request or use just-works for outgoing ones. The JUST_CFM
470 * will be converted to JUST_WORKS if necessary later in this
471 * function. If either side has MITM look up the method from the
472 * table.
473 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300474 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300475 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800476 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300477 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800478
Johan Hedberga82505c2014-03-24 14:39:07 +0200479 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300480 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200481 method = JUST_WORKS;
482
Johan Hedberg02f3e252014-07-16 15:09:13 +0300483 /* Don't bother user space with no IO capabilities */
484 if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
485 method = JUST_WORKS;
486
Brian Gix2b64d152011-12-21 16:12:12 -0800487 /* If Just Works, Continue with Zero TK */
488 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300489 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800490 return 0;
491 }
492
493 /* Not Just Works/Confirm results in MITM Authentication */
494 if (method != JUST_CFM)
Johan Hedberg4a74d652014-05-20 09:45:50 +0300495 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800496
497 /* If both devices have Keyoard-Display I/O, the master
498 * Confirms and the slave Enters the passkey.
499 */
500 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300501 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800502 method = CFM_PASSKEY;
503 else
504 method = REQ_PASSKEY;
505 }
506
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200507 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800508 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200509 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800510 get_random_bytes(&passkey, sizeof(passkey));
511 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200512 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800513 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300514 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800515 }
516
517 hci_dev_lock(hcon->hdev);
518
519 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700520 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200521 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200522 else if (method == JUST_CFM)
523 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
524 hcon->type, hcon->dst_type,
525 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800526 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200527 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200528 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200529 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800530
531 hci_dev_unlock(hcon->hdev);
532
533 return ret;
534}
535
Johan Hedberg1cc61142014-05-20 09:45:52 +0300536static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300537{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300538 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300539 struct smp_cmd_pairing_confirm cp;
540 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300541
542 BT_DBG("conn %p", conn);
543
Johan Hedbergec70f362014-06-27 14:23:04 +0300544 ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200545 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200546 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
547 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300548 if (ret)
549 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300550
Johan Hedberg4a74d652014-05-20 09:45:50 +0300551 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800552
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300553 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
554
Johan Hedberg1cc61142014-05-20 09:45:52 +0300555 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300556}
557
Johan Hedberg861580a2014-05-20 09:45:51 +0300558static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300559{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300560 struct l2cap_conn *conn = smp->conn;
561 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300562 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300563 int ret;
564
Johan Hedbergec70f362014-06-27 14:23:04 +0300565 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300566 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300567
568 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
569
Johan Hedbergec70f362014-06-27 14:23:04 +0300570 ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200571 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200572 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300573 if (ret)
574 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300575
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300576 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
577 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300578 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300579 }
580
581 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800582 u8 stk[16];
583 __le64 rand = 0;
584 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300585
Johan Hedbergec70f362014-06-27 14:23:04 +0300586 smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300587
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300588 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300589 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300590
Johan Hedberg861580a2014-05-20 09:45:51 +0300591 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
592 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300593
594 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300595 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300596 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300597 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300598 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800599 __le64 rand = 0;
600 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300601
Johan Hedberg943a7322014-03-18 12:58:24 +0200602 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
603 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300604
Johan Hedbergec70f362014-06-27 14:23:04 +0300605 smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300606
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300607 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700608 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300609
Johan Hedbergfff34902014-06-10 15:19:50 +0300610 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
611 auth = 1;
612 else
613 auth = 0;
614
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300615 /* Even though there's no _SLAVE suffix this is the
616 * slave STK we're adding for later lookup (the master
617 * STK never needs to be stored).
618 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700619 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300620 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300621 }
622
Johan Hedberg861580a2014-05-20 09:45:51 +0300623 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300624}
625
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300626static void smp_notify_keys(struct l2cap_conn *conn)
627{
628 struct l2cap_chan *chan = conn->smp;
629 struct smp_chan *smp = chan->data;
630 struct hci_conn *hcon = conn->hcon;
631 struct hci_dev *hdev = hcon->hdev;
632 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
633 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
634 bool persistent;
635
636 if (smp->remote_irk) {
637 mgmt_new_irk(hdev, smp->remote_irk);
638 /* Now that user space can be considered to know the
639 * identity address track the connection based on it
640 * from now on.
641 */
642 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
643 hcon->dst_type = smp->remote_irk->addr_type;
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300644 queue_work(hdev->workqueue, &conn->id_addr_update_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300645
646 /* When receiving an indentity resolving key for
647 * a remote device that does not use a resolvable
648 * private address, just remove the key so that
649 * it is possible to use the controller white
650 * list for scanning.
651 *
652 * Userspace will have been told to not store
653 * this key at this point. So it is safe to
654 * just remove it.
655 */
656 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
657 list_del(&smp->remote_irk->list);
658 kfree(smp->remote_irk);
659 smp->remote_irk = NULL;
660 }
661 }
662
663 /* The LTKs and CSRKs should be persistent only if both sides
664 * had the bonding bit set in their authentication requests.
665 */
666 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
667
668 if (smp->csrk) {
669 smp->csrk->bdaddr_type = hcon->dst_type;
670 bacpy(&smp->csrk->bdaddr, &hcon->dst);
671 mgmt_new_csrk(hdev, smp->csrk, persistent);
672 }
673
674 if (smp->slave_csrk) {
675 smp->slave_csrk->bdaddr_type = hcon->dst_type;
676 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
677 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
678 }
679
680 if (smp->ltk) {
681 smp->ltk->bdaddr_type = hcon->dst_type;
682 bacpy(&smp->ltk->bdaddr, &hcon->dst);
683 mgmt_new_ltk(hdev, smp->ltk, persistent);
684 }
685
686 if (smp->slave_ltk) {
687 smp->slave_ltk->bdaddr_type = hcon->dst_type;
688 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
689 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
690 }
691}
692
Johan Hedbergd6268e82014-09-05 22:19:51 +0300693static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300694{
695 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300696 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300697 struct hci_conn *hcon = conn->hcon;
698 struct hci_dev *hdev = hcon->hdev;
699 __u8 *keydist;
700
701 BT_DBG("conn %p", conn);
702
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300703 rsp = (void *) &smp->prsp[1];
704
705 /* The responder sends its keys first */
706 if (hcon->out && (smp->remote_key_dist & 0x07))
Johan Hedberg86d14072014-08-11 22:06:43 +0300707 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300708
709 req = (void *) &smp->preq[1];
710
711 if (hcon->out) {
712 keydist = &rsp->init_key_dist;
713 *keydist &= req->init_key_dist;
714 } else {
715 keydist = &rsp->resp_key_dist;
716 *keydist &= req->resp_key_dist;
717 }
718
719 BT_DBG("keydist 0x%x", *keydist);
720
721 if (*keydist & SMP_DIST_ENC_KEY) {
722 struct smp_cmd_encrypt_info enc;
723 struct smp_cmd_master_ident ident;
724 struct smp_ltk *ltk;
725 u8 authenticated;
726 __le16 ediv;
727 __le64 rand;
728
729 get_random_bytes(enc.ltk, sizeof(enc.ltk));
730 get_random_bytes(&ediv, sizeof(ediv));
731 get_random_bytes(&rand, sizeof(rand));
732
733 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
734
735 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
736 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
737 SMP_LTK_SLAVE, authenticated, enc.ltk,
738 smp->enc_key_size, ediv, rand);
739 smp->slave_ltk = ltk;
740
741 ident.ediv = ediv;
742 ident.rand = rand;
743
744 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
745
746 *keydist &= ~SMP_DIST_ENC_KEY;
747 }
748
749 if (*keydist & SMP_DIST_ID_KEY) {
750 struct smp_cmd_ident_addr_info addrinfo;
751 struct smp_cmd_ident_info idinfo;
752
753 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
754
755 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
756
757 /* The hci_conn contains the local identity address
758 * after the connection has been established.
759 *
760 * This is true even when the connection has been
761 * established using a resolvable random address.
762 */
763 bacpy(&addrinfo.bdaddr, &hcon->src);
764 addrinfo.addr_type = hcon->src_type;
765
766 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
767 &addrinfo);
768
769 *keydist &= ~SMP_DIST_ID_KEY;
770 }
771
772 if (*keydist & SMP_DIST_SIGN) {
773 struct smp_cmd_sign_info sign;
774 struct smp_csrk *csrk;
775
776 /* Generate a new random key */
777 get_random_bytes(sign.csrk, sizeof(sign.csrk));
778
779 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
780 if (csrk) {
781 csrk->master = 0x00;
782 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
783 }
784 smp->slave_csrk = csrk;
785
786 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
787
788 *keydist &= ~SMP_DIST_SIGN;
789 }
790
791 /* If there are still keys to be received wait for them */
792 if ((smp->remote_key_dist & 0x07))
Johan Hedberg86d14072014-08-11 22:06:43 +0300793 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300794
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300795 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
796 smp_notify_keys(conn);
797
798 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300799}
800
Johan Hedbergb68fda62014-08-11 22:06:40 +0300801static void smp_timeout(struct work_struct *work)
802{
803 struct smp_chan *smp = container_of(work, struct smp_chan,
804 security_timer.work);
805 struct l2cap_conn *conn = smp->conn;
806
807 BT_DBG("conn %p", conn);
808
Johan Hedberg1e91c292014-08-18 20:33:29 +0300809 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +0300810}
811
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300812static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
813{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300814 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300815 struct smp_chan *smp;
816
Marcel Holtmannf1560462013-10-13 05:43:25 -0700817 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300818 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300819 return NULL;
820
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300821 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
822 if (IS_ERR(smp->tfm_aes)) {
823 BT_ERR("Unable to create ECB crypto context");
824 kfree(smp);
825 return NULL;
826 }
827
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300828 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300829 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300830
Johan Hedbergb68fda62014-08-11 22:06:40 +0300831 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
832
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300833 hci_conn_hold(conn->hcon);
834
835 return smp;
836}
837
Brian Gix2b64d152011-12-21 16:12:12 -0800838int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
839{
Johan Hedbergb10e8012014-06-27 14:23:07 +0300840 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300841 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -0800842 struct smp_chan *smp;
843 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300844 int err;
Brian Gix2b64d152011-12-21 16:12:12 -0800845
846 BT_DBG("");
847
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300848 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -0800849 return -ENOTCONN;
850
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300851 chan = conn->smp;
852 if (!chan)
853 return -ENOTCONN;
854
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300855 l2cap_chan_lock(chan);
856 if (!chan->data) {
857 err = -ENOTCONN;
858 goto unlock;
859 }
860
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300861 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800862
863 switch (mgmt_op) {
864 case MGMT_OP_USER_PASSKEY_REPLY:
865 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200866 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800867 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200868 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800869 /* Fall Through */
870 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300871 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800872 break;
873 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
874 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200875 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300876 err = 0;
877 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800878 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200879 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300880 err = -EOPNOTSUPP;
881 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800882 }
883
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300884 err = 0;
885
Brian Gix2b64d152011-12-21 16:12:12 -0800886 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300887 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
888 u8 rsp = smp_confirm(smp);
889 if (rsp)
890 smp_failure(conn, rsp);
891 }
Brian Gix2b64d152011-12-21 16:12:12 -0800892
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300893unlock:
894 l2cap_chan_unlock(chan);
895 return err;
Brian Gix2b64d152011-12-21 16:12:12 -0800896}
897
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300898static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300899{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300900 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300901 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300902 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300903 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300904 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300905 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300906
907 BT_DBG("conn %p", conn);
908
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200909 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300910 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200911
Johan Hedberg40bef302014-07-16 11:42:27 +0300912 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800913 return SMP_CMD_NOTSUPP;
914
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300915 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300916 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300917 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300918 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300919
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300920 if (!smp)
921 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300922
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300923 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergb3c64102014-07-10 11:02:07 +0300924 (req->auth_req & SMP_AUTH_BONDING))
925 return SMP_PAIRING_NOTSUPP;
926
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300927 smp->preq[0] = SMP_CMD_PAIRING_REQ;
928 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300929 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300930
Brian Gix2b64d152011-12-21 16:12:12 -0800931 /* We didn't start the pairing, so match remote */
Johan Hedberg1ef35822014-05-20 09:45:48 +0300932 auth = req->auth_req;
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300933
Johan Hedbergc7262e72014-06-17 13:07:37 +0300934 sec_level = authreq_to_seclevel(auth);
935 if (sec_level > conn->hcon->pending_sec_level)
936 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +0200937
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300938 /* If we need MITM check that it can be acheived */
939 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
940 u8 method;
941
942 method = get_auth_method(smp, conn->hcon->io_capability,
943 req->io_capability);
944 if (method == JUST_WORKS || method == JUST_CFM)
945 return SMP_AUTH_REQUIREMENTS;
946 }
947
Brian Gix2b64d152011-12-21 16:12:12 -0800948 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300949
950 key_size = min(req->max_key_size, rsp.max_key_size);
951 if (check_enc_key_size(conn, key_size))
952 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300953
Johan Hedberge84a6b12013-12-02 10:49:03 +0200954 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300955
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300956 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
957 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300958
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300959 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300960
Brian Gix2b64d152011-12-21 16:12:12 -0800961 /* Request setup of TK */
962 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
963 if (ret)
964 return SMP_UNSPECIFIED;
965
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300966 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300967}
968
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300969static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300970{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300971 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300972 struct l2cap_chan *chan = conn->smp;
973 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800974 u8 key_size, auth = SMP_AUTH_NONE;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300975 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300976
977 BT_DBG("conn %p", conn);
978
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200979 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300980 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200981
Johan Hedberg40bef302014-07-16 11:42:27 +0300982 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800983 return SMP_CMD_NOTSUPP;
984
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300985 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300986
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300987 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300988
989 key_size = min(req->max_key_size, rsp->max_key_size);
990 if (check_enc_key_size(conn, key_size))
991 return SMP_ENC_KEY_SIZE;
992
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300993 /* If we need MITM check that it can be acheived */
994 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
995 u8 method;
996
997 method = get_auth_method(smp, req->io_capability,
998 rsp->io_capability);
999 if (method == JUST_WORKS || method == JUST_CFM)
1000 return SMP_AUTH_REQUIREMENTS;
1001 }
1002
Johan Hedberge84a6b12013-12-02 10:49:03 +02001003 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001004
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001005 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1006 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001007
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001008 /* Update remote key distribution in case the remote cleared
1009 * some bits that we had enabled in our request.
1010 */
1011 smp->remote_key_dist &= rsp->resp_key_dist;
1012
Brian Gix2b64d152011-12-21 16:12:12 -08001013 if ((req->auth_req & SMP_AUTH_BONDING) &&
Marcel Holtmannf1560462013-10-13 05:43:25 -07001014 (rsp->auth_req & SMP_AUTH_BONDING))
Brian Gix2b64d152011-12-21 16:12:12 -08001015 auth = SMP_AUTH_BONDING;
1016
1017 auth |= (req->auth_req | rsp->auth_req) & SMP_AUTH_MITM;
1018
Johan Hedberg476585e2012-06-06 18:54:15 +08001019 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001020 if (ret)
1021 return SMP_UNSPECIFIED;
1022
Johan Hedberg4a74d652014-05-20 09:45:50 +03001023 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001024
1025 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001026 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001027 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001028
1029 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001030}
1031
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001032static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001033{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001034 struct l2cap_chan *chan = conn->smp;
1035 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001036
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001037 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1038
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001039 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001040 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001041
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001042 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1043 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001044
Johan Hedberg943a7322014-03-18 12:58:24 +02001045 if (conn->hcon->out)
1046 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1047 smp->prnd);
Johan Hedberg4a74d652014-05-20 09:45:50 +03001048 else if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001049 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001050 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001051 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001052
1053 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001054}
1055
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001056static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001057{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001058 struct l2cap_chan *chan = conn->smp;
1059 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001060
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001061 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001062
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001063 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001064 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001065
Johan Hedberg943a7322014-03-18 12:58:24 +02001066 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001067 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001068
Johan Hedberg861580a2014-05-20 09:45:51 +03001069 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001070}
1071
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001072static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001073{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001074 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001075 struct hci_conn *hcon = conn->hcon;
1076
Johan Hedberg98a0b842014-01-30 19:40:00 -08001077 key = hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001078 hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001079 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001080 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001081
Johan Hedberg4dab7862012-06-07 14:58:37 +08001082 if (sec_level > BT_SECURITY_MEDIUM && !key->authenticated)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001083 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001084
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001085 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001086 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001087
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001088 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1089 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001090
Johan Hedbergfe59a052014-07-01 19:14:12 +03001091 /* We never store STKs for master role, so clear this flag */
1092 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1093
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001094 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001095}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001096
Johan Hedberg854f4722014-07-01 18:40:20 +03001097bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level)
1098{
1099 if (sec_level == BT_SECURITY_LOW)
1100 return true;
1101
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001102 /* If we're encrypted with an STK always claim insufficient
1103 * security. This way we allow the connection to be re-encrypted
1104 * with an LTK, even if the LTK provides the same level of
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001105 * security. Only exception is if we don't have an LTK (e.g.
1106 * because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001107 */
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001108 if (test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
1109 hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001110 hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001111 return false;
1112
Johan Hedberg854f4722014-07-01 18:40:20 +03001113 if (hcon->sec_level >= sec_level)
1114 return true;
1115
1116 return false;
1117}
1118
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001119static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001120{
1121 struct smp_cmd_security_req *rp = (void *) skb->data;
1122 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001123 struct hci_conn *hcon = conn->hcon;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001124 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001125 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001126 u8 sec_level;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001127
1128 BT_DBG("conn %p", conn);
1129
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001130 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001131 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001132
Johan Hedberg40bef302014-07-16 11:42:27 +03001133 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001134 return SMP_CMD_NOTSUPP;
1135
Johan Hedbergc7262e72014-06-17 13:07:37 +03001136 sec_level = authreq_to_seclevel(rp->auth_req);
Johan Hedberg854f4722014-07-01 18:40:20 +03001137 if (smp_sufficient_security(hcon, sec_level))
1138 return 0;
1139
Johan Hedbergc7262e72014-06-17 13:07:37 +03001140 if (sec_level > hcon->pending_sec_level)
1141 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001142
Johan Hedberg4dab7862012-06-07 14:58:37 +08001143 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001144 return 0;
1145
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001146 /* If SMP is already in progress ignore this request */
1147 if (chan->data)
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001148 return 0;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001149
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001150 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001151 if (!smp)
1152 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001153
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001154 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedberg616d55b2014-07-29 14:18:48 +03001155 (rp->auth_req & SMP_AUTH_BONDING))
1156 return SMP_PAIRING_NOTSUPP;
1157
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001158 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001159
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001160 memset(&cp, 0, sizeof(cp));
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -03001161 build_pairing_cmd(conn, &cp, NULL, rp->auth_req);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001162
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001163 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1164 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001165
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001166 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001167
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001168 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001169}
1170
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001171int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001172{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001173 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001174 struct l2cap_chan *chan = conn->smp;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001175 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001176 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001177 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001178
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001179 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1180
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001181 /* This may be NULL if there's an unexpected disconnection */
1182 if (!conn)
1183 return 1;
1184
Johan Hedberg757aee02013-04-24 13:05:32 +03001185 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001186 return 1;
1187
Johan Hedbergad32a2f2013-05-14 18:05:12 +03001188 if (smp_sufficient_security(hcon, sec_level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001189 return 1;
1190
Johan Hedbergc7262e72014-06-17 13:07:37 +03001191 if (sec_level > hcon->pending_sec_level)
1192 hcon->pending_sec_level = sec_level;
1193
Johan Hedberg40bef302014-07-16 11:42:27 +03001194 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001195 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1196 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001197
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001198 l2cap_chan_lock(chan);
1199
1200 /* If SMP is already in progress ignore this request */
1201 if (chan->data) {
1202 ret = 0;
1203 goto unlock;
1204 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001205
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001206 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001207 if (!smp) {
1208 ret = 1;
1209 goto unlock;
1210 }
Brian Gix2b64d152011-12-21 16:12:12 -08001211
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 Hedbergfc75cc82014-09-05 22:19:52 +03001236 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02001237
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001238unlock:
1239 l2cap_chan_unlock(chan);
1240 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001241}
1242
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001243static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1244{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001245 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001246 struct l2cap_chan *chan = conn->smp;
1247 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001248
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001249 BT_DBG("conn %p", conn);
1250
1251 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001252 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001253
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001254 /* Ignore this PDU if it wasn't requested */
1255 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1256 return 0;
1257
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001258 skb_pull(skb, sizeof(*rp));
1259
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001260 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001261
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001262 return 0;
1263}
1264
1265static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1266{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001267 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001268 struct l2cap_chan *chan = conn->smp;
1269 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001270 struct hci_dev *hdev = conn->hcon->hdev;
1271 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001272 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001273 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001274
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001275 BT_DBG("conn %p", conn);
1276
1277 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001278 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001279
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001280 /* Ignore this PDU if it wasn't requested */
1281 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1282 return 0;
1283
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001284 /* Mark the information as received */
1285 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1286
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001287 skb_pull(skb, sizeof(*rp));
1288
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001289 hci_dev_lock(hdev);
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001290 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001291 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001292 authenticated, smp->tk, smp->enc_key_size,
1293 rp->ediv, rp->rand);
1294 smp->ltk = ltk;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001295 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
Johan Hedbergd6268e82014-09-05 22:19:51 +03001296 smp_distribute_keys(smp);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001297 hci_dev_unlock(hdev);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001298
1299 return 0;
1300}
1301
Johan Hedbergfd349c02014-02-18 10:19:36 +02001302static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1303{
1304 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001305 struct l2cap_chan *chan = conn->smp;
1306 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001307
1308 BT_DBG("");
1309
1310 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001311 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001312
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001313 /* Ignore this PDU if it wasn't requested */
1314 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1315 return 0;
1316
Johan Hedbergfd349c02014-02-18 10:19:36 +02001317 skb_pull(skb, sizeof(*info));
1318
1319 memcpy(smp->irk, info->irk, 16);
1320
1321 return 0;
1322}
1323
1324static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1325 struct sk_buff *skb)
1326{
1327 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001328 struct l2cap_chan *chan = conn->smp;
1329 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001330 struct hci_conn *hcon = conn->hcon;
1331 bdaddr_t rpa;
1332
1333 BT_DBG("");
1334
1335 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001336 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001337
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001338 /* Ignore this PDU if it wasn't requested */
1339 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1340 return 0;
1341
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001342 /* Mark the information as received */
1343 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1344
Johan Hedbergfd349c02014-02-18 10:19:36 +02001345 skb_pull(skb, sizeof(*info));
1346
Johan Hedberg31dd6242014-06-27 14:23:02 +03001347 hci_dev_lock(hcon->hdev);
1348
Johan Hedberga9a58f82014-02-25 22:24:37 +02001349 /* Strictly speaking the Core Specification (4.1) allows sending
1350 * an empty address which would force us to rely on just the IRK
1351 * as "identity information". However, since such
1352 * implementations are not known of and in order to not over
1353 * complicate our implementation, simply pretend that we never
1354 * received an IRK for such a device.
1355 */
1356 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1357 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001358 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001359 }
1360
Johan Hedbergfd349c02014-02-18 10:19:36 +02001361 bacpy(&smp->id_addr, &info->bdaddr);
1362 smp->id_addr_type = info->addr_type;
1363
1364 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1365 bacpy(&rpa, &hcon->dst);
1366 else
1367 bacpy(&rpa, BDADDR_ANY);
1368
Johan Hedberg23d0e122014-02-19 14:57:46 +02001369 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1370 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001371
Johan Hedberg31dd6242014-06-27 14:23:02 +03001372distribute:
Johan Hedbergd6268e82014-09-05 22:19:51 +03001373 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001374
Johan Hedberg31dd6242014-06-27 14:23:02 +03001375 hci_dev_unlock(hcon->hdev);
1376
Johan Hedbergfd349c02014-02-18 10:19:36 +02001377 return 0;
1378}
1379
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001380static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1381{
1382 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001383 struct l2cap_chan *chan = conn->smp;
1384 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001385 struct hci_dev *hdev = conn->hcon->hdev;
1386 struct smp_csrk *csrk;
1387
1388 BT_DBG("conn %p", conn);
1389
1390 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001391 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001392
1393 /* Ignore this PDU if it wasn't requested */
1394 if (!(smp->remote_key_dist & SMP_DIST_SIGN))
1395 return 0;
1396
1397 /* Mark the information as received */
1398 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1399
1400 skb_pull(skb, sizeof(*rp));
1401
1402 hci_dev_lock(hdev);
1403 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1404 if (csrk) {
1405 csrk->master = 0x01;
1406 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1407 }
1408 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03001409 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001410 hci_dev_unlock(hdev);
1411
1412 return 0;
1413}
1414
Johan Hedberg4befb862014-08-11 22:06:38 +03001415static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001416{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001417 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001418 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001419 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001420 int err = 0;
1421
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001422 if (hcon->type != LE_LINK) {
1423 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001424 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001425 }
1426
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001427 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07001428 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001429
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001430 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001431 reason = SMP_PAIRING_NOTSUPP;
1432 goto done;
1433 }
1434
Marcel Holtmann92381f52013-10-03 01:23:08 -07001435 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001436 skb_pull(skb, sizeof(code));
1437
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001438 /*
1439 * The SMP context must be initialized for all other PDUs except
1440 * pairing and security requests. If we get any other PDU when
1441 * not initialized simply disconnect (done if this function
1442 * returns an error).
1443 */
1444 if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ &&
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001445 !chan->data) {
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001446 BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001447 err = -EOPNOTSUPP;
1448 goto done;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001449 }
1450
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001451 switch (code) {
1452 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001453 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001454 break;
1455
1456 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001457 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001458 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001459 break;
1460
1461 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001462 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001463 break;
1464
1465 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001466 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001467 break;
1468
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001469 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001470 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001471 break;
1472
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001473 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001474 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001475 break;
1476
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001477 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001478 reason = smp_cmd_encrypt_info(conn, skb);
1479 break;
1480
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001481 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001482 reason = smp_cmd_master_ident(conn, skb);
1483 break;
1484
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001485 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001486 reason = smp_cmd_ident_info(conn, skb);
1487 break;
1488
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001489 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001490 reason = smp_cmd_ident_addr_info(conn, skb);
1491 break;
1492
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001493 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001494 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001495 break;
1496
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001497 default:
1498 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001499 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001500 goto done;
1501 }
1502
1503done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001504 if (!err) {
1505 if (reason)
1506 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001507 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001508 }
1509
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001510 return err;
1511}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001512
Johan Hedberg70db83c2014-08-08 09:37:16 +03001513static void smp_teardown_cb(struct l2cap_chan *chan, int err)
1514{
1515 struct l2cap_conn *conn = chan->conn;
1516
1517 BT_DBG("chan %p", chan);
1518
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001519 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001520 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001521
Johan Hedberg70db83c2014-08-08 09:37:16 +03001522 conn->smp = NULL;
1523 l2cap_chan_put(chan);
1524}
1525
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001526static void smp_resume_cb(struct l2cap_chan *chan)
1527{
Johan Hedbergb68fda62014-08-11 22:06:40 +03001528 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001529 struct l2cap_conn *conn = chan->conn;
1530 struct hci_conn *hcon = conn->hcon;
1531
1532 BT_DBG("chan %p", chan);
1533
Johan Hedberg86d14072014-08-11 22:06:43 +03001534 if (!smp)
1535 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03001536
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001537 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
1538 return;
1539
Johan Hedberg86d14072014-08-11 22:06:43 +03001540 cancel_delayed_work(&smp->security_timer);
1541
Johan Hedbergd6268e82014-09-05 22:19:51 +03001542 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001543}
1544
Johan Hedberg70db83c2014-08-08 09:37:16 +03001545static void smp_ready_cb(struct l2cap_chan *chan)
1546{
1547 struct l2cap_conn *conn = chan->conn;
1548
1549 BT_DBG("chan %p", chan);
1550
1551 conn->smp = chan;
1552 l2cap_chan_hold(chan);
1553}
1554
Johan Hedberg4befb862014-08-11 22:06:38 +03001555static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
1556{
1557 int err;
1558
1559 BT_DBG("chan %p", chan);
1560
1561 err = smp_sig_channel(chan, skb);
1562 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03001563 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03001564
Johan Hedbergb68fda62014-08-11 22:06:40 +03001565 if (smp)
1566 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03001567
Johan Hedberg1e91c292014-08-18 20:33:29 +03001568 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03001569 }
1570
1571 return err;
1572}
1573
Johan Hedberg70db83c2014-08-08 09:37:16 +03001574static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
1575 unsigned long hdr_len,
1576 unsigned long len, int nb)
1577{
1578 struct sk_buff *skb;
1579
1580 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
1581 if (!skb)
1582 return ERR_PTR(-ENOMEM);
1583
1584 skb->priority = HCI_PRIO_MAX;
1585 bt_cb(skb)->chan = chan;
1586
1587 return skb;
1588}
1589
1590static const struct l2cap_ops smp_chan_ops = {
1591 .name = "Security Manager",
1592 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001593 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001594 .alloc_skb = smp_alloc_skb_cb,
1595 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001596 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001597
1598 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001599 .state_change = l2cap_chan_no_state_change,
1600 .close = l2cap_chan_no_close,
1601 .defer = l2cap_chan_no_defer,
1602 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001603 .set_shutdown = l2cap_chan_no_set_shutdown,
1604 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1605 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1606};
1607
1608static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
1609{
1610 struct l2cap_chan *chan;
1611
1612 BT_DBG("pchan %p", pchan);
1613
1614 chan = l2cap_chan_create();
1615 if (!chan)
1616 return NULL;
1617
1618 chan->chan_type = pchan->chan_type;
1619 chan->ops = &smp_chan_ops;
1620 chan->scid = pchan->scid;
1621 chan->dcid = chan->scid;
1622 chan->imtu = pchan->imtu;
1623 chan->omtu = pchan->omtu;
1624 chan->mode = pchan->mode;
1625
1626 BT_DBG("created chan %p", chan);
1627
1628 return chan;
1629}
1630
1631static const struct l2cap_ops smp_root_chan_ops = {
1632 .name = "Security Manager Root",
1633 .new_connection = smp_new_conn_cb,
1634
1635 /* None of these are implemented for the root channel */
1636 .close = l2cap_chan_no_close,
1637 .alloc_skb = l2cap_chan_no_alloc_skb,
1638 .recv = l2cap_chan_no_recv,
1639 .state_change = l2cap_chan_no_state_change,
1640 .teardown = l2cap_chan_no_teardown,
1641 .ready = l2cap_chan_no_ready,
1642 .defer = l2cap_chan_no_defer,
1643 .suspend = l2cap_chan_no_suspend,
1644 .resume = l2cap_chan_no_resume,
1645 .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
Johan Hedberg711eafe2014-08-08 09:32:52 +03001650int smp_register(struct hci_dev *hdev)
1651{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001652 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001653 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001654
Johan Hedberg711eafe2014-08-08 09:32:52 +03001655 BT_DBG("%s", hdev->name);
1656
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001657 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1658 if (IS_ERR(tfm_aes)) {
1659 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001660 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03001661 return err;
1662 }
1663
Johan Hedberg70db83c2014-08-08 09:37:16 +03001664 chan = l2cap_chan_create();
1665 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001666 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001667 return -ENOMEM;
1668 }
1669
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001670 chan->data = tfm_aes;
1671
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001672 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001673
1674 l2cap_chan_set_defaults(chan);
1675
1676 bacpy(&chan->src, &hdev->bdaddr);
1677 chan->src_type = BDADDR_LE_PUBLIC;
1678 chan->state = BT_LISTEN;
1679 chan->mode = L2CAP_MODE_BASIC;
1680 chan->imtu = L2CAP_DEFAULT_MTU;
1681 chan->ops = &smp_root_chan_ops;
1682
1683 hdev->smp_data = chan;
1684
Johan Hedberg711eafe2014-08-08 09:32:52 +03001685 return 0;
1686}
1687
1688void smp_unregister(struct hci_dev *hdev)
1689{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001690 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001691 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001692
1693 if (!chan)
1694 return;
1695
1696 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001697
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001698 tfm_aes = chan->data;
1699 if (tfm_aes) {
1700 chan->data = NULL;
1701 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001702 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03001703
1704 hdev->smp_data = NULL;
1705 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001706}