blob: 78eeb8b5970a8aa1a6a41cb60cc22ee97ca66bf9 [file] [log] [blame]
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
8
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
21*/
22
Gustavo Padovan8c520a52012-05-23 04:04:22 -030023#include <linux/crypto.h>
24#include <linux/scatterlist.h>
25#include <crypto/b128ops.h>
26
Anderson Brigliaeb492e02011-06-09 18:50:40 -030027#include <net/bluetooth/bluetooth.h>
28#include <net/bluetooth/hci_core.h>
29#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080030#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070031
32#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030033
Marcel Holtmann17b02e62012-03-01 14:32:37 -080034#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030035
Johan Hedberg065a13e2012-10-11 16:26:06 +020036#define AUTH_REQ_MASK 0x07
37
Johan Hedberg533e35d2014-06-16 19:25:18 +030038enum {
39 SMP_FLAG_TK_VALID,
40 SMP_FLAG_CFM_PENDING,
41 SMP_FLAG_MITM_AUTH,
42 SMP_FLAG_COMPLETE,
43 SMP_FLAG_INITIATOR,
44};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030045
46struct smp_chan {
47 struct l2cap_conn *conn;
48 u8 preq[7]; /* SMP Pairing Request */
49 u8 prsp[7]; /* SMP Pairing Response */
50 u8 prnd[16]; /* SMP Pairing Random (local) */
51 u8 rrnd[16]; /* SMP Pairing Random (remote) */
52 u8 pcnf[16]; /* SMP Pairing Confirm */
53 u8 tk[16]; /* SMP Temporary Key */
54 u8 enc_key_size;
55 u8 remote_key_dist;
56 bdaddr_t id_addr;
57 u8 id_addr_type;
58 u8 irk[16];
59 struct smp_csrk *csrk;
60 struct smp_csrk *slave_csrk;
61 struct smp_ltk *ltk;
62 struct smp_ltk *slave_ltk;
63 struct smp_irk *remote_irk;
Johan Hedberg4a74d652014-05-20 09:45:50 +030064 unsigned long flags;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030065
66 struct crypto_blkcipher *tfm_aes;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030067};
68
Johan Hedberg8a2936f2014-06-16 19:25:19 +030069static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030070{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030071 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030072
Johan Hedberg8a2936f2014-06-16 19:25:19 +030073 for (i = 0; i < len; i++)
74 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030075}
76
77static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
78{
79 struct blkcipher_desc desc;
80 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +020081 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +020082 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030083
84 if (tfm == NULL) {
85 BT_ERR("tfm %p", tfm);
86 return -EINVAL;
87 }
88
89 desc.tfm = tfm;
90 desc.flags = 0;
91
Johan Hedberg943a7322014-03-18 12:58:24 +020092 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +030093 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +020094
95 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030096 if (err) {
97 BT_ERR("cipher setkey failed: %d", err);
98 return err;
99 }
100
Johan Hedberg943a7322014-03-18 12:58:24 +0200101 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300102 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200103
104 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300105
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300106 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
107 if (err)
108 BT_ERR("Encrypt data error %d", err);
109
Johan Hedberg943a7322014-03-18 12:58:24 +0200110 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300111 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200112
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300113 return err;
114}
115
Johan Hedberg60478052014-02-18 10:19:31 +0200116static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
117{
Johan Hedberg943a7322014-03-18 12:58:24 +0200118 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200119 int err;
120
121 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200122 memcpy(_res, r, 3);
123 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200124
Johan Hedberg943a7322014-03-18 12:58:24 +0200125 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200126 if (err) {
127 BT_ERR("Encrypt error");
128 return err;
129 }
130
131 /* The output of the random address function ah is:
132 * ah(h, r) = e(k, r') mod 2^24
133 * The output of the security function e is then truncated to 24 bits
134 * by taking the least significant 24 bits of the output of e as the
135 * result of ah.
136 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200137 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200138
139 return 0;
140}
141
142bool smp_irk_matches(struct crypto_blkcipher *tfm, u8 irk[16],
143 bdaddr_t *bdaddr)
144{
145 u8 hash[3];
146 int err;
147
148 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
149
150 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
151 if (err)
152 return false;
153
154 return !memcmp(bdaddr->b, hash, 3);
155}
156
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200157int smp_generate_rpa(struct crypto_blkcipher *tfm, u8 irk[16], bdaddr_t *rpa)
158{
159 int err;
160
161 get_random_bytes(&rpa->b[3], 3);
162
163 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
164 rpa->b[5] |= 0x40; /* Set second most significant bit */
165
166 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
167 if (err < 0)
168 return err;
169
170 BT_DBG("RPA %pMR", rpa);
171
172 return 0;
173}
174
Johan Hedbergec70f362014-06-27 14:23:04 +0300175static int smp_c1(struct smp_chan *smp, u8 k[16], u8 r[16], u8 preq[7],
176 u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat, bdaddr_t *ra,
177 u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300178{
Johan Hedbergec70f362014-06-27 14:23:04 +0300179 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300180 u8 p1[16], p2[16];
181 int err;
182
Johan Hedbergec70f362014-06-27 14:23:04 +0300183 BT_DBG("%s", hdev->name);
184
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300185 memset(p1, 0, 16);
186
187 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200188 p1[0] = _iat;
189 p1[1] = _rat;
190 memcpy(p1 + 2, preq, 7);
191 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300192
193 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200194 memcpy(p2, ra, 6);
195 memcpy(p2 + 6, ia, 6);
196 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300197
198 /* res = r XOR p1 */
199 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
200
201 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300202 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300203 if (err) {
204 BT_ERR("Encrypt data error");
205 return err;
206 }
207
208 /* res = res XOR p2 */
209 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
210
211 /* res = e(k, res) */
Johan Hedbergec70f362014-06-27 14:23:04 +0300212 err = smp_e(smp->tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300213 if (err)
214 BT_ERR("Encrypt data error");
215
216 return err;
217}
218
Johan Hedbergec70f362014-06-27 14:23:04 +0300219static int smp_s1(struct smp_chan *smp, u8 k[16], u8 r1[16], u8 r2[16],
220 u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300221{
Johan Hedbergec70f362014-06-27 14:23:04 +0300222 struct hci_dev *hdev = smp->conn->hcon->hdev;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300223 int err;
224
Johan Hedbergec70f362014-06-27 14:23:04 +0300225 BT_DBG("%s", hdev->name);
226
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300227 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200228 memcpy(_r, r2, 8);
229 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300230
Johan Hedbergec70f362014-06-27 14:23:04 +0300231 err = smp_e(smp->tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300232 if (err)
233 BT_ERR("Encrypt data error");
234
235 return err;
236}
237
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300238static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700239 u16 dlen, void *data)
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300240{
241 struct sk_buff *skb;
242 struct l2cap_hdr *lh;
243 int len;
244
245 len = L2CAP_HDR_SIZE + sizeof(code) + dlen;
246
247 if (len > conn->mtu)
248 return NULL;
249
250 skb = bt_skb_alloc(len, GFP_ATOMIC);
251 if (!skb)
252 return NULL;
253
254 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
255 lh->len = cpu_to_le16(sizeof(code) + dlen);
Joe Perchesdcf4adb2014-03-12 10:52:35 -0700256 lh->cid = cpu_to_le16(L2CAP_CID_SMP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300257
258 memcpy(skb_put(skb, sizeof(code)), &code, sizeof(code));
259
260 memcpy(skb_put(skb, dlen), data, dlen);
261
262 return skb;
263}
264
265static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
266{
267 struct sk_buff *skb = smp_build_cmd(conn, code, len, data);
268
269 BT_DBG("code 0x%2.2x", code);
270
271 if (!skb)
272 return;
273
Luiz Augusto von Dentz73d80de2011-11-02 15:52:01 +0200274 skb->priority = HCI_PRIO_MAX;
275 hci_send_acl(conn->hchan, skb, 0);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300276
Gustavo F. Padovan6c9d42a2011-12-20 10:57:27 -0200277 cancel_delayed_work_sync(&conn->security_timer);
Marcel Holtmann17b02e62012-03-01 14:32:37 -0800278 schedule_delayed_work(&conn->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300279}
280
Brian Gix2b64d152011-12-21 16:12:12 -0800281static __u8 authreq_to_seclevel(__u8 authreq)
282{
283 if (authreq & SMP_AUTH_MITM)
284 return BT_SECURITY_HIGH;
285 else
286 return BT_SECURITY_MEDIUM;
287}
288
289static __u8 seclevel_to_authreq(__u8 sec_level)
290{
291 switch (sec_level) {
292 case BT_SECURITY_HIGH:
293 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
294 case BT_SECURITY_MEDIUM:
295 return SMP_AUTH_BONDING;
296 default:
297 return SMP_AUTH_NONE;
298 }
299}
300
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300301static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700302 struct smp_cmd_pairing *req,
303 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300304{
Johan Hedbergfd349c02014-02-18 10:19:36 +0200305 struct smp_chan *smp = conn->smp_chan;
306 struct hci_conn *hcon = conn->hcon;
307 struct hci_dev *hdev = hcon->hdev;
308 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300309
Johan Hedberga8b2d5c2012-01-08 23:11:15 +0200310 if (test_bit(HCI_PAIRABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700311 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
312 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300313 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800314 } else {
315 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300316 }
317
Johan Hedbergfd349c02014-02-18 10:19:36 +0200318 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
319 remote_dist |= SMP_DIST_ID_KEY;
320
Johan Hedberg863efaf2014-02-22 19:06:32 +0200321 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
322 local_dist |= SMP_DIST_ID_KEY;
323
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300324 if (rsp == NULL) {
325 req->io_capability = conn->hcon->io_capability;
326 req->oob_flag = SMP_OOB_NOT_PRESENT;
327 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200328 req->init_key_dist = local_dist;
329 req->resp_key_dist = remote_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200330 req->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200331
332 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300333 return;
334 }
335
336 rsp->io_capability = conn->hcon->io_capability;
337 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
338 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200339 rsp->init_key_dist = req->init_key_dist & remote_dist;
340 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg065a13e2012-10-11 16:26:06 +0200341 rsp->auth_req = (authreq & AUTH_REQ_MASK);
Johan Hedbergfd349c02014-02-18 10:19:36 +0200342
343 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300344}
345
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300346static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
347{
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300348 struct smp_chan *smp = conn->smp_chan;
349
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300350 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700351 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300352 return SMP_ENC_KEY_SIZE;
353
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300354 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300355
356 return 0;
357}
358
Johan Hedberg84794e12013-11-06 11:24:57 +0200359static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800360{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200361 struct hci_conn *hcon = conn->hcon;
362
Johan Hedberg84794e12013-11-06 11:24:57 +0200363 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800364 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700365 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800366
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700367 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
368 mgmt_auth_failed(hcon->hdev, &hcon->dst, hcon->type, hcon->dst_type,
369 HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300370
Andre Guedes61a0cfb2012-08-01 20:34:15 -0300371 cancel_delayed_work_sync(&conn->security_timer);
372
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700373 if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300374 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800375}
376
Brian Gix2b64d152011-12-21 16:12:12 -0800377#define JUST_WORKS 0x00
378#define JUST_CFM 0x01
379#define REQ_PASSKEY 0x02
380#define CFM_PASSKEY 0x03
381#define REQ_OOB 0x04
382#define OVERLAP 0xFF
383
384static const u8 gen_method[5][5] = {
385 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
386 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
387 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
388 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
389 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
390};
391
Johan Hedberg581370c2014-06-17 13:07:38 +0300392static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
393{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300394 /* If either side has unknown io_caps, use JUST_CFM (which gets
395 * converted later to JUST_WORKS if we're initiators.
396 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300397 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
398 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300399 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300400
401 return gen_method[remote_io][local_io];
402}
403
Brian Gix2b64d152011-12-21 16:12:12 -0800404static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
405 u8 local_io, u8 remote_io)
406{
407 struct hci_conn *hcon = conn->hcon;
408 struct smp_chan *smp = conn->smp_chan;
409 u8 method;
410 u32 passkey = 0;
411 int ret = 0;
412
413 /* Initialize key for JUST WORKS */
414 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300415 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800416
417 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
418
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300419 /* If neither side wants MITM, either "just" confirm an incoming
420 * request or use just-works for outgoing ones. The JUST_CFM
421 * will be converted to JUST_WORKS if necessary later in this
422 * function. If either side has MITM look up the method from the
423 * table.
424 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300425 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300426 method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800427 else
Johan Hedberg581370c2014-06-17 13:07:38 +0300428 method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800429
Johan Hedberga82505c2014-03-24 14:39:07 +0200430 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300431 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
Johan Hedberga82505c2014-03-24 14:39:07 +0200432 method = JUST_WORKS;
433
Brian Gix2b64d152011-12-21 16:12:12 -0800434 /* If Just Works, Continue with Zero TK */
435 if (method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300436 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800437 return 0;
438 }
439
440 /* Not Just Works/Confirm results in MITM Authentication */
441 if (method != JUST_CFM)
Johan Hedberg4a74d652014-05-20 09:45:50 +0300442 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800443
444 /* If both devices have Keyoard-Display I/O, the master
445 * Confirms and the slave Enters the passkey.
446 */
447 if (method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300448 if (hcon->role == HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800449 method = CFM_PASSKEY;
450 else
451 method = REQ_PASSKEY;
452 }
453
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200454 /* Generate random passkey. */
Brian Gix2b64d152011-12-21 16:12:12 -0800455 if (method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200456 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800457 get_random_bytes(&passkey, sizeof(passkey));
458 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200459 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800460 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300461 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800462 }
463
464 hci_dev_lock(hcon->hdev);
465
466 if (method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700467 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200468 hcon->type, hcon->dst_type);
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200469 else if (method == JUST_CFM)
470 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
471 hcon->type, hcon->dst_type,
472 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800473 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200474 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200475 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200476 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800477
478 hci_dev_unlock(hcon->hdev);
479
480 return ret;
481}
482
Johan Hedberg1cc61142014-05-20 09:45:52 +0300483static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300484{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300485 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300486 struct smp_cmd_pairing_confirm cp;
487 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300488
489 BT_DBG("conn %p", conn);
490
Johan Hedbergec70f362014-06-27 14:23:04 +0300491 ret = smp_c1(smp, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200492 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200493 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
494 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300495 if (ret)
496 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300497
Johan Hedberg4a74d652014-05-20 09:45:50 +0300498 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800499
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300500 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
501
Johan Hedberg1cc61142014-05-20 09:45:52 +0300502 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300503}
504
Johan Hedberg861580a2014-05-20 09:45:51 +0300505static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300506{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300507 struct l2cap_conn *conn = smp->conn;
508 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300509 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300510 int ret;
511
Johan Hedbergec70f362014-06-27 14:23:04 +0300512 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300513 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300514
515 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
516
Johan Hedbergec70f362014-06-27 14:23:04 +0300517 ret = smp_c1(smp, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200518 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200519 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300520 if (ret)
521 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300522
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300523 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
524 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300525 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300526 }
527
528 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800529 u8 stk[16];
530 __le64 rand = 0;
531 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300532
Johan Hedbergec70f362014-06-27 14:23:04 +0300533 smp_s1(smp, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300534
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300535 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300536 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300537
Johan Hedberg861580a2014-05-20 09:45:51 +0300538 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
539 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300540
541 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300542 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300543 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300544 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300545 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800546 __le64 rand = 0;
547 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300548
Johan Hedberg943a7322014-03-18 12:58:24 +0200549 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
550 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300551
Johan Hedbergec70f362014-06-27 14:23:04 +0300552 smp_s1(smp, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300553
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300554 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700555 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300556
Johan Hedbergfff34902014-06-10 15:19:50 +0300557 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
558 auth = 1;
559 else
560 auth = 0;
561
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300562 /* Even though there's no _SLAVE suffix this is the
563 * slave STK we're adding for later lookup (the master
564 * STK never needs to be stored).
565 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700566 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300567 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300568 }
569
Johan Hedberg861580a2014-05-20 09:45:51 +0300570 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300571}
572
573static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
574{
575 struct smp_chan *smp;
576
Marcel Holtmannf1560462013-10-13 05:43:25 -0700577 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300578 if (!smp)
579 return NULL;
580
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300581 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
582 if (IS_ERR(smp->tfm_aes)) {
583 BT_ERR("Unable to create ECB crypto context");
584 kfree(smp);
585 return NULL;
586 }
587
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300588 smp->conn = conn;
589 conn->smp_chan = smp;
590
591 hci_conn_hold(conn->hcon);
592
593 return smp;
594}
595
596void smp_chan_destroy(struct l2cap_conn *conn)
597{
Brian Gixc8eb9692011-11-23 08:28:35 -0800598 struct smp_chan *smp = conn->smp_chan;
Johan Hedbergf4a407b2014-02-18 21:41:34 +0200599 bool complete;
Brian Gixc8eb9692011-11-23 08:28:35 -0800600
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300601 BUG_ON(!smp);
Brian Gixc8eb9692011-11-23 08:28:35 -0800602
Johan Hedberg4a74d652014-05-20 09:45:50 +0300603 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedbergf4a407b2014-02-18 21:41:34 +0200604 mgmt_smp_complete(conn->hcon, complete);
605
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700606 kfree(smp->csrk);
607 kfree(smp->slave_csrk);
608
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300609 crypto_free_blkcipher(smp->tfm_aes);
610
Johan Hedberg759331d2014-02-28 10:10:16 +0200611 /* If pairing failed clean up any keys we might have */
612 if (!complete) {
613 if (smp->ltk) {
614 list_del(&smp->ltk->list);
615 kfree(smp->ltk);
616 }
617
618 if (smp->slave_ltk) {
619 list_del(&smp->slave_ltk->list);
620 kfree(smp->slave_ltk);
621 }
622
623 if (smp->remote_irk) {
624 list_del(&smp->remote_irk->list);
625 kfree(smp->remote_irk);
626 }
627 }
628
Brian Gixc8eb9692011-11-23 08:28:35 -0800629 kfree(smp);
630 conn->smp_chan = NULL;
David Herrmann76a68ba2013-04-06 20:28:37 +0200631 hci_conn_drop(conn->hcon);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300632}
633
Brian Gix2b64d152011-12-21 16:12:12 -0800634int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
635{
Johan Hedbergb10e8012014-06-27 14:23:07 +0300636 struct l2cap_conn *conn = hcon->l2cap_data;
Brian Gix2b64d152011-12-21 16:12:12 -0800637 struct smp_chan *smp;
638 u32 value;
Brian Gix2b64d152011-12-21 16:12:12 -0800639
640 BT_DBG("");
641
Johan Hedberg642ac772014-06-27 14:23:06 +0300642 if (!conn || !test_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Brian Gix2b64d152011-12-21 16:12:12 -0800643 return -ENOTCONN;
644
645 smp = conn->smp_chan;
646
647 switch (mgmt_op) {
648 case MGMT_OP_USER_PASSKEY_REPLY:
649 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +0200650 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800651 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +0200652 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800653 /* Fall Through */
654 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +0300655 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800656 break;
657 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
658 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +0200659 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Brian Gix2b64d152011-12-21 16:12:12 -0800660 return 0;
661 default:
Johan Hedberg84794e12013-11-06 11:24:57 +0200662 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Brian Gix2b64d152011-12-21 16:12:12 -0800663 return -EOPNOTSUPP;
664 }
665
666 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +0300667 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
668 u8 rsp = smp_confirm(smp);
669 if (rsp)
670 smp_failure(conn, rsp);
671 }
Brian Gix2b64d152011-12-21 16:12:12 -0800672
673 return 0;
674}
675
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300676static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300677{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300678 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergb3c64102014-07-10 11:02:07 +0300679 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300680 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300681 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300682 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300683
684 BT_DBG("conn %p", conn);
685
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200686 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300687 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200688
Johan Hedberg40bef302014-07-16 11:42:27 +0300689 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -0800690 return SMP_CMD_NOTSUPP;
691
Johan Hedberg51a8efd2012-01-16 06:10:31 +0200692 if (!test_and_set_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300693 smp = smp_chan_create(conn);
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300694 else
695 smp = conn->smp_chan;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300696
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +0300697 if (!smp)
698 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300699
Johan Hedbergb3c64102014-07-10 11:02:07 +0300700 if (!test_bit(HCI_PAIRABLE, &hdev->dev_flags) &&
701 (req->auth_req & SMP_AUTH_BONDING))
702 return SMP_PAIRING_NOTSUPP;
703
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300704 smp->preq[0] = SMP_CMD_PAIRING_REQ;
705 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300706 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300707
Brian Gix2b64d152011-12-21 16:12:12 -0800708 /* We didn't start the pairing, so match remote */
Johan Hedberg1ef35822014-05-20 09:45:48 +0300709 auth = req->auth_req;
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300710
Johan Hedbergc7262e72014-06-17 13:07:37 +0300711 sec_level = authreq_to_seclevel(auth);
712 if (sec_level > conn->hcon->pending_sec_level)
713 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +0200714
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300715 /* If we need MITM check that it can be acheived */
716 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
717 u8 method;
718
719 method = get_auth_method(smp, conn->hcon->io_capability,
720 req->io_capability);
721 if (method == JUST_WORKS || method == JUST_CFM)
722 return SMP_AUTH_REQUIREMENTS;
723 }
724
Brian Gix2b64d152011-12-21 16:12:12 -0800725 build_pairing_cmd(conn, req, &rsp, auth);
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300726
727 key_size = min(req->max_key_size, rsp.max_key_size);
728 if (check_enc_key_size(conn, key_size))
729 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300730
Johan Hedberge84a6b12013-12-02 10:49:03 +0200731 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300732
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300733 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
734 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300735
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300736 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300737
Brian Gix2b64d152011-12-21 16:12:12 -0800738 /* Request setup of TK */
739 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
740 if (ret)
741 return SMP_UNSPECIFIED;
742
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300743 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300744}
745
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300746static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300747{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300748 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300749 struct smp_chan *smp = conn->smp_chan;
Brian Gix2b64d152011-12-21 16:12:12 -0800750 u8 key_size, auth = SMP_AUTH_NONE;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300751 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300752
753 BT_DBG("conn %p", conn);
754
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200755 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300756 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200757
Johan Hedberg40bef302014-07-16 11:42:27 +0300758 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -0800759 return SMP_CMD_NOTSUPP;
760
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300761 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300762
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300763 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300764
765 key_size = min(req->max_key_size, rsp->max_key_size);
766 if (check_enc_key_size(conn, key_size))
767 return SMP_ENC_KEY_SIZE;
768
Johan Hedberg2ed8f652014-06-17 13:07:39 +0300769 /* If we need MITM check that it can be acheived */
770 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
771 u8 method;
772
773 method = get_auth_method(smp, req->io_capability,
774 rsp->io_capability);
775 if (method == JUST_WORKS || method == JUST_CFM)
776 return SMP_AUTH_REQUIREMENTS;
777 }
778
Johan Hedberge84a6b12013-12-02 10:49:03 +0200779 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300780
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300781 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
782 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300783
Johan Hedbergfdcc4be2014-03-14 10:53:50 +0200784 /* Update remote key distribution in case the remote cleared
785 * some bits that we had enabled in our request.
786 */
787 smp->remote_key_dist &= rsp->resp_key_dist;
788
Brian Gix2b64d152011-12-21 16:12:12 -0800789 if ((req->auth_req & SMP_AUTH_BONDING) &&
Marcel Holtmannf1560462013-10-13 05:43:25 -0700790 (rsp->auth_req & SMP_AUTH_BONDING))
Brian Gix2b64d152011-12-21 16:12:12 -0800791 auth = SMP_AUTH_BONDING;
792
793 auth |= (req->auth_req | rsp->auth_req) & SMP_AUTH_MITM;
794
Johan Hedberg476585e2012-06-06 18:54:15 +0800795 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -0800796 if (ret)
797 return SMP_UNSPECIFIED;
798
Johan Hedberg4a74d652014-05-20 09:45:50 +0300799 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800800
801 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +0300802 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +0300803 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300804
805 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300806}
807
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300808static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300809{
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300810 struct smp_chan *smp = conn->smp_chan;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300811
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300812 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
813
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200814 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300815 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200816
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300817 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
818 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300819
Johan Hedberg943a7322014-03-18 12:58:24 +0200820 if (conn->hcon->out)
821 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
822 smp->prnd);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300823 else if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +0300824 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +0200825 else
Johan Hedberg4a74d652014-05-20 09:45:50 +0300826 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300827
828 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300829}
830
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300831static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300832{
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300833 struct smp_chan *smp = conn->smp_chan;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300834
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300835 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -0300836
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200837 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300838 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200839
Johan Hedberg943a7322014-03-18 12:58:24 +0200840 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300841 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300842
Johan Hedberg861580a2014-05-20 09:45:51 +0300843 return smp_random(smp);
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300844}
845
Marcel Holtmannf81cd822014-07-01 10:59:24 +0200846static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300847{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -0300848 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300849 struct hci_conn *hcon = conn->hcon;
850
Johan Hedberg98a0b842014-01-30 19:40:00 -0800851 key = hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
852 hcon->out);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300853 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +0200854 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300855
Johan Hedberg4dab7862012-06-07 14:58:37 +0800856 if (sec_level > BT_SECURITY_MEDIUM && !key->authenticated)
Marcel Holtmannf81cd822014-07-01 10:59:24 +0200857 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +0800858
Johan Hedberg51a8efd2012-01-16 06:10:31 +0200859 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +0200860 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300861
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -0300862 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
863 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300864
Johan Hedbergfe59a052014-07-01 19:14:12 +0300865 /* We never store STKs for master role, so clear this flag */
866 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
867
Marcel Holtmannf81cd822014-07-01 10:59:24 +0200868 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300869}
Marcel Holtmannf1560462013-10-13 05:43:25 -0700870
Johan Hedberg854f4722014-07-01 18:40:20 +0300871bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level)
872{
873 if (sec_level == BT_SECURITY_LOW)
874 return true;
875
Johan Hedberg9ab65d602014-07-01 19:14:13 +0300876 /* If we're encrypted with an STK always claim insufficient
877 * security. This way we allow the connection to be re-encrypted
878 * with an LTK, even if the LTK provides the same level of
Johan Hedbergb2d5e252014-07-14 14:34:55 +0300879 * security. Only exception is if we don't have an LTK (e.g.
880 * because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +0300881 */
Johan Hedbergb2d5e252014-07-14 14:34:55 +0300882 if (test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
883 hci_find_ltk_by_addr(hcon->hdev, &hcon->dst, hcon->dst_type,
884 hcon->out))
Johan Hedberg9ab65d602014-07-01 19:14:13 +0300885 return false;
886
Johan Hedberg854f4722014-07-01 18:40:20 +0300887 if (hcon->sec_level >= sec_level)
888 return true;
889
890 return false;
891}
892
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300893static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300894{
895 struct smp_cmd_security_req *rp = (void *) skb->data;
896 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300897 struct hci_conn *hcon = conn->hcon;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300898 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +0300899 u8 sec_level;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300900
901 BT_DBG("conn %p", conn);
902
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200903 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +0300904 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +0200905
Johan Hedberg40bef302014-07-16 11:42:27 +0300906 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +0200907 return SMP_CMD_NOTSUPP;
908
Johan Hedbergc7262e72014-06-17 13:07:37 +0300909 sec_level = authreq_to_seclevel(rp->auth_req);
Johan Hedberg854f4722014-07-01 18:40:20 +0300910 if (smp_sufficient_security(hcon, sec_level))
911 return 0;
912
Johan Hedbergc7262e72014-06-17 13:07:37 +0300913 if (sec_level > hcon->pending_sec_level)
914 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -0300915
Johan Hedberg4dab7862012-06-07 14:58:37 +0800916 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -0300917 return 0;
918
Johan Hedberg51a8efd2012-01-16 06:10:31 +0200919 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300920 return 0;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300921
Johan Hedbergb3c64102014-07-10 11:02:07 +0300922 if (!test_bit(HCI_PAIRABLE, &hcon->hdev->dev_flags) &&
923 (rp->auth_req & SMP_AUTH_BONDING))
924 return SMP_PAIRING_NOTSUPP;
925
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300926 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +0300927 if (!smp)
928 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300929
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300930 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300931
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300932 memset(&cp, 0, sizeof(cp));
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300933 build_pairing_cmd(conn, &cp, NULL, rp->auth_req);
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300934
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300935 smp->preq[0] = SMP_CMD_PAIRING_REQ;
936 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300937
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300938 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300939
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -0300940 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -0300941}
942
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300943int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300944{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -0300945 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg0a66cf22014-03-24 14:39:03 +0200946 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -0800947 __u8 authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300948
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -0300949 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
950
Johan Hedberg0a66cf22014-03-24 14:39:03 +0200951 /* This may be NULL if there's an unexpected disconnection */
952 if (!conn)
953 return 1;
954
Johan Hedberg757aee02013-04-24 13:05:32 +0300955 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -0300956 return 1;
957
Johan Hedbergad32a2f2013-05-14 18:05:12 +0300958 if (smp_sufficient_security(hcon, sec_level))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -0300959 return 1;
960
Johan Hedbergc7262e72014-06-17 13:07:37 +0300961 if (sec_level > hcon->pending_sec_level)
962 hcon->pending_sec_level = sec_level;
963
Johan Hedberg40bef302014-07-16 11:42:27 +0300964 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +0300965 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
966 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300967
Johan Hedberg51a8efd2012-01-16 06:10:31 +0200968 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300969 return 0;
970
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300971 smp = smp_chan_create(conn);
Brian Gix2b64d152011-12-21 16:12:12 -0800972 if (!smp)
973 return 1;
974
975 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300976
Johan Hedberg79897d22014-06-01 09:45:24 +0300977 /* Require MITM if IO Capability allows or the security level
978 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +0200979 */
Johan Hedberg79897d22014-06-01 09:45:24 +0300980 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +0300981 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +0200982 authreq |= SMP_AUTH_MITM;
983
Johan Hedberg40bef302014-07-16 11:42:27 +0300984 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -0300985 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300986
Brian Gix2b64d152011-12-21 16:12:12 -0800987 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300988 smp->preq[0] = SMP_CMD_PAIRING_REQ;
989 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -0300990
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300991 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
992 } else {
993 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -0800994 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300995 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
996 }
997
Johan Hedberg4a74d652014-05-20 09:45:50 +0300998 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergedca7922014-03-24 15:54:11 +0200999
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001000 return 0;
1001}
1002
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001003static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1004{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001005 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001006 struct smp_chan *smp = conn->smp_chan;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001007
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001008 BT_DBG("conn %p", conn);
1009
1010 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001011 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001012
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001013 /* Ignore this PDU if it wasn't requested */
1014 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1015 return 0;
1016
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001017 skb_pull(skb, sizeof(*rp));
1018
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001019 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001020
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001021 return 0;
1022}
1023
1024static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1025{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001026 struct smp_cmd_master_ident *rp = (void *) skb->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001027 struct smp_chan *smp = conn->smp_chan;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001028 struct hci_dev *hdev = conn->hcon->hdev;
1029 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001030 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001031 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001032
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001033 BT_DBG("conn %p", conn);
1034
1035 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001036 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001037
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001038 /* Ignore this PDU if it wasn't requested */
1039 if (!(smp->remote_key_dist & SMP_DIST_ENC_KEY))
1040 return 0;
1041
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001042 /* Mark the information as received */
1043 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1044
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001045 skb_pull(skb, sizeof(*rp));
1046
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001047 hci_dev_lock(hdev);
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001048 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001049 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001050 authenticated, smp->tk, smp->enc_key_size,
1051 rp->ediv, rp->rand);
1052 smp->ltk = ltk;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001053 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
Johan Hedberg4bd6d382014-02-26 23:33:45 +02001054 smp_distribute_keys(conn);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001055 hci_dev_unlock(hdev);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001056
1057 return 0;
1058}
1059
Johan Hedbergfd349c02014-02-18 10:19:36 +02001060static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1061{
1062 struct smp_cmd_ident_info *info = (void *) skb->data;
1063 struct smp_chan *smp = conn->smp_chan;
1064
1065 BT_DBG("");
1066
1067 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001068 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001069
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001070 /* Ignore this PDU if it wasn't requested */
1071 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1072 return 0;
1073
Johan Hedbergfd349c02014-02-18 10:19:36 +02001074 skb_pull(skb, sizeof(*info));
1075
1076 memcpy(smp->irk, info->irk, 16);
1077
1078 return 0;
1079}
1080
1081static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1082 struct sk_buff *skb)
1083{
1084 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
1085 struct smp_chan *smp = conn->smp_chan;
1086 struct hci_conn *hcon = conn->hcon;
1087 bdaddr_t rpa;
1088
1089 BT_DBG("");
1090
1091 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001092 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001093
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001094 /* Ignore this PDU if it wasn't requested */
1095 if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
1096 return 0;
1097
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001098 /* Mark the information as received */
1099 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1100
Johan Hedbergfd349c02014-02-18 10:19:36 +02001101 skb_pull(skb, sizeof(*info));
1102
Johan Hedberg31dd6242014-06-27 14:23:02 +03001103 hci_dev_lock(hcon->hdev);
1104
Johan Hedberga9a58f82014-02-25 22:24:37 +02001105 /* Strictly speaking the Core Specification (4.1) allows sending
1106 * an empty address which would force us to rely on just the IRK
1107 * as "identity information". However, since such
1108 * implementations are not known of and in order to not over
1109 * complicate our implementation, simply pretend that we never
1110 * received an IRK for such a device.
1111 */
1112 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1113 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001114 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001115 }
1116
Johan Hedbergfd349c02014-02-18 10:19:36 +02001117 bacpy(&smp->id_addr, &info->bdaddr);
1118 smp->id_addr_type = info->addr_type;
1119
1120 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1121 bacpy(&rpa, &hcon->dst);
1122 else
1123 bacpy(&rpa, BDADDR_ANY);
1124
Johan Hedberg23d0e122014-02-19 14:57:46 +02001125 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1126 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001127
Johan Hedberg31dd6242014-06-27 14:23:02 +03001128distribute:
Johan Hedberg4bd6d382014-02-26 23:33:45 +02001129 smp_distribute_keys(conn);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001130
Johan Hedberg31dd6242014-06-27 14:23:02 +03001131 hci_dev_unlock(hcon->hdev);
1132
Johan Hedbergfd349c02014-02-18 10:19:36 +02001133 return 0;
1134}
1135
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001136static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1137{
1138 struct smp_cmd_sign_info *rp = (void *) skb->data;
1139 struct smp_chan *smp = conn->smp_chan;
1140 struct hci_dev *hdev = conn->hcon->hdev;
1141 struct smp_csrk *csrk;
1142
1143 BT_DBG("conn %p", conn);
1144
1145 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001146 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001147
1148 /* Ignore this PDU if it wasn't requested */
1149 if (!(smp->remote_key_dist & SMP_DIST_SIGN))
1150 return 0;
1151
1152 /* Mark the information as received */
1153 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1154
1155 skb_pull(skb, sizeof(*rp));
1156
1157 hci_dev_lock(hdev);
1158 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1159 if (csrk) {
1160 csrk->master = 0x01;
1161 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1162 }
1163 smp->csrk = csrk;
1164 if (!(smp->remote_key_dist & SMP_DIST_SIGN))
1165 smp_distribute_keys(conn);
1166 hci_dev_unlock(hdev);
1167
1168 return 0;
1169}
1170
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001171int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
1172{
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001173 struct hci_conn *hcon = conn->hcon;
Marcel Holtmann92381f52013-10-03 01:23:08 -07001174 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001175 int err = 0;
1176
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001177 if (hcon->type != LE_LINK) {
1178 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03001179 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07001180 }
1181
Marcel Holtmann92381f52013-10-03 01:23:08 -07001182 if (skb->len < 1) {
1183 kfree_skb(skb);
1184 return -EILSEQ;
1185 }
1186
Marcel Holtmann06ae3312013-10-18 03:43:00 -07001187 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001188 err = -ENOTSUPP;
1189 reason = SMP_PAIRING_NOTSUPP;
1190 goto done;
1191 }
1192
Marcel Holtmann92381f52013-10-03 01:23:08 -07001193 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001194 skb_pull(skb, sizeof(code));
1195
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06001196 /*
1197 * The SMP context must be initialized for all other PDUs except
1198 * pairing and security requests. If we get any other PDU when
1199 * not initialized simply disconnect (done if this function
1200 * returns an error).
1201 */
1202 if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ &&
1203 !conn->smp_chan) {
1204 BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code);
1205 kfree_skb(skb);
1206 return -ENOTSUPP;
1207 }
1208
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001209 switch (code) {
1210 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001211 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001212 break;
1213
1214 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02001215 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001216 reason = 0;
1217 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001218 break;
1219
1220 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001221 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001222 break;
1223
1224 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001225 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001226 break;
1227
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001228 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001229 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001230 break;
1231
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001232 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001233 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001234 break;
1235
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001236 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001237 reason = smp_cmd_encrypt_info(conn, skb);
1238 break;
1239
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001240 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001241 reason = smp_cmd_master_ident(conn, skb);
1242 break;
1243
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001244 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001245 reason = smp_cmd_ident_info(conn, skb);
1246 break;
1247
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001248 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02001249 reason = smp_cmd_ident_addr_info(conn, skb);
1250 break;
1251
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001252 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001253 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001254 break;
1255
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001256 default:
1257 BT_DBG("Unknown command code 0x%2.2x", code);
1258
1259 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001260 err = -EOPNOTSUPP;
1261 goto done;
1262 }
1263
1264done:
1265 if (reason)
Johan Hedberg84794e12013-11-06 11:24:57 +02001266 smp_failure(conn, reason);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001267
1268 kfree_skb(skb);
1269 return err;
1270}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001271
Johan Hedberg35d70272014-02-19 14:57:47 +02001272static void smp_notify_keys(struct l2cap_conn *conn)
1273{
1274 struct smp_chan *smp = conn->smp_chan;
1275 struct hci_conn *hcon = conn->hcon;
1276 struct hci_dev *hdev = hcon->hdev;
Marcel Holtmann53ac6ab2014-03-09 23:38:42 -07001277 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1278 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1279 bool persistent;
Johan Hedberg35d70272014-02-19 14:57:47 +02001280
Johan Hedberg61b1a7f2014-03-20 12:54:16 +02001281 if (smp->remote_irk) {
Johan Hedberg95fbac82014-02-19 15:18:31 +02001282 mgmt_new_irk(hdev, smp->remote_irk);
Johan Hedberg61b1a7f2014-03-20 12:54:16 +02001283 /* Now that user space can be considered to know the
1284 * identity address track the connection based on it
1285 * from now on.
1286 */
1287 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1288 hcon->dst_type = smp->remote_irk->addr_type;
1289 l2cap_conn_update_id_addr(hcon);
1290 }
Johan Hedberg95fbac82014-02-19 15:18:31 +02001291
Marcel Holtmann53ac6ab2014-03-09 23:38:42 -07001292 /* The LTKs and CSRKs should be persistent only if both sides
1293 * had the bonding bit set in their authentication requests.
1294 */
1295 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
1296
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001297 if (smp->csrk) {
1298 smp->csrk->bdaddr_type = hcon->dst_type;
1299 bacpy(&smp->csrk->bdaddr, &hcon->dst);
Marcel Holtmann53ac6ab2014-03-09 23:38:42 -07001300 mgmt_new_csrk(hdev, smp->csrk, persistent);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001301 }
1302
1303 if (smp->slave_csrk) {
1304 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1305 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
Marcel Holtmann53ac6ab2014-03-09 23:38:42 -07001306 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001307 }
1308
Johan Hedberg35d70272014-02-19 14:57:47 +02001309 if (smp->ltk) {
1310 smp->ltk->bdaddr_type = hcon->dst_type;
1311 bacpy(&smp->ltk->bdaddr, &hcon->dst);
Marcel Holtmann53ac6ab2014-03-09 23:38:42 -07001312 mgmt_new_ltk(hdev, smp->ltk, persistent);
Johan Hedberg35d70272014-02-19 14:57:47 +02001313 }
1314
1315 if (smp->slave_ltk) {
1316 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1317 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
Marcel Holtmann53ac6ab2014-03-09 23:38:42 -07001318 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
Johan Hedberg35d70272014-02-19 14:57:47 +02001319 }
1320}
1321
Johan Hedberg4bd6d382014-02-26 23:33:45 +02001322int smp_distribute_keys(struct l2cap_conn *conn)
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001323{
1324 struct smp_cmd_pairing *req, *rsp;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001325 struct smp_chan *smp = conn->smp_chan;
Johan Hedberg524237c2014-02-22 19:06:31 +02001326 struct hci_conn *hcon = conn->hcon;
1327 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001328 __u8 *keydist;
1329
Johan Hedberg4bd6d382014-02-26 23:33:45 +02001330 BT_DBG("conn %p", conn);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001331
Johan Hedberg524237c2014-02-22 19:06:31 +02001332 if (!test_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags))
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001333 return 0;
1334
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001335 rsp = (void *) &smp->prsp[1];
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001336
1337 /* The responder sends its keys first */
Johan Hedbergefabba32014-02-26 23:33:44 +02001338 if (hcon->out && (smp->remote_key_dist & 0x07))
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001339 return 0;
1340
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001341 req = (void *) &smp->preq[1];
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001342
Johan Hedberg524237c2014-02-22 19:06:31 +02001343 if (hcon->out) {
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001344 keydist = &rsp->init_key_dist;
1345 *keydist &= req->init_key_dist;
1346 } else {
1347 keydist = &rsp->resp_key_dist;
1348 *keydist &= req->resp_key_dist;
1349 }
1350
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001351 BT_DBG("keydist 0x%x", *keydist);
1352
1353 if (*keydist & SMP_DIST_ENC_KEY) {
1354 struct smp_cmd_encrypt_info enc;
1355 struct smp_cmd_master_ident ident;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001356 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001357 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001358 __le16 ediv;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001359 __le64 rand;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001360
1361 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1362 get_random_bytes(&ediv, sizeof(ediv));
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001363 get_random_bytes(&rand, sizeof(rand));
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001364
1365 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1366
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001367 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
Johan Hedberg524237c2014-02-22 19:06:31 +02001368 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001369 SMP_LTK_SLAVE, authenticated, enc.ltk,
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001370 smp->enc_key_size, ediv, rand);
Johan Hedberg23d0e122014-02-19 14:57:46 +02001371 smp->slave_ltk = ltk;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001372
Andrei Emeltchenko58115372012-03-12 12:13:06 +02001373 ident.ediv = ediv;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001374 ident.rand = rand;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001375
1376 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1377
1378 *keydist &= ~SMP_DIST_ENC_KEY;
1379 }
1380
1381 if (*keydist & SMP_DIST_ID_KEY) {
1382 struct smp_cmd_ident_addr_info addrinfo;
1383 struct smp_cmd_ident_info idinfo;
1384
Johan Hedberg863efaf2014-02-22 19:06:32 +02001385 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001386
1387 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1388
Johan Hedberg82d4b352014-02-23 19:42:18 +02001389 /* The hci_conn contains the local identity address
1390 * after the connection has been established.
1391 *
1392 * This is true even when the connection has been
1393 * established using a resolvable random address.
1394 */
Johan Hedberg524237c2014-02-22 19:06:31 +02001395 bacpy(&addrinfo.bdaddr, &hcon->src);
Johan Hedberg82d4b352014-02-23 19:42:18 +02001396 addrinfo.addr_type = hcon->src_type;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001397
1398 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
Marcel Holtmannf1560462013-10-13 05:43:25 -07001399 &addrinfo);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001400
1401 *keydist &= ~SMP_DIST_ID_KEY;
1402 }
1403
1404 if (*keydist & SMP_DIST_SIGN) {
1405 struct smp_cmd_sign_info sign;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001406 struct smp_csrk *csrk;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001407
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001408 /* Generate a new random key */
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001409 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1410
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001411 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1412 if (csrk) {
1413 csrk->master = 0x00;
1414 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1415 }
1416 smp->slave_csrk = csrk;
1417
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001418 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1419
1420 *keydist &= ~SMP_DIST_SIGN;
1421 }
1422
Johan Hedbergefabba32014-02-26 23:33:44 +02001423 /* If there are still keys to be received wait for them */
1424 if ((smp->remote_key_dist & 0x07))
1425 return 0;
1426
Johan Hedberg1d98bf42014-03-24 14:39:08 +02001427 clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->flags);
1428 cancel_delayed_work_sync(&conn->security_timer);
Johan Hedberg4a74d652014-05-20 09:45:50 +03001429 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg1d98bf42014-03-24 14:39:08 +02001430 smp_notify_keys(conn);
Johan Hedbergefabba32014-02-26 23:33:44 +02001431
Johan Hedberg1d98bf42014-03-24 14:39:08 +02001432 smp_chan_destroy(conn);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001433
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001434 return 0;
1435}