blob: 589e015c51254d5b6a15eeebd6c8f90cd54df884 [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
Johan Hedberg903b71c2014-09-08 16:59:18 -07001611 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
1612 return SMP_AUTH_REQUIREMENTS;
1613
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001614 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1615 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001616 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001617
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001618 /* SMP over BR/EDR requires special treatment */
1619 if (conn->hcon->type == ACL_LINK) {
1620 /* We must have a BR/EDR SC link */
1621 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags))
1622 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1623
1624 set_bit(SMP_FLAG_SC, &smp->flags);
1625
1626 build_bredr_pairing_cmd(smp, req, &rsp);
1627
1628 key_size = min(req->max_key_size, rsp.max_key_size);
1629 if (check_enc_key_size(conn, key_size))
1630 return SMP_ENC_KEY_SIZE;
1631
1632 /* Clear bits which are generated but not distributed */
1633 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1634
1635 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1636 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1637 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1638
1639 smp_distribute_keys(smp);
1640 return 0;
1641 }
1642
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001643 build_pairing_cmd(conn, req, &rsp, auth);
1644
1645 if (rsp.auth_req & SMP_AUTH_SC)
1646 set_bit(SMP_FLAG_SC, &smp->flags);
1647
Johan Hedberg5be5e272014-09-10 17:58:54 -07001648 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001649 sec_level = BT_SECURITY_MEDIUM;
1650 else
1651 sec_level = authreq_to_seclevel(auth);
1652
Johan Hedbergc7262e72014-06-17 13:07:37 +03001653 if (sec_level > conn->hcon->pending_sec_level)
1654 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001655
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001656 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001657 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1658 u8 method;
1659
1660 method = get_auth_method(smp, conn->hcon->io_capability,
1661 req->io_capability);
1662 if (method == JUST_WORKS || method == JUST_CFM)
1663 return SMP_AUTH_REQUIREMENTS;
1664 }
1665
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001666 key_size = min(req->max_key_size, rsp.max_key_size);
1667 if (check_enc_key_size(conn, key_size))
1668 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001669
Johan Hedberge84a6b12013-12-02 10:49:03 +02001670 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001671
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001672 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1673 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001674
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001675 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001676
1677 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1678
1679 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1680 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1681 /* Clear bits which are generated but not distributed */
1682 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1683 /* Wait for Public Key from Initiating Device */
1684 return 0;
1685 } else {
1686 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1687 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001688
Brian Gix2b64d152011-12-21 16:12:12 -08001689 /* Request setup of TK */
1690 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1691 if (ret)
1692 return SMP_UNSPECIFIED;
1693
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001694 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001695}
1696
Johan Hedberg3b191462014-06-06 10:50:15 +03001697static u8 sc_send_public_key(struct smp_chan *smp)
1698{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001699 struct hci_dev *hdev = smp->conn->hcon->hdev;
1700
Johan Hedberg3b191462014-06-06 10:50:15 +03001701 BT_DBG("");
1702
Johan Hedberg70157ef2014-06-24 15:22:59 +03001703 if (test_bit(HCI_USE_DEBUG_KEYS, &hdev->dev_flags)) {
1704 BT_DBG("Using debug keys");
1705 memcpy(smp->local_pk, debug_pk, 64);
1706 memcpy(smp->local_sk, debug_sk, 32);
1707 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1708 } else {
1709 while (true) {
1710 /* Generate local key pair for Secure Connections */
1711 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1712 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001713
Johan Hedberg70157ef2014-06-24 15:22:59 +03001714 /* This is unlikely, but we need to check that
1715 * we didn't accidentially generate a debug key.
1716 */
1717 if (memcmp(smp->local_sk, debug_sk, 32))
1718 break;
1719 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001720 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001721
1722 BT_DBG("Local Public Key X: %32phN", smp->local_pk);
1723 BT_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1724 BT_DBG("Local Private Key: %32phN", smp->local_sk);
1725
1726 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1727
1728 return 0;
1729}
1730
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001731static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001732{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001733 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001734 struct l2cap_chan *chan = conn->smp;
1735 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001736 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001737 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001738 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001739
1740 BT_DBG("conn %p", conn);
1741
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001742 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001743 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001744
Johan Hedberg40bef302014-07-16 11:42:27 +03001745 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001746 return SMP_CMD_NOTSUPP;
1747
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001748 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001749
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001750 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001751
1752 key_size = min(req->max_key_size, rsp->max_key_size);
1753 if (check_enc_key_size(conn, key_size))
1754 return SMP_ENC_KEY_SIZE;
1755
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001756 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001757
Johan Hedberg903b71c2014-09-08 16:59:18 -07001758 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
1759 return SMP_AUTH_REQUIREMENTS;
1760
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001761 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1762 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1763
1764 /* Update remote key distribution in case the remote cleared
1765 * some bits that we had enabled in our request.
1766 */
1767 smp->remote_key_dist &= rsp->resp_key_dist;
1768
1769 /* For BR/EDR this means we're done and can start phase 3 */
1770 if (conn->hcon->type == ACL_LINK) {
1771 /* Clear bits which are generated but not distributed */
1772 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1773 smp_distribute_keys(smp);
1774 return 0;
1775 }
1776
Johan Hedberg65668772014-05-16 11:03:34 +03001777 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1778 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001779 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1780 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001781
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001782 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001783 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1784 u8 method;
1785
1786 method = get_auth_method(smp, req->io_capability,
1787 rsp->io_capability);
1788 if (method == JUST_WORKS || method == JUST_CFM)
1789 return SMP_AUTH_REQUIREMENTS;
1790 }
1791
Johan Hedberge84a6b12013-12-02 10:49:03 +02001792 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001793
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001794 /* Update remote key distribution in case the remote cleared
1795 * some bits that we had enabled in our request.
1796 */
1797 smp->remote_key_dist &= rsp->resp_key_dist;
1798
Johan Hedberg3b191462014-06-06 10:50:15 +03001799 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1800 /* Clear bits which are generated but not distributed */
1801 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1802 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1803 return sc_send_public_key(smp);
1804 }
1805
Johan Hedbergc05b9332014-09-10 17:37:42 -07001806 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001807
Johan Hedberg476585e2012-06-06 18:54:15 +08001808 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001809 if (ret)
1810 return SMP_UNSPECIFIED;
1811
Johan Hedberg4a74d652014-05-20 09:45:50 +03001812 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001813
1814 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001815 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001816 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001817
1818 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001819}
1820
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001821static u8 sc_check_confirm(struct smp_chan *smp)
1822{
1823 struct l2cap_conn *conn = smp->conn;
1824
1825 BT_DBG("");
1826
1827 /* Public Key exchange must happen before any other steps */
1828 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1829 return SMP_UNSPECIFIED;
1830
Johan Hedberg38606f12014-06-25 11:10:28 +03001831 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1832 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1833
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001834 if (conn->hcon->out) {
1835 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1836 smp->prnd);
1837 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1838 }
1839
1840 return 0;
1841}
1842
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001843static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001844{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001845 struct l2cap_chan *chan = conn->smp;
1846 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001847
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001848 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1849
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001850 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001851 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001852
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001853 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1854 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001855
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001856 if (test_bit(SMP_FLAG_SC, &smp->flags))
1857 return sc_check_confirm(smp);
1858
Johan Hedbergb28b4942014-09-05 22:19:55 +03001859 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001860 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1861 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001862 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1863 return 0;
1864 }
1865
1866 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001867 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001868 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001869 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001870
1871 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001872}
1873
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001874static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001875{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001876 struct l2cap_chan *chan = conn->smp;
1877 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001878 struct hci_conn *hcon = conn->hcon;
1879 u8 *pkax, *pkbx, *na, *nb;
1880 u32 passkey;
1881 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001882
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001883 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001884
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001885 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001886 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001887
Johan Hedberg943a7322014-03-18 12:58:24 +02001888 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001889 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001890
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001891 if (!test_bit(SMP_FLAG_SC, &smp->flags))
1892 return smp_random(smp);
1893
Johan Hedberg38606f12014-06-25 11:10:28 +03001894 /* Passkey entry has special treatment */
1895 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1896 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
1897
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001898 if (hcon->out) {
1899 u8 cfm[16];
1900
1901 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1902 smp->rrnd, 0, cfm);
1903 if (err)
1904 return SMP_UNSPECIFIED;
1905
1906 if (memcmp(smp->pcnf, cfm, 16))
1907 return SMP_CONFIRM_FAILED;
1908
1909 pkax = smp->local_pk;
1910 pkbx = smp->remote_pk;
1911 na = smp->prnd;
1912 nb = smp->rrnd;
1913 } else {
1914 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1915 smp->prnd);
1916 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1917
1918 pkax = smp->remote_pk;
1919 pkbx = smp->local_pk;
1920 na = smp->rrnd;
1921 nb = smp->prnd;
1922 }
1923
Johan Hedberg760b0182014-06-06 11:44:05 +03001924 /* Generate MacKey and LTK */
1925 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
1926 if (err)
1927 return SMP_UNSPECIFIED;
1928
Johan Hedbergdddd3052014-06-01 15:38:09 +03001929 if (smp->method == JUST_WORKS) {
1930 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03001931 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001932 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1933 }
1934 return 0;
1935 }
1936
Johan Hedberg38606f12014-06-25 11:10:28 +03001937 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001938 if (err)
1939 return SMP_UNSPECIFIED;
1940
Johan Hedberg38606f12014-06-25 11:10:28 +03001941 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
1942 hcon->dst_type, passkey, 0);
1943 if (err)
1944 return SMP_UNSPECIFIED;
1945
1946 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1947
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001948 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001949}
1950
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001951static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001952{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001953 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001954 struct hci_conn *hcon = conn->hcon;
1955
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001956 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001957 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001958 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001959
Johan Hedberga6f78332014-09-10 17:37:45 -07001960 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001961 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001962
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001963 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001964 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001965
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001966 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1967 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001968
Johan Hedbergfe59a052014-07-01 19:14:12 +03001969 /* We never store STKs for master role, so clear this flag */
1970 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1971
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001972 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001973}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001974
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001975bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
1976 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03001977{
1978 if (sec_level == BT_SECURITY_LOW)
1979 return true;
1980
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001981 /* If we're encrypted with an STK but the caller prefers using
1982 * LTK claim insufficient security. This way we allow the
1983 * connection to be re-encrypted with an LTK, even if the LTK
1984 * provides the same level of security. Only exception is if we
1985 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001986 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001987 if (key_pref == SMP_USE_LTK &&
1988 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001989 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001990 return false;
1991
Johan Hedberg854f4722014-07-01 18:40:20 +03001992 if (hcon->sec_level >= sec_level)
1993 return true;
1994
1995 return false;
1996}
1997
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001998static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001999{
2000 struct smp_cmd_security_req *rp = (void *) skb->data;
2001 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002002 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002003 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002004 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002005 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002006
2007 BT_DBG("conn %p", conn);
2008
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002009 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002010 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002011
Johan Hedberg40bef302014-07-16 11:42:27 +03002012 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002013 return SMP_CMD_NOTSUPP;
2014
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002015 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002016
Johan Hedberg903b71c2014-09-08 16:59:18 -07002017 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
2018 return SMP_AUTH_REQUIREMENTS;
2019
Johan Hedberg5be5e272014-09-10 17:58:54 -07002020 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002021 sec_level = BT_SECURITY_MEDIUM;
2022 else
2023 sec_level = authreq_to_seclevel(auth);
2024
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002025 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002026 return 0;
2027
Johan Hedbergc7262e72014-06-17 13:07:37 +03002028 if (sec_level > hcon->pending_sec_level)
2029 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002030
Johan Hedberg4dab7862012-06-07 14:58:37 +08002031 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002032 return 0;
2033
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002034 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002035 if (!smp)
2036 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002037
Johan Hedbergb6ae8452014-07-30 09:22:22 +03002038 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002039 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002040 return SMP_PAIRING_NOTSUPP;
2041
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002042 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002043
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002044 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002045 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002046
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002047 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2048 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002049
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002050 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002051 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002052
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002053 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002054}
2055
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002056int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002057{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002058 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002059 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002060 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002061 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002062 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002063
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002064 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2065
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002066 /* This may be NULL if there's an unexpected disconnection */
2067 if (!conn)
2068 return 1;
2069
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002070 chan = conn->smp;
2071
Johan Hedberg757aee02013-04-24 13:05:32 +03002072 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002073 return 1;
2074
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002075 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002076 return 1;
2077
Johan Hedbergc7262e72014-06-17 13:07:37 +03002078 if (sec_level > hcon->pending_sec_level)
2079 hcon->pending_sec_level = sec_level;
2080
Johan Hedberg40bef302014-07-16 11:42:27 +03002081 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002082 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2083 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002084
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002085 l2cap_chan_lock(chan);
2086
2087 /* If SMP is already in progress ignore this request */
2088 if (chan->data) {
2089 ret = 0;
2090 goto unlock;
2091 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002092
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002093 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002094 if (!smp) {
2095 ret = 1;
2096 goto unlock;
2097 }
Brian Gix2b64d152011-12-21 16:12:12 -08002098
2099 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002100
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002101 if (test_bit(HCI_SC_ENABLED, &hcon->hdev->dev_flags))
2102 authreq |= SMP_AUTH_SC;
2103
Johan Hedberg79897d22014-06-01 09:45:24 +03002104 /* Require MITM if IO Capability allows or the security level
2105 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002106 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002107 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002108 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002109 authreq |= SMP_AUTH_MITM;
2110
Johan Hedberg40bef302014-07-16 11:42:27 +03002111 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002112 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002113
Brian Gix2b64d152011-12-21 16:12:12 -08002114 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002115 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2116 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002117
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002118 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002119 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002120 } else {
2121 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002122 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002123 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002124 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002125 }
2126
Johan Hedberg4a74d652014-05-20 09:45:50 +03002127 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002128 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002129
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002130unlock:
2131 l2cap_chan_unlock(chan);
2132 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002133}
2134
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002135static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2136{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002137 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002138 struct l2cap_chan *chan = conn->smp;
2139 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002140
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002141 BT_DBG("conn %p", conn);
2142
2143 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002144 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002145
Johan Hedbergb28b4942014-09-05 22:19:55 +03002146 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002147
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002148 skb_pull(skb, sizeof(*rp));
2149
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002150 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002151
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002152 return 0;
2153}
2154
2155static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2156{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002157 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002158 struct l2cap_chan *chan = conn->smp;
2159 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002160 struct hci_dev *hdev = conn->hcon->hdev;
2161 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002162 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002163 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002164
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002165 BT_DBG("conn %p", conn);
2166
2167 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002168 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002169
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002170 /* Mark the information as received */
2171 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2172
Johan Hedbergb28b4942014-09-05 22:19:55 +03002173 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2174 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002175 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2176 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002177
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002178 skb_pull(skb, sizeof(*rp));
2179
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002180 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002181 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002182 authenticated, smp->tk, smp->enc_key_size,
2183 rp->ediv, rp->rand);
2184 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002185 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002186 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002187
2188 return 0;
2189}
2190
Johan Hedbergfd349c02014-02-18 10:19:36 +02002191static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2192{
2193 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002194 struct l2cap_chan *chan = conn->smp;
2195 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002196
2197 BT_DBG("");
2198
2199 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002200 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002201
Johan Hedbergb28b4942014-09-05 22:19:55 +03002202 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002203
Johan Hedbergfd349c02014-02-18 10:19:36 +02002204 skb_pull(skb, sizeof(*info));
2205
2206 memcpy(smp->irk, info->irk, 16);
2207
2208 return 0;
2209}
2210
2211static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2212 struct sk_buff *skb)
2213{
2214 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002215 struct l2cap_chan *chan = conn->smp;
2216 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002217 struct hci_conn *hcon = conn->hcon;
2218 bdaddr_t rpa;
2219
2220 BT_DBG("");
2221
2222 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002223 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002224
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002225 /* Mark the information as received */
2226 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2227
Johan Hedbergb28b4942014-09-05 22:19:55 +03002228 if (smp->remote_key_dist & SMP_DIST_SIGN)
2229 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2230
Johan Hedbergfd349c02014-02-18 10:19:36 +02002231 skb_pull(skb, sizeof(*info));
2232
Johan Hedberga9a58f82014-02-25 22:24:37 +02002233 /* Strictly speaking the Core Specification (4.1) allows sending
2234 * an empty address which would force us to rely on just the IRK
2235 * as "identity information". However, since such
2236 * implementations are not known of and in order to not over
2237 * complicate our implementation, simply pretend that we never
2238 * received an IRK for such a device.
2239 */
2240 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
2241 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002242 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002243 }
2244
Johan Hedbergfd349c02014-02-18 10:19:36 +02002245 bacpy(&smp->id_addr, &info->bdaddr);
2246 smp->id_addr_type = info->addr_type;
2247
2248 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2249 bacpy(&rpa, &hcon->dst);
2250 else
2251 bacpy(&rpa, BDADDR_ANY);
2252
Johan Hedberg23d0e122014-02-19 14:57:46 +02002253 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2254 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002255
Johan Hedberg31dd6242014-06-27 14:23:02 +03002256distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002257 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2258 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002259
2260 return 0;
2261}
2262
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002263static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2264{
2265 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002266 struct l2cap_chan *chan = conn->smp;
2267 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002268 struct smp_csrk *csrk;
2269
2270 BT_DBG("conn %p", conn);
2271
2272 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002273 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002274
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002275 /* Mark the information as received */
2276 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2277
2278 skb_pull(skb, sizeof(*rp));
2279
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002280 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2281 if (csrk) {
2282 csrk->master = 0x01;
2283 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2284 }
2285 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002286 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002287
2288 return 0;
2289}
2290
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002291static u8 sc_select_method(struct smp_chan *smp)
2292{
2293 struct l2cap_conn *conn = smp->conn;
2294 struct hci_conn *hcon = conn->hcon;
2295 struct smp_cmd_pairing *local, *remote;
2296 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2297
2298 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2299 * which are needed as inputs to some crypto functions. To get
2300 * the "struct smp_cmd_pairing" from them we need to skip the
2301 * first byte which contains the opcode.
2302 */
2303 if (hcon->out) {
2304 local = (void *) &smp->preq[1];
2305 remote = (void *) &smp->prsp[1];
2306 } else {
2307 local = (void *) &smp->prsp[1];
2308 remote = (void *) &smp->preq[1];
2309 }
2310
2311 local_io = local->io_capability;
2312 remote_io = remote->io_capability;
2313
2314 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2315 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2316
2317 /* If either side wants MITM, look up the method from the table,
2318 * otherwise use JUST WORKS.
2319 */
2320 if (local_mitm || remote_mitm)
2321 method = get_auth_method(smp, local_io, remote_io);
2322 else
2323 method = JUST_WORKS;
2324
2325 /* Don't confirm locally initiated pairing attempts */
2326 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2327 method = JUST_WORKS;
2328
2329 return method;
2330}
2331
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002332static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2333{
2334 struct smp_cmd_public_key *key = (void *) skb->data;
2335 struct hci_conn *hcon = conn->hcon;
2336 struct l2cap_chan *chan = conn->smp;
2337 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002338 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002339 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002340 int err;
2341
2342 BT_DBG("conn %p", conn);
2343
2344 if (skb->len < sizeof(*key))
2345 return SMP_INVALID_PARAMS;
2346
2347 memcpy(smp->remote_pk, key, 64);
2348
2349 /* Non-initiating device sends its public key after receiving
2350 * the key from the initiating device.
2351 */
2352 if (!hcon->out) {
2353 err = sc_send_public_key(smp);
2354 if (err)
2355 return err;
2356 }
2357
2358 BT_DBG("Remote Public Key X: %32phN", smp->remote_pk);
2359 BT_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
2360
2361 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2362 return SMP_UNSPECIFIED;
2363
2364 BT_DBG("DHKey %32phN", smp->dhkey);
2365
2366 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2367
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002368 smp->method = sc_select_method(smp);
2369
2370 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2371
2372 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2373 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2374 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2375 else
2376 hcon->pending_sec_level = BT_SECURITY_FIPS;
2377
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002378 if (!memcmp(debug_pk, smp->remote_pk, 64))
2379 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2380
Johan Hedberg38606f12014-06-25 11:10:28 +03002381 if (smp->method == DSP_PASSKEY) {
2382 get_random_bytes(&hcon->passkey_notify,
2383 sizeof(hcon->passkey_notify));
2384 hcon->passkey_notify %= 1000000;
2385 hcon->passkey_entered = 0;
2386 smp->passkey_round = 0;
2387 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2388 hcon->dst_type,
2389 hcon->passkey_notify,
2390 hcon->passkey_entered))
2391 return SMP_UNSPECIFIED;
2392 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2393 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2394 }
2395
2396 if (hcon->out)
2397 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2398
2399 if (smp->method == REQ_PASSKEY) {
2400 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2401 hcon->dst_type))
2402 return SMP_UNSPECIFIED;
2403 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2404 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2405 return 0;
2406 }
2407
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002408 /* The Initiating device waits for the non-initiating device to
2409 * send the confirm value.
2410 */
2411 if (conn->hcon->out)
2412 return 0;
2413
2414 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2415 0, cfm.confirm_val);
2416 if (err)
2417 return SMP_UNSPECIFIED;
2418
2419 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2420 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2421
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002422 return 0;
2423}
2424
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002425static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2426{
2427 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2428 struct l2cap_chan *chan = conn->smp;
2429 struct hci_conn *hcon = conn->hcon;
2430 struct smp_chan *smp = chan->data;
2431 u8 a[7], b[7], *local_addr, *remote_addr;
2432 u8 io_cap[3], r[16], e[16];
2433 int err;
2434
2435 BT_DBG("conn %p", conn);
2436
2437 if (skb->len < sizeof(*check))
2438 return SMP_INVALID_PARAMS;
2439
2440 memcpy(a, &hcon->init_addr, 6);
2441 memcpy(b, &hcon->resp_addr, 6);
2442 a[6] = hcon->init_addr_type;
2443 b[6] = hcon->resp_addr_type;
2444
2445 if (hcon->out) {
2446 local_addr = a;
2447 remote_addr = b;
2448 memcpy(io_cap, &smp->prsp[1], 3);
2449 } else {
2450 local_addr = b;
2451 remote_addr = a;
2452 memcpy(io_cap, &smp->preq[1], 3);
2453 }
2454
2455 memset(r, 0, sizeof(r));
2456
Johan Hedberg38606f12014-06-25 11:10:28 +03002457 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2458 put_unaligned_le32(hcon->passkey_notify, r);
2459
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002460 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2461 io_cap, remote_addr, local_addr, e);
2462 if (err)
2463 return SMP_UNSPECIFIED;
2464
2465 if (memcmp(check->e, e, 16))
2466 return SMP_DHKEY_CHECK_FAILED;
2467
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002468 if (!hcon->out) {
2469 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2470 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2471 return 0;
2472 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002473
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002474 /* Slave sends DHKey check as response to master */
2475 sc_dhkey_check(smp);
2476 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002477
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002478 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002479
2480 if (hcon->out) {
2481 hci_le_start_enc(hcon, 0, 0, smp->tk);
2482 hcon->enc_key_size = smp->enc_key_size;
2483 }
2484
2485 return 0;
2486}
2487
Johan Hedberg1408bb62014-06-04 22:45:57 +03002488static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2489 struct sk_buff *skb)
2490{
2491 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2492
2493 BT_DBG("value 0x%02x", kp->value);
2494
2495 return 0;
2496}
2497
Johan Hedberg4befb862014-08-11 22:06:38 +03002498static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002499{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002500 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002501 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002502 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002503 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002504 int err = 0;
2505
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002506 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002507 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002508
Marcel Holtmann06ae3312013-10-18 03:43:00 -07002509 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002510 reason = SMP_PAIRING_NOTSUPP;
2511 goto done;
2512 }
2513
Marcel Holtmann92381f52013-10-03 01:23:08 -07002514 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002515 skb_pull(skb, sizeof(code));
2516
Johan Hedbergb28b4942014-09-05 22:19:55 +03002517 smp = chan->data;
2518
2519 if (code > SMP_CMD_MAX)
2520 goto drop;
2521
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002522 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002523 goto drop;
2524
2525 /* If we don't have a context the only allowed commands are
2526 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002527 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002528 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2529 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002530
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002531 switch (code) {
2532 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002533 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002534 break;
2535
2536 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002537 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002538 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002539 break;
2540
2541 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002542 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002543 break;
2544
2545 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002546 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002547 break;
2548
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002549 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002550 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002551 break;
2552
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002553 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002554 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002555 break;
2556
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002557 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002558 reason = smp_cmd_encrypt_info(conn, skb);
2559 break;
2560
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002561 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002562 reason = smp_cmd_master_ident(conn, skb);
2563 break;
2564
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002565 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002566 reason = smp_cmd_ident_info(conn, skb);
2567 break;
2568
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002569 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002570 reason = smp_cmd_ident_addr_info(conn, skb);
2571 break;
2572
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002573 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002574 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002575 break;
2576
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002577 case SMP_CMD_PUBLIC_KEY:
2578 reason = smp_cmd_public_key(conn, skb);
2579 break;
2580
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002581 case SMP_CMD_DHKEY_CHECK:
2582 reason = smp_cmd_dhkey_check(conn, skb);
2583 break;
2584
Johan Hedberg1408bb62014-06-04 22:45:57 +03002585 case SMP_CMD_KEYPRESS_NOTIFY:
2586 reason = smp_cmd_keypress_notify(conn, skb);
2587 break;
2588
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002589 default:
2590 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002591 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002592 goto done;
2593 }
2594
2595done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002596 if (!err) {
2597 if (reason)
2598 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002599 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002600 }
2601
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002602 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002603
2604drop:
2605 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2606 code, &hcon->dst);
2607 kfree_skb(skb);
2608 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002609}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002610
Johan Hedberg70db83c2014-08-08 09:37:16 +03002611static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2612{
2613 struct l2cap_conn *conn = chan->conn;
2614
2615 BT_DBG("chan %p", chan);
2616
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002617 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002618 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002619
Johan Hedberg70db83c2014-08-08 09:37:16 +03002620 conn->smp = NULL;
2621 l2cap_chan_put(chan);
2622}
2623
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002624static void bredr_pairing(struct l2cap_chan *chan)
2625{
2626 struct l2cap_conn *conn = chan->conn;
2627 struct hci_conn *hcon = conn->hcon;
2628 struct hci_dev *hdev = hcon->hdev;
2629 struct smp_cmd_pairing req;
2630 struct smp_chan *smp;
2631
2632 BT_DBG("chan %p", chan);
2633
2634 /* Only new pairings are interesting */
2635 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2636 return;
2637
2638 /* Don't bother if we're not encrypted */
2639 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2640 return;
2641
2642 /* Only master may initiate SMP over BR/EDR */
2643 if (hcon->role != HCI_ROLE_MASTER)
2644 return;
2645
2646 /* Secure Connections support must be enabled */
2647 if (!test_bit(HCI_SC_ENABLED, &hdev->dev_flags))
2648 return;
2649
2650 /* BR/EDR must use Secure Connections for SMP */
2651 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
2652 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2653 return;
2654
2655 /* If our LE support is not enabled don't do anything */
2656 if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
2657 return;
2658
2659 /* Don't bother if remote LE support is not enabled */
2660 if (!lmp_host_le_capable(hcon))
2661 return;
2662
2663 /* Remote must support SMP fixed chan for BR/EDR */
2664 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2665 return;
2666
2667 /* Don't bother if SMP is already ongoing */
2668 if (chan->data)
2669 return;
2670
2671 smp = smp_chan_create(conn);
2672 if (!smp) {
2673 BT_ERR("%s unable to create SMP context for BR/EDR",
2674 hdev->name);
2675 return;
2676 }
2677
2678 set_bit(SMP_FLAG_SC, &smp->flags);
2679
2680 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2681
2682 /* Prepare and send the BR/EDR SMP Pairing Request */
2683 build_bredr_pairing_cmd(smp, &req, NULL);
2684
2685 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2686 memcpy(&smp->preq[1], &req, sizeof(req));
2687
2688 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2689 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2690}
2691
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002692static void smp_resume_cb(struct l2cap_chan *chan)
2693{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002694 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002695 struct l2cap_conn *conn = chan->conn;
2696 struct hci_conn *hcon = conn->hcon;
2697
2698 BT_DBG("chan %p", chan);
2699
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002700 if (hcon->type == ACL_LINK) {
2701 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002702 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002703 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002704
Johan Hedberg86d14072014-08-11 22:06:43 +03002705 if (!smp)
2706 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002707
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002708 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2709 return;
2710
Johan Hedberg86d14072014-08-11 22:06:43 +03002711 cancel_delayed_work(&smp->security_timer);
2712
Johan Hedbergd6268e82014-09-05 22:19:51 +03002713 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002714}
2715
Johan Hedberg70db83c2014-08-08 09:37:16 +03002716static void smp_ready_cb(struct l2cap_chan *chan)
2717{
2718 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002719 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002720
2721 BT_DBG("chan %p", chan);
2722
2723 conn->smp = chan;
2724 l2cap_chan_hold(chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002725
2726 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2727 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002728}
2729
Johan Hedberg4befb862014-08-11 22:06:38 +03002730static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2731{
2732 int err;
2733
2734 BT_DBG("chan %p", chan);
2735
2736 err = smp_sig_channel(chan, skb);
2737 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002738 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002739
Johan Hedbergb68fda62014-08-11 22:06:40 +03002740 if (smp)
2741 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002742
Johan Hedberg1e91c292014-08-18 20:33:29 +03002743 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002744 }
2745
2746 return err;
2747}
2748
Johan Hedberg70db83c2014-08-08 09:37:16 +03002749static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2750 unsigned long hdr_len,
2751 unsigned long len, int nb)
2752{
2753 struct sk_buff *skb;
2754
2755 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2756 if (!skb)
2757 return ERR_PTR(-ENOMEM);
2758
2759 skb->priority = HCI_PRIO_MAX;
2760 bt_cb(skb)->chan = chan;
2761
2762 return skb;
2763}
2764
2765static const struct l2cap_ops smp_chan_ops = {
2766 .name = "Security Manager",
2767 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002768 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002769 .alloc_skb = smp_alloc_skb_cb,
2770 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002771 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002772
2773 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002774 .state_change = l2cap_chan_no_state_change,
2775 .close = l2cap_chan_no_close,
2776 .defer = l2cap_chan_no_defer,
2777 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002778 .set_shutdown = l2cap_chan_no_set_shutdown,
2779 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2780 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2781};
2782
2783static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2784{
2785 struct l2cap_chan *chan;
2786
2787 BT_DBG("pchan %p", pchan);
2788
2789 chan = l2cap_chan_create();
2790 if (!chan)
2791 return NULL;
2792
2793 chan->chan_type = pchan->chan_type;
2794 chan->ops = &smp_chan_ops;
2795 chan->scid = pchan->scid;
2796 chan->dcid = chan->scid;
2797 chan->imtu = pchan->imtu;
2798 chan->omtu = pchan->omtu;
2799 chan->mode = pchan->mode;
2800
Johan Hedbergabe84902014-11-12 22:22:21 +02002801 /* Other L2CAP channels may request SMP routines in order to
2802 * change the security level. This means that the SMP channel
2803 * lock must be considered in its own category to avoid lockdep
2804 * warnings.
2805 */
2806 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
2807
Johan Hedberg70db83c2014-08-08 09:37:16 +03002808 BT_DBG("created chan %p", chan);
2809
2810 return chan;
2811}
2812
2813static const struct l2cap_ops smp_root_chan_ops = {
2814 .name = "Security Manager Root",
2815 .new_connection = smp_new_conn_cb,
2816
2817 /* None of these are implemented for the root channel */
2818 .close = l2cap_chan_no_close,
2819 .alloc_skb = l2cap_chan_no_alloc_skb,
2820 .recv = l2cap_chan_no_recv,
2821 .state_change = l2cap_chan_no_state_change,
2822 .teardown = l2cap_chan_no_teardown,
2823 .ready = l2cap_chan_no_ready,
2824 .defer = l2cap_chan_no_defer,
2825 .suspend = l2cap_chan_no_suspend,
2826 .resume = l2cap_chan_no_resume,
2827 .set_shutdown = l2cap_chan_no_set_shutdown,
2828 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2829 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2830};
2831
Johan Hedbergef8efe42014-08-13 15:12:32 +03002832static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002833{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002834 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002835 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002836
Johan Hedbergef8efe42014-08-13 15:12:32 +03002837 if (cid == L2CAP_CID_SMP_BREDR) {
2838 tfm_aes = NULL;
2839 goto create_chan;
2840 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03002841
Johan Hedbergadae20c2014-11-13 14:37:48 +02002842 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002843 if (IS_ERR(tfm_aes)) {
Johan Hedberg711eafe2014-08-08 09:32:52 +03002844 BT_ERR("Unable to create crypto context");
Johan Hedbergef8efe42014-08-13 15:12:32 +03002845 return ERR_PTR(PTR_ERR(tfm_aes));
Johan Hedberg711eafe2014-08-08 09:32:52 +03002846 }
2847
Johan Hedbergef8efe42014-08-13 15:12:32 +03002848create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03002849 chan = l2cap_chan_create();
2850 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002851 crypto_free_blkcipher(tfm_aes);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002852 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002853 }
2854
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002855 chan->data = tfm_aes;
2856
Johan Hedbergef8efe42014-08-13 15:12:32 +03002857 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002858
2859 l2cap_chan_set_defaults(chan);
2860
2861 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002862 if (cid == L2CAP_CID_SMP)
2863 chan->src_type = BDADDR_LE_PUBLIC;
2864 else
2865 chan->src_type = BDADDR_BREDR;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002866 chan->state = BT_LISTEN;
2867 chan->mode = L2CAP_MODE_BASIC;
2868 chan->imtu = L2CAP_DEFAULT_MTU;
2869 chan->ops = &smp_root_chan_ops;
2870
Johan Hedbergabe84902014-11-12 22:22:21 +02002871 /* Set correct nesting level for a parent/listening channel */
2872 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
2873
Johan Hedbergef8efe42014-08-13 15:12:32 +03002874 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03002875}
2876
Johan Hedbergef8efe42014-08-13 15:12:32 +03002877static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002878{
Johan Hedbergef8efe42014-08-13 15:12:32 +03002879 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002880
Johan Hedbergef8efe42014-08-13 15:12:32 +03002881 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002882
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002883 tfm_aes = chan->data;
2884 if (tfm_aes) {
2885 chan->data = NULL;
2886 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002887 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03002888
Johan Hedberg70db83c2014-08-08 09:37:16 +03002889 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002890}
Johan Hedbergef8efe42014-08-13 15:12:32 +03002891
2892int smp_register(struct hci_dev *hdev)
2893{
2894 struct l2cap_chan *chan;
2895
2896 BT_DBG("%s", hdev->name);
2897
2898 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
2899 if (IS_ERR(chan))
2900 return PTR_ERR(chan);
2901
2902 hdev->smp_data = chan;
2903
2904 if (!lmp_sc_capable(hdev) &&
2905 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2906 return 0;
2907
2908 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
2909 if (IS_ERR(chan)) {
2910 int err = PTR_ERR(chan);
2911 chan = hdev->smp_data;
2912 hdev->smp_data = NULL;
2913 smp_del_chan(chan);
2914 return err;
2915 }
2916
2917 hdev->smp_bredr_data = chan;
2918
2919 return 0;
2920}
2921
2922void smp_unregister(struct hci_dev *hdev)
2923{
2924 struct l2cap_chan *chan;
2925
2926 if (hdev->smp_bredr_data) {
2927 chan = hdev->smp_bredr_data;
2928 hdev->smp_bredr_data = NULL;
2929 smp_del_chan(chan);
2930 }
2931
2932 if (hdev->smp_data) {
2933 chan = hdev->smp_data;
2934 hdev->smp_data = NULL;
2935 smp_del_chan(chan);
2936 }
2937}