blob: 1d1c33d5d1dce56c75b9e5b32a049335e300a888 [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
359 if (tfm == NULL) {
360 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
542 msg.msg_iov = (struct iovec *) &iv;
543 msg.msg_iovlen = 2;
544
545 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300546
Johan Hedbergb68fda62014-08-11 22:06:40 +0300547 if (!chan->data)
548 return;
549
550 smp = chan->data;
551
552 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300553 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300554}
555
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300556static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800557{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300558 if (authreq & SMP_AUTH_MITM) {
559 if (authreq & SMP_AUTH_SC)
560 return BT_SECURITY_FIPS;
561 else
562 return BT_SECURITY_HIGH;
563 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800564 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300565 }
Brian Gix2b64d152011-12-21 16:12:12 -0800566}
567
568static __u8 seclevel_to_authreq(__u8 sec_level)
569{
570 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300571 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800572 case BT_SECURITY_HIGH:
573 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
574 case BT_SECURITY_MEDIUM:
575 return SMP_AUTH_BONDING;
576 default:
577 return SMP_AUTH_NONE;
578 }
579}
580
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300581static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700582 struct smp_cmd_pairing *req,
583 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300584{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300585 struct l2cap_chan *chan = conn->smp;
586 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200587 struct hci_conn *hcon = conn->hcon;
588 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100589 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300590
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300591 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700592 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
593 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300594 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800595 } else {
596 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300597 }
598
Johan Hedbergfd349c02014-02-18 10:19:36 +0200599 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
600 remote_dist |= SMP_DIST_ID_KEY;
601
Johan Hedberg863efaf2014-02-22 19:06:32 +0200602 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
603 local_dist |= SMP_DIST_ID_KEY;
604
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100605 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags) &&
606 (authreq & SMP_AUTH_SC)) {
607 struct oob_data *oob_data;
608 u8 bdaddr_type;
609
610 if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300611 local_dist |= SMP_DIST_LINK_KEY;
612 remote_dist |= SMP_DIST_LINK_KEY;
613 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100614
615 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
616 bdaddr_type = BDADDR_LE_PUBLIC;
617 else
618 bdaddr_type = BDADDR_LE_RANDOM;
619
620 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
621 bdaddr_type);
622 if (oob_data) {
623 set_bit(SMP_FLAG_OOB, &smp->flags);
624 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100625 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100626 memcpy(smp->pcnf, oob_data->hash256, 16);
627 }
628
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300629 } else {
630 authreq &= ~SMP_AUTH_SC;
631 }
632
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300633 if (rsp == NULL) {
634 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100635 req->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300636 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200637 req->init_key_dist = local_dist;
638 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300639 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200640
641 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300642 return;
643 }
644
645 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100646 rsp->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300647 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200648 rsp->init_key_dist = req->init_key_dist & remote_dist;
649 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300650 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200651
652 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300653}
654
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300655static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
656{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300657 struct l2cap_chan *chan = conn->smp;
658 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300659
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300660 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700661 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300662 return SMP_ENC_KEY_SIZE;
663
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300664 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300665
666 return 0;
667}
668
Johan Hedberg6f48e262014-08-11 22:06:44 +0300669static void smp_chan_destroy(struct l2cap_conn *conn)
670{
671 struct l2cap_chan *chan = conn->smp;
672 struct smp_chan *smp = chan->data;
673 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);
680 mgmt_smp_complete(conn->hcon, complete);
681
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
689 /* If pairing failed clean up any keys we might have */
690 if (!complete) {
691 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200692 list_del_rcu(&smp->ltk->list);
693 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300694 }
695
696 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200697 list_del_rcu(&smp->slave_ltk->list);
698 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300699 }
700
701 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200702 list_del_rcu(&smp->remote_irk->list);
703 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300704 }
705 }
706
707 chan->data = NULL;
708 kfree(smp);
709 hci_conn_drop(conn->hcon);
710}
711
Johan Hedberg84794e12013-11-06 11:24:57 +0200712static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800713{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200714 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300715 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200716
Johan Hedberg84794e12013-11-06 11:24:57 +0200717 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800718 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700719 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800720
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700721 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700722 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300723
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300724 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300725 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800726}
727
Brian Gix2b64d152011-12-21 16:12:12 -0800728#define JUST_WORKS 0x00
729#define JUST_CFM 0x01
730#define REQ_PASSKEY 0x02
731#define CFM_PASSKEY 0x03
732#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300733#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800734#define OVERLAP 0xFF
735
736static const u8 gen_method[5][5] = {
737 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
738 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
739 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
740 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
741 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
742};
743
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300744static const u8 sc_method[5][5] = {
745 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
746 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
747 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
748 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
749 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
750};
751
Johan Hedberg581370c2014-06-17 13:07:38 +0300752static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
753{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300754 /* If either side has unknown io_caps, use JUST_CFM (which gets
755 * converted later to JUST_WORKS if we're initiators.
756 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300757 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
758 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300759 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300760
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300761 if (test_bit(SMP_FLAG_SC, &smp->flags))
762 return sc_method[remote_io][local_io];
763
Johan Hedberg581370c2014-06-17 13:07:38 +0300764 return gen_method[remote_io][local_io];
765}
766
Brian Gix2b64d152011-12-21 16:12:12 -0800767static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
768 u8 local_io, u8 remote_io)
769{
770 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300771 struct l2cap_chan *chan = conn->smp;
772 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800773 u32 passkey = 0;
774 int ret = 0;
775
776 /* Initialize key for JUST WORKS */
777 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300778 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800779
780 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
781
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300782 /* If neither side wants MITM, either "just" confirm an incoming
783 * request or use just-works for outgoing ones. The JUST_CFM
784 * will be converted to JUST_WORKS if necessary later in this
785 * function. If either side has MITM look up the method from the
786 * table.
787 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300788 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300789 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800790 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300791 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800792
Johan Hedberga82505c2014-03-24 14:39:07 +0200793 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300794 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
795 &smp->flags))
796 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200797
Johan Hedberg02f3e252014-07-16 15:09:13 +0300798 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300799 if (smp->method == JUST_CFM &&
800 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
801 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300802
Brian Gix2b64d152011-12-21 16:12:12 -0800803 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300804 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300805 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800806 return 0;
807 }
808
809 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300810 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300811 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300812 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
813 hcon->pending_sec_level = BT_SECURITY_HIGH;
814 }
Brian Gix2b64d152011-12-21 16:12:12 -0800815
816 /* If both devices have Keyoard-Display I/O, the master
817 * Confirms and the slave Enters the passkey.
818 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300819 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300820 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300821 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800822 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300823 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800824 }
825
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200826 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300827 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200828 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800829 get_random_bytes(&passkey, sizeof(passkey));
830 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200831 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800832 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300833 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800834 }
835
Johan Hedberg783e0572014-05-31 18:48:26 +0300836 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700837 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200838 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300839 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200840 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
841 hcon->type, hcon->dst_type,
842 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800843 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200844 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200845 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200846 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800847
Brian Gix2b64d152011-12-21 16:12:12 -0800848 return ret;
849}
850
Johan Hedberg1cc61142014-05-20 09:45:52 +0300851static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300852{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300853 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300854 struct smp_cmd_pairing_confirm cp;
855 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300856
857 BT_DBG("conn %p", conn);
858
Johan Hedberge491eaf2014-10-25 21:15:37 +0200859 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200860 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200861 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
862 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300863 if (ret)
864 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300865
Johan Hedberg4a74d652014-05-20 09:45:50 +0300866 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800867
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300868 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
869
Johan Hedbergb28b4942014-09-05 22:19:55 +0300870 if (conn->hcon->out)
871 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
872 else
873 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
874
Johan Hedberg1cc61142014-05-20 09:45:52 +0300875 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300876}
877
Johan Hedberg861580a2014-05-20 09:45:51 +0300878static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300879{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300880 struct l2cap_conn *conn = smp->conn;
881 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300882 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300883 int ret;
884
Johan Hedbergec70f362014-06-27 14:23:04 +0300885 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300886 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300887
888 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
889
Johan Hedberge491eaf2014-10-25 21:15:37 +0200890 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200891 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200892 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300893 if (ret)
894 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300895
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300896 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
897 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300898 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300899 }
900
901 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800902 u8 stk[16];
903 __le64 rand = 0;
904 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300905
Johan Hedberge491eaf2014-10-25 21:15:37 +0200906 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300907
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300908 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300909 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300910
Johan Hedberg861580a2014-05-20 09:45:51 +0300911 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
912 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300913
914 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300915 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300916 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300917 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300918 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800919 __le64 rand = 0;
920 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300921
Johan Hedberg943a7322014-03-18 12:58:24 +0200922 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
923 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300924
Johan Hedberge491eaf2014-10-25 21:15:37 +0200925 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300926
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300927 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700928 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300929
Johan Hedbergfff34902014-06-10 15:19:50 +0300930 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
931 auth = 1;
932 else
933 auth = 0;
934
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300935 /* Even though there's no _SLAVE suffix this is the
936 * slave STK we're adding for later lookup (the master
937 * STK never needs to be stored).
938 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700939 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300940 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300941 }
942
Johan Hedberg861580a2014-05-20 09:45:51 +0300943 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300944}
945
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300946static void smp_notify_keys(struct l2cap_conn *conn)
947{
948 struct l2cap_chan *chan = conn->smp;
949 struct smp_chan *smp = chan->data;
950 struct hci_conn *hcon = conn->hcon;
951 struct hci_dev *hdev = hcon->hdev;
952 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
953 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
954 bool persistent;
955
956 if (smp->remote_irk) {
957 mgmt_new_irk(hdev, smp->remote_irk);
958 /* Now that user space can be considered to know the
959 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300960 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300961 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300962 if (hcon->type == LE_LINK) {
963 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
964 hcon->dst_type = smp->remote_irk->addr_type;
965 queue_work(hdev->workqueue, &conn->id_addr_update_work);
966 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300967
968 /* When receiving an indentity resolving key for
969 * a remote device that does not use a resolvable
970 * private address, just remove the key so that
971 * it is possible to use the controller white
972 * list for scanning.
973 *
974 * Userspace will have been told to not store
975 * this key at this point. So it is safe to
976 * just remove it.
977 */
978 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200979 list_del_rcu(&smp->remote_irk->list);
980 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300981 smp->remote_irk = NULL;
982 }
983 }
984
Johan Hedbergb5ae3442014-08-14 12:34:26 +0300985 if (hcon->type == ACL_LINK) {
986 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
987 persistent = false;
988 else
989 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
990 &hcon->flags);
991 } else {
992 /* The LTKs and CSRKs should be persistent only if both sides
993 * had the bonding bit set in their authentication requests.
994 */
995 persistent = !!((req->auth_req & rsp->auth_req) &
996 SMP_AUTH_BONDING);
997 }
998
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300999
1000 if (smp->csrk) {
1001 smp->csrk->bdaddr_type = hcon->dst_type;
1002 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1003 mgmt_new_csrk(hdev, smp->csrk, persistent);
1004 }
1005
1006 if (smp->slave_csrk) {
1007 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1008 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1009 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1010 }
1011
1012 if (smp->ltk) {
1013 smp->ltk->bdaddr_type = hcon->dst_type;
1014 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1015 mgmt_new_ltk(hdev, smp->ltk, persistent);
1016 }
1017
1018 if (smp->slave_ltk) {
1019 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1020 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1021 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1022 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001023
1024 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001025 struct link_key *key;
1026 u8 type;
1027
1028 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1029 type = HCI_LK_DEBUG_COMBINATION;
1030 else if (hcon->sec_level == BT_SECURITY_FIPS)
1031 type = HCI_LK_AUTH_COMBINATION_P256;
1032 else
1033 type = HCI_LK_UNAUTH_COMBINATION_P256;
1034
1035 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1036 smp->link_key, type, 0, &persistent);
1037 if (key) {
1038 mgmt_new_link_key(hdev, key, persistent);
1039
1040 /* Don't keep debug keys around if the relevant
1041 * flag is not set.
1042 */
1043 if (!test_bit(HCI_KEEP_DEBUG_KEYS, &hdev->dev_flags) &&
1044 key->type == HCI_LK_DEBUG_COMBINATION) {
1045 list_del_rcu(&key->list);
1046 kfree_rcu(key, rcu);
1047 }
1048 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001049 }
1050}
1051
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001052static void sc_add_ltk(struct smp_chan *smp)
1053{
1054 struct hci_conn *hcon = smp->conn->hcon;
1055 u8 key_type, auth;
1056
1057 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1058 key_type = SMP_LTK_P256_DEBUG;
1059 else
1060 key_type = SMP_LTK_P256;
1061
1062 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1063 auth = 1;
1064 else
1065 auth = 0;
1066
1067 memset(smp->tk + smp->enc_key_size, 0,
1068 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
1069
1070 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1071 key_type, auth, smp->tk, smp->enc_key_size,
1072 0, 0);
1073}
1074
Johan Hedberg6a770832014-06-06 11:54:04 +03001075static void sc_generate_link_key(struct smp_chan *smp)
1076{
1077 /* These constants are as specified in the core specification.
1078 * In ASCII they spell out to 'tmp1' and 'lebr'.
1079 */
1080 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1081 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1082
1083 smp->link_key = kzalloc(16, GFP_KERNEL);
1084 if (!smp->link_key)
1085 return;
1086
1087 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
1088 kfree(smp->link_key);
1089 smp->link_key = NULL;
1090 return;
1091 }
1092
1093 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
1094 kfree(smp->link_key);
1095 smp->link_key = NULL;
1096 return;
1097 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001098}
1099
Johan Hedbergb28b4942014-09-05 22:19:55 +03001100static void smp_allow_key_dist(struct smp_chan *smp)
1101{
1102 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1103 * will be allowed in each PDU handler to ensure we receive
1104 * them in the correct order.
1105 */
1106 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1107 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1108 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1109 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1110 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1111 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1112}
1113
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001114static void sc_generate_ltk(struct smp_chan *smp)
1115{
1116 /* These constants are as specified in the core specification.
1117 * In ASCII they spell out to 'tmp2' and 'brle'.
1118 */
1119 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1120 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1121 struct hci_conn *hcon = smp->conn->hcon;
1122 struct hci_dev *hdev = hcon->hdev;
1123 struct link_key *key;
1124
1125 key = hci_find_link_key(hdev, &hcon->dst);
1126 if (!key) {
1127 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1128 return;
1129 }
1130
1131 if (key->type == HCI_LK_DEBUG_COMBINATION)
1132 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1133
1134 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1135 return;
1136
1137 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1138 return;
1139
1140 sc_add_ltk(smp);
1141}
1142
Johan Hedbergd6268e82014-09-05 22:19:51 +03001143static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001144{
1145 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001146 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001147 struct hci_conn *hcon = conn->hcon;
1148 struct hci_dev *hdev = hcon->hdev;
1149 __u8 *keydist;
1150
1151 BT_DBG("conn %p", conn);
1152
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001153 rsp = (void *) &smp->prsp[1];
1154
1155 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001156 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1157 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001158 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001159 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001160
1161 req = (void *) &smp->preq[1];
1162
1163 if (hcon->out) {
1164 keydist = &rsp->init_key_dist;
1165 *keydist &= req->init_key_dist;
1166 } else {
1167 keydist = &rsp->resp_key_dist;
1168 *keydist &= req->resp_key_dist;
1169 }
1170
Johan Hedberg6a770832014-06-06 11:54:04 +03001171 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001172 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001173 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001174 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1175 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001176
1177 /* Clear the keys which are generated but not distributed */
1178 *keydist &= ~SMP_SC_NO_DIST;
1179 }
1180
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001181 BT_DBG("keydist 0x%x", *keydist);
1182
1183 if (*keydist & SMP_DIST_ENC_KEY) {
1184 struct smp_cmd_encrypt_info enc;
1185 struct smp_cmd_master_ident ident;
1186 struct smp_ltk *ltk;
1187 u8 authenticated;
1188 __le16 ediv;
1189 __le64 rand;
1190
1191 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1192 get_random_bytes(&ediv, sizeof(ediv));
1193 get_random_bytes(&rand, sizeof(rand));
1194
1195 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1196
1197 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1198 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1199 SMP_LTK_SLAVE, authenticated, enc.ltk,
1200 smp->enc_key_size, ediv, rand);
1201 smp->slave_ltk = ltk;
1202
1203 ident.ediv = ediv;
1204 ident.rand = rand;
1205
1206 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1207
1208 *keydist &= ~SMP_DIST_ENC_KEY;
1209 }
1210
1211 if (*keydist & SMP_DIST_ID_KEY) {
1212 struct smp_cmd_ident_addr_info addrinfo;
1213 struct smp_cmd_ident_info idinfo;
1214
1215 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1216
1217 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1218
1219 /* The hci_conn contains the local identity address
1220 * after the connection has been established.
1221 *
1222 * This is true even when the connection has been
1223 * established using a resolvable random address.
1224 */
1225 bacpy(&addrinfo.bdaddr, &hcon->src);
1226 addrinfo.addr_type = hcon->src_type;
1227
1228 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1229 &addrinfo);
1230
1231 *keydist &= ~SMP_DIST_ID_KEY;
1232 }
1233
1234 if (*keydist & SMP_DIST_SIGN) {
1235 struct smp_cmd_sign_info sign;
1236 struct smp_csrk *csrk;
1237
1238 /* Generate a new random key */
1239 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1240
1241 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1242 if (csrk) {
1243 csrk->master = 0x00;
1244 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1245 }
1246 smp->slave_csrk = csrk;
1247
1248 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1249
1250 *keydist &= ~SMP_DIST_SIGN;
1251 }
1252
1253 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001254 if (smp->remote_key_dist & KEY_DIST_MASK) {
1255 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001256 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001257 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001258
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001259 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1260 smp_notify_keys(conn);
1261
1262 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001263}
1264
Johan Hedbergb68fda62014-08-11 22:06:40 +03001265static void smp_timeout(struct work_struct *work)
1266{
1267 struct smp_chan *smp = container_of(work, struct smp_chan,
1268 security_timer.work);
1269 struct l2cap_conn *conn = smp->conn;
1270
1271 BT_DBG("conn %p", conn);
1272
Johan Hedberg1e91c292014-08-18 20:33:29 +03001273 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001274}
1275
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001276static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1277{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001278 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001279 struct smp_chan *smp;
1280
Marcel Holtmannf1560462013-10-13 05:43:25 -07001281 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001282 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001283 return NULL;
1284
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001285 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1286 if (IS_ERR(smp->tfm_aes)) {
1287 BT_ERR("Unable to create ECB crypto context");
1288 kfree(smp);
1289 return NULL;
1290 }
1291
Johan Hedberg407cecf2014-05-02 14:19:47 +03001292 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1293 if (IS_ERR(smp->tfm_cmac)) {
1294 BT_ERR("Unable to create CMAC crypto context");
1295 crypto_free_blkcipher(smp->tfm_aes);
1296 kfree(smp);
1297 return NULL;
1298 }
1299
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001300 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001301 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001302
Johan Hedbergb28b4942014-09-05 22:19:55 +03001303 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1304
Johan Hedbergb68fda62014-08-11 22:06:40 +03001305 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1306
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001307 hci_conn_hold(conn->hcon);
1308
1309 return smp;
1310}
1311
Johan Hedberg760b0182014-06-06 11:44:05 +03001312static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1313{
1314 struct hci_conn *hcon = smp->conn->hcon;
1315 u8 *na, *nb, a[7], b[7];
1316
1317 if (hcon->out) {
1318 na = smp->prnd;
1319 nb = smp->rrnd;
1320 } else {
1321 na = smp->rrnd;
1322 nb = smp->prnd;
1323 }
1324
1325 memcpy(a, &hcon->init_addr, 6);
1326 memcpy(b, &hcon->resp_addr, 6);
1327 a[6] = hcon->init_addr_type;
1328 b[6] = hcon->resp_addr_type;
1329
1330 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1331}
1332
Johan Hedberg38606f12014-06-25 11:10:28 +03001333static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001334{
1335 struct hci_conn *hcon = smp->conn->hcon;
1336 struct smp_cmd_dhkey_check check;
1337 u8 a[7], b[7], *local_addr, *remote_addr;
1338 u8 io_cap[3], r[16];
1339
Johan Hedberg760b0182014-06-06 11:44:05 +03001340 memcpy(a, &hcon->init_addr, 6);
1341 memcpy(b, &hcon->resp_addr, 6);
1342 a[6] = hcon->init_addr_type;
1343 b[6] = hcon->resp_addr_type;
1344
1345 if (hcon->out) {
1346 local_addr = a;
1347 remote_addr = b;
1348 memcpy(io_cap, &smp->preq[1], 3);
1349 } else {
1350 local_addr = b;
1351 remote_addr = a;
1352 memcpy(io_cap, &smp->prsp[1], 3);
1353 }
1354
Johan Hedbergdddd3052014-06-01 15:38:09 +03001355 memset(r, 0, sizeof(r));
1356
1357 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001358 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001359
Johan Hedberga29b0732014-10-28 15:17:05 +01001360 if (smp->method == REQ_OOB)
1361 memcpy(r, smp->rr, 16);
1362
Johan Hedberg760b0182014-06-06 11:44:05 +03001363 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1364 local_addr, remote_addr, check.e);
1365
1366 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001367}
1368
Johan Hedberg38606f12014-06-25 11:10:28 +03001369static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1370{
1371 struct l2cap_conn *conn = smp->conn;
1372 struct hci_conn *hcon = conn->hcon;
1373 struct smp_cmd_pairing_confirm cfm;
1374 u8 r;
1375
1376 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1377 r |= 0x80;
1378
1379 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1380
1381 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1382 cfm.confirm_val))
1383 return SMP_UNSPECIFIED;
1384
1385 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1386
1387 return 0;
1388}
1389
1390static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1391{
1392 struct l2cap_conn *conn = smp->conn;
1393 struct hci_conn *hcon = conn->hcon;
1394 struct hci_dev *hdev = hcon->hdev;
1395 u8 cfm[16], r;
1396
1397 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1398 if (smp->passkey_round >= 20)
1399 return 0;
1400
1401 switch (smp_op) {
1402 case SMP_CMD_PAIRING_RANDOM:
1403 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1404 r |= 0x80;
1405
1406 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1407 smp->rrnd, r, cfm))
1408 return SMP_UNSPECIFIED;
1409
1410 if (memcmp(smp->pcnf, cfm, 16))
1411 return SMP_CONFIRM_FAILED;
1412
1413 smp->passkey_round++;
1414
1415 if (smp->passkey_round == 20) {
1416 /* Generate MacKey and LTK */
1417 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1418 return SMP_UNSPECIFIED;
1419 }
1420
1421 /* The round is only complete when the initiator
1422 * receives pairing random.
1423 */
1424 if (!hcon->out) {
1425 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1426 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001427 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001428 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001429 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001430 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001431 return 0;
1432 }
1433
1434 /* Start the next round */
1435 if (smp->passkey_round != 20)
1436 return sc_passkey_round(smp, 0);
1437
1438 /* Passkey rounds are complete - start DHKey Check */
1439 sc_dhkey_check(smp);
1440 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1441
1442 break;
1443
1444 case SMP_CMD_PAIRING_CONFIRM:
1445 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1446 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1447 return 0;
1448 }
1449
1450 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1451
1452 if (hcon->out) {
1453 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1454 sizeof(smp->prnd), smp->prnd);
1455 return 0;
1456 }
1457
1458 return sc_passkey_send_confirm(smp);
1459
1460 case SMP_CMD_PUBLIC_KEY:
1461 default:
1462 /* Initiating device starts the round */
1463 if (!hcon->out)
1464 return 0;
1465
1466 BT_DBG("%s Starting passkey round %u", hdev->name,
1467 smp->passkey_round + 1);
1468
1469 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1470
1471 return sc_passkey_send_confirm(smp);
1472 }
1473
1474 return 0;
1475}
1476
Johan Hedbergdddd3052014-06-01 15:38:09 +03001477static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1478{
Johan Hedberg38606f12014-06-25 11:10:28 +03001479 struct l2cap_conn *conn = smp->conn;
1480 struct hci_conn *hcon = conn->hcon;
1481 u8 smp_op;
1482
1483 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1484
Johan Hedbergdddd3052014-06-01 15:38:09 +03001485 switch (mgmt_op) {
1486 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1487 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1488 return 0;
1489 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1490 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1491 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001492 case MGMT_OP_USER_PASSKEY_REPLY:
1493 hcon->passkey_notify = le32_to_cpu(passkey);
1494 smp->passkey_round = 0;
1495
1496 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1497 smp_op = SMP_CMD_PAIRING_CONFIRM;
1498 else
1499 smp_op = 0;
1500
1501 if (sc_passkey_round(smp, smp_op))
1502 return -EIO;
1503
1504 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001505 }
1506
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001507 /* Initiator sends DHKey check first */
1508 if (hcon->out) {
1509 sc_dhkey_check(smp);
1510 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1511 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1512 sc_dhkey_check(smp);
1513 sc_add_ltk(smp);
1514 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001515
1516 return 0;
1517}
1518
Brian Gix2b64d152011-12-21 16:12:12 -08001519int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1520{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001521 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001522 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001523 struct smp_chan *smp;
1524 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001525 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001526
1527 BT_DBG("");
1528
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001529 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001530 return -ENOTCONN;
1531
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001532 chan = conn->smp;
1533 if (!chan)
1534 return -ENOTCONN;
1535
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001536 l2cap_chan_lock(chan);
1537 if (!chan->data) {
1538 err = -ENOTCONN;
1539 goto unlock;
1540 }
1541
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001542 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001543
Johan Hedberg760b0182014-06-06 11:44:05 +03001544 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1545 err = sc_user_reply(smp, mgmt_op, passkey);
1546 goto unlock;
1547 }
1548
Brian Gix2b64d152011-12-21 16:12:12 -08001549 switch (mgmt_op) {
1550 case MGMT_OP_USER_PASSKEY_REPLY:
1551 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001552 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001553 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001554 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001555 /* Fall Through */
1556 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001557 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001558 break;
1559 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1560 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001561 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001562 err = 0;
1563 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001564 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001565 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001566 err = -EOPNOTSUPP;
1567 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001568 }
1569
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001570 err = 0;
1571
Brian Gix2b64d152011-12-21 16:12:12 -08001572 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001573 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1574 u8 rsp = smp_confirm(smp);
1575 if (rsp)
1576 smp_failure(conn, rsp);
1577 }
Brian Gix2b64d152011-12-21 16:12:12 -08001578
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001579unlock:
1580 l2cap_chan_unlock(chan);
1581 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001582}
1583
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001584static void build_bredr_pairing_cmd(struct smp_chan *smp,
1585 struct smp_cmd_pairing *req,
1586 struct smp_cmd_pairing *rsp)
1587{
1588 struct l2cap_conn *conn = smp->conn;
1589 struct hci_dev *hdev = conn->hcon->hdev;
1590 u8 local_dist = 0, remote_dist = 0;
1591
1592 if (test_bit(HCI_BONDABLE, &hdev->dev_flags)) {
1593 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1594 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1595 }
1596
1597 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
1598 remote_dist |= SMP_DIST_ID_KEY;
1599
1600 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
1601 local_dist |= SMP_DIST_ID_KEY;
1602
1603 if (!rsp) {
1604 memset(req, 0, sizeof(*req));
1605
1606 req->init_key_dist = local_dist;
1607 req->resp_key_dist = remote_dist;
1608 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1609
1610 smp->remote_key_dist = remote_dist;
1611
1612 return;
1613 }
1614
1615 memset(rsp, 0, sizeof(*rsp));
1616
1617 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1618 rsp->init_key_dist = req->init_key_dist & remote_dist;
1619 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1620
1621 smp->remote_key_dist = rsp->init_key_dist;
1622}
1623
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001624static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001625{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001626 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001627 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001628 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001629 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001630 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001631 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001632
1633 BT_DBG("conn %p", conn);
1634
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001635 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001636 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001637
Johan Hedberg40bef302014-07-16 11:42:27 +03001638 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001639 return SMP_CMD_NOTSUPP;
1640
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001641 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001642 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001643 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001644 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001645
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001646 if (!smp)
1647 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001648
Johan Hedbergc05b9332014-09-10 17:37:42 -07001649 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001650 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001651
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001652 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001653 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001654 return SMP_PAIRING_NOTSUPP;
1655
Johan Hedberg903b71c2014-09-08 16:59:18 -07001656 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
1657 return SMP_AUTH_REQUIREMENTS;
1658
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001659 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1660 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001661 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001662
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001663 /* SMP over BR/EDR requires special treatment */
1664 if (conn->hcon->type == ACL_LINK) {
1665 /* We must have a BR/EDR SC link */
1666 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags))
1667 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1668
1669 set_bit(SMP_FLAG_SC, &smp->flags);
1670
1671 build_bredr_pairing_cmd(smp, req, &rsp);
1672
1673 key_size = min(req->max_key_size, rsp.max_key_size);
1674 if (check_enc_key_size(conn, key_size))
1675 return SMP_ENC_KEY_SIZE;
1676
1677 /* Clear bits which are generated but not distributed */
1678 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1679
1680 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1681 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1682 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1683
1684 smp_distribute_keys(smp);
1685 return 0;
1686 }
1687
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001688 build_pairing_cmd(conn, req, &rsp, auth);
1689
1690 if (rsp.auth_req & SMP_AUTH_SC)
1691 set_bit(SMP_FLAG_SC, &smp->flags);
1692
Johan Hedberg5be5e272014-09-10 17:58:54 -07001693 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001694 sec_level = BT_SECURITY_MEDIUM;
1695 else
1696 sec_level = authreq_to_seclevel(auth);
1697
Johan Hedbergc7262e72014-06-17 13:07:37 +03001698 if (sec_level > conn->hcon->pending_sec_level)
1699 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001700
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001701 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001702 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1703 u8 method;
1704
1705 method = get_auth_method(smp, conn->hcon->io_capability,
1706 req->io_capability);
1707 if (method == JUST_WORKS || method == JUST_CFM)
1708 return SMP_AUTH_REQUIREMENTS;
1709 }
1710
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001711 key_size = min(req->max_key_size, rsp.max_key_size);
1712 if (check_enc_key_size(conn, key_size))
1713 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001714
Johan Hedberge84a6b12013-12-02 10:49:03 +02001715 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001716
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001717 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1718 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001719
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001720 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001721
1722 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1723
1724 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1725 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1726 /* Clear bits which are generated but not distributed */
1727 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1728 /* Wait for Public Key from Initiating Device */
1729 return 0;
1730 } else {
1731 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1732 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001733
Brian Gix2b64d152011-12-21 16:12:12 -08001734 /* Request setup of TK */
1735 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1736 if (ret)
1737 return SMP_UNSPECIFIED;
1738
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001739 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001740}
1741
Johan Hedberg3b191462014-06-06 10:50:15 +03001742static u8 sc_send_public_key(struct smp_chan *smp)
1743{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001744 struct hci_dev *hdev = smp->conn->hcon->hdev;
1745
Johan Hedberg3b191462014-06-06 10:50:15 +03001746 BT_DBG("");
1747
Johan Hedberg70157ef2014-06-24 15:22:59 +03001748 if (test_bit(HCI_USE_DEBUG_KEYS, &hdev->dev_flags)) {
1749 BT_DBG("Using debug keys");
1750 memcpy(smp->local_pk, debug_pk, 64);
1751 memcpy(smp->local_sk, debug_sk, 32);
1752 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1753 } else {
1754 while (true) {
1755 /* Generate local key pair for Secure Connections */
1756 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1757 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001758
Johan Hedberg70157ef2014-06-24 15:22:59 +03001759 /* This is unlikely, but we need to check that
1760 * we didn't accidentially generate a debug key.
1761 */
1762 if (memcmp(smp->local_sk, debug_sk, 32))
1763 break;
1764 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001765 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001766
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001767 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
1768 SMP_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1769 SMP_DBG("Local Private Key: %32phN", smp->local_sk);
Johan Hedberg3b191462014-06-06 10:50:15 +03001770
1771 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1772
1773 return 0;
1774}
1775
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001776static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001777{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001778 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001779 struct l2cap_chan *chan = conn->smp;
1780 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001781 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001782 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001783 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001784
1785 BT_DBG("conn %p", conn);
1786
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001787 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001788 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001789
Johan Hedberg40bef302014-07-16 11:42:27 +03001790 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001791 return SMP_CMD_NOTSUPP;
1792
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001793 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001794
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001795 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001796
1797 key_size = min(req->max_key_size, rsp->max_key_size);
1798 if (check_enc_key_size(conn, key_size))
1799 return SMP_ENC_KEY_SIZE;
1800
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001801 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001802
Johan Hedberg903b71c2014-09-08 16:59:18 -07001803 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
1804 return SMP_AUTH_REQUIREMENTS;
1805
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001806 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1807 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1808
1809 /* Update remote key distribution in case the remote cleared
1810 * some bits that we had enabled in our request.
1811 */
1812 smp->remote_key_dist &= rsp->resp_key_dist;
1813
1814 /* For BR/EDR this means we're done and can start phase 3 */
1815 if (conn->hcon->type == ACL_LINK) {
1816 /* Clear bits which are generated but not distributed */
1817 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1818 smp_distribute_keys(smp);
1819 return 0;
1820 }
1821
Johan Hedberg65668772014-05-16 11:03:34 +03001822 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1823 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001824 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1825 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001826
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001827 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001828 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1829 u8 method;
1830
1831 method = get_auth_method(smp, req->io_capability,
1832 rsp->io_capability);
1833 if (method == JUST_WORKS || method == JUST_CFM)
1834 return SMP_AUTH_REQUIREMENTS;
1835 }
1836
Johan Hedberge84a6b12013-12-02 10:49:03 +02001837 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001838
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001839 /* Update remote key distribution in case the remote cleared
1840 * some bits that we had enabled in our request.
1841 */
1842 smp->remote_key_dist &= rsp->resp_key_dist;
1843
Johan Hedberg3b191462014-06-06 10:50:15 +03001844 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1845 /* Clear bits which are generated but not distributed */
1846 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1847 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1848 return sc_send_public_key(smp);
1849 }
1850
Johan Hedbergc05b9332014-09-10 17:37:42 -07001851 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001852
Johan Hedberg476585e2012-06-06 18:54:15 +08001853 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001854 if (ret)
1855 return SMP_UNSPECIFIED;
1856
Johan Hedberg4a74d652014-05-20 09:45:50 +03001857 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001858
1859 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001860 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001861 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001862
1863 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001864}
1865
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001866static u8 sc_check_confirm(struct smp_chan *smp)
1867{
1868 struct l2cap_conn *conn = smp->conn;
1869
1870 BT_DBG("");
1871
1872 /* Public Key exchange must happen before any other steps */
1873 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1874 return SMP_UNSPECIFIED;
1875
Johan Hedberg38606f12014-06-25 11:10:28 +03001876 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1877 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1878
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001879 if (conn->hcon->out) {
1880 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1881 smp->prnd);
1882 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1883 }
1884
1885 return 0;
1886}
1887
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001888static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001889{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001890 struct l2cap_chan *chan = conn->smp;
1891 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001892
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001893 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1894
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001895 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001896 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001897
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001898 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1899 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001900
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001901 if (test_bit(SMP_FLAG_SC, &smp->flags))
1902 return sc_check_confirm(smp);
1903
Johan Hedbergb28b4942014-09-05 22:19:55 +03001904 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001905 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1906 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001907 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1908 return 0;
1909 }
1910
1911 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001912 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001913 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001914 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001915
1916 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001917}
1918
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001919static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001920{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001921 struct l2cap_chan *chan = conn->smp;
1922 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001923 struct hci_conn *hcon = conn->hcon;
1924 u8 *pkax, *pkbx, *na, *nb;
1925 u32 passkey;
1926 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001927
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001928 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001929
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001930 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001931 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001932
Johan Hedberg943a7322014-03-18 12:58:24 +02001933 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001934 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001935
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001936 if (!test_bit(SMP_FLAG_SC, &smp->flags))
1937 return smp_random(smp);
1938
Johan Hedberga29b0732014-10-28 15:17:05 +01001939 if (smp->method == REQ_OOB) {
1940 if (!hcon->out)
1941 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1942 sizeof(smp->prnd), smp->prnd);
1943 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1944 goto mackey_and_ltk;
1945 }
1946
Johan Hedberg38606f12014-06-25 11:10:28 +03001947 /* Passkey entry has special treatment */
1948 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1949 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
1950
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001951 if (hcon->out) {
1952 u8 cfm[16];
1953
1954 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1955 smp->rrnd, 0, cfm);
1956 if (err)
1957 return SMP_UNSPECIFIED;
1958
1959 if (memcmp(smp->pcnf, cfm, 16))
1960 return SMP_CONFIRM_FAILED;
1961
1962 pkax = smp->local_pk;
1963 pkbx = smp->remote_pk;
1964 na = smp->prnd;
1965 nb = smp->rrnd;
1966 } else {
1967 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1968 smp->prnd);
1969 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1970
1971 pkax = smp->remote_pk;
1972 pkbx = smp->local_pk;
1973 na = smp->rrnd;
1974 nb = smp->prnd;
1975 }
1976
Johan Hedberga29b0732014-10-28 15:17:05 +01001977mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03001978 /* Generate MacKey and LTK */
1979 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
1980 if (err)
1981 return SMP_UNSPECIFIED;
1982
Johan Hedberga29b0732014-10-28 15:17:05 +01001983 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03001984 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03001985 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001986 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1987 }
1988 return 0;
1989 }
1990
Johan Hedberg38606f12014-06-25 11:10:28 +03001991 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001992 if (err)
1993 return SMP_UNSPECIFIED;
1994
Johan Hedberg38606f12014-06-25 11:10:28 +03001995 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
1996 hcon->dst_type, passkey, 0);
1997 if (err)
1998 return SMP_UNSPECIFIED;
1999
2000 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2001
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002002 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002003}
2004
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002005static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002006{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002007 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002008 struct hci_conn *hcon = conn->hcon;
2009
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002010 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002011 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002012 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002013
Johan Hedberga6f78332014-09-10 17:37:45 -07002014 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002015 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002016
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002017 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002018 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002019
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002020 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
2021 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002022
Johan Hedbergfe59a052014-07-01 19:14:12 +03002023 /* We never store STKs for master role, so clear this flag */
2024 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2025
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002026 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002027}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002028
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002029bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2030 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002031{
2032 if (sec_level == BT_SECURITY_LOW)
2033 return true;
2034
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002035 /* If we're encrypted with an STK but the caller prefers using
2036 * LTK claim insufficient security. This way we allow the
2037 * connection to be re-encrypted with an LTK, even if the LTK
2038 * provides the same level of security. Only exception is if we
2039 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002040 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002041 if (key_pref == SMP_USE_LTK &&
2042 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002043 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002044 return false;
2045
Johan Hedberg854f4722014-07-01 18:40:20 +03002046 if (hcon->sec_level >= sec_level)
2047 return true;
2048
2049 return false;
2050}
2051
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002052static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002053{
2054 struct smp_cmd_security_req *rp = (void *) skb->data;
2055 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002056 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002057 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002058 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002059 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002060
2061 BT_DBG("conn %p", conn);
2062
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002063 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002064 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002065
Johan Hedberg40bef302014-07-16 11:42:27 +03002066 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002067 return SMP_CMD_NOTSUPP;
2068
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002069 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002070
Johan Hedberg903b71c2014-09-08 16:59:18 -07002071 if (test_bit(HCI_SC_ONLY, &hdev->dev_flags) && !(auth & SMP_AUTH_SC))
2072 return SMP_AUTH_REQUIREMENTS;
2073
Johan Hedberg5be5e272014-09-10 17:58:54 -07002074 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002075 sec_level = BT_SECURITY_MEDIUM;
2076 else
2077 sec_level = authreq_to_seclevel(auth);
2078
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002079 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002080 return 0;
2081
Johan Hedbergc7262e72014-06-17 13:07:37 +03002082 if (sec_level > hcon->pending_sec_level)
2083 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002084
Johan Hedberg4dab7862012-06-07 14:58:37 +08002085 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002086 return 0;
2087
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002088 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002089 if (!smp)
2090 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002091
Johan Hedbergb6ae8452014-07-30 09:22:22 +03002092 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002093 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002094 return SMP_PAIRING_NOTSUPP;
2095
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002096 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002097
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002098 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002099 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002100
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002101 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2102 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002103
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002104 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002105 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002106
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002107 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002108}
2109
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002110int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002111{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002112 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002113 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002114 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002115 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002116 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002117
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002118 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2119
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002120 /* This may be NULL if there's an unexpected disconnection */
2121 if (!conn)
2122 return 1;
2123
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002124 chan = conn->smp;
2125
Johan Hedberg757aee02013-04-24 13:05:32 +03002126 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002127 return 1;
2128
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002129 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002130 return 1;
2131
Johan Hedbergc7262e72014-06-17 13:07:37 +03002132 if (sec_level > hcon->pending_sec_level)
2133 hcon->pending_sec_level = sec_level;
2134
Johan Hedberg40bef302014-07-16 11:42:27 +03002135 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002136 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2137 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002138
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002139 l2cap_chan_lock(chan);
2140
2141 /* If SMP is already in progress ignore this request */
2142 if (chan->data) {
2143 ret = 0;
2144 goto unlock;
2145 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002146
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002147 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002148 if (!smp) {
2149 ret = 1;
2150 goto unlock;
2151 }
Brian Gix2b64d152011-12-21 16:12:12 -08002152
2153 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002154
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002155 if (test_bit(HCI_SC_ENABLED, &hcon->hdev->dev_flags))
2156 authreq |= SMP_AUTH_SC;
2157
Johan Hedberg79897d22014-06-01 09:45:24 +03002158 /* Require MITM if IO Capability allows or the security level
2159 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002160 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002161 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002162 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002163 authreq |= SMP_AUTH_MITM;
2164
Johan Hedberg40bef302014-07-16 11:42:27 +03002165 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002166 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002167
Brian Gix2b64d152011-12-21 16:12:12 -08002168 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002169 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2170 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002171
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002172 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002173 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002174 } else {
2175 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002176 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002177 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002178 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002179 }
2180
Johan Hedberg4a74d652014-05-20 09:45:50 +03002181 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002182 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002183
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002184unlock:
2185 l2cap_chan_unlock(chan);
2186 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002187}
2188
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002189static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2190{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002191 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002192 struct l2cap_chan *chan = conn->smp;
2193 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002194
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002195 BT_DBG("conn %p", conn);
2196
2197 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002198 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002199
Johan Hedbergb28b4942014-09-05 22:19:55 +03002200 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002201
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002202 skb_pull(skb, sizeof(*rp));
2203
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002204 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002205
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002206 return 0;
2207}
2208
2209static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2210{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002211 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002212 struct l2cap_chan *chan = conn->smp;
2213 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002214 struct hci_dev *hdev = conn->hcon->hdev;
2215 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002216 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002217 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002218
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002219 BT_DBG("conn %p", conn);
2220
2221 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002222 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002223
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002224 /* Mark the information as received */
2225 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2226
Johan Hedbergb28b4942014-09-05 22:19:55 +03002227 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2228 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002229 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2230 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002231
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002232 skb_pull(skb, sizeof(*rp));
2233
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002234 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002235 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002236 authenticated, smp->tk, smp->enc_key_size,
2237 rp->ediv, rp->rand);
2238 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002239 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002240 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002241
2242 return 0;
2243}
2244
Johan Hedbergfd349c02014-02-18 10:19:36 +02002245static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2246{
2247 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002248 struct l2cap_chan *chan = conn->smp;
2249 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002250
2251 BT_DBG("");
2252
2253 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002254 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002255
Johan Hedbergb28b4942014-09-05 22:19:55 +03002256 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002257
Johan Hedbergfd349c02014-02-18 10:19:36 +02002258 skb_pull(skb, sizeof(*info));
2259
2260 memcpy(smp->irk, info->irk, 16);
2261
2262 return 0;
2263}
2264
2265static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2266 struct sk_buff *skb)
2267{
2268 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002269 struct l2cap_chan *chan = conn->smp;
2270 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002271 struct hci_conn *hcon = conn->hcon;
2272 bdaddr_t rpa;
2273
2274 BT_DBG("");
2275
2276 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002277 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002278
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002279 /* Mark the information as received */
2280 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2281
Johan Hedbergb28b4942014-09-05 22:19:55 +03002282 if (smp->remote_key_dist & SMP_DIST_SIGN)
2283 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2284
Johan Hedbergfd349c02014-02-18 10:19:36 +02002285 skb_pull(skb, sizeof(*info));
2286
Johan Hedberga9a58f82014-02-25 22:24:37 +02002287 /* Strictly speaking the Core Specification (4.1) allows sending
2288 * an empty address which would force us to rely on just the IRK
2289 * as "identity information". However, since such
2290 * implementations are not known of and in order to not over
2291 * complicate our implementation, simply pretend that we never
2292 * received an IRK for such a device.
2293 */
2294 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
2295 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002296 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002297 }
2298
Johan Hedbergfd349c02014-02-18 10:19:36 +02002299 bacpy(&smp->id_addr, &info->bdaddr);
2300 smp->id_addr_type = info->addr_type;
2301
2302 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2303 bacpy(&rpa, &hcon->dst);
2304 else
2305 bacpy(&rpa, BDADDR_ANY);
2306
Johan Hedberg23d0e122014-02-19 14:57:46 +02002307 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2308 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002309
Johan Hedberg31dd6242014-06-27 14:23:02 +03002310distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002311 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2312 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002313
2314 return 0;
2315}
2316
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002317static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2318{
2319 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002320 struct l2cap_chan *chan = conn->smp;
2321 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002322 struct smp_csrk *csrk;
2323
2324 BT_DBG("conn %p", conn);
2325
2326 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002327 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002328
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002329 /* Mark the information as received */
2330 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2331
2332 skb_pull(skb, sizeof(*rp));
2333
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002334 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2335 if (csrk) {
2336 csrk->master = 0x01;
2337 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2338 }
2339 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002340 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002341
2342 return 0;
2343}
2344
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002345static u8 sc_select_method(struct smp_chan *smp)
2346{
2347 struct l2cap_conn *conn = smp->conn;
2348 struct hci_conn *hcon = conn->hcon;
2349 struct smp_cmd_pairing *local, *remote;
2350 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2351
Johan Hedberga29b0732014-10-28 15:17:05 +01002352 if (test_bit(SMP_FLAG_OOB, &smp->flags))
2353 return REQ_OOB;
2354
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002355 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2356 * which are needed as inputs to some crypto functions. To get
2357 * the "struct smp_cmd_pairing" from them we need to skip the
2358 * first byte which contains the opcode.
2359 */
2360 if (hcon->out) {
2361 local = (void *) &smp->preq[1];
2362 remote = (void *) &smp->prsp[1];
2363 } else {
2364 local = (void *) &smp->prsp[1];
2365 remote = (void *) &smp->preq[1];
2366 }
2367
2368 local_io = local->io_capability;
2369 remote_io = remote->io_capability;
2370
2371 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2372 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2373
2374 /* If either side wants MITM, look up the method from the table,
2375 * otherwise use JUST WORKS.
2376 */
2377 if (local_mitm || remote_mitm)
2378 method = get_auth_method(smp, local_io, remote_io);
2379 else
2380 method = JUST_WORKS;
2381
2382 /* Don't confirm locally initiated pairing attempts */
2383 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2384 method = JUST_WORKS;
2385
2386 return method;
2387}
2388
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002389static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2390{
2391 struct smp_cmd_public_key *key = (void *) skb->data;
2392 struct hci_conn *hcon = conn->hcon;
2393 struct l2cap_chan *chan = conn->smp;
2394 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002395 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002396 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002397 int err;
2398
2399 BT_DBG("conn %p", conn);
2400
2401 if (skb->len < sizeof(*key))
2402 return SMP_INVALID_PARAMS;
2403
2404 memcpy(smp->remote_pk, key, 64);
2405
2406 /* Non-initiating device sends its public key after receiving
2407 * the key from the initiating device.
2408 */
2409 if (!hcon->out) {
2410 err = sc_send_public_key(smp);
2411 if (err)
2412 return err;
2413 }
2414
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002415 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
2416 SMP_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002417
2418 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2419 return SMP_UNSPECIFIED;
2420
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002421 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002422
2423 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2424
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002425 smp->method = sc_select_method(smp);
2426
2427 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2428
2429 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2430 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2431 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2432 else
2433 hcon->pending_sec_level = BT_SECURITY_FIPS;
2434
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002435 if (!memcmp(debug_pk, smp->remote_pk, 64))
2436 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2437
Johan Hedberg38606f12014-06-25 11:10:28 +03002438 if (smp->method == DSP_PASSKEY) {
2439 get_random_bytes(&hcon->passkey_notify,
2440 sizeof(hcon->passkey_notify));
2441 hcon->passkey_notify %= 1000000;
2442 hcon->passkey_entered = 0;
2443 smp->passkey_round = 0;
2444 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2445 hcon->dst_type,
2446 hcon->passkey_notify,
2447 hcon->passkey_entered))
2448 return SMP_UNSPECIFIED;
2449 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2450 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2451 }
2452
Johan Hedberga29b0732014-10-28 15:17:05 +01002453 if (smp->method == REQ_OOB) {
2454 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2455 smp->rr, 0, cfm.confirm_val);
2456 if (err)
2457 return SMP_UNSPECIFIED;
2458
2459 if (memcmp(cfm.confirm_val, smp->pcnf, 16))
2460 return SMP_CONFIRM_FAILED;
2461
2462 if (hcon->out)
2463 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2464 sizeof(smp->prnd), smp->prnd);
2465
2466 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2467
2468 return 0;
2469 }
2470
Johan Hedberg38606f12014-06-25 11:10:28 +03002471 if (hcon->out)
2472 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2473
2474 if (smp->method == REQ_PASSKEY) {
2475 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2476 hcon->dst_type))
2477 return SMP_UNSPECIFIED;
2478 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2479 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2480 return 0;
2481 }
2482
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002483 /* The Initiating device waits for the non-initiating device to
2484 * send the confirm value.
2485 */
2486 if (conn->hcon->out)
2487 return 0;
2488
2489 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2490 0, cfm.confirm_val);
2491 if (err)
2492 return SMP_UNSPECIFIED;
2493
2494 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2495 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2496
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002497 return 0;
2498}
2499
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002500static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2501{
2502 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2503 struct l2cap_chan *chan = conn->smp;
2504 struct hci_conn *hcon = conn->hcon;
2505 struct smp_chan *smp = chan->data;
2506 u8 a[7], b[7], *local_addr, *remote_addr;
2507 u8 io_cap[3], r[16], e[16];
2508 int err;
2509
2510 BT_DBG("conn %p", conn);
2511
2512 if (skb->len < sizeof(*check))
2513 return SMP_INVALID_PARAMS;
2514
2515 memcpy(a, &hcon->init_addr, 6);
2516 memcpy(b, &hcon->resp_addr, 6);
2517 a[6] = hcon->init_addr_type;
2518 b[6] = hcon->resp_addr_type;
2519
2520 if (hcon->out) {
2521 local_addr = a;
2522 remote_addr = b;
2523 memcpy(io_cap, &smp->prsp[1], 3);
2524 } else {
2525 local_addr = b;
2526 remote_addr = a;
2527 memcpy(io_cap, &smp->preq[1], 3);
2528 }
2529
2530 memset(r, 0, sizeof(r));
2531
Johan Hedberg38606f12014-06-25 11:10:28 +03002532 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2533 put_unaligned_le32(hcon->passkey_notify, r);
2534
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002535 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2536 io_cap, remote_addr, local_addr, e);
2537 if (err)
2538 return SMP_UNSPECIFIED;
2539
2540 if (memcmp(check->e, e, 16))
2541 return SMP_DHKEY_CHECK_FAILED;
2542
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002543 if (!hcon->out) {
2544 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2545 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2546 return 0;
2547 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002548
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002549 /* Slave sends DHKey check as response to master */
2550 sc_dhkey_check(smp);
2551 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002552
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002553 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002554
2555 if (hcon->out) {
2556 hci_le_start_enc(hcon, 0, 0, smp->tk);
2557 hcon->enc_key_size = smp->enc_key_size;
2558 }
2559
2560 return 0;
2561}
2562
Johan Hedberg1408bb62014-06-04 22:45:57 +03002563static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2564 struct sk_buff *skb)
2565{
2566 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2567
2568 BT_DBG("value 0x%02x", kp->value);
2569
2570 return 0;
2571}
2572
Johan Hedberg4befb862014-08-11 22:06:38 +03002573static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002574{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002575 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002576 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002577 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002578 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002579 int err = 0;
2580
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002581 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002582 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002583
Marcel Holtmann06ae3312013-10-18 03:43:00 -07002584 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002585 reason = SMP_PAIRING_NOTSUPP;
2586 goto done;
2587 }
2588
Marcel Holtmann92381f52013-10-03 01:23:08 -07002589 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002590 skb_pull(skb, sizeof(code));
2591
Johan Hedbergb28b4942014-09-05 22:19:55 +03002592 smp = chan->data;
2593
2594 if (code > SMP_CMD_MAX)
2595 goto drop;
2596
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002597 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002598 goto drop;
2599
2600 /* If we don't have a context the only allowed commands are
2601 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002602 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002603 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2604 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002605
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002606 switch (code) {
2607 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002608 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002609 break;
2610
2611 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002612 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002613 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002614 break;
2615
2616 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002617 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002618 break;
2619
2620 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002621 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002622 break;
2623
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002624 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002625 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002626 break;
2627
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002628 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002629 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002630 break;
2631
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002632 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002633 reason = smp_cmd_encrypt_info(conn, skb);
2634 break;
2635
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002636 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002637 reason = smp_cmd_master_ident(conn, skb);
2638 break;
2639
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002640 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002641 reason = smp_cmd_ident_info(conn, skb);
2642 break;
2643
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002644 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002645 reason = smp_cmd_ident_addr_info(conn, skb);
2646 break;
2647
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002648 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002649 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002650 break;
2651
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002652 case SMP_CMD_PUBLIC_KEY:
2653 reason = smp_cmd_public_key(conn, skb);
2654 break;
2655
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002656 case SMP_CMD_DHKEY_CHECK:
2657 reason = smp_cmd_dhkey_check(conn, skb);
2658 break;
2659
Johan Hedberg1408bb62014-06-04 22:45:57 +03002660 case SMP_CMD_KEYPRESS_NOTIFY:
2661 reason = smp_cmd_keypress_notify(conn, skb);
2662 break;
2663
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002664 default:
2665 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002666 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002667 goto done;
2668 }
2669
2670done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002671 if (!err) {
2672 if (reason)
2673 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002674 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002675 }
2676
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002677 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002678
2679drop:
2680 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2681 code, &hcon->dst);
2682 kfree_skb(skb);
2683 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002684}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002685
Johan Hedberg70db83c2014-08-08 09:37:16 +03002686static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2687{
2688 struct l2cap_conn *conn = chan->conn;
2689
2690 BT_DBG("chan %p", chan);
2691
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002692 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002693 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002694
Johan Hedberg70db83c2014-08-08 09:37:16 +03002695 conn->smp = NULL;
2696 l2cap_chan_put(chan);
2697}
2698
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002699static void bredr_pairing(struct l2cap_chan *chan)
2700{
2701 struct l2cap_conn *conn = chan->conn;
2702 struct hci_conn *hcon = conn->hcon;
2703 struct hci_dev *hdev = hcon->hdev;
2704 struct smp_cmd_pairing req;
2705 struct smp_chan *smp;
2706
2707 BT_DBG("chan %p", chan);
2708
2709 /* Only new pairings are interesting */
2710 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2711 return;
2712
2713 /* Don't bother if we're not encrypted */
2714 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2715 return;
2716
2717 /* Only master may initiate SMP over BR/EDR */
2718 if (hcon->role != HCI_ROLE_MASTER)
2719 return;
2720
2721 /* Secure Connections support must be enabled */
2722 if (!test_bit(HCI_SC_ENABLED, &hdev->dev_flags))
2723 return;
2724
2725 /* BR/EDR must use Secure Connections for SMP */
2726 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
2727 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2728 return;
2729
2730 /* If our LE support is not enabled don't do anything */
2731 if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
2732 return;
2733
2734 /* Don't bother if remote LE support is not enabled */
2735 if (!lmp_host_le_capable(hcon))
2736 return;
2737
2738 /* Remote must support SMP fixed chan for BR/EDR */
2739 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2740 return;
2741
2742 /* Don't bother if SMP is already ongoing */
2743 if (chan->data)
2744 return;
2745
2746 smp = smp_chan_create(conn);
2747 if (!smp) {
2748 BT_ERR("%s unable to create SMP context for BR/EDR",
2749 hdev->name);
2750 return;
2751 }
2752
2753 set_bit(SMP_FLAG_SC, &smp->flags);
2754
2755 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2756
2757 /* Prepare and send the BR/EDR SMP Pairing Request */
2758 build_bredr_pairing_cmd(smp, &req, NULL);
2759
2760 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2761 memcpy(&smp->preq[1], &req, sizeof(req));
2762
2763 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2764 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2765}
2766
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002767static void smp_resume_cb(struct l2cap_chan *chan)
2768{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002769 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002770 struct l2cap_conn *conn = chan->conn;
2771 struct hci_conn *hcon = conn->hcon;
2772
2773 BT_DBG("chan %p", chan);
2774
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002775 if (hcon->type == ACL_LINK) {
2776 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002777 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002778 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002779
Johan Hedberg86d14072014-08-11 22:06:43 +03002780 if (!smp)
2781 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002782
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002783 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2784 return;
2785
Johan Hedberg86d14072014-08-11 22:06:43 +03002786 cancel_delayed_work(&smp->security_timer);
2787
Johan Hedbergd6268e82014-09-05 22:19:51 +03002788 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002789}
2790
Johan Hedberg70db83c2014-08-08 09:37:16 +03002791static void smp_ready_cb(struct l2cap_chan *chan)
2792{
2793 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002794 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002795
2796 BT_DBG("chan %p", chan);
2797
2798 conn->smp = chan;
2799 l2cap_chan_hold(chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002800
2801 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2802 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002803}
2804
Johan Hedberg4befb862014-08-11 22:06:38 +03002805static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2806{
2807 int err;
2808
2809 BT_DBG("chan %p", chan);
2810
2811 err = smp_sig_channel(chan, skb);
2812 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002813 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002814
Johan Hedbergb68fda62014-08-11 22:06:40 +03002815 if (smp)
2816 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002817
Johan Hedberg1e91c292014-08-18 20:33:29 +03002818 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002819 }
2820
2821 return err;
2822}
2823
Johan Hedberg70db83c2014-08-08 09:37:16 +03002824static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2825 unsigned long hdr_len,
2826 unsigned long len, int nb)
2827{
2828 struct sk_buff *skb;
2829
2830 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2831 if (!skb)
2832 return ERR_PTR(-ENOMEM);
2833
2834 skb->priority = HCI_PRIO_MAX;
2835 bt_cb(skb)->chan = chan;
2836
2837 return skb;
2838}
2839
2840static const struct l2cap_ops smp_chan_ops = {
2841 .name = "Security Manager",
2842 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002843 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002844 .alloc_skb = smp_alloc_skb_cb,
2845 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002846 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002847
2848 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002849 .state_change = l2cap_chan_no_state_change,
2850 .close = l2cap_chan_no_close,
2851 .defer = l2cap_chan_no_defer,
2852 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002853 .set_shutdown = l2cap_chan_no_set_shutdown,
2854 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2855 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2856};
2857
2858static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2859{
2860 struct l2cap_chan *chan;
2861
2862 BT_DBG("pchan %p", pchan);
2863
2864 chan = l2cap_chan_create();
2865 if (!chan)
2866 return NULL;
2867
2868 chan->chan_type = pchan->chan_type;
2869 chan->ops = &smp_chan_ops;
2870 chan->scid = pchan->scid;
2871 chan->dcid = chan->scid;
2872 chan->imtu = pchan->imtu;
2873 chan->omtu = pchan->omtu;
2874 chan->mode = pchan->mode;
2875
Johan Hedbergabe84902014-11-12 22:22:21 +02002876 /* Other L2CAP channels may request SMP routines in order to
2877 * change the security level. This means that the SMP channel
2878 * lock must be considered in its own category to avoid lockdep
2879 * warnings.
2880 */
2881 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
2882
Johan Hedberg70db83c2014-08-08 09:37:16 +03002883 BT_DBG("created chan %p", chan);
2884
2885 return chan;
2886}
2887
2888static const struct l2cap_ops smp_root_chan_ops = {
2889 .name = "Security Manager Root",
2890 .new_connection = smp_new_conn_cb,
2891
2892 /* None of these are implemented for the root channel */
2893 .close = l2cap_chan_no_close,
2894 .alloc_skb = l2cap_chan_no_alloc_skb,
2895 .recv = l2cap_chan_no_recv,
2896 .state_change = l2cap_chan_no_state_change,
2897 .teardown = l2cap_chan_no_teardown,
2898 .ready = l2cap_chan_no_ready,
2899 .defer = l2cap_chan_no_defer,
2900 .suspend = l2cap_chan_no_suspend,
2901 .resume = l2cap_chan_no_resume,
2902 .set_shutdown = l2cap_chan_no_set_shutdown,
2903 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2904 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2905};
2906
Johan Hedbergef8efe42014-08-13 15:12:32 +03002907static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002908{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002909 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002910 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002911
Johan Hedbergef8efe42014-08-13 15:12:32 +03002912 if (cid == L2CAP_CID_SMP_BREDR) {
2913 tfm_aes = NULL;
2914 goto create_chan;
2915 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03002916
Johan Hedbergadae20c2014-11-13 14:37:48 +02002917 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002918 if (IS_ERR(tfm_aes)) {
Johan Hedberg711eafe2014-08-08 09:32:52 +03002919 BT_ERR("Unable to create crypto context");
Johan Hedbergef8efe42014-08-13 15:12:32 +03002920 return ERR_PTR(PTR_ERR(tfm_aes));
Johan Hedberg711eafe2014-08-08 09:32:52 +03002921 }
2922
Johan Hedbergef8efe42014-08-13 15:12:32 +03002923create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03002924 chan = l2cap_chan_create();
2925 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002926 crypto_free_blkcipher(tfm_aes);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002927 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002928 }
2929
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002930 chan->data = tfm_aes;
2931
Johan Hedbergef8efe42014-08-13 15:12:32 +03002932 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002933
2934 l2cap_chan_set_defaults(chan);
2935
2936 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002937 if (cid == L2CAP_CID_SMP)
2938 chan->src_type = BDADDR_LE_PUBLIC;
2939 else
2940 chan->src_type = BDADDR_BREDR;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002941 chan->state = BT_LISTEN;
2942 chan->mode = L2CAP_MODE_BASIC;
2943 chan->imtu = L2CAP_DEFAULT_MTU;
2944 chan->ops = &smp_root_chan_ops;
2945
Johan Hedbergabe84902014-11-12 22:22:21 +02002946 /* Set correct nesting level for a parent/listening channel */
2947 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
2948
Johan Hedbergef8efe42014-08-13 15:12:32 +03002949 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03002950}
2951
Johan Hedbergef8efe42014-08-13 15:12:32 +03002952static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002953{
Johan Hedbergef8efe42014-08-13 15:12:32 +03002954 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002955
Johan Hedbergef8efe42014-08-13 15:12:32 +03002956 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002957
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002958 tfm_aes = chan->data;
2959 if (tfm_aes) {
2960 chan->data = NULL;
2961 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002962 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03002963
Johan Hedberg70db83c2014-08-08 09:37:16 +03002964 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002965}
Johan Hedbergef8efe42014-08-13 15:12:32 +03002966
2967int smp_register(struct hci_dev *hdev)
2968{
2969 struct l2cap_chan *chan;
2970
2971 BT_DBG("%s", hdev->name);
2972
2973 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
2974 if (IS_ERR(chan))
2975 return PTR_ERR(chan);
2976
2977 hdev->smp_data = chan;
2978
2979 if (!lmp_sc_capable(hdev) &&
2980 !test_bit(HCI_FORCE_LESC, &hdev->dbg_flags))
2981 return 0;
2982
2983 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
2984 if (IS_ERR(chan)) {
2985 int err = PTR_ERR(chan);
2986 chan = hdev->smp_data;
2987 hdev->smp_data = NULL;
2988 smp_del_chan(chan);
2989 return err;
2990 }
2991
2992 hdev->smp_bredr_data = chan;
2993
2994 return 0;
2995}
2996
2997void smp_unregister(struct hci_dev *hdev)
2998{
2999 struct l2cap_chan *chan;
3000
3001 if (hdev->smp_bredr_data) {
3002 chan = hdev->smp_bredr_data;
3003 hdev->smp_bredr_data = NULL;
3004 smp_del_chan(chan);
3005 }
3006
3007 if (hdev->smp_data) {
3008 chan = hdev->smp_data;
3009 hdev->smp_data = NULL;
3010 smp_del_chan(chan);
3011 }
3012}