blob: 5003d224c4b66cfcc491ccc14a8d606cc398a02d [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
Johan Hedberg88d3a8a2014-09-05 22:19:53 +030037#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020038
Johan Hedberg533e35d2014-06-16 19:25:18 +030039enum {
40 SMP_FLAG_TK_VALID,
41 SMP_FLAG_CFM_PENDING,
42 SMP_FLAG_MITM_AUTH,
43 SMP_FLAG_COMPLETE,
44 SMP_FLAG_INITIATOR,
45};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030046
47struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030048 struct l2cap_conn *conn;
49 struct delayed_work security_timer;
50
Johan Hedberg4bc58f52014-05-20 09:45:47 +030051 u8 preq[7]; /* SMP Pairing Request */
52 u8 prsp[7]; /* SMP Pairing Response */
53 u8 prnd[16]; /* SMP Pairing Random (local) */
54 u8 rrnd[16]; /* SMP Pairing Random (remote) */
55 u8 pcnf[16]; /* SMP Pairing Confirm */
56 u8 tk[16]; /* SMP Temporary Key */
57 u8 enc_key_size;
58 u8 remote_key_dist;
59 bdaddr_t id_addr;
60 u8 id_addr_type;
61 u8 irk[16];
62 struct smp_csrk *csrk;
63 struct smp_csrk *slave_csrk;
64 struct smp_ltk *ltk;
65 struct smp_ltk *slave_ltk;
66 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030067 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030068
69 struct crypto_blkcipher *tfm_aes;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030070};
71
Johan Hedberg8a2936f2014-06-16 19:25:19 +030072static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030073{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030074 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030075
Johan Hedberg8a2936f2014-06-16 19:25:19 +030076 for (i = 0; i < len; i++)
77 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030078}
79
80static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
81{
82 struct blkcipher_desc desc;
83 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +020084 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +020085 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030086
87 if (tfm == NULL) {
88 BT_ERR("tfm %p", tfm);
89 return -EINVAL;
90 }
91
92 desc.tfm = tfm;
93 desc.flags = 0;
94
Johan Hedberg943a7322014-03-18 12:58:24 +020095 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +030096 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +020097
98 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030099 if (err) {
100 BT_ERR("cipher setkey failed: %d", err);
101 return err;
102 }
103
Johan Hedberg943a7322014-03-18 12:58:24 +0200104 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300105 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200106
107 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300108
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300109 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
110 if (err)
111 BT_ERR("Encrypt data error %d", err);
112
Johan Hedberg943a7322014-03-18 12:58:24 +0200113 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300114 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200115
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300116 return err;
117}
118
Johan Hedberg60478052014-02-18 10:19:31 +0200119static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
120{
Johan Hedberg943a7322014-03-18 12:58:24 +0200121 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200122 int err;
123
124 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200125 memcpy(_res, r, 3);
126 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200127
Johan Hedberg943a7322014-03-18 12:58:24 +0200128 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200129 if (err) {
130 BT_ERR("Encrypt error");
131 return err;
132 }
133
134 /* The output of the random address function ah is:
135 * ah(h, r) = e(k, r') mod 2^24
136 * The output of the security function e is then truncated to 24 bits
137 * by taking the least significant 24 bits of the output of e as the
138 * result of ah.
139 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200140 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200141
142 return 0;
143}
144
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300145bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200146{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300147 struct l2cap_chan *chan = hdev->smp_data;
148 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200149 u8 hash[3];
150 int err;
151
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300152 if (!chan || !chan->data)
153 return false;
154
155 tfm = chan->data;
156
Johan Hedberg60478052014-02-18 10:19:31 +0200157 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
158
159 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
160 if (err)
161 return false;
162
163 return !memcmp(bdaddr->b, hash, 3);
164}
165
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300166int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200167{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300168 struct l2cap_chan *chan = hdev->smp_data;
169 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200170 int err;
171
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300172 if (!chan || !chan->data)
173 return -EOPNOTSUPP;
174
175 tfm = chan->data;
176
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200177 get_random_bytes(&rpa->b[3], 3);
178
179 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
180 rpa->b[5] |= 0x40; /* Set second most significant bit */
181
182 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
183 if (err < 0)
184 return err;
185
186 BT_DBG("RPA %pMR", rpa);
187
188 return 0;
189}
190
Johan Hedbergec70f362014-06-27 14:23:04 +0300191static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
192 u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
193 u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300194{
Johan Hedbergec70f362014-06-27 14:23:04 +0300195 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300196 u8 p1[16], p2[16];
197 int err;
198
Johan Hedbergec70f362014-06-27 14:23:04 +0300199 BT_DBG("%s", hdev->name);
200
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300201 memset(p1, 0, 16);
202
203 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200204 p1[0] = _iat;
205 p1[1] = _rat;
206 memcpy(p1 + 2, preq, 7);
207 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300208
209 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200210 memcpy(p2, ra, 6);
211 memcpy(p2 + 6, ia, 6);
212 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300213
214 /* res = r XOR p1 */
215 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
216
217 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300218 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300219 if (err) {
220 BT_ERR("Encrypt data error");
221 return err;
222 }
223
224 /* res = res XOR p2 */
225 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
226
227 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300228 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300229 if (err)
230 BT_ERR("Encrypt data error");
231
232 return err;
233}
234
Johan Hedbergec70f362014-06-27 14:23:04 +0300235static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
236 u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300237{
Johan Hedbergec70f362014-06-27 14:23:04 +0300238 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300239 int err;
240
Johan Hedbergec70f362014-06-27 14:23:04 +0300241 BT_DBG("%s", hdev->name);
242
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300243 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200244 memcpy(_r, r2, 8);
245 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300246
Johan Hedbergec70f362014-06-27 14:23:04 +0300247 err = smp_e(smp->tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300248 if (err)
249 BT_ERR("Encrypt data error");
250
251 return err;
252}
253
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300254static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
255{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300256 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300257 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300258 struct kvec iv[2];
259 struct msghdr msg;
260
261 if (!chan)
262 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300263
264 BT_DBG("code 0x%2.2x", code);
265
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300266 iv[0].iov_base = &code;
267 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300268
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300269 iv[1].iov_base = data;
270 iv[1].iov_len = len;
271
272 memset(&msg, 0, sizeof(msg));
273
274 msg.msg_iov = (struct iovec *) &iv;
275 msg.msg_iovlen = 2;
276
277 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300278
Johan Hedbergb68fda62014-08-11 22:06:40 +0300279 if (!chan->data)
280 return;
281
282 smp = chan->data;
283
284 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300285 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300286}
287
Brian Gix2b64d152011-12-21 16:12:12 -0800288static __u8 authreq_to_seclevel(__u8 authreq)
289{
290 if (authreq & SMP_AUTH_MITM)
291 return BT_SECURITY_HIGH;
292 else
293 return BT_SECURITY_MEDIUM;
294}
295
296static __u8 seclevel_to_authreq(__u8 sec_level)
297{
298 switch (sec_level) {
299 case BT_SECURITY_HIGH:
300 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
301 case BT_SECURITY_MEDIUM:
302 return SMP_AUTH_BONDING;
303 default:
304 return SMP_AUTH_NONE;
305 }
306}
307
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300308static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700309 struct smp_cmd_pairing *req,
310 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300311{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300312 struct l2cap_chan *chan = conn->smp;
313 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200314 struct hci_conn *hcon = conn->hcon;
315 struct hci_dev *hdev = hcon->hdev;
316 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300317
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300318 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700319 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
320 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300321 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800322 } else {
323 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300324 }
325
Johan Hedbergfd349c02014-02-18 10:19:36 +0200326 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
327 remote_dist |= SMP_DIST_ID_KEY;
328
Johan Hedberg863efaf2014-02-22 19:06:32 +0200329 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
330 local_dist |= SMP_DIST_ID_KEY;
331
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300332 if (rsp == NULL) {
333 req->io_capability = conn->hcon->io_capability;
334 req->oob_flag = SMP_OOB_NOT_PRESENT;
335 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200336 req->init_key_dist = local_dist;
337 req->resp_key_dist = remote_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200338 req->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200339
340 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300341 return;
342 }
343
344 rsp->io_capability = conn->hcon->io_capability;
345 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
346 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200347 rsp->init_key_dist = req->init_key_dist & remote_dist;
348 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200349 rsp->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200350
351 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300352}
353
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300354static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
355{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300356 struct l2cap_chan *chan = conn->smp;
357 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300358
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300359 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700360 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300361 return SMP_ENC_KEY_SIZE;
362
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300363 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300364
365 return 0;
366}
367
Johan Hedberg6f48e262014-08-11 22:06:44 +0300368static void smp_chan_destroy(struct l2cap_conn *conn)
369{
370 struct l2cap_chan *chan = conn->smp;
371 struct smp_chan *smp = chan->data;
372 bool complete;
373
374 BUG_ON(!smp);
375
376 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300377
Johan Hedberg6f48e262014-08-11 22:06:44 +0300378 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
379 mgmt_smp_complete(conn->hcon, complete);
380
381 kfree(smp->csrk);
382 kfree(smp->slave_csrk);
383
384 crypto_free_blkcipher(smp->tfm_aes);
385
386 /* If pairing failed clean up any keys we might have */
387 if (!complete) {
388 if (smp->ltk) {
389 list_del(&smp->ltk->list);
390 kfree(smp->ltk);
391 }
392
393 if (smp->slave_ltk) {
394 list_del(&smp->slave_ltk->list);
395 kfree(smp->slave_ltk);
396 }
397
398 if (smp->remote_irk) {
399 list_del(&smp->remote_irk->list);
400 kfree(smp->remote_irk);
401 }
402 }
403
404 chan->data = NULL;
405 kfree(smp);
406 hci_conn_drop(conn->hcon);
407}
408
Johan Hedberg84794e12013-11-06 11:24:57 +0200409static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800410{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200411 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300412 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200413
Johan Hedberg84794e12013-11-06 11:24:57 +0200414 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800415 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700416 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800417
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700418 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
419 mgmt_auth_failed(hcon->hdev, &hcon->dst, hcon->type, hcon->dst_type,
420 HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300421
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300422 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300423 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800424}
425
Brian Gix2b64d152011-12-21 16:12:12 -0800426#define JUST_WORKS 0x00
427#define JUST_CFM 0x01
428#define REQ_PASSKEY 0x02
429#define CFM_PASSKEY 0x03
430#define REQ_OOB 0x04
431#define OVERLAP 0xFF
432
433static const u8 gen_method[5][5] = {
434 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
435 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
436 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
437 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
438 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
439};
440
Johan Hedberg581370c2014-06-17 13:07:38 +0300441static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
442{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300443 /* If either side has unknown io_caps, use JUST_CFM (which gets
444 * converted later to JUST_WORKS if we're initiators.
445 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300446 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
447 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300448 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300449
450 return gen_method[remote_io][local_io];
451}
452
Brian Gix2b64d152011-12-21 16:12:12 -0800453static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
454 u8 local_io, u8 remote_io)
455{
456 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300457 struct l2cap_chan *chan = conn->smp;
458 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800459 u8 method;
460 u32 passkey = 0;
461 int ret = 0;
462
463 /* Initialize key for JUST WORKS */
464 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300465 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800466
467 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
468
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300469 /* If neither side wants MITM, either "just" confirm an incoming
470 * request or use just-works for outgoing ones. The JUST_CFM
471 * will be converted to JUST_WORKS if necessary later in this
472 * function. If either side has MITM look up the method from the
473 * table.
474 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300475 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300476 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800477 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300478 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800479
Johan Hedberga82505c2014-03-24 14:39:07 +0200480 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300481 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200482 method = JUST_WORKS;
483
Johan Hedberg02f3e252014-07-16 15:09:13 +0300484 /* Don't bother user space with no IO capabilities */
485 if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
486 method = JUST_WORKS;
487
Brian Gix2b64d152011-12-21 16:12:12 -0800488 /* If Just Works, Continue with Zero TK */
489 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300490 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800491 return 0;
492 }
493
494 /* Not Just Works/Confirm results in MITM Authentication */
495 if (method != JUST_CFM)
Johan Hedberg4a74d652014-05-20 09:45:50 +0300496 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800497
498 /* If both devices have Keyoard-Display I/O, the master
499 * Confirms and the slave Enters the passkey.
500 */
501 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300502 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800503 method = CFM_PASSKEY;
504 else
505 method = REQ_PASSKEY;
506 }
507
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200508 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800509 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200510 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800511 get_random_bytes(&passkey, sizeof(passkey));
512 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200513 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800514 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300515 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800516 }
517
518 hci_dev_lock(hcon->hdev);
519
520 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700521 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200522 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200523 else if (method == JUST_CFM)
524 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
525 hcon->type, hcon->dst_type,
526 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800527 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200528 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200529 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200530 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800531
532 hci_dev_unlock(hcon->hdev);
533
534 return ret;
535}
536
Johan Hedberg1cc61142014-05-20 09:45:52 +0300537static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300538{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300539 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300540 struct smp_cmd_pairing_confirm cp;
541 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300542
543 BT_DBG("conn %p", conn);
544
Johan Hedbergec70f362014-06-27 14:23:04 +0300545 ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200546 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200547 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
548 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300549 if (ret)
550 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300551
Johan Hedberg4a74d652014-05-20 09:45:50 +0300552 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800553
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300554 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
555
Johan Hedberg1cc61142014-05-20 09:45:52 +0300556 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300557}
558
Johan Hedberg861580a2014-05-20 09:45:51 +0300559static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300560{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300561 struct l2cap_conn *conn = smp->conn;
562 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300563 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300564 int ret;
565
Johan Hedbergec70f362014-06-27 14:23:04 +0300566 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300567 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300568
569 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
570
Johan Hedbergec70f362014-06-27 14:23:04 +0300571 ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200572 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200573 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300574 if (ret)
575 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300576
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300577 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
578 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300579 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300580 }
581
582 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800583 u8 stk[16];
584 __le64 rand = 0;
585 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300586
Johan Hedbergec70f362014-06-27 14:23:04 +0300587 smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300588
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300589 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300590 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300591
Johan Hedberg861580a2014-05-20 09:45:51 +0300592 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
593 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300594
595 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300596 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300597 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300598 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300599 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800600 __le64 rand = 0;
601 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300602
Johan Hedberg943a7322014-03-18 12:58:24 +0200603 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
604 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300605
Johan Hedbergec70f362014-06-27 14:23:04 +0300606 smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300607
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300608 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700609 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300610
Johan Hedbergfff34902014-06-10 15:19:50 +0300611 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
612 auth = 1;
613 else
614 auth = 0;
615
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300616 /* Even though there's no _SLAVE suffix this is the
617 * slave STK we're adding for later lookup (the master
618 * STK never needs to be stored).
619 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700620 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300621 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300622 }
623
Johan Hedberg861580a2014-05-20 09:45:51 +0300624 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300625}
626
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300627static void smp_notify_keys(struct l2cap_conn *conn)
628{
629 struct l2cap_chan *chan = conn->smp;
630 struct smp_chan *smp = chan->data;
631 struct hci_conn *hcon = conn->hcon;
632 struct hci_dev *hdev = hcon->hdev;
633 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
634 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
635 bool persistent;
636
637 if (smp->remote_irk) {
638 mgmt_new_irk(hdev, smp->remote_irk);
639 /* Now that user space can be considered to know the
640 * identity address track the connection based on it
641 * from now on.
642 */
643 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
644 hcon->dst_type = smp->remote_irk->addr_type;
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300645 queue_work(hdev->workqueue, &conn->id_addr_update_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300646
647 /* When receiving an indentity resolving key for
648 * a remote device that does not use a resolvable
649 * private address, just remove the key so that
650 * it is possible to use the controller white
651 * list for scanning.
652 *
653 * Userspace will have been told to not store
654 * this key at this point. So it is safe to
655 * just remove it.
656 */
657 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
658 list_del(&smp->remote_irk->list);
659 kfree(smp->remote_irk);
660 smp->remote_irk = NULL;
661 }
662 }
663
664 /* The LTKs and CSRKs should be persistent only if both sides
665 * had the bonding bit set in their authentication requests.
666 */
667 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
668
669 if (smp->csrk) {
670 smp->csrk->bdaddr_type = hcon->dst_type;
671 bacpy(&smp->csrk->bdaddr, &hcon->dst);
672 mgmt_new_csrk(hdev, smp->csrk, persistent);
673 }
674
675 if (smp->slave_csrk) {
676 smp->slave_csrk->bdaddr_type = hcon->dst_type;
677 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
678 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
679 }
680
681 if (smp->ltk) {
682 smp->ltk->bdaddr_type = hcon->dst_type;
683 bacpy(&smp->ltk->bdaddr, &hcon->dst);
684 mgmt_new_ltk(hdev, smp->ltk, persistent);
685 }
686
687 if (smp->slave_ltk) {
688 smp->slave_ltk->bdaddr_type = hcon->dst_type;
689 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
690 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
691 }
692}
693
Johan Hedbergd6268e82014-09-05 22:19:51 +0300694static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300695{
696 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300697 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300698 struct hci_conn *hcon = conn->hcon;
699 struct hci_dev *hdev = hcon->hdev;
700 __u8 *keydist;
701
702 BT_DBG("conn %p", conn);
703
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300704 rsp = (void *) &smp->prsp[1];
705
706 /* The responder sends its keys first */
Johan Hedberg88d3a8a2014-09-05 22:19:53 +0300707 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedberg86d14072014-08-11 22:06:43 +0300708 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300709
710 req = (void *) &smp->preq[1];
711
712 if (hcon->out) {
713 keydist = &rsp->init_key_dist;
714 *keydist &= req->init_key_dist;
715 } else {
716 keydist = &rsp->resp_key_dist;
717 *keydist &= req->resp_key_dist;
718 }
719
720 BT_DBG("keydist 0x%x", *keydist);
721
722 if (*keydist & SMP_DIST_ENC_KEY) {
723 struct smp_cmd_encrypt_info enc;
724 struct smp_cmd_master_ident ident;
725 struct smp_ltk *ltk;
726 u8 authenticated;
727 __le16 ediv;
728 __le64 rand;
729
730 get_random_bytes(enc.ltk, sizeof(enc.ltk));
731 get_random_bytes(&ediv, sizeof(ediv));
732 get_random_bytes(&rand, sizeof(rand));
733
734 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
735
736 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
737 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
738 SMP_LTK_SLAVE, authenticated, enc.ltk,
739 smp->enc_key_size, ediv, rand);
740 smp->slave_ltk = ltk;
741
742 ident.ediv = ediv;
743 ident.rand = rand;
744
745 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
746
747 *keydist &= ~SMP_DIST_ENC_KEY;
748 }
749
750 if (*keydist & SMP_DIST_ID_KEY) {
751 struct smp_cmd_ident_addr_info addrinfo;
752 struct smp_cmd_ident_info idinfo;
753
754 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
755
756 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
757
758 /* The hci_conn contains the local identity address
759 * after the connection has been established.
760 *
761 * This is true even when the connection has been
762 * established using a resolvable random address.
763 */
764 bacpy(&addrinfo.bdaddr, &hcon->src);
765 addrinfo.addr_type = hcon->src_type;
766
767 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
768 &addrinfo);
769
770 *keydist &= ~SMP_DIST_ID_KEY;
771 }
772
773 if (*keydist & SMP_DIST_SIGN) {
774 struct smp_cmd_sign_info sign;
775 struct smp_csrk *csrk;
776
777 /* Generate a new random key */
778 get_random_bytes(sign.csrk, sizeof(sign.csrk));
779
780 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
781 if (csrk) {
782 csrk->master = 0x00;
783 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
784 }
785 smp->slave_csrk = csrk;
786
787 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
788
789 *keydist &= ~SMP_DIST_SIGN;
790 }
791
792 /* If there are still keys to be received wait for them */
Johan Hedberg88d3a8a2014-09-05 22:19:53 +0300793 if (smp->remote_key_dist & KEY_DIST_MASK)
Johan Hedberg86d14072014-08-11 22:06:43 +0300794 return;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300795
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300796 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
797 smp_notify_keys(conn);
798
799 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300800}
801
Johan Hedbergb68fda62014-08-11 22:06:40 +0300802static void smp_timeout(struct work_struct *work)
803{
804 struct smp_chan *smp = container_of(work, struct smp_chan,
805 security_timer.work);
806 struct l2cap_conn *conn = smp->conn;
807
808 BT_DBG("conn %p", conn);
809
Johan Hedberg1e91c292014-08-18 20:33:29 +0300810 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +0300811}
812
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300813static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
814{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300815 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300816 struct smp_chan *smp;
817
Marcel Holtmannf1560462013-10-13 05:43:25 -0700818 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300819 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300820 return NULL;
821
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300822 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
823 if (IS_ERR(smp->tfm_aes)) {
824 BT_ERR("Unable to create ECB crypto context");
825 kfree(smp);
826 return NULL;
827 }
828
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300829 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300830 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300831
Johan Hedbergb68fda62014-08-11 22:06:40 +0300832 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
833
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300834 hci_conn_hold(conn->hcon);
835
836 return smp;
837}
838
Brian Gix2b64d152011-12-21 16:12:12 -0800839int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
840{
Johan Hedbergb10e8012014-06-27 14:23:07 +0300841 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300842 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -0800843 struct smp_chan *smp;
844 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300845 int err;
Brian Gix2b64d152011-12-21 16:12:12 -0800846
847 BT_DBG("");
848
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300849 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -0800850 return -ENOTCONN;
851
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300852 chan = conn->smp;
853 if (!chan)
854 return -ENOTCONN;
855
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300856 l2cap_chan_lock(chan);
857 if (!chan->data) {
858 err = -ENOTCONN;
859 goto unlock;
860 }
861
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300862 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800863
864 switch (mgmt_op) {
865 case MGMT_OP_USER_PASSKEY_REPLY:
866 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200867 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800868 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200869 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800870 /* Fall Through */
871 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300872 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800873 break;
874 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
875 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200876 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300877 err = 0;
878 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800879 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200880 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300881 err = -EOPNOTSUPP;
882 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800883 }
884
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300885 err = 0;
886
Brian Gix2b64d152011-12-21 16:12:12 -0800887 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300888 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
889 u8 rsp = smp_confirm(smp);
890 if (rsp)
891 smp_failure(conn, rsp);
892 }
Brian Gix2b64d152011-12-21 16:12:12 -0800893
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300894unlock:
895 l2cap_chan_unlock(chan);
896 return err;
Brian Gix2b64d152011-12-21 16:12:12 -0800897}
898
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300899static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300900{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300901 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300902 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300903 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300904 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300905 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300906 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300907
908 BT_DBG("conn %p", conn);
909
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200910 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300911 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200912
Johan Hedberg40bef302014-07-16 11:42:27 +0300913 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800914 return SMP_CMD_NOTSUPP;
915
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300916 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300917 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300918 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300919 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300920
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300921 if (!smp)
922 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300923
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300924 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergb3c64102014-07-10 11:02:07 +0300925 (req->auth_req & SMP_AUTH_BONDING))
926 return SMP_PAIRING_NOTSUPP;
927
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300928 smp->preq[0] = SMP_CMD_PAIRING_REQ;
929 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300930 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300931
Brian Gix2b64d152011-12-21 16:12:12 -0800932 /* We didn't start the pairing, so match remote */
Johan Hedberg1ef35822014-05-20 09:45:48 +0300933 auth = req->auth_req;
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300934
Johan Hedbergc7262e72014-06-17 13:07:37 +0300935 sec_level = authreq_to_seclevel(auth);
936 if (sec_level > conn->hcon->pending_sec_level)
937 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +0200938
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300939 /* If we need MITM check that it can be acheived */
940 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
941 u8 method;
942
943 method = get_auth_method(smp, conn->hcon->io_capability,
944 req->io_capability);
945 if (method == JUST_WORKS || method == JUST_CFM)
946 return SMP_AUTH_REQUIREMENTS;
947 }
948
Brian Gix2b64d152011-12-21 16:12:12 -0800949 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300950
951 key_size = min(req->max_key_size, rsp.max_key_size);
952 if (check_enc_key_size(conn, key_size))
953 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300954
Johan Hedberge84a6b12013-12-02 10:49:03 +0200955 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300956
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300957 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
958 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300959
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300960 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300961
Brian Gix2b64d152011-12-21 16:12:12 -0800962 /* Request setup of TK */
963 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
964 if (ret)
965 return SMP_UNSPECIFIED;
966
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300967 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300968}
969
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300970static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300971{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300972 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300973 struct l2cap_chan *chan = conn->smp;
974 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800975 u8 key_size, auth = SMP_AUTH_NONE;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300976 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300977
978 BT_DBG("conn %p", conn);
979
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200980 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300981 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200982
Johan Hedberg40bef302014-07-16 11:42:27 +0300983 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800984 return SMP_CMD_NOTSUPP;
985
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300986 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300987
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300988 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300989
990 key_size = min(req->max_key_size, rsp->max_key_size);
991 if (check_enc_key_size(conn, key_size))
992 return SMP_ENC_KEY_SIZE;
993
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300994 /* If we need MITM check that it can be acheived */
995 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
996 u8 method;
997
998 method = get_auth_method(smp, req->io_capability,
999 rsp->io_capability);
1000 if (method == JUST_WORKS || method == JUST_CFM)
1001 return SMP_AUTH_REQUIREMENTS;
1002 }
1003
Johan Hedberge84a6b12013-12-02 10:49:03 +02001004 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001005
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001006 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1007 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001008
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001009 /* Update remote key distribution in case the remote cleared
1010 * some bits that we had enabled in our request.
1011 */
1012 smp->remote_key_dist &= rsp->resp_key_dist;
1013
Brian Gix2b64d152011-12-21 16:12:12 -08001014 if ((req->auth_req & SMP_AUTH_BONDING) &&
Marcel Holtmannf1560462013-10-13 05:43:25 -07001015 (rsp->auth_req & SMP_AUTH_BONDING))
Brian Gix2b64d152011-12-21 16:12:12 -08001016 auth = SMP_AUTH_BONDING;
1017
1018 auth |= (req->auth_req | rsp->auth_req) & SMP_AUTH_MITM;
1019
Johan Hedberg476585e2012-06-06 18:54:15 +08001020 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001021 if (ret)
1022 return SMP_UNSPECIFIED;
1023
Johan Hedberg4a74d652014-05-20 09:45:50 +03001024 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001025
1026 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001027 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001028 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001029
1030 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001031}
1032
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001033static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001034{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001035 struct l2cap_chan *chan = conn->smp;
1036 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001037
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001038 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1039
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001040 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001041 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001042
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001043 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1044 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001045
Johan Hedberg943a7322014-03-18 12:58:24 +02001046 if (conn->hcon->out)
1047 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1048 smp->prnd);
Johan Hedberg4a74d652014-05-20 09:45:50 +03001049 else if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001050 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001051 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001052 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001053
1054 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001055}
1056
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001057static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001058{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001059 struct l2cap_chan *chan = conn->smp;
1060 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001061
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001062 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001063
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001064 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001065 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001066
Johan Hedberg943a7322014-03-18 12:58:24 +02001067 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001068 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001069
Johan Hedberg861580a2014-05-20 09:45:51 +03001070 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001071}
1072
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001073static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001074{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001075 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001076 struct hci_conn *hcon = conn->hcon;
1077
Johan Hedberg98a0b842014-01-30 19:40:00 -08001078 key = hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001079 hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001080 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001081 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001082
Johan Hedberg4dab7862012-06-07 14:58:37 +08001083 if (sec_level > BT_SECURITY_MEDIUM && !key->authenticated)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001084 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001085
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001086 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001087 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001088
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001089 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1090 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001091
Johan Hedbergfe59a052014-07-01 19:14:12 +03001092 /* We never store STKs for master role, so clear this flag */
1093 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1094
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001095 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001096}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001097
Johan Hedberg854f4722014-07-01 18:40:20 +03001098bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level)
1099{
1100 if (sec_level == BT_SECURITY_LOW)
1101 return true;
1102
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001103 /* If we're encrypted with an STK always claim insufficient
1104 * security. This way we allow the connection to be re-encrypted
1105 * with an LTK, even if the LTK provides the same level of
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001106 * security. Only exception is if we don't have an LTK (e.g.
1107 * because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001108 */
Johan Hedbergb2d5e252014-07-14 14:34:55 +03001109 if (test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
1110 hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberge804d252014-07-16 11:42:28 +03001111 hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001112 return false;
1113
Johan Hedberg854f4722014-07-01 18:40:20 +03001114 if (hcon->sec_level >= sec_level)
1115 return true;
1116
1117 return false;
1118}
1119
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001120static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001121{
1122 struct smp_cmd_security_req *rp = (void *) skb->data;
1123 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001124 struct hci_conn *hcon = conn->hcon;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001125 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001126 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001127 u8 sec_level;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001128
1129 BT_DBG("conn %p", conn);
1130
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001131 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001132 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001133
Johan Hedberg40bef302014-07-16 11:42:27 +03001134 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001135 return SMP_CMD_NOTSUPP;
1136
Johan Hedbergc7262e72014-06-17 13:07:37 +03001137 sec_level = authreq_to_seclevel(rp->auth_req);
Johan Hedberg854f4722014-07-01 18:40:20 +03001138 if (smp_sufficient_security(hcon, sec_level))
1139 return 0;
1140
Johan Hedbergc7262e72014-06-17 13:07:37 +03001141 if (sec_level > hcon->pending_sec_level)
1142 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001143
Johan Hedberg4dab7862012-06-07 14:58:37 +08001144 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001145 return 0;
1146
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001147 /* If SMP is already in progress ignore this request */
1148 if (chan->data)
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001149 return 0;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001150
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001151 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001152 if (!smp)
1153 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001154
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001155 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedberg616d55b2014-07-29 14:18:48 +03001156 (rp->auth_req & SMP_AUTH_BONDING))
1157 return SMP_PAIRING_NOTSUPP;
1158
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001159 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001160
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001161 memset(&cp, 0, sizeof(cp));
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -03001162 build_pairing_cmd(conn, &cp, NULL, rp->auth_req);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001163
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001164 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1165 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001166
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001167 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001168
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001169 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001170}
1171
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001172int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001173{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001174 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001175 struct l2cap_chan *chan = conn->smp;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001176 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001177 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001178 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001179
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001180 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1181
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001182 /* This may be NULL if there's an unexpected disconnection */
1183 if (!conn)
1184 return 1;
1185
Johan Hedberg757aee02013-04-24 13:05:32 +03001186 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001187 return 1;
1188
Johan Hedbergad32a2f2013-05-14 18:05:12 +03001189 if (smp_sufficient_security(hcon, sec_level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001190 return 1;
1191
Johan Hedbergc7262e72014-06-17 13:07:37 +03001192 if (sec_level > hcon->pending_sec_level)
1193 hcon->pending_sec_level = sec_level;
1194
Johan Hedberg40bef302014-07-16 11:42:27 +03001195 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001196 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1197 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001198
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001199 l2cap_chan_lock(chan);
1200
1201 /* If SMP is already in progress ignore this request */
1202 if (chan->data) {
1203 ret = 0;
1204 goto unlock;
1205 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001206
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001207 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001208 if (!smp) {
1209 ret = 1;
1210 goto unlock;
1211 }
Brian Gix2b64d152011-12-21 16:12:12 -08001212
1213 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001214
Johan Hedberg79897d22014-06-01 09:45:24 +03001215 /* Require MITM if IO Capability allows or the security level
1216 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02001217 */
Johan Hedberg79897d22014-06-01 09:45:24 +03001218 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03001219 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02001220 authreq |= SMP_AUTH_MITM;
1221
Johan Hedberg40bef302014-07-16 11:42:27 +03001222 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001223 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001224
Brian Gix2b64d152011-12-21 16:12:12 -08001225 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001226 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1227 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001228
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001229 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
1230 } else {
1231 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08001232 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001233 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
1234 }
1235
Johan Hedberg4a74d652014-05-20 09:45:50 +03001236 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001237 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02001238
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001239unlock:
1240 l2cap_chan_unlock(chan);
1241 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001242}
1243
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001244static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1245{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001246 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001247 struct l2cap_chan *chan = conn->smp;
1248 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001249
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001250 BT_DBG("conn %p", conn);
1251
1252 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001253 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001254
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001255 /* Ignore this PDU if it wasn't requested */
1256 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1257 return 0;
1258
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001259 skb_pull(skb, sizeof(*rp));
1260
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001261 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001262
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001263 return 0;
1264}
1265
1266static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1267{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001268 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001269 struct l2cap_chan *chan = conn->smp;
1270 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001271 struct hci_dev *hdev = conn->hcon->hdev;
1272 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001273 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001274 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001275
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001276 BT_DBG("conn %p", conn);
1277
1278 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001279 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001280
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001281 /* Ignore this PDU if it wasn't requested */
1282 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1283 return 0;
1284
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001285 /* Mark the information as received */
1286 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1287
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001288 skb_pull(skb, sizeof(*rp));
1289
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001290 hci_dev_lock(hdev);
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001291 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001292 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001293 authenticated, smp->tk, smp->enc_key_size,
1294 rp->ediv, rp->rand);
1295 smp->ltk = ltk;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001296 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
Johan Hedbergd6268e82014-09-05 22:19:51 +03001297 smp_distribute_keys(smp);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001298 hci_dev_unlock(hdev);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001299
1300 return 0;
1301}
1302
Johan Hedbergfd349c02014-02-18 10:19:36 +02001303static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1304{
1305 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001306 struct l2cap_chan *chan = conn->smp;
1307 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001308
1309 BT_DBG("");
1310
1311 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001312 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001313
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001314 /* Ignore this PDU if it wasn't requested */
1315 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1316 return 0;
1317
Johan Hedbergfd349c02014-02-18 10:19:36 +02001318 skb_pull(skb, sizeof(*info));
1319
1320 memcpy(smp->irk, info->irk, 16);
1321
1322 return 0;
1323}
1324
1325static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1326 struct sk_buff *skb)
1327{
1328 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001329 struct l2cap_chan *chan = conn->smp;
1330 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001331 struct hci_conn *hcon = conn->hcon;
1332 bdaddr_t rpa;
1333
1334 BT_DBG("");
1335
1336 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001337 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001338
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001339 /* Ignore this PDU if it wasn't requested */
1340 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1341 return 0;
1342
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001343 /* Mark the information as received */
1344 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1345
Johan Hedbergfd349c02014-02-18 10:19:36 +02001346 skb_pull(skb, sizeof(*info));
1347
Johan Hedberg31dd6242014-06-27 14:23:02 +03001348 hci_dev_lock(hcon->hdev);
1349
Johan Hedberga9a58f82014-02-25 22:24:37 +02001350 /* Strictly speaking the Core Specification (4.1) allows sending
1351 * an empty address which would force us to rely on just the IRK
1352 * as "identity information". However, since such
1353 * implementations are not known of and in order to not over
1354 * complicate our implementation, simply pretend that we never
1355 * received an IRK for such a device.
1356 */
1357 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1358 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001359 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001360 }
1361
Johan Hedbergfd349c02014-02-18 10:19:36 +02001362 bacpy(&smp->id_addr, &info->bdaddr);
1363 smp->id_addr_type = info->addr_type;
1364
1365 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1366 bacpy(&rpa, &hcon->dst);
1367 else
1368 bacpy(&rpa, BDADDR_ANY);
1369
Johan Hedberg23d0e122014-02-19 14:57:46 +02001370 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1371 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001372
Johan Hedberg31dd6242014-06-27 14:23:02 +03001373distribute:
Johan Hedbergd6268e82014-09-05 22:19:51 +03001374 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001375
Johan Hedberg31dd6242014-06-27 14:23:02 +03001376 hci_dev_unlock(hcon->hdev);
1377
Johan Hedbergfd349c02014-02-18 10:19:36 +02001378 return 0;
1379}
1380
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001381static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1382{
1383 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001384 struct l2cap_chan *chan = conn->smp;
1385 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001386 struct hci_dev *hdev = conn->hcon->hdev;
1387 struct smp_csrk *csrk;
1388
1389 BT_DBG("conn %p", conn);
1390
1391 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001392 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001393
1394 /* Ignore this PDU if it wasn't requested */
1395 if (!(smp->remote_key_dist & SMP_DIST_SIGN))
1396 return 0;
1397
1398 /* Mark the information as received */
1399 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1400
1401 skb_pull(skb, sizeof(*rp));
1402
1403 hci_dev_lock(hdev);
1404 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1405 if (csrk) {
1406 csrk->master = 0x01;
1407 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1408 }
1409 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03001410 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001411 hci_dev_unlock(hdev);
1412
1413 return 0;
1414}
1415
Johan Hedberg4befb862014-08-11 22:06:38 +03001416static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001417{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001418 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001419 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001420 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001421 int err = 0;
1422
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001423 if (hcon->type != LE_LINK) {
1424 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001425 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001426 }
1427
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001428 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07001429 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001430
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001431 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001432 reason = SMP_PAIRING_NOTSUPP;
1433 goto done;
1434 }
1435
Marcel Holtmann92381f52013-10-03 01:23:08 -07001436 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001437 skb_pull(skb, sizeof(code));
1438
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001439 /*
1440 * The SMP context must be initialized for all other PDUs except
1441 * pairing and security requests. If we get any other PDU when
1442 * not initialized simply disconnect (done if this function
1443 * returns an error).
1444 */
1445 if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ &&
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001446 !chan->data) {
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001447 BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001448 err = -EOPNOTSUPP;
1449 goto done;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001450 }
1451
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001452 switch (code) {
1453 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001454 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001455 break;
1456
1457 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001458 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001459 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001460 break;
1461
1462 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001463 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001464 break;
1465
1466 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001467 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001468 break;
1469
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001470 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001471 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001472 break;
1473
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001474 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001475 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001476 break;
1477
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001478 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001479 reason = smp_cmd_encrypt_info(conn, skb);
1480 break;
1481
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001482 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001483 reason = smp_cmd_master_ident(conn, skb);
1484 break;
1485
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001486 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001487 reason = smp_cmd_ident_info(conn, skb);
1488 break;
1489
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001490 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001491 reason = smp_cmd_ident_addr_info(conn, skb);
1492 break;
1493
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001494 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001495 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001496 break;
1497
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001498 default:
1499 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001500 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001501 goto done;
1502 }
1503
1504done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001505 if (!err) {
1506 if (reason)
1507 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001508 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001509 }
1510
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001511 return err;
1512}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001513
Johan Hedberg70db83c2014-08-08 09:37:16 +03001514static void smp_teardown_cb(struct l2cap_chan *chan, int err)
1515{
1516 struct l2cap_conn *conn = chan->conn;
1517
1518 BT_DBG("chan %p", chan);
1519
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001520 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001521 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001522
Johan Hedberg70db83c2014-08-08 09:37:16 +03001523 conn->smp = NULL;
1524 l2cap_chan_put(chan);
1525}
1526
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001527static void smp_resume_cb(struct l2cap_chan *chan)
1528{
Johan Hedbergb68fda62014-08-11 22:06:40 +03001529 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001530 struct l2cap_conn *conn = chan->conn;
1531 struct hci_conn *hcon = conn->hcon;
1532
1533 BT_DBG("chan %p", chan);
1534
Johan Hedberg86d14072014-08-11 22:06:43 +03001535 if (!smp)
1536 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03001537
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001538 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
1539 return;
1540
Johan Hedberg86d14072014-08-11 22:06:43 +03001541 cancel_delayed_work(&smp->security_timer);
1542
Johan Hedbergd6268e82014-09-05 22:19:51 +03001543 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001544}
1545
Johan Hedberg70db83c2014-08-08 09:37:16 +03001546static void smp_ready_cb(struct l2cap_chan *chan)
1547{
1548 struct l2cap_conn *conn = chan->conn;
1549
1550 BT_DBG("chan %p", chan);
1551
1552 conn->smp = chan;
1553 l2cap_chan_hold(chan);
1554}
1555
Johan Hedberg4befb862014-08-11 22:06:38 +03001556static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
1557{
1558 int err;
1559
1560 BT_DBG("chan %p", chan);
1561
1562 err = smp_sig_channel(chan, skb);
1563 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03001564 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03001565
Johan Hedbergb68fda62014-08-11 22:06:40 +03001566 if (smp)
1567 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03001568
Johan Hedberg1e91c292014-08-18 20:33:29 +03001569 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03001570 }
1571
1572 return err;
1573}
1574
Johan Hedberg70db83c2014-08-08 09:37:16 +03001575static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
1576 unsigned long hdr_len,
1577 unsigned long len, int nb)
1578{
1579 struct sk_buff *skb;
1580
1581 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
1582 if (!skb)
1583 return ERR_PTR(-ENOMEM);
1584
1585 skb->priority = HCI_PRIO_MAX;
1586 bt_cb(skb)->chan = chan;
1587
1588 return skb;
1589}
1590
1591static const struct l2cap_ops smp_chan_ops = {
1592 .name = "Security Manager",
1593 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001594 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001595 .alloc_skb = smp_alloc_skb_cb,
1596 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001597 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001598
1599 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001600 .state_change = l2cap_chan_no_state_change,
1601 .close = l2cap_chan_no_close,
1602 .defer = l2cap_chan_no_defer,
1603 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001604 .set_shutdown = l2cap_chan_no_set_shutdown,
1605 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1606 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1607};
1608
1609static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
1610{
1611 struct l2cap_chan *chan;
1612
1613 BT_DBG("pchan %p", pchan);
1614
1615 chan = l2cap_chan_create();
1616 if (!chan)
1617 return NULL;
1618
1619 chan->chan_type = pchan->chan_type;
1620 chan->ops = &smp_chan_ops;
1621 chan->scid = pchan->scid;
1622 chan->dcid = chan->scid;
1623 chan->imtu = pchan->imtu;
1624 chan->omtu = pchan->omtu;
1625 chan->mode = pchan->mode;
1626
1627 BT_DBG("created chan %p", chan);
1628
1629 return chan;
1630}
1631
1632static const struct l2cap_ops smp_root_chan_ops = {
1633 .name = "Security Manager Root",
1634 .new_connection = smp_new_conn_cb,
1635
1636 /* None of these are implemented for the root channel */
1637 .close = l2cap_chan_no_close,
1638 .alloc_skb = l2cap_chan_no_alloc_skb,
1639 .recv = l2cap_chan_no_recv,
1640 .state_change = l2cap_chan_no_state_change,
1641 .teardown = l2cap_chan_no_teardown,
1642 .ready = l2cap_chan_no_ready,
1643 .defer = l2cap_chan_no_defer,
1644 .suspend = l2cap_chan_no_suspend,
1645 .resume = l2cap_chan_no_resume,
1646 .set_shutdown = l2cap_chan_no_set_shutdown,
1647 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1648 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1649};
1650
Johan Hedberg711eafe2014-08-08 09:32:52 +03001651int smp_register(struct hci_dev *hdev)
1652{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001653 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001654 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001655
Johan Hedberg711eafe2014-08-08 09:32:52 +03001656 BT_DBG("%s", hdev->name);
1657
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001658 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1659 if (IS_ERR(tfm_aes)) {
1660 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001661 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03001662 return err;
1663 }
1664
Johan Hedberg70db83c2014-08-08 09:37:16 +03001665 chan = l2cap_chan_create();
1666 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001667 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001668 return -ENOMEM;
1669 }
1670
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001671 chan->data = tfm_aes;
1672
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001673 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001674
1675 l2cap_chan_set_defaults(chan);
1676
1677 bacpy(&chan->src, &hdev->bdaddr);
1678 chan->src_type = BDADDR_LE_PUBLIC;
1679 chan->state = BT_LISTEN;
1680 chan->mode = L2CAP_MODE_BASIC;
1681 chan->imtu = L2CAP_DEFAULT_MTU;
1682 chan->ops = &smp_root_chan_ops;
1683
1684 hdev->smp_data = chan;
1685
Johan Hedberg711eafe2014-08-08 09:32:52 +03001686 return 0;
1687}
1688
1689void smp_unregister(struct hci_dev *hdev)
1690{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001691 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001692 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001693
1694 if (!chan)
1695 return;
1696
1697 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001698
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001699 tfm_aes = chan->data;
1700 if (tfm_aes) {
1701 chan->data = NULL;
1702 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001703 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03001704
1705 hdev->smp_data = NULL;
1706 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001707}