blob: 1cc438c9c2cbf3904f70f76af9ec8a40b98d510b [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
Johan Hedberg3b191462014-06-06 10:50:15 +030032#include "ecc.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070033#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030034
Johan Hedbergb28b4942014-09-05 22:19:55 +030035#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030036
Johan Hedberg3b191462014-06-06 10:50:15 +030037/* Keys which are not distributed with Secure Connections */
38#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
39
Marcel Holtmann17b02e62012-03-01 14:32:37 -080040#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030041
Johan Hedberg0edb14d2014-05-26 13:29:28 +030042#define AUTH_REQ_MASK(dev) (test_bit(HCI_SC_ENABLED, &(dev)->dev_flags) ? \
43 0x1f : 0x07)
44#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020045
Johan Hedberg533e35d2014-06-16 19:25:18 +030046enum {
47 SMP_FLAG_TK_VALID,
48 SMP_FLAG_CFM_PENDING,
49 SMP_FLAG_MITM_AUTH,
50 SMP_FLAG_COMPLETE,
51 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030052 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030053 SMP_FLAG_REMOTE_PK,
Johan Hedberg533e35d2014-06-16 19:25:18 +030054};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030055
56struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030057 struct l2cap_conn *conn;
58 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030059 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030060
Johan Hedberg4bc58f52014-05-20 09:45:47 +030061 u8 preq[7]; /* SMP Pairing Request */
62 u8 prsp[7]; /* SMP Pairing Response */
63 u8 prnd[16]; /* SMP Pairing Random (local) */
64 u8 rrnd[16]; /* SMP Pairing Random (remote) */
65 u8 pcnf[16]; /* SMP Pairing Confirm */
66 u8 tk[16]; /* SMP Temporary Key */
67 u8 enc_key_size;
68 u8 remote_key_dist;
69 bdaddr_t id_addr;
70 u8 id_addr_type;
71 u8 irk[16];
72 struct smp_csrk *csrk;
73 struct smp_csrk *slave_csrk;
74 struct smp_ltk *ltk;
75 struct smp_ltk *slave_ltk;
76 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030077 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030078
Johan Hedberg3b191462014-06-06 10:50:15 +030079 /* Secure Connections variables */
80 u8 local_pk[64];
81 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030082 u8 remote_pk[64];
83 u8 dhkey[32];
Johan Hedberg3b191462014-06-06 10:50:15 +030084
Johan Hedberg6a7bd102014-06-27 14:23:03 +030085 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +030086 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030087};
88
Johan Hedberg8a2936f2014-06-16 19:25:19 +030089static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030090{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030091 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030092
Johan Hedberg8a2936f2014-06-16 19:25:19 +030093 for (i = 0; i < len; i++)
94 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030095}
96
97static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
98{
99 struct blkcipher_desc desc;
100 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200101 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200102 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300103
104 if (tfm == NULL) {
105 BT_ERR("tfm %p", tfm);
106 return -EINVAL;
107 }
108
109 desc.tfm = tfm;
110 desc.flags = 0;
111
Johan Hedberg943a7322014-03-18 12:58:24 +0200112 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300113 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200114
115 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300116 if (err) {
117 BT_ERR("cipher setkey failed: %d", err);
118 return err;
119 }
120
Johan Hedberg943a7322014-03-18 12:58:24 +0200121 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300122 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200123
124 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300125
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300126 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
127 if (err)
128 BT_ERR("Encrypt data error %d", err);
129
Johan Hedberg943a7322014-03-18 12:58:24 +0200130 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300131 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200132
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300133 return err;
134}
135
Johan Hedberg60478052014-02-18 10:19:31 +0200136static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
137{
Johan Hedberg943a7322014-03-18 12:58:24 +0200138 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200139 int err;
140
141 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200142 memcpy(_res, r, 3);
143 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200144
Johan Hedberg943a7322014-03-18 12:58:24 +0200145 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200146 if (err) {
147 BT_ERR("Encrypt error");
148 return err;
149 }
150
151 /* The output of the random address function ah is:
152 * ah(h, r) = e(k, r') mod 2^24
153 * The output of the security function e is then truncated to 24 bits
154 * by taking the least significant 24 bits of the output of e as the
155 * result of ah.
156 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200157 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200158
159 return 0;
160}
161
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300162bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200163{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300164 struct l2cap_chan *chan = hdev->smp_data;
165 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200166 u8 hash[3];
167 int err;
168
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300169 if (!chan || !chan->data)
170 return false;
171
172 tfm = chan->data;
173
Johan Hedberg60478052014-02-18 10:19:31 +0200174 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
175
176 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
177 if (err)
178 return false;
179
180 return !memcmp(bdaddr->b, hash, 3);
181}
182
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300183int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200184{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300185 struct l2cap_chan *chan = hdev->smp_data;
186 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200187 int err;
188
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300189 if (!chan || !chan->data)
190 return -EOPNOTSUPP;
191
192 tfm = chan->data;
193
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200194 get_random_bytes(&rpa->b[3], 3);
195
196 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
197 rpa->b[5] |= 0x40; /* Set second most significant bit */
198
199 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
200 if (err < 0)
201 return err;
202
203 BT_DBG("RPA %pMR", rpa);
204
205 return 0;
206}
207
Johan Hedberge491eaf2014-10-25 21:15:37 +0200208static int smp_c1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r[16],
209 u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat,
210 bdaddr_t *ra, u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300211{
212 u8 p1[16], p2[16];
213 int err;
214
215 memset(p1, 0, 16);
216
217 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200218 p1[0] = _iat;
219 p1[1] = _rat;
220 memcpy(p1 + 2, preq, 7);
221 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300222
223 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200224 memcpy(p2, ra, 6);
225 memcpy(p2 + 6, ia, 6);
226 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300227
228 /* res = r XOR p1 */
229 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
230
231 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200232 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300233 if (err) {
234 BT_ERR("Encrypt data error");
235 return err;
236 }
237
238 /* res = res XOR p2 */
239 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
240
241 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200242 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300243 if (err)
244 BT_ERR("Encrypt data error");
245
246 return err;
247}
248
Johan Hedberge491eaf2014-10-25 21:15:37 +0200249static int smp_s1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r1[16],
250 u8 r2[16], u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300251{
252 int err;
253
254 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200255 memcpy(_r, r2, 8);
256 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300257
Johan Hedberge491eaf2014-10-25 21:15:37 +0200258 err = smp_e(tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300259 if (err)
260 BT_ERR("Encrypt data error");
261
262 return err;
263}
264
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300265static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
266{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300267 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300268 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300269 struct kvec iv[2];
270 struct msghdr msg;
271
272 if (!chan)
273 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300274
275 BT_DBG("code 0x%2.2x", code);
276
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300277 iv[0].iov_base = &code;
278 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300279
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300280 iv[1].iov_base = data;
281 iv[1].iov_len = len;
282
283 memset(&msg, 0, sizeof(msg));
284
285 msg.msg_iov = (struct iovec *) &iv;
286 msg.msg_iovlen = 2;
287
288 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300289
Johan Hedbergb68fda62014-08-11 22:06:40 +0300290 if (!chan->data)
291 return;
292
293 smp = chan->data;
294
295 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300296 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300297}
298
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300299static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800300{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300301 if (authreq & SMP_AUTH_MITM) {
302 if (authreq & SMP_AUTH_SC)
303 return BT_SECURITY_FIPS;
304 else
305 return BT_SECURITY_HIGH;
306 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800307 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300308 }
Brian Gix2b64d152011-12-21 16:12:12 -0800309}
310
311static __u8 seclevel_to_authreq(__u8 sec_level)
312{
313 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300314 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800315 case BT_SECURITY_HIGH:
316 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
317 case BT_SECURITY_MEDIUM:
318 return SMP_AUTH_BONDING;
319 default:
320 return SMP_AUTH_NONE;
321 }
322}
323
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300324static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700325 struct smp_cmd_pairing *req,
326 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300327{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300328 struct l2cap_chan *chan = conn->smp;
329 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200330 struct hci_conn *hcon = conn->hcon;
331 struct hci_dev *hdev = hcon->hdev;
332 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300333
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300334 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700335 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
336 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300337 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800338 } else {
339 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300340 }
341
Johan Hedbergfd349c02014-02-18 10:19:36 +0200342 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
343 remote_dist |= SMP_DIST_ID_KEY;
344
Johan Hedberg863efaf2014-02-22 19:06:32 +0200345 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
346 local_dist |= SMP_DIST_ID_KEY;
347
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300348 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
349 if ((authreq & SMP_AUTH_SC) &&
350 test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
351 local_dist |= SMP_DIST_LINK_KEY;
352 remote_dist |= SMP_DIST_LINK_KEY;
353 }
354 } else {
355 authreq &= ~SMP_AUTH_SC;
356 }
357
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300358 if (rsp == NULL) {
359 req->io_capability = conn->hcon->io_capability;
360 req->oob_flag = SMP_OOB_NOT_PRESENT;
361 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200362 req->init_key_dist = local_dist;
363 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300364 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200365
366 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300367 return;
368 }
369
370 rsp->io_capability = conn->hcon->io_capability;
371 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
372 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200373 rsp->init_key_dist = req->init_key_dist & remote_dist;
374 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300375 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200376
377 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300378}
379
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300380static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
381{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300382 struct l2cap_chan *chan = conn->smp;
383 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300384
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300385 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700386 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300387 return SMP_ENC_KEY_SIZE;
388
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300389 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300390
391 return 0;
392}
393
Johan Hedberg6f48e262014-08-11 22:06:44 +0300394static void smp_chan_destroy(struct l2cap_conn *conn)
395{
396 struct l2cap_chan *chan = conn->smp;
397 struct smp_chan *smp = chan->data;
398 bool complete;
399
400 BUG_ON(!smp);
401
402 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300403
Johan Hedberg6f48e262014-08-11 22:06:44 +0300404 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
405 mgmt_smp_complete(conn->hcon, complete);
406
407 kfree(smp->csrk);
408 kfree(smp->slave_csrk);
409
410 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300411 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300412
413 /* If pairing failed clean up any keys we might have */
414 if (!complete) {
415 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200416 list_del_rcu(&smp->ltk->list);
417 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300418 }
419
420 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200421 list_del_rcu(&smp->slave_ltk->list);
422 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300423 }
424
425 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200426 list_del_rcu(&smp->remote_irk->list);
427 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300428 }
429 }
430
431 chan->data = NULL;
432 kfree(smp);
433 hci_conn_drop(conn->hcon);
434}
435
Johan Hedberg84794e12013-11-06 11:24:57 +0200436static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800437{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200438 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300439 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200440
Johan Hedberg84794e12013-11-06 11:24:57 +0200441 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800442 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700443 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800444
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700445 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700446 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300447
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300448 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300449 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800450}
451
Brian Gix2b64d152011-12-21 16:12:12 -0800452#define JUST_WORKS 0x00
453#define JUST_CFM 0x01
454#define REQ_PASSKEY 0x02
455#define CFM_PASSKEY 0x03
456#define REQ_OOB 0x04
457#define OVERLAP 0xFF
458
459static const u8 gen_method[5][5] = {
460 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
461 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
462 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
463 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
464 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
465};
466
Johan Hedberg581370c2014-06-17 13:07:38 +0300467static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
468{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300469 /* If either side has unknown io_caps, use JUST_CFM (which gets
470 * converted later to JUST_WORKS if we're initiators.
471 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300472 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
473 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300474 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300475
476 return gen_method[remote_io][local_io];
477}
478
Brian Gix2b64d152011-12-21 16:12:12 -0800479static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
480 u8 local_io, u8 remote_io)
481{
482 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300483 struct l2cap_chan *chan = conn->smp;
484 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800485 u8 method;
486 u32 passkey = 0;
487 int ret = 0;
488
489 /* Initialize key for JUST WORKS */
490 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300491 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800492
493 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
494
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300495 /* If neither side wants MITM, either "just" confirm an incoming
496 * request or use just-works for outgoing ones. The JUST_CFM
497 * will be converted to JUST_WORKS if necessary later in this
498 * function. If either side has MITM look up the method from the
499 * table.
500 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300501 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300502 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800503 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300504 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800505
Johan Hedberga82505c2014-03-24 14:39:07 +0200506 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300507 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200508 method = JUST_WORKS;
509
Johan Hedberg02f3e252014-07-16 15:09:13 +0300510 /* Don't bother user space with no IO capabilities */
511 if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
512 method = JUST_WORKS;
513
Brian Gix2b64d152011-12-21 16:12:12 -0800514 /* If Just Works, Continue with Zero TK */
515 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300516 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800517 return 0;
518 }
519
520 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300521 if (method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300522 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300523 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
524 hcon->pending_sec_level = BT_SECURITY_HIGH;
525 }
Brian Gix2b64d152011-12-21 16:12:12 -0800526
527 /* If both devices have Keyoard-Display I/O, the master
528 * Confirms and the slave Enters the passkey.
529 */
530 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300531 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800532 method = CFM_PASSKEY;
533 else
534 method = REQ_PASSKEY;
535 }
536
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200537 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800538 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200539 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800540 get_random_bytes(&passkey, sizeof(passkey));
541 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200542 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800543 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300544 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800545 }
546
Brian Gix2b64d152011-12-21 16:12:12 -0800547 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700548 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200549 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200550 else if (method == JUST_CFM)
551 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
552 hcon->type, hcon->dst_type,
553 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800554 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200555 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200556 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200557 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800558
Brian Gix2b64d152011-12-21 16:12:12 -0800559 return ret;
560}
561
Johan Hedberg1cc61142014-05-20 09:45:52 +0300562static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300563{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300564 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300565 struct smp_cmd_pairing_confirm cp;
566 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300567
568 BT_DBG("conn %p", conn);
569
Johan Hedberge491eaf2014-10-25 21:15:37 +0200570 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200571 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200572 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
573 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300574 if (ret)
575 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300576
Johan Hedberg4a74d652014-05-20 09:45:50 +0300577 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800578
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300579 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
580
Johan Hedbergb28b4942014-09-05 22:19:55 +0300581 if (conn->hcon->out)
582 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
583 else
584 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
585
Johan Hedberg1cc61142014-05-20 09:45:52 +0300586 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300587}
588
Johan Hedberg861580a2014-05-20 09:45:51 +0300589static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300590{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300591 struct l2cap_conn *conn = smp->conn;
592 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300593 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300594 int ret;
595
Johan Hedbergec70f362014-06-27 14:23:04 +0300596 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300597 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300598
599 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
600
Johan Hedberge491eaf2014-10-25 21:15:37 +0200601 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200602 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200603 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300604 if (ret)
605 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300606
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300607 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
608 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300609 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300610 }
611
612 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800613 u8 stk[16];
614 __le64 rand = 0;
615 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300616
Johan Hedberge491eaf2014-10-25 21:15:37 +0200617 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300618
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300619 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300620 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300621
Johan Hedberg861580a2014-05-20 09:45:51 +0300622 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
623 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300624
625 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300626 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300627 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300628 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300629 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800630 __le64 rand = 0;
631 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300632
Johan Hedberg943a7322014-03-18 12:58:24 +0200633 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
634 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300635
Johan Hedberge491eaf2014-10-25 21:15:37 +0200636 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300637
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300638 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700639 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300640
Johan Hedbergfff34902014-06-10 15:19:50 +0300641 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
642 auth = 1;
643 else
644 auth = 0;
645
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300646 /* Even though there's no _SLAVE suffix this is the
647 * slave STK we're adding for later lookup (the master
648 * STK never needs to be stored).
649 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700650 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300651 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300652 }
653
Johan Hedberg861580a2014-05-20 09:45:51 +0300654 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300655}
656
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300657static void smp_notify_keys(struct l2cap_conn *conn)
658{
659 struct l2cap_chan *chan = conn->smp;
660 struct smp_chan *smp = chan->data;
661 struct hci_conn *hcon = conn->hcon;
662 struct hci_dev *hdev = hcon->hdev;
663 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
664 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
665 bool persistent;
666
667 if (smp->remote_irk) {
668 mgmt_new_irk(hdev, smp->remote_irk);
669 /* Now that user space can be considered to know the
670 * identity address track the connection based on it
671 * from now on.
672 */
673 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
674 hcon->dst_type = smp->remote_irk->addr_type;
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300675 queue_work(hdev->workqueue, &conn->id_addr_update_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300676
677 /* When receiving an indentity resolving key for
678 * a remote device that does not use a resolvable
679 * private address, just remove the key so that
680 * it is possible to use the controller white
681 * list for scanning.
682 *
683 * Userspace will have been told to not store
684 * this key at this point. So it is safe to
685 * just remove it.
686 */
687 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200688 list_del_rcu(&smp->remote_irk->list);
689 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300690 smp->remote_irk = NULL;
691 }
692 }
693
694 /* The LTKs and CSRKs should be persistent only if both sides
695 * had the bonding bit set in their authentication requests.
696 */
697 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
698
699 if (smp->csrk) {
700 smp->csrk->bdaddr_type = hcon->dst_type;
701 bacpy(&smp->csrk->bdaddr, &hcon->dst);
702 mgmt_new_csrk(hdev, smp->csrk, persistent);
703 }
704
705 if (smp->slave_csrk) {
706 smp->slave_csrk->bdaddr_type = hcon->dst_type;
707 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
708 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
709 }
710
711 if (smp->ltk) {
712 smp->ltk->bdaddr_type = hcon->dst_type;
713 bacpy(&smp->ltk->bdaddr, &hcon->dst);
714 mgmt_new_ltk(hdev, smp->ltk, persistent);
715 }
716
717 if (smp->slave_ltk) {
718 smp->slave_ltk->bdaddr_type = hcon->dst_type;
719 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
720 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
721 }
722}
723
Johan Hedbergb28b4942014-09-05 22:19:55 +0300724static void smp_allow_key_dist(struct smp_chan *smp)
725{
726 /* Allow the first expected phase 3 PDU. The rest of the PDUs
727 * will be allowed in each PDU handler to ensure we receive
728 * them in the correct order.
729 */
730 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
731 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
732 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
733 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
734 else if (smp->remote_key_dist & SMP_DIST_SIGN)
735 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
736}
737
Johan Hedbergd6268e82014-09-05 22:19:51 +0300738static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300739{
740 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300741 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300742 struct hci_conn *hcon = conn->hcon;
743 struct hci_dev *hdev = hcon->hdev;
744 __u8 *keydist;
745
746 BT_DBG("conn %p", conn);
747
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300748 rsp = (void *) &smp->prsp[1];
749
750 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +0300751 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
752 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +0300753 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300754 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300755
756 req = (void *) &smp->preq[1];
757
758 if (hcon->out) {
759 keydist = &rsp->init_key_dist;
760 *keydist &= req->init_key_dist;
761 } else {
762 keydist = &rsp->resp_key_dist;
763 *keydist &= req->resp_key_dist;
764 }
765
766 BT_DBG("keydist 0x%x", *keydist);
767
768 if (*keydist & SMP_DIST_ENC_KEY) {
769 struct smp_cmd_encrypt_info enc;
770 struct smp_cmd_master_ident ident;
771 struct smp_ltk *ltk;
772 u8 authenticated;
773 __le16 ediv;
774 __le64 rand;
775
776 get_random_bytes(enc.ltk, sizeof(enc.ltk));
777 get_random_bytes(&ediv, sizeof(ediv));
778 get_random_bytes(&rand, sizeof(rand));
779
780 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
781
782 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
783 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
784 SMP_LTK_SLAVE, authenticated, enc.ltk,
785 smp->enc_key_size, ediv, rand);
786 smp->slave_ltk = ltk;
787
788 ident.ediv = ediv;
789 ident.rand = rand;
790
791 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
792
793 *keydist &= ~SMP_DIST_ENC_KEY;
794 }
795
796 if (*keydist & SMP_DIST_ID_KEY) {
797 struct smp_cmd_ident_addr_info addrinfo;
798 struct smp_cmd_ident_info idinfo;
799
800 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
801
802 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
803
804 /* The hci_conn contains the local identity address
805 * after the connection has been established.
806 *
807 * This is true even when the connection has been
808 * established using a resolvable random address.
809 */
810 bacpy(&addrinfo.bdaddr, &hcon->src);
811 addrinfo.addr_type = hcon->src_type;
812
813 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
814 &addrinfo);
815
816 *keydist &= ~SMP_DIST_ID_KEY;
817 }
818
819 if (*keydist & SMP_DIST_SIGN) {
820 struct smp_cmd_sign_info sign;
821 struct smp_csrk *csrk;
822
823 /* Generate a new random key */
824 get_random_bytes(sign.csrk, sizeof(sign.csrk));
825
826 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
827 if (csrk) {
828 csrk->master = 0x00;
829 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
830 }
831 smp->slave_csrk = csrk;
832
833 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
834
835 *keydist &= ~SMP_DIST_SIGN;
836 }
837
838 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +0300839 if (smp->remote_key_dist & KEY_DIST_MASK) {
840 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +0300841 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300842 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300843
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300844 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
845 smp_notify_keys(conn);
846
847 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300848}
849
Johan Hedbergb68fda62014-08-11 22:06:40 +0300850static void smp_timeout(struct work_struct *work)
851{
852 struct smp_chan *smp = container_of(work, struct smp_chan,
853 security_timer.work);
854 struct l2cap_conn *conn = smp->conn;
855
856 BT_DBG("conn %p", conn);
857
Johan Hedberg1e91c292014-08-18 20:33:29 +0300858 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +0300859}
860
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300861static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
862{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300863 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300864 struct smp_chan *smp;
865
Marcel Holtmannf1560462013-10-13 05:43:25 -0700866 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300867 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300868 return NULL;
869
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300870 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
871 if (IS_ERR(smp->tfm_aes)) {
872 BT_ERR("Unable to create ECB crypto context");
873 kfree(smp);
874 return NULL;
875 }
876
Johan Hedberg407cecf2014-05-02 14:19:47 +0300877 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
878 if (IS_ERR(smp->tfm_cmac)) {
879 BT_ERR("Unable to create CMAC crypto context");
880 crypto_free_blkcipher(smp->tfm_aes);
881 kfree(smp);
882 return NULL;
883 }
884
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300885 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300886 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300887
Johan Hedbergb28b4942014-09-05 22:19:55 +0300888 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
889
Johan Hedbergb68fda62014-08-11 22:06:40 +0300890 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
891
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300892 hci_conn_hold(conn->hcon);
893
894 return smp;
895}
896
Brian Gix2b64d152011-12-21 16:12:12 -0800897int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
898{
Johan Hedbergb10e8012014-06-27 14:23:07 +0300899 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300900 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -0800901 struct smp_chan *smp;
902 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300903 int err;
Brian Gix2b64d152011-12-21 16:12:12 -0800904
905 BT_DBG("");
906
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300907 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -0800908 return -ENOTCONN;
909
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300910 chan = conn->smp;
911 if (!chan)
912 return -ENOTCONN;
913
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300914 l2cap_chan_lock(chan);
915 if (!chan->data) {
916 err = -ENOTCONN;
917 goto unlock;
918 }
919
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300920 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800921
922 switch (mgmt_op) {
923 case MGMT_OP_USER_PASSKEY_REPLY:
924 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200925 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800926 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200927 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800928 /* Fall Through */
929 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300930 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800931 break;
932 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
933 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200934 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300935 err = 0;
936 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800937 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200938 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300939 err = -EOPNOTSUPP;
940 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -0800941 }
942
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300943 err = 0;
944
Brian Gix2b64d152011-12-21 16:12:12 -0800945 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300946 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
947 u8 rsp = smp_confirm(smp);
948 if (rsp)
949 smp_failure(conn, rsp);
950 }
Brian Gix2b64d152011-12-21 16:12:12 -0800951
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300952unlock:
953 l2cap_chan_unlock(chan);
954 return err;
Brian Gix2b64d152011-12-21 16:12:12 -0800955}
956
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300957static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300958{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300959 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300960 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300961 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300962 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300963 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300964 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300965
966 BT_DBG("conn %p", conn);
967
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200968 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300969 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200970
Johan Hedberg40bef302014-07-16 11:42:27 +0300971 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800972 return SMP_CMD_NOTSUPP;
973
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300974 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300975 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300976 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300977 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300978
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300979 if (!smp)
980 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300981
Johan Hedbergc05b9332014-09-10 17:37:42 -0700982 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300983 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -0700984
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300985 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -0700986 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +0300987 return SMP_PAIRING_NOTSUPP;
988
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300989 smp->preq[0] = SMP_CMD_PAIRING_REQ;
990 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300991 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300992
Johan Hedberg5be5e272014-09-10 17:58:54 -0700993 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -0700994 sec_level = BT_SECURITY_MEDIUM;
995 else
996 sec_level = authreq_to_seclevel(auth);
997
Johan Hedbergc7262e72014-06-17 13:07:37 +0300998 if (sec_level > conn->hcon->pending_sec_level)
999 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001000
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001001 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001002 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1003 u8 method;
1004
1005 method = get_auth_method(smp, conn->hcon->io_capability,
1006 req->io_capability);
1007 if (method == JUST_WORKS || method == JUST_CFM)
1008 return SMP_AUTH_REQUIREMENTS;
1009 }
1010
Brian Gix2b64d152011-12-21 16:12:12 -08001011 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001012
Johan Hedberg65668772014-05-16 11:03:34 +03001013 if (rsp.auth_req & SMP_AUTH_SC)
1014 set_bit(SMP_FLAG_SC, &smp->flags);
1015
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001016 key_size = min(req->max_key_size, rsp.max_key_size);
1017 if (check_enc_key_size(conn, key_size))
1018 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001019
Johan Hedberge84a6b12013-12-02 10:49:03 +02001020 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001021
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001022 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1023 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001024
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001025 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001026
1027 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1028
1029 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1030 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1031 /* Clear bits which are generated but not distributed */
1032 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1033 /* Wait for Public Key from Initiating Device */
1034 return 0;
1035 } else {
1036 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1037 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001038
Brian Gix2b64d152011-12-21 16:12:12 -08001039 /* Request setup of TK */
1040 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1041 if (ret)
1042 return SMP_UNSPECIFIED;
1043
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001044 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001045}
1046
Johan Hedberg3b191462014-06-06 10:50:15 +03001047static u8 sc_send_public_key(struct smp_chan *smp)
1048{
1049 BT_DBG("");
1050
1051 /* Generate local key pair for Secure Connections */
1052 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1053 return SMP_UNSPECIFIED;
1054
1055 BT_DBG("Local Public Key X: %32phN", smp->local_pk);
1056 BT_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1057 BT_DBG("Local Private Key: %32phN", smp->local_sk);
1058
1059 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1060
1061 return 0;
1062}
1063
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001064static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001065{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001066 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001067 struct l2cap_chan *chan = conn->smp;
1068 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001069 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001070 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001071 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001072
1073 BT_DBG("conn %p", conn);
1074
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001075 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001076 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001077
Johan Hedberg40bef302014-07-16 11:42:27 +03001078 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001079 return SMP_CMD_NOTSUPP;
1080
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001081 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001082
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001083 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001084
1085 key_size = min(req->max_key_size, rsp->max_key_size);
1086 if (check_enc_key_size(conn, key_size))
1087 return SMP_ENC_KEY_SIZE;
1088
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001089 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001090
Johan Hedberg65668772014-05-16 11:03:34 +03001091 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1092 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001093 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1094 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001095
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001096 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001097 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1098 u8 method;
1099
1100 method = get_auth_method(smp, req->io_capability,
1101 rsp->io_capability);
1102 if (method == JUST_WORKS || method == JUST_CFM)
1103 return SMP_AUTH_REQUIREMENTS;
1104 }
1105
Johan Hedberge84a6b12013-12-02 10:49:03 +02001106 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001107
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001108 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1109 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001110
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001111 /* Update remote key distribution in case the remote cleared
1112 * some bits that we had enabled in our request.
1113 */
1114 smp->remote_key_dist &= rsp->resp_key_dist;
1115
Johan Hedberg3b191462014-06-06 10:50:15 +03001116 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1117 /* Clear bits which are generated but not distributed */
1118 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1119 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1120 return sc_send_public_key(smp);
1121 }
1122
Johan Hedbergc05b9332014-09-10 17:37:42 -07001123 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001124
Johan Hedberg476585e2012-06-06 18:54:15 +08001125 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001126 if (ret)
1127 return SMP_UNSPECIFIED;
1128
Johan Hedberg4a74d652014-05-20 09:45:50 +03001129 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001130
1131 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001132 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001133 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001134
1135 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001136}
1137
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001138static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001139{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001140 struct l2cap_chan *chan = conn->smp;
1141 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001142
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001143 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1144
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001145 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001146 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001147
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001148 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1149 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001150
Johan Hedbergb28b4942014-09-05 22:19:55 +03001151 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001152 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1153 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001154 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1155 return 0;
1156 }
1157
1158 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001159 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001160 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001161 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001162
1163 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001164}
1165
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001166static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001167{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001168 struct l2cap_chan *chan = conn->smp;
1169 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001170
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001171 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001172
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001173 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001174 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001175
Johan Hedberg943a7322014-03-18 12:58:24 +02001176 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001177 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001178
Johan Hedberg861580a2014-05-20 09:45:51 +03001179 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001180}
1181
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001182static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001183{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001184 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001185 struct hci_conn *hcon = conn->hcon;
1186
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001187 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001188 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001189 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001190
Johan Hedberga6f78332014-09-10 17:37:45 -07001191 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001192 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001193
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001194 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001195 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001196
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001197 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1198 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001199
Johan Hedbergfe59a052014-07-01 19:14:12 +03001200 /* We never store STKs for master role, so clear this flag */
1201 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1202
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001203 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001204}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001205
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001206bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
1207 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03001208{
1209 if (sec_level == BT_SECURITY_LOW)
1210 return true;
1211
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001212 /* If we're encrypted with an STK but the caller prefers using
1213 * LTK claim insufficient security. This way we allow the
1214 * connection to be re-encrypted with an LTK, even if the LTK
1215 * provides the same level of security. Only exception is if we
1216 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001217 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001218 if (key_pref == SMP_USE_LTK &&
1219 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001220 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001221 return false;
1222
Johan Hedberg854f4722014-07-01 18:40:20 +03001223 if (hcon->sec_level >= sec_level)
1224 return true;
1225
1226 return false;
1227}
1228
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001229static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001230{
1231 struct smp_cmd_security_req *rp = (void *) skb->data;
1232 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001233 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001234 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001235 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07001236 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001237
1238 BT_DBG("conn %p", conn);
1239
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001240 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001241 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001242
Johan Hedberg40bef302014-07-16 11:42:27 +03001243 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001244 return SMP_CMD_NOTSUPP;
1245
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001246 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001247
Johan Hedberg5be5e272014-09-10 17:58:54 -07001248 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001249 sec_level = BT_SECURITY_MEDIUM;
1250 else
1251 sec_level = authreq_to_seclevel(auth);
1252
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001253 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03001254 return 0;
1255
Johan Hedbergc7262e72014-06-17 13:07:37 +03001256 if (sec_level > hcon->pending_sec_level)
1257 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001258
Johan Hedberg4dab7862012-06-07 14:58:37 +08001259 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001260 return 0;
1261
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001262 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001263 if (!smp)
1264 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001265
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001266 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001267 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03001268 return SMP_PAIRING_NOTSUPP;
1269
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001270 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001271
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001272 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07001273 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001274
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001275 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1276 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001277
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001278 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001279 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001280
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001281 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001282}
1283
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001284int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001285{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001286 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001287 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001288 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001289 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001290 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001291
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001292 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1293
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001294 /* This may be NULL if there's an unexpected disconnection */
1295 if (!conn)
1296 return 1;
1297
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001298 chan = conn->smp;
1299
Johan Hedberg757aee02013-04-24 13:05:32 +03001300 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001301 return 1;
1302
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001303 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001304 return 1;
1305
Johan Hedbergc7262e72014-06-17 13:07:37 +03001306 if (sec_level > hcon->pending_sec_level)
1307 hcon->pending_sec_level = sec_level;
1308
Johan Hedberg40bef302014-07-16 11:42:27 +03001309 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001310 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1311 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001312
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001313 l2cap_chan_lock(chan);
1314
1315 /* If SMP is already in progress ignore this request */
1316 if (chan->data) {
1317 ret = 0;
1318 goto unlock;
1319 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001320
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001321 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001322 if (!smp) {
1323 ret = 1;
1324 goto unlock;
1325 }
Brian Gix2b64d152011-12-21 16:12:12 -08001326
1327 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001328
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001329 if (test_bit(HCI_SC_ENABLED, &hcon->hdev->dev_flags))
1330 authreq |= SMP_AUTH_SC;
1331
Johan Hedberg79897d22014-06-01 09:45:24 +03001332 /* Require MITM if IO Capability allows or the security level
1333 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02001334 */
Johan Hedberg79897d22014-06-01 09:45:24 +03001335 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03001336 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02001337 authreq |= SMP_AUTH_MITM;
1338
Johan Hedberg40bef302014-07-16 11:42:27 +03001339 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001340 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001341
Brian Gix2b64d152011-12-21 16:12:12 -08001342 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001343 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1344 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001345
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001346 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001347 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001348 } else {
1349 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08001350 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001351 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001352 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001353 }
1354
Johan Hedberg4a74d652014-05-20 09:45:50 +03001355 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001356 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02001357
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001358unlock:
1359 l2cap_chan_unlock(chan);
1360 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001361}
1362
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001363static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1364{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001365 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001366 struct l2cap_chan *chan = conn->smp;
1367 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001368
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001369 BT_DBG("conn %p", conn);
1370
1371 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001372 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001373
Johan Hedbergb28b4942014-09-05 22:19:55 +03001374 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001375
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001376 skb_pull(skb, sizeof(*rp));
1377
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001378 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001379
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001380 return 0;
1381}
1382
1383static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1384{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001385 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001386 struct l2cap_chan *chan = conn->smp;
1387 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001388 struct hci_dev *hdev = conn->hcon->hdev;
1389 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001390 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001391 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001392
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001393 BT_DBG("conn %p", conn);
1394
1395 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001396 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001397
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001398 /* Mark the information as received */
1399 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1400
Johan Hedbergb28b4942014-09-05 22:19:55 +03001401 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1402 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07001403 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1404 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001405
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001406 skb_pull(skb, sizeof(*rp));
1407
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001408 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001409 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001410 authenticated, smp->tk, smp->enc_key_size,
1411 rp->ediv, rp->rand);
1412 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001413 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03001414 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001415
1416 return 0;
1417}
1418
Johan Hedbergfd349c02014-02-18 10:19:36 +02001419static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1420{
1421 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001422 struct l2cap_chan *chan = conn->smp;
1423 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001424
1425 BT_DBG("");
1426
1427 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001428 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001429
Johan Hedbergb28b4942014-09-05 22:19:55 +03001430 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001431
Johan Hedbergfd349c02014-02-18 10:19:36 +02001432 skb_pull(skb, sizeof(*info));
1433
1434 memcpy(smp->irk, info->irk, 16);
1435
1436 return 0;
1437}
1438
1439static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1440 struct sk_buff *skb)
1441{
1442 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001443 struct l2cap_chan *chan = conn->smp;
1444 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001445 struct hci_conn *hcon = conn->hcon;
1446 bdaddr_t rpa;
1447
1448 BT_DBG("");
1449
1450 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001451 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001452
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001453 /* Mark the information as received */
1454 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1455
Johan Hedbergb28b4942014-09-05 22:19:55 +03001456 if (smp->remote_key_dist & SMP_DIST_SIGN)
1457 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1458
Johan Hedbergfd349c02014-02-18 10:19:36 +02001459 skb_pull(skb, sizeof(*info));
1460
Johan Hedberga9a58f82014-02-25 22:24:37 +02001461 /* Strictly speaking the Core Specification (4.1) allows sending
1462 * an empty address which would force us to rely on just the IRK
1463 * as "identity information". However, since such
1464 * implementations are not known of and in order to not over
1465 * complicate our implementation, simply pretend that we never
1466 * received an IRK for such a device.
1467 */
1468 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1469 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001470 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001471 }
1472
Johan Hedbergfd349c02014-02-18 10:19:36 +02001473 bacpy(&smp->id_addr, &info->bdaddr);
1474 smp->id_addr_type = info->addr_type;
1475
1476 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1477 bacpy(&rpa, &hcon->dst);
1478 else
1479 bacpy(&rpa, BDADDR_ANY);
1480
Johan Hedberg23d0e122014-02-19 14:57:46 +02001481 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1482 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001483
Johan Hedberg31dd6242014-06-27 14:23:02 +03001484distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001485 if (!(smp->remote_key_dist & KEY_DIST_MASK))
1486 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001487
1488 return 0;
1489}
1490
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001491static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1492{
1493 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001494 struct l2cap_chan *chan = conn->smp;
1495 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001496 struct smp_csrk *csrk;
1497
1498 BT_DBG("conn %p", conn);
1499
1500 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001501 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001502
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001503 /* Mark the information as received */
1504 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1505
1506 skb_pull(skb, sizeof(*rp));
1507
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001508 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1509 if (csrk) {
1510 csrk->master = 0x01;
1511 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1512 }
1513 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03001514 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001515
1516 return 0;
1517}
1518
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03001519static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
1520{
1521 struct smp_cmd_public_key *key = (void *) skb->data;
1522 struct hci_conn *hcon = conn->hcon;
1523 struct l2cap_chan *chan = conn->smp;
1524 struct smp_chan *smp = chan->data;
1525 int err;
1526
1527 BT_DBG("conn %p", conn);
1528
1529 if (skb->len < sizeof(*key))
1530 return SMP_INVALID_PARAMS;
1531
1532 memcpy(smp->remote_pk, key, 64);
1533
1534 /* Non-initiating device sends its public key after receiving
1535 * the key from the initiating device.
1536 */
1537 if (!hcon->out) {
1538 err = sc_send_public_key(smp);
1539 if (err)
1540 return err;
1541 }
1542
1543 BT_DBG("Remote Public Key X: %32phN", smp->remote_pk);
1544 BT_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
1545
1546 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
1547 return SMP_UNSPECIFIED;
1548
1549 BT_DBG("DHKey %32phN", smp->dhkey);
1550
1551 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
1552
1553 return 0;
1554}
1555
Johan Hedberg4befb862014-08-11 22:06:38 +03001556static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001557{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001558 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001559 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001560 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001561 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001562 int err = 0;
1563
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001564 if (hcon->type != LE_LINK) {
1565 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001566 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001567 }
1568
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001569 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07001570 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001571
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001572 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001573 reason = SMP_PAIRING_NOTSUPP;
1574 goto done;
1575 }
1576
Marcel Holtmann92381f52013-10-03 01:23:08 -07001577 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001578 skb_pull(skb, sizeof(code));
1579
Johan Hedbergb28b4942014-09-05 22:19:55 +03001580 smp = chan->data;
1581
1582 if (code > SMP_CMD_MAX)
1583 goto drop;
1584
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07001585 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03001586 goto drop;
1587
1588 /* If we don't have a context the only allowed commands are
1589 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001590 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001591 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
1592 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001593
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001594 switch (code) {
1595 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001596 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001597 break;
1598
1599 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001600 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001601 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001602 break;
1603
1604 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001605 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001606 break;
1607
1608 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001609 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001610 break;
1611
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001612 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001613 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001614 break;
1615
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001616 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001617 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001618 break;
1619
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001620 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001621 reason = smp_cmd_encrypt_info(conn, skb);
1622 break;
1623
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001624 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001625 reason = smp_cmd_master_ident(conn, skb);
1626 break;
1627
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001628 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001629 reason = smp_cmd_ident_info(conn, skb);
1630 break;
1631
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001632 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001633 reason = smp_cmd_ident_addr_info(conn, skb);
1634 break;
1635
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001636 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001637 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001638 break;
1639
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03001640 case SMP_CMD_PUBLIC_KEY:
1641 reason = smp_cmd_public_key(conn, skb);
1642 break;
1643
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001644 default:
1645 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001646 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001647 goto done;
1648 }
1649
1650done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001651 if (!err) {
1652 if (reason)
1653 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03001654 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03001655 }
1656
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001657 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001658
1659drop:
1660 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
1661 code, &hcon->dst);
1662 kfree_skb(skb);
1663 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001664}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001665
Johan Hedberg70db83c2014-08-08 09:37:16 +03001666static void smp_teardown_cb(struct l2cap_chan *chan, int err)
1667{
1668 struct l2cap_conn *conn = chan->conn;
1669
1670 BT_DBG("chan %p", chan);
1671
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001672 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001673 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001674
Johan Hedberg70db83c2014-08-08 09:37:16 +03001675 conn->smp = NULL;
1676 l2cap_chan_put(chan);
1677}
1678
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001679static void smp_resume_cb(struct l2cap_chan *chan)
1680{
Johan Hedbergb68fda62014-08-11 22:06:40 +03001681 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001682 struct l2cap_conn *conn = chan->conn;
1683 struct hci_conn *hcon = conn->hcon;
1684
1685 BT_DBG("chan %p", chan);
1686
Johan Hedberg86d14072014-08-11 22:06:43 +03001687 if (!smp)
1688 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03001689
Johan Hedberg84bc0db2014-09-05 22:19:49 +03001690 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
1691 return;
1692
Johan Hedberg86d14072014-08-11 22:06:43 +03001693 cancel_delayed_work(&smp->security_timer);
1694
Johan Hedbergd6268e82014-09-05 22:19:51 +03001695 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001696}
1697
Johan Hedberg70db83c2014-08-08 09:37:16 +03001698static void smp_ready_cb(struct l2cap_chan *chan)
1699{
1700 struct l2cap_conn *conn = chan->conn;
1701
1702 BT_DBG("chan %p", chan);
1703
1704 conn->smp = chan;
1705 l2cap_chan_hold(chan);
1706}
1707
Johan Hedberg4befb862014-08-11 22:06:38 +03001708static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
1709{
1710 int err;
1711
1712 BT_DBG("chan %p", chan);
1713
1714 err = smp_sig_channel(chan, skb);
1715 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03001716 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03001717
Johan Hedbergb68fda62014-08-11 22:06:40 +03001718 if (smp)
1719 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03001720
Johan Hedberg1e91c292014-08-18 20:33:29 +03001721 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03001722 }
1723
1724 return err;
1725}
1726
Johan Hedberg70db83c2014-08-08 09:37:16 +03001727static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
1728 unsigned long hdr_len,
1729 unsigned long len, int nb)
1730{
1731 struct sk_buff *skb;
1732
1733 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
1734 if (!skb)
1735 return ERR_PTR(-ENOMEM);
1736
1737 skb->priority = HCI_PRIO_MAX;
1738 bt_cb(skb)->chan = chan;
1739
1740 return skb;
1741}
1742
1743static const struct l2cap_ops smp_chan_ops = {
1744 .name = "Security Manager",
1745 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001746 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001747 .alloc_skb = smp_alloc_skb_cb,
1748 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001749 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001750
1751 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001752 .state_change = l2cap_chan_no_state_change,
1753 .close = l2cap_chan_no_close,
1754 .defer = l2cap_chan_no_defer,
1755 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03001756 .set_shutdown = l2cap_chan_no_set_shutdown,
1757 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1758 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1759};
1760
1761static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
1762{
1763 struct l2cap_chan *chan;
1764
1765 BT_DBG("pchan %p", pchan);
1766
1767 chan = l2cap_chan_create();
1768 if (!chan)
1769 return NULL;
1770
1771 chan->chan_type = pchan->chan_type;
1772 chan->ops = &smp_chan_ops;
1773 chan->scid = pchan->scid;
1774 chan->dcid = chan->scid;
1775 chan->imtu = pchan->imtu;
1776 chan->omtu = pchan->omtu;
1777 chan->mode = pchan->mode;
1778
Johan Hedbergabe84902014-11-12 22:22:21 +02001779 /* Other L2CAP channels may request SMP routines in order to
1780 * change the security level. This means that the SMP channel
1781 * lock must be considered in its own category to avoid lockdep
1782 * warnings.
1783 */
1784 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
1785
Johan Hedberg70db83c2014-08-08 09:37:16 +03001786 BT_DBG("created chan %p", chan);
1787
1788 return chan;
1789}
1790
1791static const struct l2cap_ops smp_root_chan_ops = {
1792 .name = "Security Manager Root",
1793 .new_connection = smp_new_conn_cb,
1794
1795 /* None of these are implemented for the root channel */
1796 .close = l2cap_chan_no_close,
1797 .alloc_skb = l2cap_chan_no_alloc_skb,
1798 .recv = l2cap_chan_no_recv,
1799 .state_change = l2cap_chan_no_state_change,
1800 .teardown = l2cap_chan_no_teardown,
1801 .ready = l2cap_chan_no_ready,
1802 .defer = l2cap_chan_no_defer,
1803 .suspend = l2cap_chan_no_suspend,
1804 .resume = l2cap_chan_no_resume,
1805 .set_shutdown = l2cap_chan_no_set_shutdown,
1806 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
1807 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
1808};
1809
Johan Hedberg711eafe2014-08-08 09:32:52 +03001810int smp_register(struct hci_dev *hdev)
1811{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001812 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001813 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001814
Johan Hedberg711eafe2014-08-08 09:32:52 +03001815 BT_DBG("%s", hdev->name);
1816
Johan Hedbergadae20c2014-11-13 14:37:48 +02001817 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001818 if (IS_ERR(tfm_aes)) {
1819 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001820 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03001821 return err;
1822 }
1823
Johan Hedberg70db83c2014-08-08 09:37:16 +03001824 chan = l2cap_chan_create();
1825 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001826 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001827 return -ENOMEM;
1828 }
1829
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001830 chan->data = tfm_aes;
1831
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001832 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03001833
1834 l2cap_chan_set_defaults(chan);
1835
1836 bacpy(&chan->src, &hdev->bdaddr);
1837 chan->src_type = BDADDR_LE_PUBLIC;
1838 chan->state = BT_LISTEN;
1839 chan->mode = L2CAP_MODE_BASIC;
1840 chan->imtu = L2CAP_DEFAULT_MTU;
1841 chan->ops = &smp_root_chan_ops;
1842
Johan Hedbergabe84902014-11-12 22:22:21 +02001843 /* Set correct nesting level for a parent/listening channel */
1844 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
1845
Johan Hedberg70db83c2014-08-08 09:37:16 +03001846 hdev->smp_data = chan;
1847
Johan Hedberg711eafe2014-08-08 09:32:52 +03001848 return 0;
1849}
1850
1851void smp_unregister(struct hci_dev *hdev)
1852{
Johan Hedberg70db83c2014-08-08 09:37:16 +03001853 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001854 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03001855
1856 if (!chan)
1857 return;
1858
1859 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001860
Johan Hedbergdefce9e2014-08-08 09:37:17 +03001861 tfm_aes = chan->data;
1862 if (tfm_aes) {
1863 chan->data = NULL;
1864 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001865 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03001866
1867 hdev->smp_data = NULL;
1868 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03001869}