blob: b67749bb55bffa511fd180ef52b2e9c271fa35a1 [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 Hedbergc7a3d572014-12-01 22:03:16 +020035/* Low-level debug macros to be used for stuff that we don't want
36 * accidentially in dmesg, i.e. the values of the various crypto keys
37 * and the inputs & outputs of crypto functions.
38 */
39#ifdef DEBUG
40#define SMP_DBG(fmt, ...) printk(KERN_DEBUG "%s: " fmt, __func__, \
41 ##__VA_ARGS__)
42#else
43#define SMP_DBG(fmt, ...) no_printk(KERN_DEBUG "%s: " fmt, __func__, \
44 ##__VA_ARGS__)
45#endif
46
Johan Hedbergb28b4942014-09-05 22:19:55 +030047#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030048
Johan Hedberg3b191462014-06-06 10:50:15 +030049/* Keys which are not distributed with Secure Connections */
50#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
51
Marcel Holtmann17b02e62012-03-01 14:32:37 -080052#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030053
Johan Hedberg0edb14d2014-05-26 13:29:28 +030054#define AUTH_REQ_MASK(dev) (test_bit(HCI_SC_ENABLED, &(dev)->dev_flags) ? \
55 0x1f : 0x07)
56#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020057
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030058/* Maximum message length that can be passed to aes_cmac */
59#define CMAC_MSG_MAX 80
60
Johan Hedberg533e35d2014-06-16 19:25:18 +030061enum {
62 SMP_FLAG_TK_VALID,
63 SMP_FLAG_CFM_PENDING,
64 SMP_FLAG_MITM_AUTH,
65 SMP_FLAG_COMPLETE,
66 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030067 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030068 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030069 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030070 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030071 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg02b05bd2014-10-26 21:19:10 +010072 SMP_FLAG_OOB,
Johan Hedberg533e35d2014-06-16 19:25:18 +030073};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030074
75struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030076 struct l2cap_conn *conn;
77 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030078 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030079
Johan Hedberg4bc58f52014-05-20 09:45:47 +030080 u8 preq[7]; /* SMP Pairing Request */
81 u8 prsp[7]; /* SMP Pairing Response */
82 u8 prnd[16]; /* SMP Pairing Random (local) */
83 u8 rrnd[16]; /* SMP Pairing Random (remote) */
84 u8 pcnf[16]; /* SMP Pairing Confirm */
85 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberga29b0732014-10-28 15:17:05 +010086 u8 rr[16];
Johan Hedberg4bc58f52014-05-20 09:45:47 +030087 u8 enc_key_size;
88 u8 remote_key_dist;
89 bdaddr_t id_addr;
90 u8 id_addr_type;
91 u8 irk[16];
92 struct smp_csrk *csrk;
93 struct smp_csrk *slave_csrk;
94 struct smp_ltk *ltk;
95 struct smp_ltk *slave_ltk;
96 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +030097 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +030098 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +030099 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300100 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300101
Johan Hedberg3b191462014-06-06 10:50:15 +0300102 /* Secure Connections variables */
103 u8 local_pk[64];
104 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300105 u8 remote_pk[64];
106 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300107 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300108
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300109 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +0300110 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300111};
112
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300113/* These debug key values are defined in the SMP section of the core
114 * specification. debug_pk is the public debug key and debug_sk the
115 * private debug key.
116 */
117static const u8 debug_pk[64] = {
118 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
119 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
120 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
121 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
122
123 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
124 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
125 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
126 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
127};
128
129static const u8 debug_sk[32] = {
130 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
131 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
132 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
133 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
134};
135
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300136static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300137{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300138 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300139
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300140 for (i = 0; i < len; i++)
141 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300142}
143
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200144/* The following functions map to the LE SC SMP crypto functions
145 * AES-CMAC, f4, f5, f6, g2 and h6.
146 */
147
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300148static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
149 size_t len, u8 mac[16])
150{
151 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
152 struct hash_desc desc;
153 struct scatterlist sg;
154 int err;
155
156 if (len > CMAC_MSG_MAX)
157 return -EFBIG;
158
159 if (!tfm) {
160 BT_ERR("tfm %p", tfm);
161 return -EINVAL;
162 }
163
164 desc.tfm = tfm;
165 desc.flags = 0;
166
167 crypto_hash_init(&desc);
168
169 /* Swap key and message from LSB to MSB */
170 swap_buf(k, tmp, 16);
171 swap_buf(m, msg_msb, len);
172
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200173 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
174 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300175
176 err = crypto_hash_setkey(tfm, tmp, 16);
177 if (err) {
178 BT_ERR("cipher setkey failed: %d", err);
179 return err;
180 }
181
182 sg_init_one(&sg, msg_msb, len);
183
184 err = crypto_hash_update(&desc, &sg, len);
185 if (err) {
186 BT_ERR("Hash update error %d", err);
187 return err;
188 }
189
190 err = crypto_hash_final(&desc, mac_msb);
191 if (err) {
192 BT_ERR("Hash final error %d", err);
193 return err;
194 }
195
196 swap_buf(mac_msb, mac, 16);
197
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200198 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300199
200 return 0;
201}
202
203static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
204 const u8 x[16], u8 z, u8 res[16])
205{
206 u8 m[65];
207 int err;
208
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200209 SMP_DBG("u %32phN", u);
210 SMP_DBG("v %32phN", v);
211 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300212
213 m[0] = z;
214 memcpy(m + 1, v, 32);
215 memcpy(m + 33, u, 32);
216
217 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
218 if (err)
219 return err;
220
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200221 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300222
223 return err;
224}
225
Johan Hedberg760b0182014-06-06 11:44:05 +0300226static int smp_f5(struct crypto_hash *tfm_cmac, u8 w[32], u8 n1[16], u8 n2[16],
227 u8 a1[7], u8 a2[7], u8 mackey[16], u8 ltk[16])
228{
229 /* The btle, salt and length "magic" values are as defined in
230 * the SMP section of the Bluetooth core specification. In ASCII
231 * the btle value ends up being 'btle'. The salt is just a
232 * random number whereas length is the value 256 in little
233 * endian format.
234 */
235 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
236 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
237 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
238 const u8 length[2] = { 0x00, 0x01 };
239 u8 m[53], t[16];
240 int err;
241
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200242 SMP_DBG("w %32phN", w);
243 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
244 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300245
246 err = aes_cmac(tfm_cmac, salt, w, 32, t);
247 if (err)
248 return err;
249
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200250 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300251
252 memcpy(m, length, 2);
253 memcpy(m + 2, a2, 7);
254 memcpy(m + 9, a1, 7);
255 memcpy(m + 16, n2, 16);
256 memcpy(m + 32, n1, 16);
257 memcpy(m + 48, btle, 4);
258
259 m[52] = 0; /* Counter */
260
261 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
262 if (err)
263 return err;
264
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200265 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300266
267 m[52] = 1; /* Counter */
268
269 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
270 if (err)
271 return err;
272
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200273 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300274
275 return 0;
276}
277
278static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
279 const u8 n1[16], u8 n2[16], const u8 r[16],
280 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
281 u8 res[16])
282{
283 u8 m[65];
284 int err;
285
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200286 SMP_DBG("w %16phN", w);
287 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
288 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300289
290 memcpy(m, a2, 7);
291 memcpy(m + 7, a1, 7);
292 memcpy(m + 14, io_cap, 3);
293 memcpy(m + 17, r, 16);
294 memcpy(m + 33, n2, 16);
295 memcpy(m + 49, n1, 16);
296
297 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
298 if (err)
299 return err;
300
301 BT_DBG("res %16phN", res);
302
303 return err;
304}
305
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300306static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
307 const u8 x[16], const u8 y[16], u32 *val)
308{
309 u8 m[80], tmp[16];
310 int err;
311
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200312 SMP_DBG("u %32phN", u);
313 SMP_DBG("v %32phN", v);
314 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300315
316 memcpy(m, y, 16);
317 memcpy(m + 16, v, 32);
318 memcpy(m + 48, u, 32);
319
320 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
321 if (err)
322 return err;
323
324 *val = get_unaligned_le32(tmp);
325 *val %= 1000000;
326
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200327 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300328
329 return 0;
330}
331
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200332static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
333 const u8 key_id[4], u8 res[16])
334{
335 int err;
336
337 SMP_DBG("w %16phN key_id %4phN", w, key_id);
338
339 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
340 if (err)
341 return err;
342
343 SMP_DBG("res %16phN", res);
344
345 return err;
346}
347
348/* The following functions map to the legacy SMP crypto functions e, c1,
349 * s1 and ah.
350 */
351
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300352static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
353{
354 struct blkcipher_desc desc;
355 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200356 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200357 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300358
Johan Hedberg7f376cd2014-12-03 16:07:13 +0200359 if (!tfm) {
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300360 BT_ERR("tfm %p", tfm);
361 return -EINVAL;
362 }
363
364 desc.tfm = tfm;
365 desc.flags = 0;
366
Johan Hedberg943a7322014-03-18 12:58:24 +0200367 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300368 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200369
370 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300371 if (err) {
372 BT_ERR("cipher setkey failed: %d", err);
373 return err;
374 }
375
Johan Hedberg943a7322014-03-18 12:58:24 +0200376 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300377 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200378
379 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300380
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300381 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
382 if (err)
383 BT_ERR("Encrypt data error %d", err);
384
Johan Hedberg943a7322014-03-18 12:58:24 +0200385 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300386 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200387
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300388 return err;
389}
390
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200391static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
392 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
393 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
394{
395 u8 p1[16], p2[16];
396 int err;
397
398 memset(p1, 0, 16);
399
400 /* p1 = pres || preq || _rat || _iat */
401 p1[0] = _iat;
402 p1[1] = _rat;
403 memcpy(p1 + 2, preq, 7);
404 memcpy(p1 + 9, pres, 7);
405
406 /* p2 = padding || ia || ra */
407 memcpy(p2, ra, 6);
408 memcpy(p2 + 6, ia, 6);
409 memset(p2 + 12, 0, 4);
410
411 /* res = r XOR p1 */
412 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
413
414 /* res = e(k, res) */
415 err = smp_e(tfm_aes, k, res);
416 if (err) {
417 BT_ERR("Encrypt data error");
418 return err;
419 }
420
421 /* res = res XOR p2 */
422 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
423
424 /* res = e(k, res) */
425 err = smp_e(tfm_aes, k, res);
426 if (err)
427 BT_ERR("Encrypt data error");
428
429 return err;
430}
431
432static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
433 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300434{
435 int err;
436
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200437 /* Just least significant octets from r1 and r2 are considered */
438 memcpy(_r, r2, 8);
439 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300440
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200441 err = smp_e(tfm_aes, k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300442 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200443 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300444
445 return err;
446}
447
Johan Hedbergcd082792014-12-02 13:37:41 +0200448static int smp_ah(struct crypto_blkcipher *tfm, const u8 irk[16],
449 const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200450{
Johan Hedberg943a7322014-03-18 12:58:24 +0200451 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200452 int err;
453
454 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200455 memcpy(_res, r, 3);
456 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200457
Johan Hedberg943a7322014-03-18 12:58:24 +0200458 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200459 if (err) {
460 BT_ERR("Encrypt error");
461 return err;
462 }
463
464 /* The output of the random address function ah is:
465 * ah(h, r) = e(k, r') mod 2^24
466 * The output of the security function e is then truncated to 24 bits
467 * by taking the least significant 24 bits of the output of e as the
468 * result of ah.
469 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200470 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200471
472 return 0;
473}
474
Johan Hedbergcd082792014-12-02 13:37:41 +0200475bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
476 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200477{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300478 struct l2cap_chan *chan = hdev->smp_data;
479 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200480 u8 hash[3];
481 int err;
482
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300483 if (!chan || !chan->data)
484 return false;
485
486 tfm = chan->data;
487
Johan Hedberg60478052014-02-18 10:19:31 +0200488 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
489
490 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
491 if (err)
492 return false;
493
494 return !memcmp(bdaddr->b, hash, 3);
495}
496
Johan Hedbergcd082792014-12-02 13:37:41 +0200497int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200498{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300499 struct l2cap_chan *chan = hdev->smp_data;
500 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200501 int err;
502
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300503 if (!chan || !chan->data)
504 return -EOPNOTSUPP;
505
506 tfm = chan->data;
507
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200508 get_random_bytes(&rpa->b[3], 3);
509
510 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
511 rpa->b[5] |= 0x40; /* Set second most significant bit */
512
513 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
514 if (err < 0)
515 return err;
516
517 BT_DBG("RPA %pMR", rpa);
518
519 return 0;
520}
521
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300522static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
523{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300524 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300525 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300526 struct kvec iv[2];
527 struct msghdr msg;
528
529 if (!chan)
530 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300531
532 BT_DBG("code 0x%2.2x", code);
533
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300534 iv[0].iov_base = &code;
535 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300536
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300537 iv[1].iov_base = data;
538 iv[1].iov_len = len;
539
540 memset(&msg, 0, sizeof(msg));
541
Al Viro17836392014-11-24 17:07:38 -0500542 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300543
544 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300545
Johan Hedbergb68fda62014-08-11 22:06:40 +0300546 if (!chan->data)
547 return;
548
549 smp = chan->data;
550
551 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300552 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300553}
554
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300555static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800556{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300557 if (authreq & SMP_AUTH_MITM) {
558 if (authreq & SMP_AUTH_SC)
559 return BT_SECURITY_FIPS;
560 else
561 return BT_SECURITY_HIGH;
562 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800563 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300564 }
Brian Gix2b64d152011-12-21 16:12:12 -0800565}
566
567static __u8 seclevel_to_authreq(__u8 sec_level)
568{
569 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300570 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800571 case BT_SECURITY_HIGH:
572 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
573 case BT_SECURITY_MEDIUM:
574 return SMP_AUTH_BONDING;
575 default:
576 return SMP_AUTH_NONE;
577 }
578}
579
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300580static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700581 struct smp_cmd_pairing *req,
582 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300583{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300584 struct l2cap_chan *chan = conn->smp;
585 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200586 struct hci_conn *hcon = conn->hcon;
587 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100588 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300589
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300590 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700591 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
592 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300593 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800594 } else {
595 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300596 }
597
Johan Hedbergfd349c02014-02-18 10:19:36 +0200598 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
599 remote_dist |= SMP_DIST_ID_KEY;
600
Johan Hedberg863efaf2014-02-22 19:06:32 +0200601 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
602 local_dist |= SMP_DIST_ID_KEY;
603
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100604 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags) &&
605 (authreq & SMP_AUTH_SC)) {
606 struct oob_data *oob_data;
607 u8 bdaddr_type;
608
609 if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300610 local_dist |= SMP_DIST_LINK_KEY;
611 remote_dist |= SMP_DIST_LINK_KEY;
612 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100613
614 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
615 bdaddr_type = BDADDR_LE_PUBLIC;
616 else
617 bdaddr_type = BDADDR_LE_RANDOM;
618
619 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
620 bdaddr_type);
621 if (oob_data) {
622 set_bit(SMP_FLAG_OOB, &smp->flags);
623 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100624 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100625 memcpy(smp->pcnf, oob_data->hash256, 16);
626 }
627
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300628 } else {
629 authreq &= ~SMP_AUTH_SC;
630 }
631
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300632 if (rsp == NULL) {
633 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100634 req->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300635 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200636 req->init_key_dist = local_dist;
637 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300638 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200639
640 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300641 return;
642 }
643
644 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100645 rsp->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300646 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200647 rsp->init_key_dist = req->init_key_dist & remote_dist;
648 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300649 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200650
651 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300652}
653
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300654static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
655{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300656 struct l2cap_chan *chan = conn->smp;
657 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300658
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300659 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700660 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300661 return SMP_ENC_KEY_SIZE;
662
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300663 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300664
665 return 0;
666}
667
Johan Hedberg6f48e262014-08-11 22:06:44 +0300668static void smp_chan_destroy(struct l2cap_conn *conn)
669{
670 struct l2cap_chan *chan = conn->smp;
671 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200672 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300673 bool complete;
674
675 BUG_ON(!smp);
676
677 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300678
Johan Hedberg6f48e262014-08-11 22:06:44 +0300679 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200680 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300681
682 kfree(smp->csrk);
683 kfree(smp->slave_csrk);
Johan Hedberg6a770832014-06-06 11:54:04 +0300684 kfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300685
686 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300687 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300688
Johan Hedberg923e2412014-12-03 12:43:39 +0200689 /* Ensure that we don't leave any debug key around if debug key
690 * support hasn't been explicitly enabled.
691 */
692 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
693 !test_bit(HCI_KEEP_DEBUG_KEYS, &hcon->hdev->dev_flags)) {
694 list_del_rcu(&smp->ltk->list);
695 kfree_rcu(smp->ltk, rcu);
696 smp->ltk = NULL;
697 }
698
Johan Hedberg6f48e262014-08-11 22:06:44 +0300699 /* If pairing failed clean up any keys we might have */
700 if (!complete) {
701 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200702 list_del_rcu(&smp->ltk->list);
703 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300704 }
705
706 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200707 list_del_rcu(&smp->slave_ltk->list);
708 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300709 }
710
711 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200712 list_del_rcu(&smp->remote_irk->list);
713 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300714 }
715 }
716
717 chan->data = NULL;
718 kfree(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200719 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300720}
721
Johan Hedberg84794e12013-11-06 11:24:57 +0200722static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800723{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200724 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300725 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200726
Johan Hedberg84794e12013-11-06 11:24:57 +0200727 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800728 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700729 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800730
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700731 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700732 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300733
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300734 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300735 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800736}
737
Brian Gix2b64d152011-12-21 16:12:12 -0800738#define JUST_WORKS 0x00
739#define JUST_CFM 0x01
740#define REQ_PASSKEY 0x02
741#define CFM_PASSKEY 0x03
742#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300743#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800744#define OVERLAP 0xFF
745
746static const u8 gen_method[5][5] = {
747 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
748 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
749 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
750 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
751 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
752};
753
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300754static const u8 sc_method[5][5] = {
755 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
756 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
757 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
758 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
759 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
760};
761
Johan Hedberg581370c2014-06-17 13:07:38 +0300762static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
763{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300764 /* If either side has unknown io_caps, use JUST_CFM (which gets
765 * converted later to JUST_WORKS if we're initiators.
766 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300767 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
768 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300769 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300770
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300771 if (test_bit(SMP_FLAG_SC, &smp->flags))
772 return sc_method[remote_io][local_io];
773
Johan Hedberg581370c2014-06-17 13:07:38 +0300774 return gen_method[remote_io][local_io];
775}
776
Brian Gix2b64d152011-12-21 16:12:12 -0800777static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
778 u8 local_io, u8 remote_io)
779{
780 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300781 struct l2cap_chan *chan = conn->smp;
782 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800783 u32 passkey = 0;
784 int ret = 0;
785
786 /* Initialize key for JUST WORKS */
787 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300788 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800789
790 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
791
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300792 /* If neither side wants MITM, either "just" confirm an incoming
793 * request or use just-works for outgoing ones. The JUST_CFM
794 * will be converted to JUST_WORKS if necessary later in this
795 * function. If either side has MITM look up the method from the
796 * table.
797 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300798 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300799 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800800 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300801 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800802
Johan Hedberga82505c2014-03-24 14:39:07 +0200803 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300804 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
805 &smp->flags))
806 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200807
Johan Hedberg02f3e252014-07-16 15:09:13 +0300808 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300809 if (smp->method == JUST_CFM &&
810 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
811 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300812
Brian Gix2b64d152011-12-21 16:12:12 -0800813 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300814 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300815 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800816 return 0;
817 }
818
819 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300820 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300821 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300822 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
823 hcon->pending_sec_level = BT_SECURITY_HIGH;
824 }
Brian Gix2b64d152011-12-21 16:12:12 -0800825
826 /* If both devices have Keyoard-Display I/O, the master
827 * Confirms and the slave Enters the passkey.
828 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300829 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300830 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300831 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800832 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300833 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800834 }
835
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200836 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300837 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200838 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800839 get_random_bytes(&passkey, sizeof(passkey));
840 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200841 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800842 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300843 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800844 }
845
Johan Hedberg783e0572014-05-31 18:48:26 +0300846 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700847 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200848 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300849 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200850 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
851 hcon->type, hcon->dst_type,
852 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800853 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200854 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200855 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200856 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800857
Brian Gix2b64d152011-12-21 16:12:12 -0800858 return ret;
859}
860
Johan Hedberg1cc61142014-05-20 09:45:52 +0300861static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300862{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300863 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300864 struct smp_cmd_pairing_confirm cp;
865 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300866
867 BT_DBG("conn %p", conn);
868
Johan Hedberge491eaf2014-10-25 21:15:37 +0200869 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200870 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200871 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
872 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300873 if (ret)
874 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300875
Johan Hedberg4a74d652014-05-20 09:45:50 +0300876 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800877
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300878 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
879
Johan Hedbergb28b4942014-09-05 22:19:55 +0300880 if (conn->hcon->out)
881 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
882 else
883 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
884
Johan Hedberg1cc61142014-05-20 09:45:52 +0300885 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300886}
887
Johan Hedberg861580a2014-05-20 09:45:51 +0300888static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300889{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300890 struct l2cap_conn *conn = smp->conn;
891 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300892 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300893 int ret;
894
Johan Hedbergec70f362014-06-27 14:23:04 +0300895 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300896 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300897
898 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
899
Johan Hedberge491eaf2014-10-25 21:15:37 +0200900 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200901 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200902 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300903 if (ret)
904 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300905
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300906 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
907 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300908 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300909 }
910
911 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800912 u8 stk[16];
913 __le64 rand = 0;
914 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300915
Johan Hedberge491eaf2014-10-25 21:15:37 +0200916 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300917
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300918 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300919 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300920
Johan Hedberg861580a2014-05-20 09:45:51 +0300921 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
922 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300923
924 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300925 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300926 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300927 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300928 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800929 __le64 rand = 0;
930 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300931
Johan Hedberg943a7322014-03-18 12:58:24 +0200932 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
933 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300934
Johan Hedberge491eaf2014-10-25 21:15:37 +0200935 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300936
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300937 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700938 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300939
Johan Hedbergfff34902014-06-10 15:19:50 +0300940 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
941 auth = 1;
942 else
943 auth = 0;
944
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300945 /* Even though there's no _SLAVE suffix this is the
946 * slave STK we're adding for later lookup (the master
947 * STK never needs to be stored).
948 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700949 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300950 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300951 }
952
Johan Hedberg861580a2014-05-20 09:45:51 +0300953 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300954}
955
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300956static void smp_notify_keys(struct l2cap_conn *conn)
957{
958 struct l2cap_chan *chan = conn->smp;
959 struct smp_chan *smp = chan->data;
960 struct hci_conn *hcon = conn->hcon;
961 struct hci_dev *hdev = hcon->hdev;
962 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
963 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
964 bool persistent;
965
966 if (smp->remote_irk) {
967 mgmt_new_irk(hdev, smp->remote_irk);
968 /* Now that user space can be considered to know the
969 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300970 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300971 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300972 if (hcon->type == LE_LINK) {
973 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
974 hcon->dst_type = smp->remote_irk->addr_type;
975 queue_work(hdev->workqueue, &conn->id_addr_update_work);
976 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300977
978 /* When receiving an indentity resolving key for
979 * a remote device that does not use a resolvable
980 * private address, just remove the key so that
981 * it is possible to use the controller white
982 * list for scanning.
983 *
984 * Userspace will have been told to not store
985 * this key at this point. So it is safe to
986 * just remove it.
987 */
988 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200989 list_del_rcu(&smp->remote_irk->list);
990 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300991 smp->remote_irk = NULL;
992 }
993 }
994
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300995 if (hcon->type == ACL_LINK) {
996 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
997 persistent = false;
998 else
999 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1000 &hcon->flags);
1001 } else {
1002 /* The LTKs and CSRKs should be persistent only if both sides
1003 * had the bonding bit set in their authentication requests.
1004 */
1005 persistent = !!((req->auth_req & rsp->auth_req) &
1006 SMP_AUTH_BONDING);
1007 }
1008
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001009
1010 if (smp->csrk) {
1011 smp->csrk->bdaddr_type = hcon->dst_type;
1012 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1013 mgmt_new_csrk(hdev, smp->csrk, persistent);
1014 }
1015
1016 if (smp->slave_csrk) {
1017 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1018 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1019 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1020 }
1021
1022 if (smp->ltk) {
1023 smp->ltk->bdaddr_type = hcon->dst_type;
1024 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1025 mgmt_new_ltk(hdev, smp->ltk, persistent);
1026 }
1027
1028 if (smp->slave_ltk) {
1029 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1030 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1031 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1032 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001033
1034 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001035 struct link_key *key;
1036 u8 type;
1037
1038 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1039 type = HCI_LK_DEBUG_COMBINATION;
1040 else if (hcon->sec_level == BT_SECURITY_FIPS)
1041 type = HCI_LK_AUTH_COMBINATION_P256;
1042 else
1043 type = HCI_LK_UNAUTH_COMBINATION_P256;
1044
1045 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1046 smp->link_key, type, 0, &persistent);
1047 if (key) {
1048 mgmt_new_link_key(hdev, key, persistent);
1049
1050 /* Don't keep debug keys around if the relevant
1051 * flag is not set.
1052 */
1053 if (!test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags) &&
1054 key->type == HCI_LK_DEBUG_COMBINATION) {
1055 list_del_rcu(&key->list);
1056 kfree_rcu(key, rcu);
1057 }
1058 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001059 }
1060}
1061
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001062static void sc_add_ltk(struct smp_chan *smp)
1063{
1064 struct hci_conn *hcon = smp->conn->hcon;
1065 u8 key_type, auth;
1066
1067 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1068 key_type = SMP_LTK_P256_DEBUG;
1069 else
1070 key_type = SMP_LTK_P256;
1071
1072 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1073 auth = 1;
1074 else
1075 auth = 0;
1076
1077 memset(smp->tk + smp->enc_key_size, 0,
1078 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
1079
1080 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1081 key_type, auth, smp->tk, smp->enc_key_size,
1082 0, 0);
1083}
1084
Johan Hedberg6a770832014-06-06 11:54:04 +03001085static void sc_generate_link_key(struct smp_chan *smp)
1086{
1087 /* These constants are as specified in the core specification.
1088 * In ASCII they spell out to 'tmp1' and 'lebr'.
1089 */
1090 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1091 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1092
1093 smp->link_key = kzalloc(16, GFP_KERNEL);
1094 if (!smp->link_key)
1095 return;
1096
1097 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
1098 kfree(smp->link_key);
1099 smp->link_key = NULL;
1100 return;
1101 }
1102
1103 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
1104 kfree(smp->link_key);
1105 smp->link_key = NULL;
1106 return;
1107 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001108}
1109
Johan Hedbergb28b4942014-09-05 22:19:55 +03001110static void smp_allow_key_dist(struct smp_chan *smp)
1111{
1112 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1113 * will be allowed in each PDU handler to ensure we receive
1114 * them in the correct order.
1115 */
1116 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1117 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1118 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1119 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1120 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1121 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1122}
1123
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001124static void sc_generate_ltk(struct smp_chan *smp)
1125{
1126 /* These constants are as specified in the core specification.
1127 * In ASCII they spell out to 'tmp2' and 'brle'.
1128 */
1129 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1130 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1131 struct hci_conn *hcon = smp->conn->hcon;
1132 struct hci_dev *hdev = hcon->hdev;
1133 struct link_key *key;
1134
1135 key = hci_find_link_key(hdev, &hcon->dst);
1136 if (!key) {
1137 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1138 return;
1139 }
1140
1141 if (key->type == HCI_LK_DEBUG_COMBINATION)
1142 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1143
1144 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1145 return;
1146
1147 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1148 return;
1149
1150 sc_add_ltk(smp);
1151}
1152
Johan Hedbergd6268e82014-09-05 22:19:51 +03001153static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001154{
1155 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001156 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001157 struct hci_conn *hcon = conn->hcon;
1158 struct hci_dev *hdev = hcon->hdev;
1159 __u8 *keydist;
1160
1161 BT_DBG("conn %p", conn);
1162
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001163 rsp = (void *) &smp->prsp[1];
1164
1165 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001166 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1167 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001168 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001169 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001170
1171 req = (void *) &smp->preq[1];
1172
1173 if (hcon->out) {
1174 keydist = &rsp->init_key_dist;
1175 *keydist &= req->init_key_dist;
1176 } else {
1177 keydist = &rsp->resp_key_dist;
1178 *keydist &= req->resp_key_dist;
1179 }
1180
Johan Hedberg6a770832014-06-06 11:54:04 +03001181 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001182 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001183 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001184 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1185 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001186
1187 /* Clear the keys which are generated but not distributed */
1188 *keydist &= ~SMP_SC_NO_DIST;
1189 }
1190
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001191 BT_DBG("keydist 0x%x", *keydist);
1192
1193 if (*keydist & SMP_DIST_ENC_KEY) {
1194 struct smp_cmd_encrypt_info enc;
1195 struct smp_cmd_master_ident ident;
1196 struct smp_ltk *ltk;
1197 u8 authenticated;
1198 __le16 ediv;
1199 __le64 rand;
1200
1201 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1202 get_random_bytes(&ediv, sizeof(ediv));
1203 get_random_bytes(&rand, sizeof(rand));
1204
1205 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1206
1207 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1208 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1209 SMP_LTK_SLAVE, authenticated, enc.ltk,
1210 smp->enc_key_size, ediv, rand);
1211 smp->slave_ltk = ltk;
1212
1213 ident.ediv = ediv;
1214 ident.rand = rand;
1215
1216 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1217
1218 *keydist &= ~SMP_DIST_ENC_KEY;
1219 }
1220
1221 if (*keydist & SMP_DIST_ID_KEY) {
1222 struct smp_cmd_ident_addr_info addrinfo;
1223 struct smp_cmd_ident_info idinfo;
1224
1225 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1226
1227 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1228
1229 /* The hci_conn contains the local identity address
1230 * after the connection has been established.
1231 *
1232 * This is true even when the connection has been
1233 * established using a resolvable random address.
1234 */
1235 bacpy(&addrinfo.bdaddr, &hcon->src);
1236 addrinfo.addr_type = hcon->src_type;
1237
1238 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1239 &addrinfo);
1240
1241 *keydist &= ~SMP_DIST_ID_KEY;
1242 }
1243
1244 if (*keydist & SMP_DIST_SIGN) {
1245 struct smp_cmd_sign_info sign;
1246 struct smp_csrk *csrk;
1247
1248 /* Generate a new random key */
1249 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1250
1251 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1252 if (csrk) {
1253 csrk->master = 0x00;
1254 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1255 }
1256 smp->slave_csrk = csrk;
1257
1258 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1259
1260 *keydist &= ~SMP_DIST_SIGN;
1261 }
1262
1263 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001264 if (smp->remote_key_dist & KEY_DIST_MASK) {
1265 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001266 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001267 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001268
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001269 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1270 smp_notify_keys(conn);
1271
1272 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001273}
1274
Johan Hedbergb68fda62014-08-11 22:06:40 +03001275static void smp_timeout(struct work_struct *work)
1276{
1277 struct smp_chan *smp = container_of(work, struct smp_chan,
1278 security_timer.work);
1279 struct l2cap_conn *conn = smp->conn;
1280
1281 BT_DBG("conn %p", conn);
1282
Johan Hedberg1e91c292014-08-18 20:33:29 +03001283 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001284}
1285
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001286static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1287{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001288 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001289 struct smp_chan *smp;
1290
Marcel Holtmannf1560462013-10-13 05:43:25 -07001291 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001292 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001293 return NULL;
1294
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001295 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1296 if (IS_ERR(smp->tfm_aes)) {
1297 BT_ERR("Unable to create ECB crypto context");
1298 kfree(smp);
1299 return NULL;
1300 }
1301
Johan Hedberg407cecf2014-05-02 14:19:47 +03001302 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1303 if (IS_ERR(smp->tfm_cmac)) {
1304 BT_ERR("Unable to create CMAC crypto context");
1305 crypto_free_blkcipher(smp->tfm_aes);
1306 kfree(smp);
1307 return NULL;
1308 }
1309
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001310 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001311 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001312
Johan Hedbergb28b4942014-09-05 22:19:55 +03001313 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1314
Johan Hedbergb68fda62014-08-11 22:06:40 +03001315 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1316
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001317 hci_conn_hold(conn->hcon);
1318
1319 return smp;
1320}
1321
Johan Hedberg760b0182014-06-06 11:44:05 +03001322static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1323{
1324 struct hci_conn *hcon = smp->conn->hcon;
1325 u8 *na, *nb, a[7], b[7];
1326
1327 if (hcon->out) {
1328 na = smp->prnd;
1329 nb = smp->rrnd;
1330 } else {
1331 na = smp->rrnd;
1332 nb = smp->prnd;
1333 }
1334
1335 memcpy(a, &hcon->init_addr, 6);
1336 memcpy(b, &hcon->resp_addr, 6);
1337 a[6] = hcon->init_addr_type;
1338 b[6] = hcon->resp_addr_type;
1339
1340 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1341}
1342
Johan Hedberg38606f12014-06-25 11:10:28 +03001343static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001344{
1345 struct hci_conn *hcon = smp->conn->hcon;
1346 struct smp_cmd_dhkey_check check;
1347 u8 a[7], b[7], *local_addr, *remote_addr;
1348 u8 io_cap[3], r[16];
1349
Johan Hedberg760b0182014-06-06 11:44:05 +03001350 memcpy(a, &hcon->init_addr, 6);
1351 memcpy(b, &hcon->resp_addr, 6);
1352 a[6] = hcon->init_addr_type;
1353 b[6] = hcon->resp_addr_type;
1354
1355 if (hcon->out) {
1356 local_addr = a;
1357 remote_addr = b;
1358 memcpy(io_cap, &smp->preq[1], 3);
1359 } else {
1360 local_addr = b;
1361 remote_addr = a;
1362 memcpy(io_cap, &smp->prsp[1], 3);
1363 }
1364
Johan Hedbergdddd3052014-06-01 15:38:09 +03001365 memset(r, 0, sizeof(r));
1366
1367 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001368 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001369
Johan Hedberga29b0732014-10-28 15:17:05 +01001370 if (smp->method == REQ_OOB)
1371 memcpy(r, smp->rr, 16);
1372
Johan Hedberg760b0182014-06-06 11:44:05 +03001373 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1374 local_addr, remote_addr, check.e);
1375
1376 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001377}
1378
Johan Hedberg38606f12014-06-25 11:10:28 +03001379static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1380{
1381 struct l2cap_conn *conn = smp->conn;
1382 struct hci_conn *hcon = conn->hcon;
1383 struct smp_cmd_pairing_confirm cfm;
1384 u8 r;
1385
1386 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1387 r |= 0x80;
1388
1389 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1390
1391 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1392 cfm.confirm_val))
1393 return SMP_UNSPECIFIED;
1394
1395 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1396
1397 return 0;
1398}
1399
1400static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1401{
1402 struct l2cap_conn *conn = smp->conn;
1403 struct hci_conn *hcon = conn->hcon;
1404 struct hci_dev *hdev = hcon->hdev;
1405 u8 cfm[16], r;
1406
1407 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1408 if (smp->passkey_round >= 20)
1409 return 0;
1410
1411 switch (smp_op) {
1412 case SMP_CMD_PAIRING_RANDOM:
1413 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1414 r |= 0x80;
1415
1416 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1417 smp->rrnd, r, cfm))
1418 return SMP_UNSPECIFIED;
1419
1420 if (memcmp(smp->pcnf, cfm, 16))
1421 return SMP_CONFIRM_FAILED;
1422
1423 smp->passkey_round++;
1424
1425 if (smp->passkey_round == 20) {
1426 /* Generate MacKey and LTK */
1427 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1428 return SMP_UNSPECIFIED;
1429 }
1430
1431 /* The round is only complete when the initiator
1432 * receives pairing random.
1433 */
1434 if (!hcon->out) {
1435 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1436 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001437 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001438 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001439 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001440 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001441 return 0;
1442 }
1443
1444 /* Start the next round */
1445 if (smp->passkey_round != 20)
1446 return sc_passkey_round(smp, 0);
1447
1448 /* Passkey rounds are complete - start DHKey Check */
1449 sc_dhkey_check(smp);
1450 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1451
1452 break;
1453
1454 case SMP_CMD_PAIRING_CONFIRM:
1455 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1456 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1457 return 0;
1458 }
1459
1460 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1461
1462 if (hcon->out) {
1463 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1464 sizeof(smp->prnd), smp->prnd);
1465 return 0;
1466 }
1467
1468 return sc_passkey_send_confirm(smp);
1469
1470 case SMP_CMD_PUBLIC_KEY:
1471 default:
1472 /* Initiating device starts the round */
1473 if (!hcon->out)
1474 return 0;
1475
1476 BT_DBG("%s Starting passkey round %u", hdev->name,
1477 smp->passkey_round + 1);
1478
1479 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1480
1481 return sc_passkey_send_confirm(smp);
1482 }
1483
1484 return 0;
1485}
1486
Johan Hedbergdddd3052014-06-01 15:38:09 +03001487static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1488{
Johan Hedberg38606f12014-06-25 11:10:28 +03001489 struct l2cap_conn *conn = smp->conn;
1490 struct hci_conn *hcon = conn->hcon;
1491 u8 smp_op;
1492
1493 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1494
Johan Hedbergdddd3052014-06-01 15:38:09 +03001495 switch (mgmt_op) {
1496 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1497 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1498 return 0;
1499 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1500 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1501 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001502 case MGMT_OP_USER_PASSKEY_REPLY:
1503 hcon->passkey_notify = le32_to_cpu(passkey);
1504 smp->passkey_round = 0;
1505
1506 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1507 smp_op = SMP_CMD_PAIRING_CONFIRM;
1508 else
1509 smp_op = 0;
1510
1511 if (sc_passkey_round(smp, smp_op))
1512 return -EIO;
1513
1514 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001515 }
1516
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001517 /* Initiator sends DHKey check first */
1518 if (hcon->out) {
1519 sc_dhkey_check(smp);
1520 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1521 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1522 sc_dhkey_check(smp);
1523 sc_add_ltk(smp);
1524 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001525
1526 return 0;
1527}
1528
Brian Gix2b64d152011-12-21 16:12:12 -08001529int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1530{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001531 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001532 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001533 struct smp_chan *smp;
1534 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001535 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001536
1537 BT_DBG("");
1538
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001539 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001540 return -ENOTCONN;
1541
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001542 chan = conn->smp;
1543 if (!chan)
1544 return -ENOTCONN;
1545
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001546 l2cap_chan_lock(chan);
1547 if (!chan->data) {
1548 err = -ENOTCONN;
1549 goto unlock;
1550 }
1551
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001552 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001553
Johan Hedberg760b0182014-06-06 11:44:05 +03001554 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1555 err = sc_user_reply(smp, mgmt_op, passkey);
1556 goto unlock;
1557 }
1558
Brian Gix2b64d152011-12-21 16:12:12 -08001559 switch (mgmt_op) {
1560 case MGMT_OP_USER_PASSKEY_REPLY:
1561 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001562 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001563 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001564 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001565 /* Fall Through */
1566 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001567 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001568 break;
1569 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1570 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001571 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001572 err = 0;
1573 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001574 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001575 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001576 err = -EOPNOTSUPP;
1577 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001578 }
1579
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001580 err = 0;
1581
Brian Gix2b64d152011-12-21 16:12:12 -08001582 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001583 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1584 u8 rsp = smp_confirm(smp);
1585 if (rsp)
1586 smp_failure(conn, rsp);
1587 }
Brian Gix2b64d152011-12-21 16:12:12 -08001588
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001589unlock:
1590 l2cap_chan_unlock(chan);
1591 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001592}
1593
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001594static void build_bredr_pairing_cmd(struct smp_chan *smp,
1595 struct smp_cmd_pairing *req,
1596 struct smp_cmd_pairing *rsp)
1597{
1598 struct l2cap_conn *conn = smp->conn;
1599 struct hci_dev *hdev = conn->hcon->hdev;
1600 u8 local_dist = 0, remote_dist = 0;
1601
1602 if (test_bit(HCI_BONDABLE, &hdev->dev_flags)) {
1603 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1604 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1605 }
1606
1607 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
1608 remote_dist |= SMP_DIST_ID_KEY;
1609
1610 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
1611 local_dist |= SMP_DIST_ID_KEY;
1612
1613 if (!rsp) {
1614 memset(req, 0, sizeof(*req));
1615
1616 req->init_key_dist = local_dist;
1617 req->resp_key_dist = remote_dist;
1618 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1619
1620 smp->remote_key_dist = remote_dist;
1621
1622 return;
1623 }
1624
1625 memset(rsp, 0, sizeof(*rsp));
1626
1627 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1628 rsp->init_key_dist = req->init_key_dist & remote_dist;
1629 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1630
1631 smp->remote_key_dist = rsp->init_key_dist;
1632}
1633
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001634static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001635{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001636 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001637 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001638 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001639 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001640 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001641 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001642
1643 BT_DBG("conn %p", conn);
1644
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001645 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001646 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001647
Johan Hedberg40bef302014-07-16 11:42:27 +03001648 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001649 return SMP_CMD_NOTSUPP;
1650
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001651 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001652 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001653 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001654 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001655
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001656 if (!smp)
1657 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001658
Johan Hedbergc05b9332014-09-10 17:37:42 -07001659 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001660 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001661
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001662 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001663 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001664 return SMP_PAIRING_NOTSUPP;
1665
Johan Hedberg903b71c2014-09-08 16:59:18 -07001666 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
1667 return SMP_AUTH_REQUIREMENTS;
1668
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001669 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1670 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001671 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001672
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001673 /* SMP over BR/EDR requires special treatment */
1674 if (conn->hcon->type == ACL_LINK) {
1675 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001676 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
1677 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001678 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1679
1680 set_bit(SMP_FLAG_SC, &smp->flags);
1681
1682 build_bredr_pairing_cmd(smp, req, &rsp);
1683
1684 key_size = min(req->max_key_size, rsp.max_key_size);
1685 if (check_enc_key_size(conn, key_size))
1686 return SMP_ENC_KEY_SIZE;
1687
1688 /* Clear bits which are generated but not distributed */
1689 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1690
1691 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1692 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1693 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1694
1695 smp_distribute_keys(smp);
1696 return 0;
1697 }
1698
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001699 build_pairing_cmd(conn, req, &rsp, auth);
1700
1701 if (rsp.auth_req & SMP_AUTH_SC)
1702 set_bit(SMP_FLAG_SC, &smp->flags);
1703
Johan Hedberg5be5e272014-09-10 17:58:54 -07001704 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001705 sec_level = BT_SECURITY_MEDIUM;
1706 else
1707 sec_level = authreq_to_seclevel(auth);
1708
Johan Hedbergc7262e72014-06-17 13:07:37 +03001709 if (sec_level > conn->hcon->pending_sec_level)
1710 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001711
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001712 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001713 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1714 u8 method;
1715
1716 method = get_auth_method(smp, conn->hcon->io_capability,
1717 req->io_capability);
1718 if (method == JUST_WORKS || method == JUST_CFM)
1719 return SMP_AUTH_REQUIREMENTS;
1720 }
1721
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001722 key_size = min(req->max_key_size, rsp.max_key_size);
1723 if (check_enc_key_size(conn, key_size))
1724 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001725
Johan Hedberge84a6b12013-12-02 10:49:03 +02001726 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001727
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001728 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1729 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001730
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001731 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001732
1733 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1734
1735 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1736 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1737 /* Clear bits which are generated but not distributed */
1738 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1739 /* Wait for Public Key from Initiating Device */
1740 return 0;
1741 } else {
1742 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1743 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001744
Brian Gix2b64d152011-12-21 16:12:12 -08001745 /* Request setup of TK */
1746 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1747 if (ret)
1748 return SMP_UNSPECIFIED;
1749
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001750 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001751}
1752
Johan Hedberg3b191462014-06-06 10:50:15 +03001753static u8 sc_send_public_key(struct smp_chan *smp)
1754{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001755 struct hci_dev *hdev = smp->conn->hcon->hdev;
1756
Johan Hedberg3b191462014-06-06 10:50:15 +03001757 BT_DBG("");
1758
Johan Hedberg70157ef2014-06-24 15:22:59 +03001759 if (test_bit(HCI_USE_DEBUG_KEYS, &hdev->dev_flags)) {
1760 BT_DBG("Using debug keys");
1761 memcpy(smp->local_pk, debug_pk, 64);
1762 memcpy(smp->local_sk, debug_sk, 32);
1763 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1764 } else {
1765 while (true) {
1766 /* Generate local key pair for Secure Connections */
1767 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1768 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001769
Johan Hedberg70157ef2014-06-24 15:22:59 +03001770 /* This is unlikely, but we need to check that
1771 * we didn't accidentially generate a debug key.
1772 */
1773 if (memcmp(smp->local_sk, debug_sk, 32))
1774 break;
1775 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001776 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001777
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001778 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
1779 SMP_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1780 SMP_DBG("Local Private Key: %32phN", smp->local_sk);
Johan Hedberg3b191462014-06-06 10:50:15 +03001781
1782 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1783
1784 return 0;
1785}
1786
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001787static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001788{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001789 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001790 struct l2cap_chan *chan = conn->smp;
1791 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001792 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001793 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001794 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001795
1796 BT_DBG("conn %p", conn);
1797
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001798 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001799 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001800
Johan Hedberg40bef302014-07-16 11:42:27 +03001801 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001802 return SMP_CMD_NOTSUPP;
1803
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001804 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001805
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001806 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001807
1808 key_size = min(req->max_key_size, rsp->max_key_size);
1809 if (check_enc_key_size(conn, key_size))
1810 return SMP_ENC_KEY_SIZE;
1811
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001812 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001813
Johan Hedberg903b71c2014-09-08 16:59:18 -07001814 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
1815 return SMP_AUTH_REQUIREMENTS;
1816
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001817 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1818 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1819
1820 /* Update remote key distribution in case the remote cleared
1821 * some bits that we had enabled in our request.
1822 */
1823 smp->remote_key_dist &= rsp->resp_key_dist;
1824
1825 /* For BR/EDR this means we're done and can start phase 3 */
1826 if (conn->hcon->type == ACL_LINK) {
1827 /* Clear bits which are generated but not distributed */
1828 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1829 smp_distribute_keys(smp);
1830 return 0;
1831 }
1832
Johan Hedberg65668772014-05-16 11:03:34 +03001833 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1834 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001835 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1836 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001837
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001838 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001839 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1840 u8 method;
1841
1842 method = get_auth_method(smp, req->io_capability,
1843 rsp->io_capability);
1844 if (method == JUST_WORKS || method == JUST_CFM)
1845 return SMP_AUTH_REQUIREMENTS;
1846 }
1847
Johan Hedberge84a6b12013-12-02 10:49:03 +02001848 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001849
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001850 /* Update remote key distribution in case the remote cleared
1851 * some bits that we had enabled in our request.
1852 */
1853 smp->remote_key_dist &= rsp->resp_key_dist;
1854
Johan Hedberg3b191462014-06-06 10:50:15 +03001855 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1856 /* Clear bits which are generated but not distributed */
1857 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1858 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1859 return sc_send_public_key(smp);
1860 }
1861
Johan Hedbergc05b9332014-09-10 17:37:42 -07001862 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001863
Johan Hedberg476585e2012-06-06 18:54:15 +08001864 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001865 if (ret)
1866 return SMP_UNSPECIFIED;
1867
Johan Hedberg4a74d652014-05-20 09:45:50 +03001868 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001869
1870 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001871 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001872 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001873
1874 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001875}
1876
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001877static u8 sc_check_confirm(struct smp_chan *smp)
1878{
1879 struct l2cap_conn *conn = smp->conn;
1880
1881 BT_DBG("");
1882
1883 /* Public Key exchange must happen before any other steps */
1884 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1885 return SMP_UNSPECIFIED;
1886
Johan Hedberg38606f12014-06-25 11:10:28 +03001887 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1888 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1889
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001890 if (conn->hcon->out) {
1891 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1892 smp->prnd);
1893 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1894 }
1895
1896 return 0;
1897}
1898
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001899static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001900{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001901 struct l2cap_chan *chan = conn->smp;
1902 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001903
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001904 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1905
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001906 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001907 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001908
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001909 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1910 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001911
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001912 if (test_bit(SMP_FLAG_SC, &smp->flags))
1913 return sc_check_confirm(smp);
1914
Johan Hedbergb28b4942014-09-05 22:19:55 +03001915 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001916 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1917 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001918 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1919 return 0;
1920 }
1921
1922 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001923 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001924 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001925 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001926
1927 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001928}
1929
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001930static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001931{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001932 struct l2cap_chan *chan = conn->smp;
1933 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001934 struct hci_conn *hcon = conn->hcon;
1935 u8 *pkax, *pkbx, *na, *nb;
1936 u32 passkey;
1937 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001938
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001939 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001940
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001941 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001942 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001943
Johan Hedberg943a7322014-03-18 12:58:24 +02001944 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001945 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001946
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001947 if (!test_bit(SMP_FLAG_SC, &smp->flags))
1948 return smp_random(smp);
1949
Johan Hedberg580039e2014-12-03 16:26:37 +02001950 if (hcon->out) {
1951 pkax = smp->local_pk;
1952 pkbx = smp->remote_pk;
1953 na = smp->prnd;
1954 nb = smp->rrnd;
1955 } else {
1956 pkax = smp->remote_pk;
1957 pkbx = smp->local_pk;
1958 na = smp->rrnd;
1959 nb = smp->prnd;
1960 }
1961
Johan Hedberga29b0732014-10-28 15:17:05 +01001962 if (smp->method == REQ_OOB) {
1963 if (!hcon->out)
1964 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1965 sizeof(smp->prnd), smp->prnd);
1966 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1967 goto mackey_and_ltk;
1968 }
1969
Johan Hedberg38606f12014-06-25 11:10:28 +03001970 /* Passkey entry has special treatment */
1971 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1972 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
1973
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001974 if (hcon->out) {
1975 u8 cfm[16];
1976
1977 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1978 smp->rrnd, 0, cfm);
1979 if (err)
1980 return SMP_UNSPECIFIED;
1981
1982 if (memcmp(smp->pcnf, cfm, 16))
1983 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001984 } else {
1985 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1986 smp->prnd);
1987 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001988 }
1989
Johan Hedberga29b0732014-10-28 15:17:05 +01001990mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03001991 /* Generate MacKey and LTK */
1992 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
1993 if (err)
1994 return SMP_UNSPECIFIED;
1995
Johan Hedberga29b0732014-10-28 15:17:05 +01001996 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03001997 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03001998 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001999 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2000 }
2001 return 0;
2002 }
2003
Johan Hedberg38606f12014-06-25 11:10:28 +03002004 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002005 if (err)
2006 return SMP_UNSPECIFIED;
2007
Johan Hedberg38606f12014-06-25 11:10:28 +03002008 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
2009 hcon->dst_type, passkey, 0);
2010 if (err)
2011 return SMP_UNSPECIFIED;
2012
2013 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2014
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002015 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002016}
2017
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002018static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002019{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002020 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002021 struct hci_conn *hcon = conn->hcon;
2022
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002023 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002024 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002025 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002026
Johan Hedberga6f78332014-09-10 17:37:45 -07002027 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002028 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002029
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002030 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002031 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002032
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002033 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
2034 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002035
Johan Hedbergfe59a052014-07-01 19:14:12 +03002036 /* We never store STKs for master role, so clear this flag */
2037 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2038
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002039 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002040}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002041
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002042bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2043 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002044{
2045 if (sec_level == BT_SECURITY_LOW)
2046 return true;
2047
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002048 /* If we're encrypted with an STK but the caller prefers using
2049 * LTK claim insufficient security. This way we allow the
2050 * connection to be re-encrypted with an LTK, even if the LTK
2051 * provides the same level of security. Only exception is if we
2052 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002053 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002054 if (key_pref == SMP_USE_LTK &&
2055 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002056 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002057 return false;
2058
Johan Hedberg854f4722014-07-01 18:40:20 +03002059 if (hcon->sec_level >= sec_level)
2060 return true;
2061
2062 return false;
2063}
2064
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002065static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002066{
2067 struct smp_cmd_security_req *rp = (void *) skb->data;
2068 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002069 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002070 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002071 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002072 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002073
2074 BT_DBG("conn %p", conn);
2075
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002076 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002077 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002078
Johan Hedberg40bef302014-07-16 11:42:27 +03002079 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002080 return SMP_CMD_NOTSUPP;
2081
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002082 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002083
Johan Hedberg903b71c2014-09-08 16:59:18 -07002084 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
2085 return SMP_AUTH_REQUIREMENTS;
2086
Johan Hedberg5be5e272014-09-10 17:58:54 -07002087 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002088 sec_level = BT_SECURITY_MEDIUM;
2089 else
2090 sec_level = authreq_to_seclevel(auth);
2091
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002092 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002093 return 0;
2094
Johan Hedbergc7262e72014-06-17 13:07:37 +03002095 if (sec_level > hcon->pending_sec_level)
2096 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002097
Johan Hedberg4dab7862012-06-07 14:58:37 +08002098 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002099 return 0;
2100
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002101 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002102 if (!smp)
2103 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002104
Johan Hedbergb6ae8452014-07-30 09:22:22 +03002105 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002106 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002107 return SMP_PAIRING_NOTSUPP;
2108
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002109 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002110
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002111 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002112 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002113
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002114 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2115 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002116
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002117 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002118 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002119
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002120 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002121}
2122
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002123int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002124{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002125 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002126 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002127 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002128 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002129 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002130
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002131 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2132
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002133 /* This may be NULL if there's an unexpected disconnection */
2134 if (!conn)
2135 return 1;
2136
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002137 chan = conn->smp;
2138
Johan Hedberg757aee02013-04-24 13:05:32 +03002139 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002140 return 1;
2141
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002142 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002143 return 1;
2144
Johan Hedbergc7262e72014-06-17 13:07:37 +03002145 if (sec_level > hcon->pending_sec_level)
2146 hcon->pending_sec_level = sec_level;
2147
Johan Hedberg40bef302014-07-16 11:42:27 +03002148 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002149 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2150 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002151
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002152 l2cap_chan_lock(chan);
2153
2154 /* If SMP is already in progress ignore this request */
2155 if (chan->data) {
2156 ret = 0;
2157 goto unlock;
2158 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002159
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002160 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002161 if (!smp) {
2162 ret = 1;
2163 goto unlock;
2164 }
Brian Gix2b64d152011-12-21 16:12:12 -08002165
2166 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002167
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002168 if (test_bit(HCI_SC_ENABLED, &hcon->hdev->dev_flags))
2169 authreq |= SMP_AUTH_SC;
2170
Johan Hedberg79897d22014-06-01 09:45:24 +03002171 /* Require MITM if IO Capability allows or the security level
2172 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002173 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002174 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002175 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002176 authreq |= SMP_AUTH_MITM;
2177
Johan Hedberg40bef302014-07-16 11:42:27 +03002178 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002179 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002180
Brian Gix2b64d152011-12-21 16:12:12 -08002181 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002182 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2183 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002184
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002185 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002186 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002187 } else {
2188 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002189 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002190 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002191 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002192 }
2193
Johan Hedberg4a74d652014-05-20 09:45:50 +03002194 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002195 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002196
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002197unlock:
2198 l2cap_chan_unlock(chan);
2199 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002200}
2201
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002202static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2203{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002204 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002205 struct l2cap_chan *chan = conn->smp;
2206 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002207
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002208 BT_DBG("conn %p", conn);
2209
2210 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002211 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002212
Johan Hedbergb28b4942014-09-05 22:19:55 +03002213 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002214
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002215 skb_pull(skb, sizeof(*rp));
2216
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002217 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002218
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002219 return 0;
2220}
2221
2222static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2223{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002224 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002225 struct l2cap_chan *chan = conn->smp;
2226 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002227 struct hci_dev *hdev = conn->hcon->hdev;
2228 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002229 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002230 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002231
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002232 BT_DBG("conn %p", conn);
2233
2234 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002235 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002236
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002237 /* Mark the information as received */
2238 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2239
Johan Hedbergb28b4942014-09-05 22:19:55 +03002240 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2241 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002242 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2243 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002244
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002245 skb_pull(skb, sizeof(*rp));
2246
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002247 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002248 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002249 authenticated, smp->tk, smp->enc_key_size,
2250 rp->ediv, rp->rand);
2251 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002252 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002253 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002254
2255 return 0;
2256}
2257
Johan Hedbergfd349c02014-02-18 10:19:36 +02002258static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2259{
2260 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002261 struct l2cap_chan *chan = conn->smp;
2262 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002263
2264 BT_DBG("");
2265
2266 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002267 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002268
Johan Hedbergb28b4942014-09-05 22:19:55 +03002269 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002270
Johan Hedbergfd349c02014-02-18 10:19:36 +02002271 skb_pull(skb, sizeof(*info));
2272
2273 memcpy(smp->irk, info->irk, 16);
2274
2275 return 0;
2276}
2277
2278static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2279 struct sk_buff *skb)
2280{
2281 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002282 struct l2cap_chan *chan = conn->smp;
2283 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002284 struct hci_conn *hcon = conn->hcon;
2285 bdaddr_t rpa;
2286
2287 BT_DBG("");
2288
2289 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002290 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002291
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002292 /* Mark the information as received */
2293 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2294
Johan Hedbergb28b4942014-09-05 22:19:55 +03002295 if (smp->remote_key_dist & SMP_DIST_SIGN)
2296 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2297
Johan Hedbergfd349c02014-02-18 10:19:36 +02002298 skb_pull(skb, sizeof(*info));
2299
Johan Hedberga9a58f82014-02-25 22:24:37 +02002300 /* Strictly speaking the Core Specification (4.1) allows sending
2301 * an empty address which would force us to rely on just the IRK
2302 * as "identity information". However, since such
2303 * implementations are not known of and in order to not over
2304 * complicate our implementation, simply pretend that we never
2305 * received an IRK for such a device.
2306 */
2307 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
2308 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002309 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002310 }
2311
Johan Hedbergfd349c02014-02-18 10:19:36 +02002312 bacpy(&smp->id_addr, &info->bdaddr);
2313 smp->id_addr_type = info->addr_type;
2314
2315 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2316 bacpy(&rpa, &hcon->dst);
2317 else
2318 bacpy(&rpa, BDADDR_ANY);
2319
Johan Hedberg23d0e122014-02-19 14:57:46 +02002320 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2321 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002322
Johan Hedberg31dd6242014-06-27 14:23:02 +03002323distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002324 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2325 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002326
2327 return 0;
2328}
2329
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002330static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2331{
2332 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002333 struct l2cap_chan *chan = conn->smp;
2334 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002335 struct smp_csrk *csrk;
2336
2337 BT_DBG("conn %p", conn);
2338
2339 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002340 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002341
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002342 /* Mark the information as received */
2343 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2344
2345 skb_pull(skb, sizeof(*rp));
2346
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002347 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2348 if (csrk) {
2349 csrk->master = 0x01;
2350 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2351 }
2352 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002353 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002354
2355 return 0;
2356}
2357
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002358static u8 sc_select_method(struct smp_chan *smp)
2359{
2360 struct l2cap_conn *conn = smp->conn;
2361 struct hci_conn *hcon = conn->hcon;
2362 struct smp_cmd_pairing *local, *remote;
2363 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2364
Johan Hedberga29b0732014-10-28 15:17:05 +01002365 if (test_bit(SMP_FLAG_OOB, &smp->flags))
2366 return REQ_OOB;
2367
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002368 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2369 * which are needed as inputs to some crypto functions. To get
2370 * the "struct smp_cmd_pairing" from them we need to skip the
2371 * first byte which contains the opcode.
2372 */
2373 if (hcon->out) {
2374 local = (void *) &smp->preq[1];
2375 remote = (void *) &smp->prsp[1];
2376 } else {
2377 local = (void *) &smp->prsp[1];
2378 remote = (void *) &smp->preq[1];
2379 }
2380
2381 local_io = local->io_capability;
2382 remote_io = remote->io_capability;
2383
2384 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2385 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2386
2387 /* If either side wants MITM, look up the method from the table,
2388 * otherwise use JUST WORKS.
2389 */
2390 if (local_mitm || remote_mitm)
2391 method = get_auth_method(smp, local_io, remote_io);
2392 else
2393 method = JUST_WORKS;
2394
2395 /* Don't confirm locally initiated pairing attempts */
2396 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2397 method = JUST_WORKS;
2398
2399 return method;
2400}
2401
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002402static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2403{
2404 struct smp_cmd_public_key *key = (void *) skb->data;
2405 struct hci_conn *hcon = conn->hcon;
2406 struct l2cap_chan *chan = conn->smp;
2407 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002408 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002409 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002410 int err;
2411
2412 BT_DBG("conn %p", conn);
2413
2414 if (skb->len < sizeof(*key))
2415 return SMP_INVALID_PARAMS;
2416
2417 memcpy(smp->remote_pk, key, 64);
2418
2419 /* Non-initiating device sends its public key after receiving
2420 * the key from the initiating device.
2421 */
2422 if (!hcon->out) {
2423 err = sc_send_public_key(smp);
2424 if (err)
2425 return err;
2426 }
2427
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002428 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
2429 SMP_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002430
2431 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2432 return SMP_UNSPECIFIED;
2433
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002434 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002435
2436 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2437
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002438 smp->method = sc_select_method(smp);
2439
2440 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2441
2442 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2443 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2444 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2445 else
2446 hcon->pending_sec_level = BT_SECURITY_FIPS;
2447
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002448 if (!memcmp(debug_pk, smp->remote_pk, 64))
2449 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2450
Johan Hedberg38606f12014-06-25 11:10:28 +03002451 if (smp->method == DSP_PASSKEY) {
2452 get_random_bytes(&hcon->passkey_notify,
2453 sizeof(hcon->passkey_notify));
2454 hcon->passkey_notify %= 1000000;
2455 hcon->passkey_entered = 0;
2456 smp->passkey_round = 0;
2457 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2458 hcon->dst_type,
2459 hcon->passkey_notify,
2460 hcon->passkey_entered))
2461 return SMP_UNSPECIFIED;
2462 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2463 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2464 }
2465
Johan Hedberga29b0732014-10-28 15:17:05 +01002466 if (smp->method == REQ_OOB) {
2467 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2468 smp->rr, 0, cfm.confirm_val);
2469 if (err)
2470 return SMP_UNSPECIFIED;
2471
2472 if (memcmp(cfm.confirm_val, smp->pcnf, 16))
2473 return SMP_CONFIRM_FAILED;
2474
2475 if (hcon->out)
2476 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2477 sizeof(smp->prnd), smp->prnd);
2478
2479 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2480
2481 return 0;
2482 }
2483
Johan Hedberg38606f12014-06-25 11:10:28 +03002484 if (hcon->out)
2485 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2486
2487 if (smp->method == REQ_PASSKEY) {
2488 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2489 hcon->dst_type))
2490 return SMP_UNSPECIFIED;
2491 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2492 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2493 return 0;
2494 }
2495
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002496 /* The Initiating device waits for the non-initiating device to
2497 * send the confirm value.
2498 */
2499 if (conn->hcon->out)
2500 return 0;
2501
2502 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2503 0, cfm.confirm_val);
2504 if (err)
2505 return SMP_UNSPECIFIED;
2506
2507 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2508 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2509
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002510 return 0;
2511}
2512
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002513static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2514{
2515 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2516 struct l2cap_chan *chan = conn->smp;
2517 struct hci_conn *hcon = conn->hcon;
2518 struct smp_chan *smp = chan->data;
2519 u8 a[7], b[7], *local_addr, *remote_addr;
2520 u8 io_cap[3], r[16], e[16];
2521 int err;
2522
2523 BT_DBG("conn %p", conn);
2524
2525 if (skb->len < sizeof(*check))
2526 return SMP_INVALID_PARAMS;
2527
2528 memcpy(a, &hcon->init_addr, 6);
2529 memcpy(b, &hcon->resp_addr, 6);
2530 a[6] = hcon->init_addr_type;
2531 b[6] = hcon->resp_addr_type;
2532
2533 if (hcon->out) {
2534 local_addr = a;
2535 remote_addr = b;
2536 memcpy(io_cap, &smp->prsp[1], 3);
2537 } else {
2538 local_addr = b;
2539 remote_addr = a;
2540 memcpy(io_cap, &smp->preq[1], 3);
2541 }
2542
2543 memset(r, 0, sizeof(r));
2544
Johan Hedberg38606f12014-06-25 11:10:28 +03002545 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2546 put_unaligned_le32(hcon->passkey_notify, r);
2547
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002548 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2549 io_cap, remote_addr, local_addr, e);
2550 if (err)
2551 return SMP_UNSPECIFIED;
2552
2553 if (memcmp(check->e, e, 16))
2554 return SMP_DHKEY_CHECK_FAILED;
2555
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002556 if (!hcon->out) {
2557 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2558 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2559 return 0;
2560 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002561
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002562 /* Slave sends DHKey check as response to master */
2563 sc_dhkey_check(smp);
2564 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002565
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002566 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002567
2568 if (hcon->out) {
2569 hci_le_start_enc(hcon, 0, 0, smp->tk);
2570 hcon->enc_key_size = smp->enc_key_size;
2571 }
2572
2573 return 0;
2574}
2575
Johan Hedberg1408bb62014-06-04 22:45:57 +03002576static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2577 struct sk_buff *skb)
2578{
2579 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2580
2581 BT_DBG("value 0x%02x", kp->value);
2582
2583 return 0;
2584}
2585
Johan Hedberg4befb862014-08-11 22:06:38 +03002586static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002587{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002588 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002589 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002590 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002591 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002592 int err = 0;
2593
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002594 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002595 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002596
Marcel Holtmann06ae3312013-10-18 03:43:00 -07002597 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002598 reason = SMP_PAIRING_NOTSUPP;
2599 goto done;
2600 }
2601
Marcel Holtmann92381f52013-10-03 01:23:08 -07002602 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002603 skb_pull(skb, sizeof(code));
2604
Johan Hedbergb28b4942014-09-05 22:19:55 +03002605 smp = chan->data;
2606
2607 if (code > SMP_CMD_MAX)
2608 goto drop;
2609
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002610 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002611 goto drop;
2612
2613 /* If we don't have a context the only allowed commands are
2614 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002615 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002616 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2617 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002618
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002619 switch (code) {
2620 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002621 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002622 break;
2623
2624 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002625 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002626 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002627 break;
2628
2629 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002630 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002631 break;
2632
2633 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002634 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002635 break;
2636
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002637 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002638 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002639 break;
2640
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002641 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002642 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002643 break;
2644
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002645 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002646 reason = smp_cmd_encrypt_info(conn, skb);
2647 break;
2648
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002649 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002650 reason = smp_cmd_master_ident(conn, skb);
2651 break;
2652
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002653 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002654 reason = smp_cmd_ident_info(conn, skb);
2655 break;
2656
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002657 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002658 reason = smp_cmd_ident_addr_info(conn, skb);
2659 break;
2660
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002661 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002662 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002663 break;
2664
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002665 case SMP_CMD_PUBLIC_KEY:
2666 reason = smp_cmd_public_key(conn, skb);
2667 break;
2668
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002669 case SMP_CMD_DHKEY_CHECK:
2670 reason = smp_cmd_dhkey_check(conn, skb);
2671 break;
2672
Johan Hedberg1408bb62014-06-04 22:45:57 +03002673 case SMP_CMD_KEYPRESS_NOTIFY:
2674 reason = smp_cmd_keypress_notify(conn, skb);
2675 break;
2676
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002677 default:
2678 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002679 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002680 goto done;
2681 }
2682
2683done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002684 if (!err) {
2685 if (reason)
2686 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002687 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002688 }
2689
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002690 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002691
2692drop:
2693 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2694 code, &hcon->dst);
2695 kfree_skb(skb);
2696 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002697}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002698
Johan Hedberg70db83c2014-08-08 09:37:16 +03002699static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2700{
2701 struct l2cap_conn *conn = chan->conn;
2702
2703 BT_DBG("chan %p", chan);
2704
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002705 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002706 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002707
Johan Hedberg70db83c2014-08-08 09:37:16 +03002708 conn->smp = NULL;
2709 l2cap_chan_put(chan);
2710}
2711
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002712static void bredr_pairing(struct l2cap_chan *chan)
2713{
2714 struct l2cap_conn *conn = chan->conn;
2715 struct hci_conn *hcon = conn->hcon;
2716 struct hci_dev *hdev = hcon->hdev;
2717 struct smp_cmd_pairing req;
2718 struct smp_chan *smp;
2719
2720 BT_DBG("chan %p", chan);
2721
2722 /* Only new pairings are interesting */
2723 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2724 return;
2725
2726 /* Don't bother if we're not encrypted */
2727 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2728 return;
2729
2730 /* Only master may initiate SMP over BR/EDR */
2731 if (hcon->role != HCI_ROLE_MASTER)
2732 return;
2733
2734 /* Secure Connections support must be enabled */
2735 if (!test_bit(HCI_SC_ENABLED, &hdev->dev_flags))
2736 return;
2737
2738 /* BR/EDR must use Secure Connections for SMP */
2739 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
2740 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2741 return;
2742
2743 /* If our LE support is not enabled don't do anything */
2744 if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
2745 return;
2746
2747 /* Don't bother if remote LE support is not enabled */
2748 if (!lmp_host_le_capable(hcon))
2749 return;
2750
2751 /* Remote must support SMP fixed chan for BR/EDR */
2752 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2753 return;
2754
2755 /* Don't bother if SMP is already ongoing */
2756 if (chan->data)
2757 return;
2758
2759 smp = smp_chan_create(conn);
2760 if (!smp) {
2761 BT_ERR("%s unable to create SMP context for BR/EDR",
2762 hdev->name);
2763 return;
2764 }
2765
2766 set_bit(SMP_FLAG_SC, &smp->flags);
2767
2768 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2769
2770 /* Prepare and send the BR/EDR SMP Pairing Request */
2771 build_bredr_pairing_cmd(smp, &req, NULL);
2772
2773 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2774 memcpy(&smp->preq[1], &req, sizeof(req));
2775
2776 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2777 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2778}
2779
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002780static void smp_resume_cb(struct l2cap_chan *chan)
2781{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002782 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002783 struct l2cap_conn *conn = chan->conn;
2784 struct hci_conn *hcon = conn->hcon;
2785
2786 BT_DBG("chan %p", chan);
2787
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002788 if (hcon->type == ACL_LINK) {
2789 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002790 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002791 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002792
Johan Hedberg86d14072014-08-11 22:06:43 +03002793 if (!smp)
2794 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002795
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002796 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2797 return;
2798
Johan Hedberg86d14072014-08-11 22:06:43 +03002799 cancel_delayed_work(&smp->security_timer);
2800
Johan Hedbergd6268e82014-09-05 22:19:51 +03002801 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002802}
2803
Johan Hedberg70db83c2014-08-08 09:37:16 +03002804static void smp_ready_cb(struct l2cap_chan *chan)
2805{
2806 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002807 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002808
2809 BT_DBG("chan %p", chan);
2810
2811 conn->smp = chan;
2812 l2cap_chan_hold(chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002813
2814 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2815 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002816}
2817
Johan Hedberg4befb862014-08-11 22:06:38 +03002818static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2819{
2820 int err;
2821
2822 BT_DBG("chan %p", chan);
2823
2824 err = smp_sig_channel(chan, skb);
2825 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002826 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002827
Johan Hedbergb68fda62014-08-11 22:06:40 +03002828 if (smp)
2829 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002830
Johan Hedberg1e91c292014-08-18 20:33:29 +03002831 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002832 }
2833
2834 return err;
2835}
2836
Johan Hedberg70db83c2014-08-08 09:37:16 +03002837static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2838 unsigned long hdr_len,
2839 unsigned long len, int nb)
2840{
2841 struct sk_buff *skb;
2842
2843 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2844 if (!skb)
2845 return ERR_PTR(-ENOMEM);
2846
2847 skb->priority = HCI_PRIO_MAX;
2848 bt_cb(skb)->chan = chan;
2849
2850 return skb;
2851}
2852
2853static const struct l2cap_ops smp_chan_ops = {
2854 .name = "Security Manager",
2855 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002856 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002857 .alloc_skb = smp_alloc_skb_cb,
2858 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002859 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002860
2861 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002862 .state_change = l2cap_chan_no_state_change,
2863 .close = l2cap_chan_no_close,
2864 .defer = l2cap_chan_no_defer,
2865 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002866 .set_shutdown = l2cap_chan_no_set_shutdown,
2867 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002868};
2869
2870static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2871{
2872 struct l2cap_chan *chan;
2873
2874 BT_DBG("pchan %p", pchan);
2875
2876 chan = l2cap_chan_create();
2877 if (!chan)
2878 return NULL;
2879
2880 chan->chan_type = pchan->chan_type;
2881 chan->ops = &smp_chan_ops;
2882 chan->scid = pchan->scid;
2883 chan->dcid = chan->scid;
2884 chan->imtu = pchan->imtu;
2885 chan->omtu = pchan->omtu;
2886 chan->mode = pchan->mode;
2887
Johan Hedbergabe84902014-11-12 22:22:21 +02002888 /* Other L2CAP channels may request SMP routines in order to
2889 * change the security level. This means that the SMP channel
2890 * lock must be considered in its own category to avoid lockdep
2891 * warnings.
2892 */
2893 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
2894
Johan Hedberg70db83c2014-08-08 09:37:16 +03002895 BT_DBG("created chan %p", chan);
2896
2897 return chan;
2898}
2899
2900static const struct l2cap_ops smp_root_chan_ops = {
2901 .name = "Security Manager Root",
2902 .new_connection = smp_new_conn_cb,
2903
2904 /* None of these are implemented for the root channel */
2905 .close = l2cap_chan_no_close,
2906 .alloc_skb = l2cap_chan_no_alloc_skb,
2907 .recv = l2cap_chan_no_recv,
2908 .state_change = l2cap_chan_no_state_change,
2909 .teardown = l2cap_chan_no_teardown,
2910 .ready = l2cap_chan_no_ready,
2911 .defer = l2cap_chan_no_defer,
2912 .suspend = l2cap_chan_no_suspend,
2913 .resume = l2cap_chan_no_resume,
2914 .set_shutdown = l2cap_chan_no_set_shutdown,
2915 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002916};
2917
Johan Hedbergef8efe42014-08-13 15:12:32 +03002918static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002919{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002920 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002921 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002922
Johan Hedbergef8efe42014-08-13 15:12:32 +03002923 if (cid == L2CAP_CID_SMP_BREDR) {
2924 tfm_aes = NULL;
2925 goto create_chan;
2926 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03002927
Johan Hedbergadae20c2014-11-13 14:37:48 +02002928 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002929 if (IS_ERR(tfm_aes)) {
Johan Hedberg711eafe2014-08-08 09:32:52 +03002930 BT_ERR("Unable to create crypto context");
Fengguang Wufe700772014-12-08 03:04:38 +08002931 return ERR_CAST(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002932 }
2933
Johan Hedbergef8efe42014-08-13 15:12:32 +03002934create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03002935 chan = l2cap_chan_create();
2936 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002937 crypto_free_blkcipher(tfm_aes);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002938 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002939 }
2940
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002941 chan->data = tfm_aes;
2942
Johan Hedbergef8efe42014-08-13 15:12:32 +03002943 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002944
2945 l2cap_chan_set_defaults(chan);
2946
2947 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002948 if (cid == L2CAP_CID_SMP)
2949 chan->src_type = BDADDR_LE_PUBLIC;
2950 else
2951 chan->src_type = BDADDR_BREDR;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002952 chan->state = BT_LISTEN;
2953 chan->mode = L2CAP_MODE_BASIC;
2954 chan->imtu = L2CAP_DEFAULT_MTU;
2955 chan->ops = &smp_root_chan_ops;
2956
Johan Hedbergabe84902014-11-12 22:22:21 +02002957 /* Set correct nesting level for a parent/listening channel */
2958 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
2959
Johan Hedbergef8efe42014-08-13 15:12:32 +03002960 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03002961}
2962
Johan Hedbergef8efe42014-08-13 15:12:32 +03002963static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002964{
Johan Hedbergef8efe42014-08-13 15:12:32 +03002965 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002966
Johan Hedbergef8efe42014-08-13 15:12:32 +03002967 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002968
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002969 tfm_aes = chan->data;
2970 if (tfm_aes) {
2971 chan->data = NULL;
2972 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002973 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03002974
Johan Hedberg70db83c2014-08-08 09:37:16 +03002975 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002976}
Johan Hedbergef8efe42014-08-13 15:12:32 +03002977
2978int smp_register(struct hci_dev *hdev)
2979{
2980 struct l2cap_chan *chan;
2981
2982 BT_DBG("%s", hdev->name);
2983
2984 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
2985 if (IS_ERR(chan))
2986 return PTR_ERR(chan);
2987
2988 hdev->smp_data = chan;
2989
2990 if (!lmp_sc_capable(hdev) &&
2991 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2992 return 0;
2993
2994 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
2995 if (IS_ERR(chan)) {
2996 int err = PTR_ERR(chan);
2997 chan = hdev->smp_data;
2998 hdev->smp_data = NULL;
2999 smp_del_chan(chan);
3000 return err;
3001 }
3002
3003 hdev->smp_bredr_data = chan;
3004
3005 return 0;
3006}
3007
3008void smp_unregister(struct hci_dev *hdev)
3009{
3010 struct l2cap_chan *chan;
3011
3012 if (hdev->smp_bredr_data) {
3013 chan = hdev->smp_bredr_data;
3014 hdev->smp_bredr_data = NULL;
3015 smp_del_chan(chan);
3016 }
3017
3018 if (hdev->smp_data) {
3019 chan = hdev->smp_data;
3020 hdev->smp_data = NULL;
3021 smp_del_chan(chan);
3022 }
3023}