blob: 2c6edf1b6669f160626fef2d071a7ad71607425a [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 Hedbergcbbbe3e2014-06-06 11:30:08 +030046/* Maximum message length that can be passed to aes_cmac */
47#define CMAC_MSG_MAX 80
48
Johan Hedberg533e35d2014-06-16 19:25:18 +030049enum {
50 SMP_FLAG_TK_VALID,
51 SMP_FLAG_CFM_PENDING,
52 SMP_FLAG_MITM_AUTH,
53 SMP_FLAG_COMPLETE,
54 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030055 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030056 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030057 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030058 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030059 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg533e35d2014-06-16 19:25:18 +030060};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030061
62struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030063 struct l2cap_conn *conn;
64 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030065 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030066
Johan Hedberg4bc58f52014-05-20 09:45:47 +030067 u8 preq[7]; /* SMP Pairing Request */
68 u8 prsp[7]; /* SMP Pairing Response */
69 u8 prnd[16]; /* SMP Pairing Random (local) */
70 u8 rrnd[16]; /* SMP Pairing Random (remote) */
71 u8 pcnf[16]; /* SMP Pairing Confirm */
72 u8 tk[16]; /* SMP Temporary Key */
73 u8 enc_key_size;
74 u8 remote_key_dist;
75 bdaddr_t id_addr;
76 u8 id_addr_type;
77 u8 irk[16];
78 struct smp_csrk *csrk;
79 struct smp_csrk *slave_csrk;
80 struct smp_ltk *ltk;
81 struct smp_ltk *slave_ltk;
82 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +030083 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +030084 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +030085 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +030086 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030087
Johan Hedberg3b191462014-06-06 10:50:15 +030088 /* Secure Connections variables */
89 u8 local_pk[64];
90 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030091 u8 remote_pk[64];
92 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +030093 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +030094
Johan Hedberg6a7bd102014-06-27 14:23:03 +030095 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +030096 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030097};
98
Johan Hedbergaeb7d462014-05-31 18:52:28 +030099/* These debug key values are defined in the SMP section of the core
100 * specification. debug_pk is the public debug key and debug_sk the
101 * private debug key.
102 */
103static const u8 debug_pk[64] = {
104 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
105 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
106 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
107 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
108
109 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
110 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
111 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
112 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
113};
114
115static const u8 debug_sk[32] = {
116 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
117 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
118 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
119 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
120};
121
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300122static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300123{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300124 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300125
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300126 for (i = 0; i < len; i++)
127 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300128}
129
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300130static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
131 size_t len, u8 mac[16])
132{
133 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
134 struct hash_desc desc;
135 struct scatterlist sg;
136 int err;
137
138 if (len > CMAC_MSG_MAX)
139 return -EFBIG;
140
141 if (!tfm) {
142 BT_ERR("tfm %p", tfm);
143 return -EINVAL;
144 }
145
146 desc.tfm = tfm;
147 desc.flags = 0;
148
149 crypto_hash_init(&desc);
150
151 /* Swap key and message from LSB to MSB */
152 swap_buf(k, tmp, 16);
153 swap_buf(m, msg_msb, len);
154
155 BT_DBG("msg (len %zu) %*phN", len, (int) len, m);
156 BT_DBG("key %16phN", k);
157
158 err = crypto_hash_setkey(tfm, tmp, 16);
159 if (err) {
160 BT_ERR("cipher setkey failed: %d", err);
161 return err;
162 }
163
164 sg_init_one(&sg, msg_msb, len);
165
166 err = crypto_hash_update(&desc, &sg, len);
167 if (err) {
168 BT_ERR("Hash update error %d", err);
169 return err;
170 }
171
172 err = crypto_hash_final(&desc, mac_msb);
173 if (err) {
174 BT_ERR("Hash final error %d", err);
175 return err;
176 }
177
178 swap_buf(mac_msb, mac, 16);
179
180 BT_DBG("mac %16phN", mac);
181
182 return 0;
183}
184
185static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
186 const u8 x[16], u8 z, u8 res[16])
187{
188 u8 m[65];
189 int err;
190
191 BT_DBG("u %32phN", u);
192 BT_DBG("v %32phN", v);
193 BT_DBG("x %16phN z %02x", x, z);
194
195 m[0] = z;
196 memcpy(m + 1, v, 32);
197 memcpy(m + 33, u, 32);
198
199 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
200 if (err)
201 return err;
202
203 BT_DBG("res %16phN", res);
204
205 return err;
206}
207
Johan Hedberg760b0182014-06-06 11:44:05 +0300208static int smp_f5(struct crypto_hash *tfm_cmac, u8 w[32], u8 n1[16], u8 n2[16],
209 u8 a1[7], u8 a2[7], u8 mackey[16], u8 ltk[16])
210{
211 /* The btle, salt and length "magic" values are as defined in
212 * the SMP section of the Bluetooth core specification. In ASCII
213 * the btle value ends up being 'btle'. The salt is just a
214 * random number whereas length is the value 256 in little
215 * endian format.
216 */
217 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
218 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
219 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
220 const u8 length[2] = { 0x00, 0x01 };
221 u8 m[53], t[16];
222 int err;
223
224 BT_DBG("w %32phN", w);
225 BT_DBG("n1 %16phN n2 %16phN", n1, n2);
226 BT_DBG("a1 %7phN a2 %7phN", a1, a2);
227
228 err = aes_cmac(tfm_cmac, salt, w, 32, t);
229 if (err)
230 return err;
231
232 BT_DBG("t %16phN", t);
233
234 memcpy(m, length, 2);
235 memcpy(m + 2, a2, 7);
236 memcpy(m + 9, a1, 7);
237 memcpy(m + 16, n2, 16);
238 memcpy(m + 32, n1, 16);
239 memcpy(m + 48, btle, 4);
240
241 m[52] = 0; /* Counter */
242
243 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
244 if (err)
245 return err;
246
247 BT_DBG("mackey %16phN", mackey);
248
249 m[52] = 1; /* Counter */
250
251 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
252 if (err)
253 return err;
254
255 BT_DBG("ltk %16phN", ltk);
256
257 return 0;
258}
259
260static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
261 const u8 n1[16], u8 n2[16], const u8 r[16],
262 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
263 u8 res[16])
264{
265 u8 m[65];
266 int err;
267
268 BT_DBG("w %16phN", w);
269 BT_DBG("n1 %16phN n2 %16phN", n1, n2);
270 BT_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
271
272 memcpy(m, a2, 7);
273 memcpy(m + 7, a1, 7);
274 memcpy(m + 14, io_cap, 3);
275 memcpy(m + 17, r, 16);
276 memcpy(m + 33, n2, 16);
277 memcpy(m + 49, n1, 16);
278
279 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
280 if (err)
281 return err;
282
283 BT_DBG("res %16phN", res);
284
285 return err;
286}
287
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300288static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
289 const u8 x[16], const u8 y[16], u32 *val)
290{
291 u8 m[80], tmp[16];
292 int err;
293
294 BT_DBG("u %32phN", u);
295 BT_DBG("v %32phN", v);
296 BT_DBG("x %16phN y %16phN", x, y);
297
298 memcpy(m, y, 16);
299 memcpy(m + 16, v, 32);
300 memcpy(m + 48, u, 32);
301
302 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
303 if (err)
304 return err;
305
306 *val = get_unaligned_le32(tmp);
307 *val %= 1000000;
308
309 BT_DBG("val %06u", *val);
310
311 return 0;
312}
313
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300314static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
315{
316 struct blkcipher_desc desc;
317 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200318 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200319 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300320
321 if (tfm == NULL) {
322 BT_ERR("tfm %p", tfm);
323 return -EINVAL;
324 }
325
326 desc.tfm = tfm;
327 desc.flags = 0;
328
Johan Hedberg943a7322014-03-18 12:58:24 +0200329 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300330 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200331
332 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300333 if (err) {
334 BT_ERR("cipher setkey failed: %d", err);
335 return err;
336 }
337
Johan Hedberg943a7322014-03-18 12:58:24 +0200338 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300339 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200340
341 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300342
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300343 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
344 if (err)
345 BT_ERR("Encrypt data error %d", err);
346
Johan Hedberg943a7322014-03-18 12:58:24 +0200347 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300348 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200349
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300350 return err;
351}
352
Johan Hedberg6a770832014-06-06 11:54:04 +0300353static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
354 const u8 key_id[4], u8 res[16])
355{
356 int err;
357
358 BT_DBG("w %16phN key_id %4phN", w, key_id);
359
360 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
361 if (err)
362 return err;
363
364 BT_DBG("res %16phN", res);
365
366 return err;
367}
368
Johan Hedberg60478052014-02-18 10:19:31 +0200369static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
370{
Johan Hedberg943a7322014-03-18 12:58:24 +0200371 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200372 int err;
373
374 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200375 memcpy(_res, r, 3);
376 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200377
Johan Hedberg943a7322014-03-18 12:58:24 +0200378 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200379 if (err) {
380 BT_ERR("Encrypt error");
381 return err;
382 }
383
384 /* The output of the random address function ah is:
385 * ah(h, r) = e(k, r') mod 2^24
386 * The output of the security function e is then truncated to 24 bits
387 * by taking the least significant 24 bits of the output of e as the
388 * result of ah.
389 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200390 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200391
392 return 0;
393}
394
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300395bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200396{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300397 struct l2cap_chan *chan = hdev->smp_data;
398 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200399 u8 hash[3];
400 int err;
401
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300402 if (!chan || !chan->data)
403 return false;
404
405 tfm = chan->data;
406
Johan Hedberg60478052014-02-18 10:19:31 +0200407 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
408
409 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
410 if (err)
411 return false;
412
413 return !memcmp(bdaddr->b, hash, 3);
414}
415
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300416int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200417{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300418 struct l2cap_chan *chan = hdev->smp_data;
419 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200420 int err;
421
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300422 if (!chan || !chan->data)
423 return -EOPNOTSUPP;
424
425 tfm = chan->data;
426
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200427 get_random_bytes(&rpa->b[3], 3);
428
429 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
430 rpa->b[5] |= 0x40; /* Set second most significant bit */
431
432 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
433 if (err < 0)
434 return err;
435
436 BT_DBG("RPA %pMR", rpa);
437
438 return 0;
439}
440
Johan Hedberge491eaf2014-10-25 21:15:37 +0200441static int smp_c1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r[16],
442 u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat,
443 bdaddr_t *ra, u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300444{
445 u8 p1[16], p2[16];
446 int err;
447
448 memset(p1, 0, 16);
449
450 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200451 p1[0] = _iat;
452 p1[1] = _rat;
453 memcpy(p1 + 2, preq, 7);
454 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300455
456 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200457 memcpy(p2, ra, 6);
458 memcpy(p2 + 6, ia, 6);
459 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300460
461 /* res = r XOR p1 */
462 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
463
464 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200465 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300466 if (err) {
467 BT_ERR("Encrypt data error");
468 return err;
469 }
470
471 /* res = res XOR p2 */
472 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
473
474 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200475 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300476 if (err)
477 BT_ERR("Encrypt data error");
478
479 return err;
480}
481
Johan Hedberge491eaf2014-10-25 21:15:37 +0200482static int smp_s1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r1[16],
483 u8 r2[16], u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300484{
485 int err;
486
487 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200488 memcpy(_r, r2, 8);
489 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300490
Johan Hedberge491eaf2014-10-25 21:15:37 +0200491 err = smp_e(tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300492 if (err)
493 BT_ERR("Encrypt data error");
494
495 return err;
496}
497
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300498static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
499{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300500 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300501 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300502 struct kvec iv[2];
503 struct msghdr msg;
504
505 if (!chan)
506 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300507
508 BT_DBG("code 0x%2.2x", code);
509
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300510 iv[0].iov_base = &code;
511 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300512
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300513 iv[1].iov_base = data;
514 iv[1].iov_len = len;
515
516 memset(&msg, 0, sizeof(msg));
517
518 msg.msg_iov = (struct iovec *) &iv;
519 msg.msg_iovlen = 2;
520
521 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300522
Johan Hedbergb68fda62014-08-11 22:06:40 +0300523 if (!chan->data)
524 return;
525
526 smp = chan->data;
527
528 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300529 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300530}
531
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300532static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800533{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300534 if (authreq & SMP_AUTH_MITM) {
535 if (authreq & SMP_AUTH_SC)
536 return BT_SECURITY_FIPS;
537 else
538 return BT_SECURITY_HIGH;
539 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800540 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300541 }
Brian Gix2b64d152011-12-21 16:12:12 -0800542}
543
544static __u8 seclevel_to_authreq(__u8 sec_level)
545{
546 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300547 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800548 case BT_SECURITY_HIGH:
549 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
550 case BT_SECURITY_MEDIUM:
551 return SMP_AUTH_BONDING;
552 default:
553 return SMP_AUTH_NONE;
554 }
555}
556
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300557static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700558 struct smp_cmd_pairing *req,
559 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300560{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300561 struct l2cap_chan *chan = conn->smp;
562 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200563 struct hci_conn *hcon = conn->hcon;
564 struct hci_dev *hdev = hcon->hdev;
565 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300566
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300567 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700568 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
569 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300570 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800571 } else {
572 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300573 }
574
Johan Hedbergfd349c02014-02-18 10:19:36 +0200575 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
576 remote_dist |= SMP_DIST_ID_KEY;
577
Johan Hedberg863efaf2014-02-22 19:06:32 +0200578 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
579 local_dist |= SMP_DIST_ID_KEY;
580
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300581 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
582 if ((authreq & SMP_AUTH_SC) &&
583 test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
584 local_dist |= SMP_DIST_LINK_KEY;
585 remote_dist |= SMP_DIST_LINK_KEY;
586 }
587 } else {
588 authreq &= ~SMP_AUTH_SC;
589 }
590
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300591 if (rsp == NULL) {
592 req->io_capability = conn->hcon->io_capability;
593 req->oob_flag = SMP_OOB_NOT_PRESENT;
594 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200595 req->init_key_dist = local_dist;
596 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300597 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200598
599 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300600 return;
601 }
602
603 rsp->io_capability = conn->hcon->io_capability;
604 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
605 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200606 rsp->init_key_dist = req->init_key_dist & remote_dist;
607 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300608 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200609
610 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300611}
612
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300613static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
614{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300615 struct l2cap_chan *chan = conn->smp;
616 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300617
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300618 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700619 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300620 return SMP_ENC_KEY_SIZE;
621
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300622 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300623
624 return 0;
625}
626
Johan Hedberg6f48e262014-08-11 22:06:44 +0300627static void smp_chan_destroy(struct l2cap_conn *conn)
628{
629 struct l2cap_chan *chan = conn->smp;
630 struct smp_chan *smp = chan->data;
631 bool complete;
632
633 BUG_ON(!smp);
634
635 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300636
Johan Hedberg6f48e262014-08-11 22:06:44 +0300637 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
638 mgmt_smp_complete(conn->hcon, complete);
639
640 kfree(smp->csrk);
641 kfree(smp->slave_csrk);
Johan Hedberg6a770832014-06-06 11:54:04 +0300642 kfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300643
644 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300645 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300646
647 /* If pairing failed clean up any keys we might have */
648 if (!complete) {
649 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200650 list_del_rcu(&smp->ltk->list);
651 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300652 }
653
654 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200655 list_del_rcu(&smp->slave_ltk->list);
656 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300657 }
658
659 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200660 list_del_rcu(&smp->remote_irk->list);
661 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300662 }
663 }
664
665 chan->data = NULL;
666 kfree(smp);
667 hci_conn_drop(conn->hcon);
668}
669
Johan Hedberg84794e12013-11-06 11:24:57 +0200670static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800671{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200672 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300673 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200674
Johan Hedberg84794e12013-11-06 11:24:57 +0200675 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800676 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700677 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800678
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700679 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700680 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300681
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300682 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300683 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800684}
685
Brian Gix2b64d152011-12-21 16:12:12 -0800686#define JUST_WORKS 0x00
687#define JUST_CFM 0x01
688#define REQ_PASSKEY 0x02
689#define CFM_PASSKEY 0x03
690#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300691#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800692#define OVERLAP 0xFF
693
694static const u8 gen_method[5][5] = {
695 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
696 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
697 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
698 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
699 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
700};
701
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300702static const u8 sc_method[5][5] = {
703 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
704 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
705 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
706 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
707 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
708};
709
Johan Hedberg581370c2014-06-17 13:07:38 +0300710static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
711{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300712 /* If either side has unknown io_caps, use JUST_CFM (which gets
713 * converted later to JUST_WORKS if we're initiators.
714 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300715 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
716 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300717 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300718
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300719 if (test_bit(SMP_FLAG_SC, &smp->flags))
720 return sc_method[remote_io][local_io];
721
Johan Hedberg581370c2014-06-17 13:07:38 +0300722 return gen_method[remote_io][local_io];
723}
724
Brian Gix2b64d152011-12-21 16:12:12 -0800725static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
726 u8 local_io, u8 remote_io)
727{
728 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300729 struct l2cap_chan *chan = conn->smp;
730 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800731 u32 passkey = 0;
732 int ret = 0;
733
734 /* Initialize key for JUST WORKS */
735 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300736 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800737
738 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
739
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300740 /* If neither side wants MITM, either "just" confirm an incoming
741 * request or use just-works for outgoing ones. The JUST_CFM
742 * will be converted to JUST_WORKS if necessary later in this
743 * function. If either side has MITM look up the method from the
744 * table.
745 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300746 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300747 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800748 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300749 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800750
Johan Hedberga82505c2014-03-24 14:39:07 +0200751 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300752 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
753 &smp->flags))
754 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200755
Johan Hedberg02f3e252014-07-16 15:09:13 +0300756 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300757 if (smp->method == JUST_CFM &&
758 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
759 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300760
Brian Gix2b64d152011-12-21 16:12:12 -0800761 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300762 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300763 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800764 return 0;
765 }
766
767 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300768 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300769 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300770 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
771 hcon->pending_sec_level = BT_SECURITY_HIGH;
772 }
Brian Gix2b64d152011-12-21 16:12:12 -0800773
774 /* If both devices have Keyoard-Display I/O, the master
775 * Confirms and the slave Enters the passkey.
776 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300777 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300778 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300779 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800780 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300781 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800782 }
783
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200784 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300785 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200786 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800787 get_random_bytes(&passkey, sizeof(passkey));
788 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200789 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800790 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300791 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800792 }
793
Johan Hedberg783e0572014-05-31 18:48:26 +0300794 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700795 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200796 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300797 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200798 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
799 hcon->type, hcon->dst_type,
800 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800801 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200802 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200803 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200804 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800805
Brian Gix2b64d152011-12-21 16:12:12 -0800806 return ret;
807}
808
Johan Hedberg1cc61142014-05-20 09:45:52 +0300809static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300810{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300811 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300812 struct smp_cmd_pairing_confirm cp;
813 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300814
815 BT_DBG("conn %p", conn);
816
Johan Hedberge491eaf2014-10-25 21:15:37 +0200817 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200818 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200819 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
820 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300821 if (ret)
822 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300823
Johan Hedberg4a74d652014-05-20 09:45:50 +0300824 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800825
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300826 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
827
Johan Hedbergb28b4942014-09-05 22:19:55 +0300828 if (conn->hcon->out)
829 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
830 else
831 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
832
Johan Hedberg1cc61142014-05-20 09:45:52 +0300833 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300834}
835
Johan Hedberg861580a2014-05-20 09:45:51 +0300836static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300837{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300838 struct l2cap_conn *conn = smp->conn;
839 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300840 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300841 int ret;
842
Johan Hedbergec70f362014-06-27 14:23:04 +0300843 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300844 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300845
846 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
847
Johan Hedberge491eaf2014-10-25 21:15:37 +0200848 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200849 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200850 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300851 if (ret)
852 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300853
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300854 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
855 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300856 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300857 }
858
859 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800860 u8 stk[16];
861 __le64 rand = 0;
862 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300863
Johan Hedberge491eaf2014-10-25 21:15:37 +0200864 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300865
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300866 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300867 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300868
Johan Hedberg861580a2014-05-20 09:45:51 +0300869 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
870 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300871
872 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300873 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300874 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300875 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300876 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800877 __le64 rand = 0;
878 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300879
Johan Hedberg943a7322014-03-18 12:58:24 +0200880 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
881 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300882
Johan Hedberge491eaf2014-10-25 21:15:37 +0200883 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300884
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300885 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700886 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300887
Johan Hedbergfff34902014-06-10 15:19:50 +0300888 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
889 auth = 1;
890 else
891 auth = 0;
892
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300893 /* Even though there's no _SLAVE suffix this is the
894 * slave STK we're adding for later lookup (the master
895 * STK never needs to be stored).
896 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700897 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300898 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300899 }
900
Johan Hedberg861580a2014-05-20 09:45:51 +0300901 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300902}
903
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300904static void smp_notify_keys(struct l2cap_conn *conn)
905{
906 struct l2cap_chan *chan = conn->smp;
907 struct smp_chan *smp = chan->data;
908 struct hci_conn *hcon = conn->hcon;
909 struct hci_dev *hdev = hcon->hdev;
910 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
911 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
912 bool persistent;
913
914 if (smp->remote_irk) {
915 mgmt_new_irk(hdev, smp->remote_irk);
916 /* Now that user space can be considered to know the
917 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300918 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300919 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300920 if (hcon->type == LE_LINK) {
921 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
922 hcon->dst_type = smp->remote_irk->addr_type;
923 queue_work(hdev->workqueue, &conn->id_addr_update_work);
924 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300925
926 /* When receiving an indentity resolving key for
927 * a remote device that does not use a resolvable
928 * private address, just remove the key so that
929 * it is possible to use the controller white
930 * list for scanning.
931 *
932 * Userspace will have been told to not store
933 * this key at this point. So it is safe to
934 * just remove it.
935 */
936 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200937 list_del_rcu(&smp->remote_irk->list);
938 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300939 smp->remote_irk = NULL;
940 }
941 }
942
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300943 if (hcon->type == ACL_LINK) {
944 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
945 persistent = false;
946 else
947 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
948 &hcon->flags);
949 } else {
950 /* The LTKs and CSRKs should be persistent only if both sides
951 * had the bonding bit set in their authentication requests.
952 */
953 persistent = !!((req->auth_req & rsp->auth_req) &
954 SMP_AUTH_BONDING);
955 }
956
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300957
958 if (smp->csrk) {
959 smp->csrk->bdaddr_type = hcon->dst_type;
960 bacpy(&smp->csrk->bdaddr, &hcon->dst);
961 mgmt_new_csrk(hdev, smp->csrk, persistent);
962 }
963
964 if (smp->slave_csrk) {
965 smp->slave_csrk->bdaddr_type = hcon->dst_type;
966 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
967 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
968 }
969
970 if (smp->ltk) {
971 smp->ltk->bdaddr_type = hcon->dst_type;
972 bacpy(&smp->ltk->bdaddr, &hcon->dst);
973 mgmt_new_ltk(hdev, smp->ltk, persistent);
974 }
975
976 if (smp->slave_ltk) {
977 smp->slave_ltk->bdaddr_type = hcon->dst_type;
978 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
979 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
980 }
Johan Hedberg6a770832014-06-06 11:54:04 +0300981
982 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +0300983 struct link_key *key;
984 u8 type;
985
986 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
987 type = HCI_LK_DEBUG_COMBINATION;
988 else if (hcon->sec_level == BT_SECURITY_FIPS)
989 type = HCI_LK_AUTH_COMBINATION_P256;
990 else
991 type = HCI_LK_UNAUTH_COMBINATION_P256;
992
993 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
994 smp->link_key, type, 0, &persistent);
995 if (key) {
996 mgmt_new_link_key(hdev, key, persistent);
997
998 /* Don't keep debug keys around if the relevant
999 * flag is not set.
1000 */
1001 if (!test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags) &&
1002 key->type == HCI_LK_DEBUG_COMBINATION) {
1003 list_del_rcu(&key->list);
1004 kfree_rcu(key, rcu);
1005 }
1006 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001007 }
1008}
1009
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001010static void sc_add_ltk(struct smp_chan *smp)
1011{
1012 struct hci_conn *hcon = smp->conn->hcon;
1013 u8 key_type, auth;
1014
1015 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1016 key_type = SMP_LTK_P256_DEBUG;
1017 else
1018 key_type = SMP_LTK_P256;
1019
1020 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1021 auth = 1;
1022 else
1023 auth = 0;
1024
1025 memset(smp->tk + smp->enc_key_size, 0,
1026 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
1027
1028 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1029 key_type, auth, smp->tk, smp->enc_key_size,
1030 0, 0);
1031}
1032
Johan Hedberg6a770832014-06-06 11:54:04 +03001033static void sc_generate_link_key(struct smp_chan *smp)
1034{
1035 /* These constants are as specified in the core specification.
1036 * In ASCII they spell out to 'tmp1' and 'lebr'.
1037 */
1038 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1039 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1040
1041 smp->link_key = kzalloc(16, GFP_KERNEL);
1042 if (!smp->link_key)
1043 return;
1044
1045 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
1046 kfree(smp->link_key);
1047 smp->link_key = NULL;
1048 return;
1049 }
1050
1051 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
1052 kfree(smp->link_key);
1053 smp->link_key = NULL;
1054 return;
1055 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001056}
1057
Johan Hedbergb28b4942014-09-05 22:19:55 +03001058static void smp_allow_key_dist(struct smp_chan *smp)
1059{
1060 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1061 * will be allowed in each PDU handler to ensure we receive
1062 * them in the correct order.
1063 */
1064 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1065 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1066 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1067 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1068 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1069 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1070}
1071
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001072static void sc_generate_ltk(struct smp_chan *smp)
1073{
1074 /* These constants are as specified in the core specification.
1075 * In ASCII they spell out to 'tmp2' and 'brle'.
1076 */
1077 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1078 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1079 struct hci_conn *hcon = smp->conn->hcon;
1080 struct hci_dev *hdev = hcon->hdev;
1081 struct link_key *key;
1082
1083 key = hci_find_link_key(hdev, &hcon->dst);
1084 if (!key) {
1085 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1086 return;
1087 }
1088
1089 if (key->type == HCI_LK_DEBUG_COMBINATION)
1090 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1091
1092 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1093 return;
1094
1095 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1096 return;
1097
1098 sc_add_ltk(smp);
1099}
1100
Johan Hedbergd6268e82014-09-05 22:19:51 +03001101static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001102{
1103 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001104 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001105 struct hci_conn *hcon = conn->hcon;
1106 struct hci_dev *hdev = hcon->hdev;
1107 __u8 *keydist;
1108
1109 BT_DBG("conn %p", conn);
1110
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001111 rsp = (void *) &smp->prsp[1];
1112
1113 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001114 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1115 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001116 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001117 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001118
1119 req = (void *) &smp->preq[1];
1120
1121 if (hcon->out) {
1122 keydist = &rsp->init_key_dist;
1123 *keydist &= req->init_key_dist;
1124 } else {
1125 keydist = &rsp->resp_key_dist;
1126 *keydist &= req->resp_key_dist;
1127 }
1128
Johan Hedberg6a770832014-06-06 11:54:04 +03001129 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001130 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001131 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001132 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1133 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001134
1135 /* Clear the keys which are generated but not distributed */
1136 *keydist &= ~SMP_SC_NO_DIST;
1137 }
1138
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001139 BT_DBG("keydist 0x%x", *keydist);
1140
1141 if (*keydist & SMP_DIST_ENC_KEY) {
1142 struct smp_cmd_encrypt_info enc;
1143 struct smp_cmd_master_ident ident;
1144 struct smp_ltk *ltk;
1145 u8 authenticated;
1146 __le16 ediv;
1147 __le64 rand;
1148
1149 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1150 get_random_bytes(&ediv, sizeof(ediv));
1151 get_random_bytes(&rand, sizeof(rand));
1152
1153 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1154
1155 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1156 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1157 SMP_LTK_SLAVE, authenticated, enc.ltk,
1158 smp->enc_key_size, ediv, rand);
1159 smp->slave_ltk = ltk;
1160
1161 ident.ediv = ediv;
1162 ident.rand = rand;
1163
1164 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1165
1166 *keydist &= ~SMP_DIST_ENC_KEY;
1167 }
1168
1169 if (*keydist & SMP_DIST_ID_KEY) {
1170 struct smp_cmd_ident_addr_info addrinfo;
1171 struct smp_cmd_ident_info idinfo;
1172
1173 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1174
1175 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1176
1177 /* The hci_conn contains the local identity address
1178 * after the connection has been established.
1179 *
1180 * This is true even when the connection has been
1181 * established using a resolvable random address.
1182 */
1183 bacpy(&addrinfo.bdaddr, &hcon->src);
1184 addrinfo.addr_type = hcon->src_type;
1185
1186 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1187 &addrinfo);
1188
1189 *keydist &= ~SMP_DIST_ID_KEY;
1190 }
1191
1192 if (*keydist & SMP_DIST_SIGN) {
1193 struct smp_cmd_sign_info sign;
1194 struct smp_csrk *csrk;
1195
1196 /* Generate a new random key */
1197 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1198
1199 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1200 if (csrk) {
1201 csrk->master = 0x00;
1202 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1203 }
1204 smp->slave_csrk = csrk;
1205
1206 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1207
1208 *keydist &= ~SMP_DIST_SIGN;
1209 }
1210
1211 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001212 if (smp->remote_key_dist & KEY_DIST_MASK) {
1213 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001214 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001215 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001216
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001217 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1218 smp_notify_keys(conn);
1219
1220 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001221}
1222
Johan Hedbergb68fda62014-08-11 22:06:40 +03001223static void smp_timeout(struct work_struct *work)
1224{
1225 struct smp_chan *smp = container_of(work, struct smp_chan,
1226 security_timer.work);
1227 struct l2cap_conn *conn = smp->conn;
1228
1229 BT_DBG("conn %p", conn);
1230
Johan Hedberg1e91c292014-08-18 20:33:29 +03001231 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001232}
1233
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001234static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1235{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001236 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001237 struct smp_chan *smp;
1238
Marcel Holtmannf1560462013-10-13 05:43:25 -07001239 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001240 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001241 return NULL;
1242
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001243 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1244 if (IS_ERR(smp->tfm_aes)) {
1245 BT_ERR("Unable to create ECB crypto context");
1246 kfree(smp);
1247 return NULL;
1248 }
1249
Johan Hedberg407cecf2014-05-02 14:19:47 +03001250 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1251 if (IS_ERR(smp->tfm_cmac)) {
1252 BT_ERR("Unable to create CMAC crypto context");
1253 crypto_free_blkcipher(smp->tfm_aes);
1254 kfree(smp);
1255 return NULL;
1256 }
1257
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001258 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001259 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001260
Johan Hedbergb28b4942014-09-05 22:19:55 +03001261 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1262
Johan Hedbergb68fda62014-08-11 22:06:40 +03001263 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1264
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001265 hci_conn_hold(conn->hcon);
1266
1267 return smp;
1268}
1269
Johan Hedberg760b0182014-06-06 11:44:05 +03001270static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1271{
1272 struct hci_conn *hcon = smp->conn->hcon;
1273 u8 *na, *nb, a[7], b[7];
1274
1275 if (hcon->out) {
1276 na = smp->prnd;
1277 nb = smp->rrnd;
1278 } else {
1279 na = smp->rrnd;
1280 nb = smp->prnd;
1281 }
1282
1283 memcpy(a, &hcon->init_addr, 6);
1284 memcpy(b, &hcon->resp_addr, 6);
1285 a[6] = hcon->init_addr_type;
1286 b[6] = hcon->resp_addr_type;
1287
1288 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1289}
1290
Johan Hedberg38606f12014-06-25 11:10:28 +03001291static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001292{
1293 struct hci_conn *hcon = smp->conn->hcon;
1294 struct smp_cmd_dhkey_check check;
1295 u8 a[7], b[7], *local_addr, *remote_addr;
1296 u8 io_cap[3], r[16];
1297
Johan Hedberg760b0182014-06-06 11:44:05 +03001298 memcpy(a, &hcon->init_addr, 6);
1299 memcpy(b, &hcon->resp_addr, 6);
1300 a[6] = hcon->init_addr_type;
1301 b[6] = hcon->resp_addr_type;
1302
1303 if (hcon->out) {
1304 local_addr = a;
1305 remote_addr = b;
1306 memcpy(io_cap, &smp->preq[1], 3);
1307 } else {
1308 local_addr = b;
1309 remote_addr = a;
1310 memcpy(io_cap, &smp->prsp[1], 3);
1311 }
1312
Johan Hedbergdddd3052014-06-01 15:38:09 +03001313 memset(r, 0, sizeof(r));
1314
1315 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001316 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001317
1318 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1319 local_addr, remote_addr, check.e);
1320
1321 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001322}
1323
Johan Hedberg38606f12014-06-25 11:10:28 +03001324static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1325{
1326 struct l2cap_conn *conn = smp->conn;
1327 struct hci_conn *hcon = conn->hcon;
1328 struct smp_cmd_pairing_confirm cfm;
1329 u8 r;
1330
1331 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1332 r |= 0x80;
1333
1334 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1335
1336 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1337 cfm.confirm_val))
1338 return SMP_UNSPECIFIED;
1339
1340 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1341
1342 return 0;
1343}
1344
1345static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1346{
1347 struct l2cap_conn *conn = smp->conn;
1348 struct hci_conn *hcon = conn->hcon;
1349 struct hci_dev *hdev = hcon->hdev;
1350 u8 cfm[16], r;
1351
1352 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1353 if (smp->passkey_round >= 20)
1354 return 0;
1355
1356 switch (smp_op) {
1357 case SMP_CMD_PAIRING_RANDOM:
1358 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1359 r |= 0x80;
1360
1361 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1362 smp->rrnd, r, cfm))
1363 return SMP_UNSPECIFIED;
1364
1365 if (memcmp(smp->pcnf, cfm, 16))
1366 return SMP_CONFIRM_FAILED;
1367
1368 smp->passkey_round++;
1369
1370 if (smp->passkey_round == 20) {
1371 /* Generate MacKey and LTK */
1372 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1373 return SMP_UNSPECIFIED;
1374 }
1375
1376 /* The round is only complete when the initiator
1377 * receives pairing random.
1378 */
1379 if (!hcon->out) {
1380 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1381 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001382 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001383 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001384 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001385 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001386 return 0;
1387 }
1388
1389 /* Start the next round */
1390 if (smp->passkey_round != 20)
1391 return sc_passkey_round(smp, 0);
1392
1393 /* Passkey rounds are complete - start DHKey Check */
1394 sc_dhkey_check(smp);
1395 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1396
1397 break;
1398
1399 case SMP_CMD_PAIRING_CONFIRM:
1400 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1401 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1402 return 0;
1403 }
1404
1405 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1406
1407 if (hcon->out) {
1408 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1409 sizeof(smp->prnd), smp->prnd);
1410 return 0;
1411 }
1412
1413 return sc_passkey_send_confirm(smp);
1414
1415 case SMP_CMD_PUBLIC_KEY:
1416 default:
1417 /* Initiating device starts the round */
1418 if (!hcon->out)
1419 return 0;
1420
1421 BT_DBG("%s Starting passkey round %u", hdev->name,
1422 smp->passkey_round + 1);
1423
1424 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1425
1426 return sc_passkey_send_confirm(smp);
1427 }
1428
1429 return 0;
1430}
1431
Johan Hedbergdddd3052014-06-01 15:38:09 +03001432static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1433{
Johan Hedberg38606f12014-06-25 11:10:28 +03001434 struct l2cap_conn *conn = smp->conn;
1435 struct hci_conn *hcon = conn->hcon;
1436 u8 smp_op;
1437
1438 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1439
Johan Hedbergdddd3052014-06-01 15:38:09 +03001440 switch (mgmt_op) {
1441 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1442 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1443 return 0;
1444 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1445 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1446 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001447 case MGMT_OP_USER_PASSKEY_REPLY:
1448 hcon->passkey_notify = le32_to_cpu(passkey);
1449 smp->passkey_round = 0;
1450
1451 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1452 smp_op = SMP_CMD_PAIRING_CONFIRM;
1453 else
1454 smp_op = 0;
1455
1456 if (sc_passkey_round(smp, smp_op))
1457 return -EIO;
1458
1459 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001460 }
1461
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001462 /* Initiator sends DHKey check first */
1463 if (hcon->out) {
1464 sc_dhkey_check(smp);
1465 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1466 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1467 sc_dhkey_check(smp);
1468 sc_add_ltk(smp);
1469 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001470
1471 return 0;
1472}
1473
Brian Gix2b64d152011-12-21 16:12:12 -08001474int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1475{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001476 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001477 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001478 struct smp_chan *smp;
1479 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001480 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001481
1482 BT_DBG("");
1483
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001484 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001485 return -ENOTCONN;
1486
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001487 chan = conn->smp;
1488 if (!chan)
1489 return -ENOTCONN;
1490
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001491 l2cap_chan_lock(chan);
1492 if (!chan->data) {
1493 err = -ENOTCONN;
1494 goto unlock;
1495 }
1496
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001497 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001498
Johan Hedberg760b0182014-06-06 11:44:05 +03001499 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1500 err = sc_user_reply(smp, mgmt_op, passkey);
1501 goto unlock;
1502 }
1503
Brian Gix2b64d152011-12-21 16:12:12 -08001504 switch (mgmt_op) {
1505 case MGMT_OP_USER_PASSKEY_REPLY:
1506 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001507 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001508 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001509 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001510 /* Fall Through */
1511 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001512 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001513 break;
1514 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1515 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001516 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001517 err = 0;
1518 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001519 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001520 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001521 err = -EOPNOTSUPP;
1522 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001523 }
1524
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001525 err = 0;
1526
Brian Gix2b64d152011-12-21 16:12:12 -08001527 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001528 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1529 u8 rsp = smp_confirm(smp);
1530 if (rsp)
1531 smp_failure(conn, rsp);
1532 }
Brian Gix2b64d152011-12-21 16:12:12 -08001533
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001534unlock:
1535 l2cap_chan_unlock(chan);
1536 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001537}
1538
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001539static void build_bredr_pairing_cmd(struct smp_chan *smp,
1540 struct smp_cmd_pairing *req,
1541 struct smp_cmd_pairing *rsp)
1542{
1543 struct l2cap_conn *conn = smp->conn;
1544 struct hci_dev *hdev = conn->hcon->hdev;
1545 u8 local_dist = 0, remote_dist = 0;
1546
1547 if (test_bit(HCI_BONDABLE, &hdev->dev_flags)) {
1548 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1549 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1550 }
1551
1552 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
1553 remote_dist |= SMP_DIST_ID_KEY;
1554
1555 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
1556 local_dist |= SMP_DIST_ID_KEY;
1557
1558 if (!rsp) {
1559 memset(req, 0, sizeof(*req));
1560
1561 req->init_key_dist = local_dist;
1562 req->resp_key_dist = remote_dist;
1563 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1564
1565 smp->remote_key_dist = remote_dist;
1566
1567 return;
1568 }
1569
1570 memset(rsp, 0, sizeof(*rsp));
1571
1572 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1573 rsp->init_key_dist = req->init_key_dist & remote_dist;
1574 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1575
1576 smp->remote_key_dist = rsp->init_key_dist;
1577}
1578
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001579static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001580{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001581 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001582 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001583 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001584 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001585 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001586 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001587
1588 BT_DBG("conn %p", conn);
1589
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001590 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001591 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001592
Johan Hedberg40bef302014-07-16 11:42:27 +03001593 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001594 return SMP_CMD_NOTSUPP;
1595
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001596 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001597 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001598 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001599 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001600
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001601 if (!smp)
1602 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001603
Johan Hedbergc05b9332014-09-10 17:37:42 -07001604 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001605 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001606
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001607 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001608 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001609 return SMP_PAIRING_NOTSUPP;
1610
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001611 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1612 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001613 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001614
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001615 /* SMP over BR/EDR requires special treatment */
1616 if (conn->hcon->type == ACL_LINK) {
1617 /* We must have a BR/EDR SC link */
1618 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags))
1619 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1620
1621 set_bit(SMP_FLAG_SC, &smp->flags);
1622
1623 build_bredr_pairing_cmd(smp, req, &rsp);
1624
1625 key_size = min(req->max_key_size, rsp.max_key_size);
1626 if (check_enc_key_size(conn, key_size))
1627 return SMP_ENC_KEY_SIZE;
1628
1629 /* Clear bits which are generated but not distributed */
1630 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1631
1632 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1633 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1634 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1635
1636 smp_distribute_keys(smp);
1637 return 0;
1638 }
1639
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001640 build_pairing_cmd(conn, req, &rsp, auth);
1641
1642 if (rsp.auth_req & SMP_AUTH_SC)
1643 set_bit(SMP_FLAG_SC, &smp->flags);
1644
Johan Hedberg5be5e272014-09-10 17:58:54 -07001645 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001646 sec_level = BT_SECURITY_MEDIUM;
1647 else
1648 sec_level = authreq_to_seclevel(auth);
1649
Johan Hedbergc7262e72014-06-17 13:07:37 +03001650 if (sec_level > conn->hcon->pending_sec_level)
1651 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001652
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001653 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001654 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1655 u8 method;
1656
1657 method = get_auth_method(smp, conn->hcon->io_capability,
1658 req->io_capability);
1659 if (method == JUST_WORKS || method == JUST_CFM)
1660 return SMP_AUTH_REQUIREMENTS;
1661 }
1662
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001663 key_size = min(req->max_key_size, rsp.max_key_size);
1664 if (check_enc_key_size(conn, key_size))
1665 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001666
Johan Hedberge84a6b12013-12-02 10:49:03 +02001667 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001668
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001669 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1670 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001671
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001672 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001673
1674 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1675
1676 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1677 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1678 /* Clear bits which are generated but not distributed */
1679 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1680 /* Wait for Public Key from Initiating Device */
1681 return 0;
1682 } else {
1683 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1684 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001685
Brian Gix2b64d152011-12-21 16:12:12 -08001686 /* Request setup of TK */
1687 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1688 if (ret)
1689 return SMP_UNSPECIFIED;
1690
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001691 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001692}
1693
Johan Hedberg3b191462014-06-06 10:50:15 +03001694static u8 sc_send_public_key(struct smp_chan *smp)
1695{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001696 struct hci_dev *hdev = smp->conn->hcon->hdev;
1697
Johan Hedberg3b191462014-06-06 10:50:15 +03001698 BT_DBG("");
1699
Johan Hedberg70157ef2014-06-24 15:22:59 +03001700 if (test_bit(HCI_USE_DEBUG_KEYS, &hdev->dev_flags)) {
1701 BT_DBG("Using debug keys");
1702 memcpy(smp->local_pk, debug_pk, 64);
1703 memcpy(smp->local_sk, debug_sk, 32);
1704 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1705 } else {
1706 while (true) {
1707 /* Generate local key pair for Secure Connections */
1708 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1709 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001710
Johan Hedberg70157ef2014-06-24 15:22:59 +03001711 /* This is unlikely, but we need to check that
1712 * we didn't accidentially generate a debug key.
1713 */
1714 if (memcmp(smp->local_sk, debug_sk, 32))
1715 break;
1716 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001717 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001718
1719 BT_DBG("Local Public Key X: %32phN", smp->local_pk);
1720 BT_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1721 BT_DBG("Local Private Key: %32phN", smp->local_sk);
1722
1723 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1724
1725 return 0;
1726}
1727
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001728static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001729{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001730 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001731 struct l2cap_chan *chan = conn->smp;
1732 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001733 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001734 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001735 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001736
1737 BT_DBG("conn %p", conn);
1738
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001739 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001740 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001741
Johan Hedberg40bef302014-07-16 11:42:27 +03001742 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001743 return SMP_CMD_NOTSUPP;
1744
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001745 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001746
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001747 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001748
1749 key_size = min(req->max_key_size, rsp->max_key_size);
1750 if (check_enc_key_size(conn, key_size))
1751 return SMP_ENC_KEY_SIZE;
1752
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001753 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001754
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001755 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1756 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1757
1758 /* Update remote key distribution in case the remote cleared
1759 * some bits that we had enabled in our request.
1760 */
1761 smp->remote_key_dist &= rsp->resp_key_dist;
1762
1763 /* For BR/EDR this means we're done and can start phase 3 */
1764 if (conn->hcon->type == ACL_LINK) {
1765 /* Clear bits which are generated but not distributed */
1766 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1767 smp_distribute_keys(smp);
1768 return 0;
1769 }
1770
Johan Hedberg65668772014-05-16 11:03:34 +03001771 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1772 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001773 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1774 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001775
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001776 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001777 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1778 u8 method;
1779
1780 method = get_auth_method(smp, req->io_capability,
1781 rsp->io_capability);
1782 if (method == JUST_WORKS || method == JUST_CFM)
1783 return SMP_AUTH_REQUIREMENTS;
1784 }
1785
Johan Hedberge84a6b12013-12-02 10:49:03 +02001786 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001787
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001788 /* Update remote key distribution in case the remote cleared
1789 * some bits that we had enabled in our request.
1790 */
1791 smp->remote_key_dist &= rsp->resp_key_dist;
1792
Johan Hedberg3b191462014-06-06 10:50:15 +03001793 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1794 /* Clear bits which are generated but not distributed */
1795 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1796 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1797 return sc_send_public_key(smp);
1798 }
1799
Johan Hedbergc05b9332014-09-10 17:37:42 -07001800 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001801
Johan Hedberg476585e2012-06-06 18:54:15 +08001802 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001803 if (ret)
1804 return SMP_UNSPECIFIED;
1805
Johan Hedberg4a74d652014-05-20 09:45:50 +03001806 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001807
1808 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001809 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001810 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001811
1812 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001813}
1814
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001815static u8 sc_check_confirm(struct smp_chan *smp)
1816{
1817 struct l2cap_conn *conn = smp->conn;
1818
1819 BT_DBG("");
1820
1821 /* Public Key exchange must happen before any other steps */
1822 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1823 return SMP_UNSPECIFIED;
1824
Johan Hedberg38606f12014-06-25 11:10:28 +03001825 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1826 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1827
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001828 if (conn->hcon->out) {
1829 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1830 smp->prnd);
1831 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1832 }
1833
1834 return 0;
1835}
1836
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001837static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001838{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001839 struct l2cap_chan *chan = conn->smp;
1840 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001841
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001842 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1843
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001844 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001845 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001846
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001847 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1848 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001849
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001850 if (test_bit(SMP_FLAG_SC, &smp->flags))
1851 return sc_check_confirm(smp);
1852
Johan Hedbergb28b4942014-09-05 22:19:55 +03001853 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001854 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1855 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001856 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1857 return 0;
1858 }
1859
1860 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001861 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001862 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001863 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001864
1865 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001866}
1867
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001868static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001869{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001870 struct l2cap_chan *chan = conn->smp;
1871 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001872 struct hci_conn *hcon = conn->hcon;
1873 u8 *pkax, *pkbx, *na, *nb;
1874 u32 passkey;
1875 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001876
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001877 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001878
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001879 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001880 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001881
Johan Hedberg943a7322014-03-18 12:58:24 +02001882 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001883 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001884
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001885 if (!test_bit(SMP_FLAG_SC, &smp->flags))
1886 return smp_random(smp);
1887
Johan Hedberg38606f12014-06-25 11:10:28 +03001888 /* Passkey entry has special treatment */
1889 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1890 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
1891
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001892 if (hcon->out) {
1893 u8 cfm[16];
1894
1895 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1896 smp->rrnd, 0, cfm);
1897 if (err)
1898 return SMP_UNSPECIFIED;
1899
1900 if (memcmp(smp->pcnf, cfm, 16))
1901 return SMP_CONFIRM_FAILED;
1902
1903 pkax = smp->local_pk;
1904 pkbx = smp->remote_pk;
1905 na = smp->prnd;
1906 nb = smp->rrnd;
1907 } else {
1908 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1909 smp->prnd);
1910 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1911
1912 pkax = smp->remote_pk;
1913 pkbx = smp->local_pk;
1914 na = smp->rrnd;
1915 nb = smp->prnd;
1916 }
1917
Johan Hedberg760b0182014-06-06 11:44:05 +03001918 /* Generate MacKey and LTK */
1919 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
1920 if (err)
1921 return SMP_UNSPECIFIED;
1922
Johan Hedbergdddd3052014-06-01 15:38:09 +03001923 if (smp->method == JUST_WORKS) {
1924 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03001925 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001926 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1927 }
1928 return 0;
1929 }
1930
Johan Hedberg38606f12014-06-25 11:10:28 +03001931 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001932 if (err)
1933 return SMP_UNSPECIFIED;
1934
Johan Hedberg38606f12014-06-25 11:10:28 +03001935 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
1936 hcon->dst_type, passkey, 0);
1937 if (err)
1938 return SMP_UNSPECIFIED;
1939
1940 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1941
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001942 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001943}
1944
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001945static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001946{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001947 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001948 struct hci_conn *hcon = conn->hcon;
1949
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001950 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001951 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001952 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001953
Johan Hedberga6f78332014-09-10 17:37:45 -07001954 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001955 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001956
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001957 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001958 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001959
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001960 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1961 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001962
Johan Hedbergfe59a052014-07-01 19:14:12 +03001963 /* We never store STKs for master role, so clear this flag */
1964 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1965
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001966 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001967}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001968
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001969bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
1970 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03001971{
1972 if (sec_level == BT_SECURITY_LOW)
1973 return true;
1974
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001975 /* If we're encrypted with an STK but the caller prefers using
1976 * LTK claim insufficient security. This way we allow the
1977 * connection to be re-encrypted with an LTK, even if the LTK
1978 * provides the same level of security. Only exception is if we
1979 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001980 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001981 if (key_pref == SMP_USE_LTK &&
1982 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001983 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001984 return false;
1985
Johan Hedberg854f4722014-07-01 18:40:20 +03001986 if (hcon->sec_level >= sec_level)
1987 return true;
1988
1989 return false;
1990}
1991
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001992static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001993{
1994 struct smp_cmd_security_req *rp = (void *) skb->data;
1995 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001996 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001997 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001998 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07001999 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002000
2001 BT_DBG("conn %p", conn);
2002
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002003 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002004 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002005
Johan Hedberg40bef302014-07-16 11:42:27 +03002006 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002007 return SMP_CMD_NOTSUPP;
2008
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002009 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002010
Johan Hedberg5be5e272014-09-10 17:58:54 -07002011 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002012 sec_level = BT_SECURITY_MEDIUM;
2013 else
2014 sec_level = authreq_to_seclevel(auth);
2015
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002016 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002017 return 0;
2018
Johan Hedbergc7262e72014-06-17 13:07:37 +03002019 if (sec_level > hcon->pending_sec_level)
2020 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002021
Johan Hedberg4dab7862012-06-07 14:58:37 +08002022 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002023 return 0;
2024
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002025 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002026 if (!smp)
2027 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002028
Johan Hedbergb6ae8452014-07-30 09:22:22 +03002029 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002030 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002031 return SMP_PAIRING_NOTSUPP;
2032
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002033 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002034
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002035 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002036 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002037
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002038 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2039 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002040
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002041 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002042 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002043
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002044 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002045}
2046
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002047int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002048{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002049 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002050 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002051 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002052 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002053 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002054
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002055 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2056
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002057 /* This may be NULL if there's an unexpected disconnection */
2058 if (!conn)
2059 return 1;
2060
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002061 chan = conn->smp;
2062
Johan Hedberg757aee02013-04-24 13:05:32 +03002063 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002064 return 1;
2065
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002066 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002067 return 1;
2068
Johan Hedbergc7262e72014-06-17 13:07:37 +03002069 if (sec_level > hcon->pending_sec_level)
2070 hcon->pending_sec_level = sec_level;
2071
Johan Hedberg40bef302014-07-16 11:42:27 +03002072 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002073 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2074 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002075
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002076 l2cap_chan_lock(chan);
2077
2078 /* If SMP is already in progress ignore this request */
2079 if (chan->data) {
2080 ret = 0;
2081 goto unlock;
2082 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002083
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002084 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002085 if (!smp) {
2086 ret = 1;
2087 goto unlock;
2088 }
Brian Gix2b64d152011-12-21 16:12:12 -08002089
2090 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002091
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002092 if (test_bit(HCI_SC_ENABLED, &hcon->hdev->dev_flags))
2093 authreq |= SMP_AUTH_SC;
2094
Johan Hedberg79897d22014-06-01 09:45:24 +03002095 /* Require MITM if IO Capability allows or the security level
2096 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002097 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002098 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002099 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002100 authreq |= SMP_AUTH_MITM;
2101
Johan Hedberg40bef302014-07-16 11:42:27 +03002102 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002103 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002104
Brian Gix2b64d152011-12-21 16:12:12 -08002105 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002106 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2107 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002108
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002109 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002110 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002111 } else {
2112 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002113 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002114 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002115 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002116 }
2117
Johan Hedberg4a74d652014-05-20 09:45:50 +03002118 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002119 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002120
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002121unlock:
2122 l2cap_chan_unlock(chan);
2123 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002124}
2125
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002126static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2127{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002128 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002129 struct l2cap_chan *chan = conn->smp;
2130 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002131
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002132 BT_DBG("conn %p", conn);
2133
2134 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002135 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002136
Johan Hedbergb28b4942014-09-05 22:19:55 +03002137 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002138
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002139 skb_pull(skb, sizeof(*rp));
2140
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002141 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002142
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002143 return 0;
2144}
2145
2146static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2147{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002148 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002149 struct l2cap_chan *chan = conn->smp;
2150 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002151 struct hci_dev *hdev = conn->hcon->hdev;
2152 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002153 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002154 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002155
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002156 BT_DBG("conn %p", conn);
2157
2158 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002159 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002160
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002161 /* Mark the information as received */
2162 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2163
Johan Hedbergb28b4942014-09-05 22:19:55 +03002164 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2165 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002166 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2167 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002168
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002169 skb_pull(skb, sizeof(*rp));
2170
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002171 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002172 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002173 authenticated, smp->tk, smp->enc_key_size,
2174 rp->ediv, rp->rand);
2175 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002176 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002177 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002178
2179 return 0;
2180}
2181
Johan Hedbergfd349c02014-02-18 10:19:36 +02002182static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2183{
2184 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002185 struct l2cap_chan *chan = conn->smp;
2186 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002187
2188 BT_DBG("");
2189
2190 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002191 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002192
Johan Hedbergb28b4942014-09-05 22:19:55 +03002193 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002194
Johan Hedbergfd349c02014-02-18 10:19:36 +02002195 skb_pull(skb, sizeof(*info));
2196
2197 memcpy(smp->irk, info->irk, 16);
2198
2199 return 0;
2200}
2201
2202static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2203 struct sk_buff *skb)
2204{
2205 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002206 struct l2cap_chan *chan = conn->smp;
2207 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002208 struct hci_conn *hcon = conn->hcon;
2209 bdaddr_t rpa;
2210
2211 BT_DBG("");
2212
2213 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002214 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002215
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002216 /* Mark the information as received */
2217 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2218
Johan Hedbergb28b4942014-09-05 22:19:55 +03002219 if (smp->remote_key_dist & SMP_DIST_SIGN)
2220 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2221
Johan Hedbergfd349c02014-02-18 10:19:36 +02002222 skb_pull(skb, sizeof(*info));
2223
Johan Hedberga9a58f82014-02-25 22:24:37 +02002224 /* Strictly speaking the Core Specification (4.1) allows sending
2225 * an empty address which would force us to rely on just the IRK
2226 * as "identity information". However, since such
2227 * implementations are not known of and in order to not over
2228 * complicate our implementation, simply pretend that we never
2229 * received an IRK for such a device.
2230 */
2231 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
2232 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002233 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002234 }
2235
Johan Hedbergfd349c02014-02-18 10:19:36 +02002236 bacpy(&smp->id_addr, &info->bdaddr);
2237 smp->id_addr_type = info->addr_type;
2238
2239 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2240 bacpy(&rpa, &hcon->dst);
2241 else
2242 bacpy(&rpa, BDADDR_ANY);
2243
Johan Hedberg23d0e122014-02-19 14:57:46 +02002244 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2245 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002246
Johan Hedberg31dd6242014-06-27 14:23:02 +03002247distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002248 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2249 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002250
2251 return 0;
2252}
2253
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002254static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2255{
2256 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002257 struct l2cap_chan *chan = conn->smp;
2258 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002259 struct smp_csrk *csrk;
2260
2261 BT_DBG("conn %p", conn);
2262
2263 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002264 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002265
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002266 /* Mark the information as received */
2267 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2268
2269 skb_pull(skb, sizeof(*rp));
2270
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002271 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2272 if (csrk) {
2273 csrk->master = 0x01;
2274 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2275 }
2276 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002277 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002278
2279 return 0;
2280}
2281
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002282static u8 sc_select_method(struct smp_chan *smp)
2283{
2284 struct l2cap_conn *conn = smp->conn;
2285 struct hci_conn *hcon = conn->hcon;
2286 struct smp_cmd_pairing *local, *remote;
2287 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2288
2289 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2290 * which are needed as inputs to some crypto functions. To get
2291 * the "struct smp_cmd_pairing" from them we need to skip the
2292 * first byte which contains the opcode.
2293 */
2294 if (hcon->out) {
2295 local = (void *) &smp->preq[1];
2296 remote = (void *) &smp->prsp[1];
2297 } else {
2298 local = (void *) &smp->prsp[1];
2299 remote = (void *) &smp->preq[1];
2300 }
2301
2302 local_io = local->io_capability;
2303 remote_io = remote->io_capability;
2304
2305 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2306 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2307
2308 /* If either side wants MITM, look up the method from the table,
2309 * otherwise use JUST WORKS.
2310 */
2311 if (local_mitm || remote_mitm)
2312 method = get_auth_method(smp, local_io, remote_io);
2313 else
2314 method = JUST_WORKS;
2315
2316 /* Don't confirm locally initiated pairing attempts */
2317 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2318 method = JUST_WORKS;
2319
2320 return method;
2321}
2322
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002323static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2324{
2325 struct smp_cmd_public_key *key = (void *) skb->data;
2326 struct hci_conn *hcon = conn->hcon;
2327 struct l2cap_chan *chan = conn->smp;
2328 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002329 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002330 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002331 int err;
2332
2333 BT_DBG("conn %p", conn);
2334
2335 if (skb->len < sizeof(*key))
2336 return SMP_INVALID_PARAMS;
2337
2338 memcpy(smp->remote_pk, key, 64);
2339
2340 /* Non-initiating device sends its public key after receiving
2341 * the key from the initiating device.
2342 */
2343 if (!hcon->out) {
2344 err = sc_send_public_key(smp);
2345 if (err)
2346 return err;
2347 }
2348
2349 BT_DBG("Remote Public Key X: %32phN", smp->remote_pk);
2350 BT_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
2351
2352 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2353 return SMP_UNSPECIFIED;
2354
2355 BT_DBG("DHKey %32phN", smp->dhkey);
2356
2357 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2358
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002359 smp->method = sc_select_method(smp);
2360
2361 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2362
2363 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2364 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2365 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2366 else
2367 hcon->pending_sec_level = BT_SECURITY_FIPS;
2368
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002369 if (!memcmp(debug_pk, smp->remote_pk, 64))
2370 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2371
Johan Hedberg38606f12014-06-25 11:10:28 +03002372 if (smp->method == DSP_PASSKEY) {
2373 get_random_bytes(&hcon->passkey_notify,
2374 sizeof(hcon->passkey_notify));
2375 hcon->passkey_notify %= 1000000;
2376 hcon->passkey_entered = 0;
2377 smp->passkey_round = 0;
2378 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2379 hcon->dst_type,
2380 hcon->passkey_notify,
2381 hcon->passkey_entered))
2382 return SMP_UNSPECIFIED;
2383 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2384 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2385 }
2386
2387 if (hcon->out)
2388 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2389
2390 if (smp->method == REQ_PASSKEY) {
2391 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2392 hcon->dst_type))
2393 return SMP_UNSPECIFIED;
2394 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2395 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2396 return 0;
2397 }
2398
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002399 /* The Initiating device waits for the non-initiating device to
2400 * send the confirm value.
2401 */
2402 if (conn->hcon->out)
2403 return 0;
2404
2405 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2406 0, cfm.confirm_val);
2407 if (err)
2408 return SMP_UNSPECIFIED;
2409
2410 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2411 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2412
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002413 return 0;
2414}
2415
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002416static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2417{
2418 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2419 struct l2cap_chan *chan = conn->smp;
2420 struct hci_conn *hcon = conn->hcon;
2421 struct smp_chan *smp = chan->data;
2422 u8 a[7], b[7], *local_addr, *remote_addr;
2423 u8 io_cap[3], r[16], e[16];
2424 int err;
2425
2426 BT_DBG("conn %p", conn);
2427
2428 if (skb->len < sizeof(*check))
2429 return SMP_INVALID_PARAMS;
2430
2431 memcpy(a, &hcon->init_addr, 6);
2432 memcpy(b, &hcon->resp_addr, 6);
2433 a[6] = hcon->init_addr_type;
2434 b[6] = hcon->resp_addr_type;
2435
2436 if (hcon->out) {
2437 local_addr = a;
2438 remote_addr = b;
2439 memcpy(io_cap, &smp->prsp[1], 3);
2440 } else {
2441 local_addr = b;
2442 remote_addr = a;
2443 memcpy(io_cap, &smp->preq[1], 3);
2444 }
2445
2446 memset(r, 0, sizeof(r));
2447
Johan Hedberg38606f12014-06-25 11:10:28 +03002448 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2449 put_unaligned_le32(hcon->passkey_notify, r);
2450
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002451 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2452 io_cap, remote_addr, local_addr, e);
2453 if (err)
2454 return SMP_UNSPECIFIED;
2455
2456 if (memcmp(check->e, e, 16))
2457 return SMP_DHKEY_CHECK_FAILED;
2458
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002459 if (!hcon->out) {
2460 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2461 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2462 return 0;
2463 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002464
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002465 /* Slave sends DHKey check as response to master */
2466 sc_dhkey_check(smp);
2467 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002468
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002469 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002470
2471 if (hcon->out) {
2472 hci_le_start_enc(hcon, 0, 0, smp->tk);
2473 hcon->enc_key_size = smp->enc_key_size;
2474 }
2475
2476 return 0;
2477}
2478
Johan Hedberg1408bb62014-06-04 22:45:57 +03002479static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2480 struct sk_buff *skb)
2481{
2482 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2483
2484 BT_DBG("value 0x%02x", kp->value);
2485
2486 return 0;
2487}
2488
Johan Hedberg4befb862014-08-11 22:06:38 +03002489static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002490{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002491 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002492 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002493 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002494 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002495 int err = 0;
2496
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002497 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002498 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002499
Marcel Holtmann06ae3312013-10-18 03:43:00 -07002500 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002501 reason = SMP_PAIRING_NOTSUPP;
2502 goto done;
2503 }
2504
Marcel Holtmann92381f52013-10-03 01:23:08 -07002505 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002506 skb_pull(skb, sizeof(code));
2507
Johan Hedbergb28b4942014-09-05 22:19:55 +03002508 smp = chan->data;
2509
2510 if (code > SMP_CMD_MAX)
2511 goto drop;
2512
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002513 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002514 goto drop;
2515
2516 /* If we don't have a context the only allowed commands are
2517 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002518 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002519 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2520 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002521
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002522 switch (code) {
2523 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002524 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002525 break;
2526
2527 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002528 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002529 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002530 break;
2531
2532 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002533 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002534 break;
2535
2536 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002537 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002538 break;
2539
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002540 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002541 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002542 break;
2543
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002544 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002545 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002546 break;
2547
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002548 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002549 reason = smp_cmd_encrypt_info(conn, skb);
2550 break;
2551
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002552 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002553 reason = smp_cmd_master_ident(conn, skb);
2554 break;
2555
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002556 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002557 reason = smp_cmd_ident_info(conn, skb);
2558 break;
2559
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002560 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002561 reason = smp_cmd_ident_addr_info(conn, skb);
2562 break;
2563
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002564 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002565 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002566 break;
2567
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002568 case SMP_CMD_PUBLIC_KEY:
2569 reason = smp_cmd_public_key(conn, skb);
2570 break;
2571
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002572 case SMP_CMD_DHKEY_CHECK:
2573 reason = smp_cmd_dhkey_check(conn, skb);
2574 break;
2575
Johan Hedberg1408bb62014-06-04 22:45:57 +03002576 case SMP_CMD_KEYPRESS_NOTIFY:
2577 reason = smp_cmd_keypress_notify(conn, skb);
2578 break;
2579
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002580 default:
2581 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002582 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002583 goto done;
2584 }
2585
2586done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002587 if (!err) {
2588 if (reason)
2589 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002590 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002591 }
2592
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002593 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002594
2595drop:
2596 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2597 code, &hcon->dst);
2598 kfree_skb(skb);
2599 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002600}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002601
Johan Hedberg70db83c2014-08-08 09:37:16 +03002602static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2603{
2604 struct l2cap_conn *conn = chan->conn;
2605
2606 BT_DBG("chan %p", chan);
2607
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002608 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002609 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002610
Johan Hedberg70db83c2014-08-08 09:37:16 +03002611 conn->smp = NULL;
2612 l2cap_chan_put(chan);
2613}
2614
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002615static void bredr_pairing(struct l2cap_chan *chan)
2616{
2617 struct l2cap_conn *conn = chan->conn;
2618 struct hci_conn *hcon = conn->hcon;
2619 struct hci_dev *hdev = hcon->hdev;
2620 struct smp_cmd_pairing req;
2621 struct smp_chan *smp;
2622
2623 BT_DBG("chan %p", chan);
2624
2625 /* Only new pairings are interesting */
2626 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2627 return;
2628
2629 /* Don't bother if we're not encrypted */
2630 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2631 return;
2632
2633 /* Only master may initiate SMP over BR/EDR */
2634 if (hcon->role != HCI_ROLE_MASTER)
2635 return;
2636
2637 /* Secure Connections support must be enabled */
2638 if (!test_bit(HCI_SC_ENABLED, &hdev->dev_flags))
2639 return;
2640
2641 /* BR/EDR must use Secure Connections for SMP */
2642 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
2643 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2644 return;
2645
2646 /* If our LE support is not enabled don't do anything */
2647 if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
2648 return;
2649
2650 /* Don't bother if remote LE support is not enabled */
2651 if (!lmp_host_le_capable(hcon))
2652 return;
2653
2654 /* Remote must support SMP fixed chan for BR/EDR */
2655 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2656 return;
2657
2658 /* Don't bother if SMP is already ongoing */
2659 if (chan->data)
2660 return;
2661
2662 smp = smp_chan_create(conn);
2663 if (!smp) {
2664 BT_ERR("%s unable to create SMP context for BR/EDR",
2665 hdev->name);
2666 return;
2667 }
2668
2669 set_bit(SMP_FLAG_SC, &smp->flags);
2670
2671 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2672
2673 /* Prepare and send the BR/EDR SMP Pairing Request */
2674 build_bredr_pairing_cmd(smp, &req, NULL);
2675
2676 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2677 memcpy(&smp->preq[1], &req, sizeof(req));
2678
2679 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2680 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2681}
2682
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002683static void smp_resume_cb(struct l2cap_chan *chan)
2684{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002685 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002686 struct l2cap_conn *conn = chan->conn;
2687 struct hci_conn *hcon = conn->hcon;
2688
2689 BT_DBG("chan %p", chan);
2690
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002691 if (hcon->type == ACL_LINK) {
2692 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002693 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002694 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002695
Johan Hedberg86d14072014-08-11 22:06:43 +03002696 if (!smp)
2697 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002698
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002699 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2700 return;
2701
Johan Hedberg86d14072014-08-11 22:06:43 +03002702 cancel_delayed_work(&smp->security_timer);
2703
Johan Hedbergd6268e82014-09-05 22:19:51 +03002704 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002705}
2706
Johan Hedberg70db83c2014-08-08 09:37:16 +03002707static void smp_ready_cb(struct l2cap_chan *chan)
2708{
2709 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002710 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002711
2712 BT_DBG("chan %p", chan);
2713
2714 conn->smp = chan;
2715 l2cap_chan_hold(chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002716
2717 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2718 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002719}
2720
Johan Hedberg4befb862014-08-11 22:06:38 +03002721static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2722{
2723 int err;
2724
2725 BT_DBG("chan %p", chan);
2726
2727 err = smp_sig_channel(chan, skb);
2728 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002729 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002730
Johan Hedbergb68fda62014-08-11 22:06:40 +03002731 if (smp)
2732 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002733
Johan Hedberg1e91c292014-08-18 20:33:29 +03002734 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002735 }
2736
2737 return err;
2738}
2739
Johan Hedberg70db83c2014-08-08 09:37:16 +03002740static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2741 unsigned long hdr_len,
2742 unsigned long len, int nb)
2743{
2744 struct sk_buff *skb;
2745
2746 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2747 if (!skb)
2748 return ERR_PTR(-ENOMEM);
2749
2750 skb->priority = HCI_PRIO_MAX;
2751 bt_cb(skb)->chan = chan;
2752
2753 return skb;
2754}
2755
2756static const struct l2cap_ops smp_chan_ops = {
2757 .name = "Security Manager",
2758 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002759 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002760 .alloc_skb = smp_alloc_skb_cb,
2761 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002762 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002763
2764 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002765 .state_change = l2cap_chan_no_state_change,
2766 .close = l2cap_chan_no_close,
2767 .defer = l2cap_chan_no_defer,
2768 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002769 .set_shutdown = l2cap_chan_no_set_shutdown,
2770 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2771 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2772};
2773
2774static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2775{
2776 struct l2cap_chan *chan;
2777
2778 BT_DBG("pchan %p", pchan);
2779
2780 chan = l2cap_chan_create();
2781 if (!chan)
2782 return NULL;
2783
2784 chan->chan_type = pchan->chan_type;
2785 chan->ops = &smp_chan_ops;
2786 chan->scid = pchan->scid;
2787 chan->dcid = chan->scid;
2788 chan->imtu = pchan->imtu;
2789 chan->omtu = pchan->omtu;
2790 chan->mode = pchan->mode;
2791
Johan Hedbergabe84902014-11-12 22:22:21 +02002792 /* Other L2CAP channels may request SMP routines in order to
2793 * change the security level. This means that the SMP channel
2794 * lock must be considered in its own category to avoid lockdep
2795 * warnings.
2796 */
2797 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
2798
Johan Hedberg70db83c2014-08-08 09:37:16 +03002799 BT_DBG("created chan %p", chan);
2800
2801 return chan;
2802}
2803
2804static const struct l2cap_ops smp_root_chan_ops = {
2805 .name = "Security Manager Root",
2806 .new_connection = smp_new_conn_cb,
2807
2808 /* None of these are implemented for the root channel */
2809 .close = l2cap_chan_no_close,
2810 .alloc_skb = l2cap_chan_no_alloc_skb,
2811 .recv = l2cap_chan_no_recv,
2812 .state_change = l2cap_chan_no_state_change,
2813 .teardown = l2cap_chan_no_teardown,
2814 .ready = l2cap_chan_no_ready,
2815 .defer = l2cap_chan_no_defer,
2816 .suspend = l2cap_chan_no_suspend,
2817 .resume = l2cap_chan_no_resume,
2818 .set_shutdown = l2cap_chan_no_set_shutdown,
2819 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2820 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2821};
2822
Johan Hedbergef8efe42014-08-13 15:12:32 +03002823static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002824{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002825 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002826 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002827
Johan Hedbergef8efe42014-08-13 15:12:32 +03002828 if (cid == L2CAP_CID_SMP_BREDR) {
2829 tfm_aes = NULL;
2830 goto create_chan;
2831 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03002832
Johan Hedbergadae20c2014-11-13 14:37:48 +02002833 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002834 if (IS_ERR(tfm_aes)) {
Johan Hedberg711eafe2014-08-08 09:32:52 +03002835 BT_ERR("Unable to create crypto context");
Johan Hedbergef8efe42014-08-13 15:12:32 +03002836 return ERR_PTR(PTR_ERR(tfm_aes));
Johan Hedberg711eafe2014-08-08 09:32:52 +03002837 }
2838
Johan Hedbergef8efe42014-08-13 15:12:32 +03002839create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03002840 chan = l2cap_chan_create();
2841 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002842 crypto_free_blkcipher(tfm_aes);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002843 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002844 }
2845
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002846 chan->data = tfm_aes;
2847
Johan Hedbergef8efe42014-08-13 15:12:32 +03002848 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002849
2850 l2cap_chan_set_defaults(chan);
2851
2852 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002853 if (cid == L2CAP_CID_SMP)
2854 chan->src_type = BDADDR_LE_PUBLIC;
2855 else
2856 chan->src_type = BDADDR_BREDR;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002857 chan->state = BT_LISTEN;
2858 chan->mode = L2CAP_MODE_BASIC;
2859 chan->imtu = L2CAP_DEFAULT_MTU;
2860 chan->ops = &smp_root_chan_ops;
2861
Johan Hedbergabe84902014-11-12 22:22:21 +02002862 /* Set correct nesting level for a parent/listening channel */
2863 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
2864
Johan Hedbergef8efe42014-08-13 15:12:32 +03002865 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03002866}
2867
Johan Hedbergef8efe42014-08-13 15:12:32 +03002868static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002869{
Johan Hedbergef8efe42014-08-13 15:12:32 +03002870 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002871
Johan Hedbergef8efe42014-08-13 15:12:32 +03002872 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002873
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002874 tfm_aes = chan->data;
2875 if (tfm_aes) {
2876 chan->data = NULL;
2877 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002878 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03002879
Johan Hedberg70db83c2014-08-08 09:37:16 +03002880 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002881}
Johan Hedbergef8efe42014-08-13 15:12:32 +03002882
2883int smp_register(struct hci_dev *hdev)
2884{
2885 struct l2cap_chan *chan;
2886
2887 BT_DBG("%s", hdev->name);
2888
2889 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
2890 if (IS_ERR(chan))
2891 return PTR_ERR(chan);
2892
2893 hdev->smp_data = chan;
2894
2895 if (!lmp_sc_capable(hdev) &&
2896 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2897 return 0;
2898
2899 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
2900 if (IS_ERR(chan)) {
2901 int err = PTR_ERR(chan);
2902 chan = hdev->smp_data;
2903 hdev->smp_data = NULL;
2904 smp_del_chan(chan);
2905 return err;
2906 }
2907
2908 hdev->smp_bredr_data = chan;
2909
2910 return 0;
2911}
2912
2913void smp_unregister(struct hci_dev *hdev)
2914{
2915 struct l2cap_chan *chan;
2916
2917 if (hdev->smp_bredr_data) {
2918 chan = hdev->smp_bredr_data;
2919 hdev->smp_bredr_data = NULL;
2920 smp_del_chan(chan);
2921 }
2922
2923 if (hdev->smp_data) {
2924 chan = hdev->smp_data;
2925 hdev->smp_data = NULL;
2926 smp_del_chan(chan);
2927 }
2928}