blob: 9e11931740646527759127bc3be170dc81fc3697 [file] [log] [blame]
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
8
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
21*/
22
Gustavo Padovan8c520a52012-05-23 04:04:22 -030023#include <linux/crypto.h>
24#include <linux/scatterlist.h>
25#include <crypto/b128ops.h>
26
Anderson Brigliaeb492e02011-06-09 18:50:40 -030027#include <net/bluetooth/bluetooth.h>
28#include <net/bluetooth/hci_core.h>
29#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080030#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070031
Johan Hedberg3b191462014-06-06 10:50:15 +030032#include "ecc.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070033#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030034
Johan Hedbergb28b4942014-09-05 22:19:55 +030035#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030036
Johan Hedberg3b191462014-06-06 10:50:15 +030037/* Keys which are not distributed with Secure Connections */
38#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
39
Marcel Holtmann17b02e62012-03-01 14:32:37 -080040#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030041
Johan Hedberg0edb14d2014-05-26 13:29:28 +030042#define AUTH_REQ_MASK(dev) (test_bit(HCI_SC_ENABLED, &(dev)->dev_flags) ? \
43 0x1f : 0x07)
44#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020045
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030046/* Maximum message length that can be passed to aes_cmac */
47#define CMAC_MSG_MAX 80
48
Johan Hedberg533e35d2014-06-16 19:25:18 +030049enum {
50 SMP_FLAG_TK_VALID,
51 SMP_FLAG_CFM_PENDING,
52 SMP_FLAG_MITM_AUTH,
53 SMP_FLAG_COMPLETE,
54 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030055 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030056 SMP_FLAG_REMOTE_PK,
Johan Hedberg533e35d2014-06-16 19:25:18 +030057};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030058
59struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030060 struct l2cap_conn *conn;
61 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030062 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030063
Johan Hedberg4bc58f52014-05-20 09:45:47 +030064 u8 preq[7]; /* SMP Pairing Request */
65 u8 prsp[7]; /* SMP Pairing Response */
66 u8 prnd[16]; /* SMP Pairing Random (local) */
67 u8 rrnd[16]; /* SMP Pairing Random (remote) */
68 u8 pcnf[16]; /* SMP Pairing Confirm */
69 u8 tk[16]; /* SMP Temporary Key */
70 u8 enc_key_size;
71 u8 remote_key_dist;
72 bdaddr_t id_addr;
73 u8 id_addr_type;
74 u8 irk[16];
75 struct smp_csrk *csrk;
76 struct smp_csrk *slave_csrk;
77 struct smp_ltk *ltk;
78 struct smp_ltk *slave_ltk;
79 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +030080 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +030081 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +030082 u8 method;
Johan Hedberg6a7bd102014-06-27 14:23:03 +030083
Johan Hedberg3b191462014-06-06 10:50:15 +030084 /* Secure Connections variables */
85 u8 local_pk[64];
86 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030087 u8 remote_pk[64];
88 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +030089 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +030090
Johan Hedberg6a7bd102014-06-27 14:23:03 +030091 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +030092 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +030093};
94
Johan Hedberg8a2936f2014-06-16 19:25:19 +030095static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030096{
Johan Hedberg8a2936f2014-06-16 19:25:19 +030097 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030098
Johan Hedberg8a2936f2014-06-16 19:25:19 +030099 for (i = 0; i < len; i++)
100 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300101}
102
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300103static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
104 size_t len, u8 mac[16])
105{
106 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
107 struct hash_desc desc;
108 struct scatterlist sg;
109 int err;
110
111 if (len > CMAC_MSG_MAX)
112 return -EFBIG;
113
114 if (!tfm) {
115 BT_ERR("tfm %p", tfm);
116 return -EINVAL;
117 }
118
119 desc.tfm = tfm;
120 desc.flags = 0;
121
122 crypto_hash_init(&desc);
123
124 /* Swap key and message from LSB to MSB */
125 swap_buf(k, tmp, 16);
126 swap_buf(m, msg_msb, len);
127
128 BT_DBG("msg (len %zu) %*phN", len, (int) len, m);
129 BT_DBG("key %16phN", k);
130
131 err = crypto_hash_setkey(tfm, tmp, 16);
132 if (err) {
133 BT_ERR("cipher setkey failed: %d", err);
134 return err;
135 }
136
137 sg_init_one(&sg, msg_msb, len);
138
139 err = crypto_hash_update(&desc, &sg, len);
140 if (err) {
141 BT_ERR("Hash update error %d", err);
142 return err;
143 }
144
145 err = crypto_hash_final(&desc, mac_msb);
146 if (err) {
147 BT_ERR("Hash final error %d", err);
148 return err;
149 }
150
151 swap_buf(mac_msb, mac, 16);
152
153 BT_DBG("mac %16phN", mac);
154
155 return 0;
156}
157
158static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
159 const u8 x[16], u8 z, u8 res[16])
160{
161 u8 m[65];
162 int err;
163
164 BT_DBG("u %32phN", u);
165 BT_DBG("v %32phN", v);
166 BT_DBG("x %16phN z %02x", x, z);
167
168 m[0] = z;
169 memcpy(m + 1, v, 32);
170 memcpy(m + 33, u, 32);
171
172 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
173 if (err)
174 return err;
175
176 BT_DBG("res %16phN", res);
177
178 return err;
179}
180
Johan Hedberg760b0182014-06-06 11:44:05 +0300181static int smp_f5(struct crypto_hash *tfm_cmac, u8 w[32], u8 n1[16], u8 n2[16],
182 u8 a1[7], u8 a2[7], u8 mackey[16], u8 ltk[16])
183{
184 /* The btle, salt and length "magic" values are as defined in
185 * the SMP section of the Bluetooth core specification. In ASCII
186 * the btle value ends up being 'btle'. The salt is just a
187 * random number whereas length is the value 256 in little
188 * endian format.
189 */
190 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
191 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
192 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
193 const u8 length[2] = { 0x00, 0x01 };
194 u8 m[53], t[16];
195 int err;
196
197 BT_DBG("w %32phN", w);
198 BT_DBG("n1 %16phN n2 %16phN", n1, n2);
199 BT_DBG("a1 %7phN a2 %7phN", a1, a2);
200
201 err = aes_cmac(tfm_cmac, salt, w, 32, t);
202 if (err)
203 return err;
204
205 BT_DBG("t %16phN", t);
206
207 memcpy(m, length, 2);
208 memcpy(m + 2, a2, 7);
209 memcpy(m + 9, a1, 7);
210 memcpy(m + 16, n2, 16);
211 memcpy(m + 32, n1, 16);
212 memcpy(m + 48, btle, 4);
213
214 m[52] = 0; /* Counter */
215
216 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
217 if (err)
218 return err;
219
220 BT_DBG("mackey %16phN", mackey);
221
222 m[52] = 1; /* Counter */
223
224 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
225 if (err)
226 return err;
227
228 BT_DBG("ltk %16phN", ltk);
229
230 return 0;
231}
232
233static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
234 const u8 n1[16], u8 n2[16], const u8 r[16],
235 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
236 u8 res[16])
237{
238 u8 m[65];
239 int err;
240
241 BT_DBG("w %16phN", w);
242 BT_DBG("n1 %16phN n2 %16phN", n1, n2);
243 BT_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
244
245 memcpy(m, a2, 7);
246 memcpy(m + 7, a1, 7);
247 memcpy(m + 14, io_cap, 3);
248 memcpy(m + 17, r, 16);
249 memcpy(m + 33, n2, 16);
250 memcpy(m + 49, n1, 16);
251
252 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
253 if (err)
254 return err;
255
256 BT_DBG("res %16phN", res);
257
258 return err;
259}
260
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300261static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
262 const u8 x[16], const u8 y[16], u32 *val)
263{
264 u8 m[80], tmp[16];
265 int err;
266
267 BT_DBG("u %32phN", u);
268 BT_DBG("v %32phN", v);
269 BT_DBG("x %16phN y %16phN", x, y);
270
271 memcpy(m, y, 16);
272 memcpy(m + 16, v, 32);
273 memcpy(m + 48, u, 32);
274
275 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
276 if (err)
277 return err;
278
279 *val = get_unaligned_le32(tmp);
280 *val %= 1000000;
281
282 BT_DBG("val %06u", *val);
283
284 return 0;
285}
286
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300287static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
288{
289 struct blkcipher_desc desc;
290 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200291 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200292 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300293
294 if (tfm == NULL) {
295 BT_ERR("tfm %p", tfm);
296 return -EINVAL;
297 }
298
299 desc.tfm = tfm;
300 desc.flags = 0;
301
Johan Hedberg943a7322014-03-18 12:58:24 +0200302 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300303 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200304
305 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300306 if (err) {
307 BT_ERR("cipher setkey failed: %d", err);
308 return err;
309 }
310
Johan Hedberg943a7322014-03-18 12:58:24 +0200311 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300312 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200313
314 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300315
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300316 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
317 if (err)
318 BT_ERR("Encrypt data error %d", err);
319
Johan Hedberg943a7322014-03-18 12:58:24 +0200320 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300321 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200322
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300323 return err;
324}
325
Johan Hedberg6a770832014-06-06 11:54:04 +0300326static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
327 const u8 key_id[4], u8 res[16])
328{
329 int err;
330
331 BT_DBG("w %16phN key_id %4phN", w, key_id);
332
333 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
334 if (err)
335 return err;
336
337 BT_DBG("res %16phN", res);
338
339 return err;
340}
341
Johan Hedberg60478052014-02-18 10:19:31 +0200342static int smp_ah(struct crypto_blkcipher *tfm, u8 irk[16], u8 r[3], u8 res[3])
343{
Johan Hedberg943a7322014-03-18 12:58:24 +0200344 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200345 int err;
346
347 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200348 memcpy(_res, r, 3);
349 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200350
Johan Hedberg943a7322014-03-18 12:58:24 +0200351 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200352 if (err) {
353 BT_ERR("Encrypt error");
354 return err;
355 }
356
357 /* The output of the random address function ah is:
358 * ah(h, r) = e(k, r') mod 2^24
359 * The output of the security function e is then truncated to 24 bits
360 * by taking the least significant 24 bits of the output of e as the
361 * result of ah.
362 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200363 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200364
365 return 0;
366}
367
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300368bool smp_irk_matches(struct hci_dev *hdev, u8 irk[16], bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200369{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300370 struct l2cap_chan *chan = hdev->smp_data;
371 struct crypto_blkcipher *tfm;
Johan Hedberg60478052014-02-18 10:19:31 +0200372 u8 hash[3];
373 int err;
374
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300375 if (!chan || !chan->data)
376 return false;
377
378 tfm = chan->data;
379
Johan Hedberg60478052014-02-18 10:19:31 +0200380 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
381
382 err = smp_ah(tfm, irk, &bdaddr->b[3], hash);
383 if (err)
384 return false;
385
386 return !memcmp(bdaddr->b, hash, 3);
387}
388
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300389int smp_generate_rpa(struct hci_dev *hdev, u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200390{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300391 struct l2cap_chan *chan = hdev->smp_data;
392 struct crypto_blkcipher *tfm;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200393 int err;
394
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300395 if (!chan || !chan->data)
396 return -EOPNOTSUPP;
397
398 tfm = chan->data;
399
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200400 get_random_bytes(&rpa->b[3], 3);
401
402 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
403 rpa->b[5] |= 0x40; /* Set second most significant bit */
404
405 err = smp_ah(tfm, irk, &rpa->b[3], rpa->b);
406 if (err < 0)
407 return err;
408
409 BT_DBG("RPA %pMR", rpa);
410
411 return 0;
412}
413
Johan Hedberge491eaf2014-10-25 21:15:37 +0200414static int smp_c1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r[16],
415 u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia, u8 _rat,
416 bdaddr_t *ra, u8 res[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300417{
418 u8 p1[16], p2[16];
419 int err;
420
421 memset(p1, 0, 16);
422
423 /* p1 = pres || preq || _rat || _iat */
Johan Hedberg943a7322014-03-18 12:58:24 +0200424 p1[0] = _iat;
425 p1[1] = _rat;
426 memcpy(p1 + 2, preq, 7);
427 memcpy(p1 + 9, pres, 7);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300428
429 /* p2 = padding || ia || ra */
Johan Hedberg943a7322014-03-18 12:58:24 +0200430 memcpy(p2, ra, 6);
431 memcpy(p2 + 6, ia, 6);
432 memset(p2 + 12, 0, 4);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300433
434 /* res = r XOR p1 */
435 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
436
437 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200438 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300439 if (err) {
440 BT_ERR("Encrypt data error");
441 return err;
442 }
443
444 /* res = res XOR p2 */
445 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
446
447 /* res = e(k, res) */
Johan Hedberge491eaf2014-10-25 21:15:37 +0200448 err = smp_e(tfm_aes, k, res);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300449 if (err)
450 BT_ERR("Encrypt data error");
451
452 return err;
453}
454
Johan Hedberge491eaf2014-10-25 21:15:37 +0200455static int smp_s1(struct crypto_blkcipher *tfm_aes, u8 k[16], u8 r1[16],
456 u8 r2[16], u8 _r[16])
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300457{
458 int err;
459
460 /* Just least significant octets from r1 and r2 are considered */
Johan Hedberg943a7322014-03-18 12:58:24 +0200461 memcpy(_r, r2, 8);
462 memcpy(_r + 8, r1, 8);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300463
Johan Hedberge491eaf2014-10-25 21:15:37 +0200464 err = smp_e(tfm_aes, k, _r);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300465 if (err)
466 BT_ERR("Encrypt data error");
467
468 return err;
469}
470
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300471static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
472{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300473 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300474 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300475 struct kvec iv[2];
476 struct msghdr msg;
477
478 if (!chan)
479 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300480
481 BT_DBG("code 0x%2.2x", code);
482
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300483 iv[0].iov_base = &code;
484 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300485
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300486 iv[1].iov_base = data;
487 iv[1].iov_len = len;
488
489 memset(&msg, 0, sizeof(msg));
490
491 msg.msg_iov = (struct iovec *) &iv;
492 msg.msg_iovlen = 2;
493
494 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300495
Johan Hedbergb68fda62014-08-11 22:06:40 +0300496 if (!chan->data)
497 return;
498
499 smp = chan->data;
500
501 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300502 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300503}
504
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300505static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800506{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300507 if (authreq & SMP_AUTH_MITM) {
508 if (authreq & SMP_AUTH_SC)
509 return BT_SECURITY_FIPS;
510 else
511 return BT_SECURITY_HIGH;
512 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800513 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300514 }
Brian Gix2b64d152011-12-21 16:12:12 -0800515}
516
517static __u8 seclevel_to_authreq(__u8 sec_level)
518{
519 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300520 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800521 case BT_SECURITY_HIGH:
522 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
523 case BT_SECURITY_MEDIUM:
524 return SMP_AUTH_BONDING;
525 default:
526 return SMP_AUTH_NONE;
527 }
528}
529
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300530static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700531 struct smp_cmd_pairing *req,
532 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300533{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300534 struct l2cap_chan *chan = conn->smp;
535 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200536 struct hci_conn *hcon = conn->hcon;
537 struct hci_dev *hdev = hcon->hdev;
538 u8 local_dist = 0, remote_dist = 0;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300539
Johan Hedbergb6ae8452014-07-30 09:22:22 +0300540 if (test_bit(HCI_BONDABLE, &conn->hcon->hdev->dev_flags)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700541 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
542 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300543 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800544 } else {
545 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300546 }
547
Johan Hedbergfd349c02014-02-18 10:19:36 +0200548 if (test_bit(HCI_RPA_RESOLVING, &hdev->dev_flags))
549 remote_dist |= SMP_DIST_ID_KEY;
550
Johan Hedberg863efaf2014-02-22 19:06:32 +0200551 if (test_bit(HCI_PRIVACY, &hdev->dev_flags))
552 local_dist |= SMP_DIST_ID_KEY;
553
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300554 if (test_bit(HCI_SC_ENABLED, &hdev->dev_flags)) {
555 if ((authreq & SMP_AUTH_SC) &&
556 test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
557 local_dist |= SMP_DIST_LINK_KEY;
558 remote_dist |= SMP_DIST_LINK_KEY;
559 }
560 } else {
561 authreq &= ~SMP_AUTH_SC;
562 }
563
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300564 if (rsp == NULL) {
565 req->io_capability = conn->hcon->io_capability;
566 req->oob_flag = SMP_OOB_NOT_PRESENT;
567 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200568 req->init_key_dist = local_dist;
569 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300570 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200571
572 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300573 return;
574 }
575
576 rsp->io_capability = conn->hcon->io_capability;
577 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
578 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200579 rsp->init_key_dist = req->init_key_dist & remote_dist;
580 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300581 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200582
583 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300584}
585
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300586static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
587{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300588 struct l2cap_chan *chan = conn->smp;
589 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300590
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300591 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700592 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300593 return SMP_ENC_KEY_SIZE;
594
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300595 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300596
597 return 0;
598}
599
Johan Hedberg6f48e262014-08-11 22:06:44 +0300600static void smp_chan_destroy(struct l2cap_conn *conn)
601{
602 struct l2cap_chan *chan = conn->smp;
603 struct smp_chan *smp = chan->data;
604 bool complete;
605
606 BUG_ON(!smp);
607
608 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300609
Johan Hedberg6f48e262014-08-11 22:06:44 +0300610 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
611 mgmt_smp_complete(conn->hcon, complete);
612
613 kfree(smp->csrk);
614 kfree(smp->slave_csrk);
Johan Hedberg6a770832014-06-06 11:54:04 +0300615 kfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300616
617 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300618 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300619
620 /* If pairing failed clean up any keys we might have */
621 if (!complete) {
622 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200623 list_del_rcu(&smp->ltk->list);
624 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300625 }
626
627 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200628 list_del_rcu(&smp->slave_ltk->list);
629 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300630 }
631
632 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200633 list_del_rcu(&smp->remote_irk->list);
634 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300635 }
636 }
637
638 chan->data = NULL;
639 kfree(smp);
640 hci_conn_drop(conn->hcon);
641}
642
Johan Hedberg84794e12013-11-06 11:24:57 +0200643static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800644{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200645 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300646 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200647
Johan Hedberg84794e12013-11-06 11:24:57 +0200648 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800649 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700650 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800651
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700652 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700653 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300654
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300655 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300656 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800657}
658
Brian Gix2b64d152011-12-21 16:12:12 -0800659#define JUST_WORKS 0x00
660#define JUST_CFM 0x01
661#define REQ_PASSKEY 0x02
662#define CFM_PASSKEY 0x03
663#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300664#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800665#define OVERLAP 0xFF
666
667static const u8 gen_method[5][5] = {
668 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
669 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
670 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
671 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
672 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
673};
674
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300675static const u8 sc_method[5][5] = {
676 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
677 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
678 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
679 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
680 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
681};
682
Johan Hedberg581370c2014-06-17 13:07:38 +0300683static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
684{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300685 /* If either side has unknown io_caps, use JUST_CFM (which gets
686 * converted later to JUST_WORKS if we're initiators.
687 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300688 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
689 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300690 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300691
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300692 if (test_bit(SMP_FLAG_SC, &smp->flags))
693 return sc_method[remote_io][local_io];
694
Johan Hedberg581370c2014-06-17 13:07:38 +0300695 return gen_method[remote_io][local_io];
696}
697
Brian Gix2b64d152011-12-21 16:12:12 -0800698static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
699 u8 local_io, u8 remote_io)
700{
701 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300702 struct l2cap_chan *chan = conn->smp;
703 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800704 u32 passkey = 0;
705 int ret = 0;
706
707 /* Initialize key for JUST WORKS */
708 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300709 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800710
711 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
712
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300713 /* If neither side wants MITM, either "just" confirm an incoming
714 * request or use just-works for outgoing ones. The JUST_CFM
715 * will be converted to JUST_WORKS if necessary later in this
716 * function. If either side has MITM look up the method from the
717 * table.
718 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300719 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300720 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800721 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300722 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800723
Johan Hedberga82505c2014-03-24 14:39:07 +0200724 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300725 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
726 &smp->flags))
727 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200728
Johan Hedberg02f3e252014-07-16 15:09:13 +0300729 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300730 if (smp->method == JUST_CFM &&
731 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
732 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300733
Brian Gix2b64d152011-12-21 16:12:12 -0800734 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300735 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300736 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800737 return 0;
738 }
739
740 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300741 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300742 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300743 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
744 hcon->pending_sec_level = BT_SECURITY_HIGH;
745 }
Brian Gix2b64d152011-12-21 16:12:12 -0800746
747 /* If both devices have Keyoard-Display I/O, the master
748 * Confirms and the slave Enters the passkey.
749 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300750 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300751 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300752 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800753 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300754 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800755 }
756
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200757 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300758 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200759 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800760 get_random_bytes(&passkey, sizeof(passkey));
761 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200762 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800763 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300764 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800765 }
766
Johan Hedberg783e0572014-05-31 18:48:26 +0300767 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700768 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200769 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300770 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200771 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
772 hcon->type, hcon->dst_type,
773 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800774 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200775 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200776 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200777 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800778
Brian Gix2b64d152011-12-21 16:12:12 -0800779 return ret;
780}
781
Johan Hedberg1cc61142014-05-20 09:45:52 +0300782static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300783{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300784 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300785 struct smp_cmd_pairing_confirm cp;
786 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300787
788 BT_DBG("conn %p", conn);
789
Johan Hedberge491eaf2014-10-25 21:15:37 +0200790 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200791 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200792 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
793 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300794 if (ret)
795 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300796
Johan Hedberg4a74d652014-05-20 09:45:50 +0300797 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800798
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300799 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
800
Johan Hedbergb28b4942014-09-05 22:19:55 +0300801 if (conn->hcon->out)
802 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
803 else
804 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
805
Johan Hedberg1cc61142014-05-20 09:45:52 +0300806 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300807}
808
Johan Hedberg861580a2014-05-20 09:45:51 +0300809static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300810{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300811 struct l2cap_conn *conn = smp->conn;
812 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300813 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300814 int ret;
815
Johan Hedbergec70f362014-06-27 14:23:04 +0300816 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300817 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300818
819 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
820
Johan Hedberge491eaf2014-10-25 21:15:37 +0200821 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200822 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200823 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300824 if (ret)
825 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300826
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300827 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
828 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300829 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300830 }
831
832 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800833 u8 stk[16];
834 __le64 rand = 0;
835 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300836
Johan Hedberge491eaf2014-10-25 21:15:37 +0200837 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300838
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300839 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300840 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300841
Johan Hedberg861580a2014-05-20 09:45:51 +0300842 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
843 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300844
845 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300846 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300847 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300848 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300849 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800850 __le64 rand = 0;
851 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300852
Johan Hedberg943a7322014-03-18 12:58:24 +0200853 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
854 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300855
Johan Hedberge491eaf2014-10-25 21:15:37 +0200856 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300857
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300858 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700859 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300860
Johan Hedbergfff34902014-06-10 15:19:50 +0300861 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
862 auth = 1;
863 else
864 auth = 0;
865
Johan Hedberg7d5843b2014-06-16 19:25:15 +0300866 /* Even though there's no _SLAVE suffix this is the
867 * slave STK we're adding for later lookup (the master
868 * STK never needs to be stored).
869 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700870 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +0300871 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300872 }
873
Johan Hedberg861580a2014-05-20 09:45:51 +0300874 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300875}
876
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300877static void smp_notify_keys(struct l2cap_conn *conn)
878{
879 struct l2cap_chan *chan = conn->smp;
880 struct smp_chan *smp = chan->data;
881 struct hci_conn *hcon = conn->hcon;
882 struct hci_dev *hdev = hcon->hdev;
883 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
884 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
885 bool persistent;
886
887 if (smp->remote_irk) {
888 mgmt_new_irk(hdev, smp->remote_irk);
889 /* Now that user space can be considered to know the
890 * identity address track the connection based on it
891 * from now on.
892 */
893 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
894 hcon->dst_type = smp->remote_irk->addr_type;
Johan Hedbergf3d82d02014-09-05 22:19:50 +0300895 queue_work(hdev->workqueue, &conn->id_addr_update_work);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300896
897 /* When receiving an indentity resolving key for
898 * a remote device that does not use a resolvable
899 * private address, just remove the key so that
900 * it is possible to use the controller white
901 * list for scanning.
902 *
903 * Userspace will have been told to not store
904 * this key at this point. So it is safe to
905 * just remove it.
906 */
907 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200908 list_del_rcu(&smp->remote_irk->list);
909 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300910 smp->remote_irk = NULL;
911 }
912 }
913
914 /* The LTKs and CSRKs should be persistent only if both sides
915 * had the bonding bit set in their authentication requests.
916 */
917 persistent = !!((req->auth_req & rsp->auth_req) & SMP_AUTH_BONDING);
918
919 if (smp->csrk) {
920 smp->csrk->bdaddr_type = hcon->dst_type;
921 bacpy(&smp->csrk->bdaddr, &hcon->dst);
922 mgmt_new_csrk(hdev, smp->csrk, persistent);
923 }
924
925 if (smp->slave_csrk) {
926 smp->slave_csrk->bdaddr_type = hcon->dst_type;
927 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
928 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
929 }
930
931 if (smp->ltk) {
932 smp->ltk->bdaddr_type = hcon->dst_type;
933 bacpy(&smp->ltk->bdaddr, &hcon->dst);
934 mgmt_new_ltk(hdev, smp->ltk, persistent);
935 }
936
937 if (smp->slave_ltk) {
938 smp->slave_ltk->bdaddr_type = hcon->dst_type;
939 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
940 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
941 }
Johan Hedberg6a770832014-06-06 11:54:04 +0300942
943 if (smp->link_key) {
944 hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
945 smp->link_key, HCI_LK_AUTH_COMBINATION_P256,
946 0, NULL);
947 }
948}
949
950static void sc_generate_link_key(struct smp_chan *smp)
951{
952 /* These constants are as specified in the core specification.
953 * In ASCII they spell out to 'tmp1' and 'lebr'.
954 */
955 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
956 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
957
958 smp->link_key = kzalloc(16, GFP_KERNEL);
959 if (!smp->link_key)
960 return;
961
962 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
963 kfree(smp->link_key);
964 smp->link_key = NULL;
965 return;
966 }
967
968 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
969 kfree(smp->link_key);
970 smp->link_key = NULL;
971 return;
972 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300973}
974
Johan Hedbergb28b4942014-09-05 22:19:55 +0300975static void smp_allow_key_dist(struct smp_chan *smp)
976{
977 /* Allow the first expected phase 3 PDU. The rest of the PDUs
978 * will be allowed in each PDU handler to ensure we receive
979 * them in the correct order.
980 */
981 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
982 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
983 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
984 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
985 else if (smp->remote_key_dist & SMP_DIST_SIGN)
986 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
987}
988
Johan Hedbergd6268e82014-09-05 22:19:51 +0300989static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300990{
991 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +0300992 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300993 struct hci_conn *hcon = conn->hcon;
994 struct hci_dev *hdev = hcon->hdev;
995 __u8 *keydist;
996
997 BT_DBG("conn %p", conn);
998
Johan Hedberg44f1a7a2014-08-11 22:06:36 +0300999 rsp = (void *) &smp->prsp[1];
1000
1001 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001002 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1003 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001004 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001005 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001006
1007 req = (void *) &smp->preq[1];
1008
1009 if (hcon->out) {
1010 keydist = &rsp->init_key_dist;
1011 *keydist &= req->init_key_dist;
1012 } else {
1013 keydist = &rsp->resp_key_dist;
1014 *keydist &= req->resp_key_dist;
1015 }
1016
Johan Hedberg6a770832014-06-06 11:54:04 +03001017 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1018 if (*keydist & SMP_DIST_LINK_KEY)
1019 sc_generate_link_key(smp);
1020
1021 /* Clear the keys which are generated but not distributed */
1022 *keydist &= ~SMP_SC_NO_DIST;
1023 }
1024
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001025 BT_DBG("keydist 0x%x", *keydist);
1026
1027 if (*keydist & SMP_DIST_ENC_KEY) {
1028 struct smp_cmd_encrypt_info enc;
1029 struct smp_cmd_master_ident ident;
1030 struct smp_ltk *ltk;
1031 u8 authenticated;
1032 __le16 ediv;
1033 __le64 rand;
1034
1035 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1036 get_random_bytes(&ediv, sizeof(ediv));
1037 get_random_bytes(&rand, sizeof(rand));
1038
1039 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1040
1041 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1042 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1043 SMP_LTK_SLAVE, authenticated, enc.ltk,
1044 smp->enc_key_size, ediv, rand);
1045 smp->slave_ltk = ltk;
1046
1047 ident.ediv = ediv;
1048 ident.rand = rand;
1049
1050 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1051
1052 *keydist &= ~SMP_DIST_ENC_KEY;
1053 }
1054
1055 if (*keydist & SMP_DIST_ID_KEY) {
1056 struct smp_cmd_ident_addr_info addrinfo;
1057 struct smp_cmd_ident_info idinfo;
1058
1059 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1060
1061 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1062
1063 /* The hci_conn contains the local identity address
1064 * after the connection has been established.
1065 *
1066 * This is true even when the connection has been
1067 * established using a resolvable random address.
1068 */
1069 bacpy(&addrinfo.bdaddr, &hcon->src);
1070 addrinfo.addr_type = hcon->src_type;
1071
1072 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1073 &addrinfo);
1074
1075 *keydist &= ~SMP_DIST_ID_KEY;
1076 }
1077
1078 if (*keydist & SMP_DIST_SIGN) {
1079 struct smp_cmd_sign_info sign;
1080 struct smp_csrk *csrk;
1081
1082 /* Generate a new random key */
1083 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1084
1085 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1086 if (csrk) {
1087 csrk->master = 0x00;
1088 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1089 }
1090 smp->slave_csrk = csrk;
1091
1092 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1093
1094 *keydist &= ~SMP_DIST_SIGN;
1095 }
1096
1097 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001098 if (smp->remote_key_dist & KEY_DIST_MASK) {
1099 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001100 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001101 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001102
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001103 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1104 smp_notify_keys(conn);
1105
1106 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001107}
1108
Johan Hedbergb68fda62014-08-11 22:06:40 +03001109static void smp_timeout(struct work_struct *work)
1110{
1111 struct smp_chan *smp = container_of(work, struct smp_chan,
1112 security_timer.work);
1113 struct l2cap_conn *conn = smp->conn;
1114
1115 BT_DBG("conn %p", conn);
1116
Johan Hedberg1e91c292014-08-18 20:33:29 +03001117 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001118}
1119
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001120static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1121{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001122 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001123 struct smp_chan *smp;
1124
Marcel Holtmannf1560462013-10-13 05:43:25 -07001125 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001126 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001127 return NULL;
1128
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001129 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1130 if (IS_ERR(smp->tfm_aes)) {
1131 BT_ERR("Unable to create ECB crypto context");
1132 kfree(smp);
1133 return NULL;
1134 }
1135
Johan Hedberg407cecf2014-05-02 14:19:47 +03001136 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1137 if (IS_ERR(smp->tfm_cmac)) {
1138 BT_ERR("Unable to create CMAC crypto context");
1139 crypto_free_blkcipher(smp->tfm_aes);
1140 kfree(smp);
1141 return NULL;
1142 }
1143
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001144 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001145 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001146
Johan Hedbergb28b4942014-09-05 22:19:55 +03001147 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1148
Johan Hedbergb68fda62014-08-11 22:06:40 +03001149 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1150
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001151 hci_conn_hold(conn->hcon);
1152
1153 return smp;
1154}
1155
Johan Hedberg760b0182014-06-06 11:44:05 +03001156static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1157{
1158 struct hci_conn *hcon = smp->conn->hcon;
1159 u8 *na, *nb, a[7], b[7];
1160
1161 if (hcon->out) {
1162 na = smp->prnd;
1163 nb = smp->rrnd;
1164 } else {
1165 na = smp->rrnd;
1166 nb = smp->prnd;
1167 }
1168
1169 memcpy(a, &hcon->init_addr, 6);
1170 memcpy(b, &hcon->resp_addr, 6);
1171 a[6] = hcon->init_addr_type;
1172 b[6] = hcon->resp_addr_type;
1173
1174 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1175}
1176
1177static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1178{
1179 struct hci_conn *hcon = smp->conn->hcon;
1180 struct smp_cmd_dhkey_check check;
1181 u8 a[7], b[7], *local_addr, *remote_addr;
1182 u8 io_cap[3], r[16];
1183
1184 switch (mgmt_op) {
1185 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1186 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1187 return 0;
1188 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1189 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1190 return 0;
1191 }
1192
1193 memcpy(a, &hcon->init_addr, 6);
1194 memcpy(b, &hcon->resp_addr, 6);
1195 a[6] = hcon->init_addr_type;
1196 b[6] = hcon->resp_addr_type;
1197
1198 if (hcon->out) {
1199 local_addr = a;
1200 remote_addr = b;
1201 memcpy(io_cap, &smp->preq[1], 3);
1202 } else {
1203 local_addr = b;
1204 remote_addr = a;
1205 memcpy(io_cap, &smp->prsp[1], 3);
1206 }
1207
1208 memcpy(r, &passkey, sizeof(passkey));
1209 memset(r + sizeof(passkey), 0, sizeof(r) - sizeof(passkey));
1210
1211 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1212 local_addr, remote_addr, check.e);
1213
1214 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
1215
1216 return 0;
1217}
1218
Brian Gix2b64d152011-12-21 16:12:12 -08001219int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1220{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001221 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001222 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001223 struct smp_chan *smp;
1224 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001225 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001226
1227 BT_DBG("");
1228
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001229 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001230 return -ENOTCONN;
1231
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001232 chan = conn->smp;
1233 if (!chan)
1234 return -ENOTCONN;
1235
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001236 l2cap_chan_lock(chan);
1237 if (!chan->data) {
1238 err = -ENOTCONN;
1239 goto unlock;
1240 }
1241
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001242 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001243
Johan Hedberg760b0182014-06-06 11:44:05 +03001244 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1245 err = sc_user_reply(smp, mgmt_op, passkey);
1246 goto unlock;
1247 }
1248
Brian Gix2b64d152011-12-21 16:12:12 -08001249 switch (mgmt_op) {
1250 case MGMT_OP_USER_PASSKEY_REPLY:
1251 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001252 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001253 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001254 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001255 /* Fall Through */
1256 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001257 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001258 break;
1259 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1260 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001261 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001262 err = 0;
1263 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001264 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001265 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001266 err = -EOPNOTSUPP;
1267 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001268 }
1269
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001270 err = 0;
1271
Brian Gix2b64d152011-12-21 16:12:12 -08001272 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001273 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1274 u8 rsp = smp_confirm(smp);
1275 if (rsp)
1276 smp_failure(conn, rsp);
1277 }
Brian Gix2b64d152011-12-21 16:12:12 -08001278
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001279unlock:
1280 l2cap_chan_unlock(chan);
1281 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001282}
1283
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001284static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001285{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001286 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001287 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001288 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001289 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001290 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001291 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001292
1293 BT_DBG("conn %p", conn);
1294
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001295 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001296 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001297
Johan Hedberg40bef302014-07-16 11:42:27 +03001298 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001299 return SMP_CMD_NOTSUPP;
1300
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001301 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001302 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001303 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001304 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001305
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001306 if (!smp)
1307 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001308
Johan Hedbergc05b9332014-09-10 17:37:42 -07001309 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001310 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001311
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001312 if (!test_bit(HCI_BONDABLE, &hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001313 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001314 return SMP_PAIRING_NOTSUPP;
1315
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001316 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1317 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001318 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001319
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001320 build_pairing_cmd(conn, req, &rsp, auth);
1321
1322 if (rsp.auth_req & SMP_AUTH_SC)
1323 set_bit(SMP_FLAG_SC, &smp->flags);
1324
Johan Hedberg5be5e272014-09-10 17:58:54 -07001325 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001326 sec_level = BT_SECURITY_MEDIUM;
1327 else
1328 sec_level = authreq_to_seclevel(auth);
1329
Johan Hedbergc7262e72014-06-17 13:07:37 +03001330 if (sec_level > conn->hcon->pending_sec_level)
1331 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001332
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001333 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001334 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1335 u8 method;
1336
1337 method = get_auth_method(smp, conn->hcon->io_capability,
1338 req->io_capability);
1339 if (method == JUST_WORKS || method == JUST_CFM)
1340 return SMP_AUTH_REQUIREMENTS;
1341 }
1342
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001343 key_size = min(req->max_key_size, rsp.max_key_size);
1344 if (check_enc_key_size(conn, key_size))
1345 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001346
Johan Hedberge84a6b12013-12-02 10:49:03 +02001347 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001348
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001349 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1350 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001351
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001352 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001353
1354 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1355
1356 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1357 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1358 /* Clear bits which are generated but not distributed */
1359 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1360 /* Wait for Public Key from Initiating Device */
1361 return 0;
1362 } else {
1363 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1364 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001365
Brian Gix2b64d152011-12-21 16:12:12 -08001366 /* Request setup of TK */
1367 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1368 if (ret)
1369 return SMP_UNSPECIFIED;
1370
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001371 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001372}
1373
Johan Hedberg3b191462014-06-06 10:50:15 +03001374static u8 sc_send_public_key(struct smp_chan *smp)
1375{
1376 BT_DBG("");
1377
1378 /* Generate local key pair for Secure Connections */
1379 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1380 return SMP_UNSPECIFIED;
1381
1382 BT_DBG("Local Public Key X: %32phN", smp->local_pk);
1383 BT_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1384 BT_DBG("Local Private Key: %32phN", smp->local_sk);
1385
1386 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1387
1388 return 0;
1389}
1390
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001391static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001392{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001393 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001394 struct l2cap_chan *chan = conn->smp;
1395 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001396 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001397 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001398 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001399
1400 BT_DBG("conn %p", conn);
1401
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001402 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001403 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001404
Johan Hedberg40bef302014-07-16 11:42:27 +03001405 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001406 return SMP_CMD_NOTSUPP;
1407
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001408 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001409
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001410 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001411
1412 key_size = min(req->max_key_size, rsp->max_key_size);
1413 if (check_enc_key_size(conn, key_size))
1414 return SMP_ENC_KEY_SIZE;
1415
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001416 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001417
Johan Hedberg65668772014-05-16 11:03:34 +03001418 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1419 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001420 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1421 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001422
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001423 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001424 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1425 u8 method;
1426
1427 method = get_auth_method(smp, req->io_capability,
1428 rsp->io_capability);
1429 if (method == JUST_WORKS || method == JUST_CFM)
1430 return SMP_AUTH_REQUIREMENTS;
1431 }
1432
Johan Hedberge84a6b12013-12-02 10:49:03 +02001433 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001434
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001435 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1436 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001437
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001438 /* Update remote key distribution in case the remote cleared
1439 * some bits that we had enabled in our request.
1440 */
1441 smp->remote_key_dist &= rsp->resp_key_dist;
1442
Johan Hedberg3b191462014-06-06 10:50:15 +03001443 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1444 /* Clear bits which are generated but not distributed */
1445 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1446 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1447 return sc_send_public_key(smp);
1448 }
1449
Johan Hedbergc05b9332014-09-10 17:37:42 -07001450 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001451
Johan Hedberg476585e2012-06-06 18:54:15 +08001452 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001453 if (ret)
1454 return SMP_UNSPECIFIED;
1455
Johan Hedberg4a74d652014-05-20 09:45:50 +03001456 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001457
1458 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001459 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001460 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001461
1462 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001463}
1464
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001465static u8 sc_check_confirm(struct smp_chan *smp)
1466{
1467 struct l2cap_conn *conn = smp->conn;
1468
1469 BT_DBG("");
1470
1471 /* Public Key exchange must happen before any other steps */
1472 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1473 return SMP_UNSPECIFIED;
1474
1475 if (conn->hcon->out) {
1476 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1477 smp->prnd);
1478 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1479 }
1480
1481 return 0;
1482}
1483
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001484static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001485{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001486 struct l2cap_chan *chan = conn->smp;
1487 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001488
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001489 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1490
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001491 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001492 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001493
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001494 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1495 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001496
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001497 if (test_bit(SMP_FLAG_SC, &smp->flags))
1498 return sc_check_confirm(smp);
1499
Johan Hedbergb28b4942014-09-05 22:19:55 +03001500 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001501 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1502 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001503 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1504 return 0;
1505 }
1506
1507 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001508 return smp_confirm(smp);
Johan Hedberg943a7322014-03-18 12:58:24 +02001509 else
Johan Hedberg4a74d652014-05-20 09:45:50 +03001510 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001511
1512 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001513}
1514
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001515static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001516{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001517 struct l2cap_chan *chan = conn->smp;
1518 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001519 struct hci_conn *hcon = conn->hcon;
1520 u8 *pkax, *pkbx, *na, *nb;
1521 u32 passkey;
1522 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001523
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001524 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001525
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001526 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001527 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001528
Johan Hedberg943a7322014-03-18 12:58:24 +02001529 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001530 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001531
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001532 if (!test_bit(SMP_FLAG_SC, &smp->flags))
1533 return smp_random(smp);
1534
1535 if (hcon->out) {
1536 u8 cfm[16];
1537
1538 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1539 smp->rrnd, 0, cfm);
1540 if (err)
1541 return SMP_UNSPECIFIED;
1542
1543 if (memcmp(smp->pcnf, cfm, 16))
1544 return SMP_CONFIRM_FAILED;
1545
1546 pkax = smp->local_pk;
1547 pkbx = smp->remote_pk;
1548 na = smp->prnd;
1549 nb = smp->rrnd;
1550 } else {
1551 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1552 smp->prnd);
1553 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1554
1555 pkax = smp->remote_pk;
1556 pkbx = smp->local_pk;
1557 na = smp->rrnd;
1558 nb = smp->prnd;
1559 }
1560
Johan Hedberg760b0182014-06-06 11:44:05 +03001561 /* Generate MacKey and LTK */
1562 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
1563 if (err)
1564 return SMP_UNSPECIFIED;
1565
Johan Hedberg191dc7f2014-06-06 11:39:49 +03001566 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
1567 if (err)
1568 return SMP_UNSPECIFIED;
1569
1570 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
1571 hcon->type, hcon->dst_type,
1572 passkey, 0);
1573 if (err)
1574 return SMP_UNSPECIFIED;
1575
1576 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001577}
1578
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001579static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001580{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001581 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001582 struct hci_conn *hcon = conn->hcon;
1583
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001584 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001585 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001586 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001587
Johan Hedberga6f78332014-09-10 17:37:45 -07001588 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001589 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08001590
Johan Hedberg51a8efd2012-01-16 06:10:31 +02001591 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001592 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001593
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001594 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
1595 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001596
Johan Hedbergfe59a052014-07-01 19:14:12 +03001597 /* We never store STKs for master role, so clear this flag */
1598 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
1599
Marcel Holtmannf81cd822014-07-01 10:59:24 +02001600 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001601}
Marcel Holtmannf1560462013-10-13 05:43:25 -07001602
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001603bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
1604 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03001605{
1606 if (sec_level == BT_SECURITY_LOW)
1607 return true;
1608
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001609 /* If we're encrypted with an STK but the caller prefers using
1610 * LTK claim insufficient security. This way we allow the
1611 * connection to be re-encrypted with an LTK, even if the LTK
1612 * provides the same level of security. Only exception is if we
1613 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001614 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001615 if (key_pref == SMP_USE_LTK &&
1616 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03001617 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03001618 return false;
1619
Johan Hedberg854f4722014-07-01 18:40:20 +03001620 if (hcon->sec_level >= sec_level)
1621 return true;
1622
1623 return false;
1624}
1625
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001626static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001627{
1628 struct smp_cmd_security_req *rp = (void *) skb->data;
1629 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001630 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001631 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001632 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07001633 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001634
1635 BT_DBG("conn %p", conn);
1636
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001637 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001638 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001639
Johan Hedberg40bef302014-07-16 11:42:27 +03001640 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02001641 return SMP_CMD_NOTSUPP;
1642
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001643 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001644
Johan Hedberg5be5e272014-09-10 17:58:54 -07001645 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001646 sec_level = BT_SECURITY_MEDIUM;
1647 else
1648 sec_level = authreq_to_seclevel(auth);
1649
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001650 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03001651 return 0;
1652
Johan Hedbergc7262e72014-06-17 13:07:37 +03001653 if (sec_level > hcon->pending_sec_level)
1654 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03001655
Johan Hedberg4dab7862012-06-07 14:58:37 +08001656 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03001657 return 0;
1658
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001659 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03001660 if (!smp)
1661 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001662
Johan Hedbergb6ae8452014-07-30 09:22:22 +03001663 if (!test_bit(HCI_BONDABLE, &hcon->hdev->dev_flags) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001664 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03001665 return SMP_PAIRING_NOTSUPP;
1666
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001667 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001668
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001669 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07001670 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001671
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001672 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1673 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001674
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001675 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001676 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001677
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001678 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001679}
1680
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001681int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001682{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03001683 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001684 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001685 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08001686 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001687 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001688
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03001689 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
1690
Johan Hedberg0a66cf22014-03-24 14:39:03 +02001691 /* This may be NULL if there's an unexpected disconnection */
1692 if (!conn)
1693 return 1;
1694
Johan Hedbergc68b7f12014-09-06 06:59:10 +03001695 chan = conn->smp;
1696
Johan Hedberg757aee02013-04-24 13:05:32 +03001697 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03001698 return 1;
1699
Johan Hedberg35dc6f82014-11-13 10:55:18 +02001700 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03001701 return 1;
1702
Johan Hedbergc7262e72014-06-17 13:07:37 +03001703 if (sec_level > hcon->pending_sec_level)
1704 hcon->pending_sec_level = sec_level;
1705
Johan Hedberg40bef302014-07-16 11:42:27 +03001706 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03001707 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
1708 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001709
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001710 l2cap_chan_lock(chan);
1711
1712 /* If SMP is already in progress ignore this request */
1713 if (chan->data) {
1714 ret = 0;
1715 goto unlock;
1716 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001717
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001718 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001719 if (!smp) {
1720 ret = 1;
1721 goto unlock;
1722 }
Brian Gix2b64d152011-12-21 16:12:12 -08001723
1724 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001725
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001726 if (test_bit(HCI_SC_ENABLED, &hcon->hdev->dev_flags))
1727 authreq |= SMP_AUTH_SC;
1728
Johan Hedberg79897d22014-06-01 09:45:24 +03001729 /* Require MITM if IO Capability allows or the security level
1730 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02001731 */
Johan Hedberg79897d22014-06-01 09:45:24 +03001732 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03001733 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02001734 authreq |= SMP_AUTH_MITM;
1735
Johan Hedberg40bef302014-07-16 11:42:27 +03001736 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001737 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001738
Brian Gix2b64d152011-12-21 16:12:12 -08001739 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001740 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1741 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001742
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001743 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001744 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001745 } else {
1746 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08001747 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001748 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001749 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001750 }
1751
Johan Hedberg4a74d652014-05-20 09:45:50 +03001752 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001753 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02001754
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001755unlock:
1756 l2cap_chan_unlock(chan);
1757 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001758}
1759
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001760static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
1761{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001762 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001763 struct l2cap_chan *chan = conn->smp;
1764 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001765
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001766 BT_DBG("conn %p", conn);
1767
1768 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001769 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001770
Johan Hedbergb28b4942014-09-05 22:19:55 +03001771 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001772
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001773 skb_pull(skb, sizeof(*rp));
1774
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001775 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001776
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001777 return 0;
1778}
1779
1780static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
1781{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001782 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001783 struct l2cap_chan *chan = conn->smp;
1784 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001785 struct hci_dev *hdev = conn->hcon->hdev;
1786 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02001787 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03001788 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001789
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001790 BT_DBG("conn %p", conn);
1791
1792 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001793 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001794
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001795 /* Mark the information as received */
1796 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
1797
Johan Hedbergb28b4942014-09-05 22:19:55 +03001798 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1799 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07001800 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1801 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001802
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03001803 skb_pull(skb, sizeof(*rp));
1804
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001805 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03001806 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02001807 authenticated, smp->tk, smp->enc_key_size,
1808 rp->ediv, rp->rand);
1809 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001810 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03001811 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03001812
1813 return 0;
1814}
1815
Johan Hedbergfd349c02014-02-18 10:19:36 +02001816static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
1817{
1818 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001819 struct l2cap_chan *chan = conn->smp;
1820 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001821
1822 BT_DBG("");
1823
1824 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001825 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001826
Johan Hedbergb28b4942014-09-05 22:19:55 +03001827 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02001828
Johan Hedbergfd349c02014-02-18 10:19:36 +02001829 skb_pull(skb, sizeof(*info));
1830
1831 memcpy(smp->irk, info->irk, 16);
1832
1833 return 0;
1834}
1835
1836static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
1837 struct sk_buff *skb)
1838{
1839 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001840 struct l2cap_chan *chan = conn->smp;
1841 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001842 struct hci_conn *hcon = conn->hcon;
1843 bdaddr_t rpa;
1844
1845 BT_DBG("");
1846
1847 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001848 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02001849
Johan Hedberg9747a9f2014-02-26 23:33:43 +02001850 /* Mark the information as received */
1851 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
1852
Johan Hedbergb28b4942014-09-05 22:19:55 +03001853 if (smp->remote_key_dist & SMP_DIST_SIGN)
1854 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1855
Johan Hedbergfd349c02014-02-18 10:19:36 +02001856 skb_pull(skb, sizeof(*info));
1857
Johan Hedberga9a58f82014-02-25 22:24:37 +02001858 /* Strictly speaking the Core Specification (4.1) allows sending
1859 * an empty address which would force us to rely on just the IRK
1860 * as "identity information". However, since such
1861 * implementations are not known of and in order to not over
1862 * complicate our implementation, simply pretend that we never
1863 * received an IRK for such a device.
1864 */
1865 if (!bacmp(&info->bdaddr, BDADDR_ANY)) {
1866 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03001867 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02001868 }
1869
Johan Hedbergfd349c02014-02-18 10:19:36 +02001870 bacpy(&smp->id_addr, &info->bdaddr);
1871 smp->id_addr_type = info->addr_type;
1872
1873 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
1874 bacpy(&rpa, &hcon->dst);
1875 else
1876 bacpy(&rpa, BDADDR_ANY);
1877
Johan Hedberg23d0e122014-02-19 14:57:46 +02001878 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
1879 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001880
Johan Hedberg31dd6242014-06-27 14:23:02 +03001881distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03001882 if (!(smp->remote_key_dist & KEY_DIST_MASK))
1883 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02001884
1885 return 0;
1886}
1887
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001888static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
1889{
1890 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001891 struct l2cap_chan *chan = conn->smp;
1892 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001893 struct smp_csrk *csrk;
1894
1895 BT_DBG("conn %p", conn);
1896
1897 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001898 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001899
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001900 /* Mark the information as received */
1901 smp->remote_key_dist &= ~SMP_DIST_SIGN;
1902
1903 skb_pull(skb, sizeof(*rp));
1904
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001905 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1906 if (csrk) {
1907 csrk->master = 0x01;
1908 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
1909 }
1910 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03001911 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07001912
1913 return 0;
1914}
1915
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001916static u8 sc_select_method(struct smp_chan *smp)
1917{
1918 struct l2cap_conn *conn = smp->conn;
1919 struct hci_conn *hcon = conn->hcon;
1920 struct smp_cmd_pairing *local, *remote;
1921 u8 local_mitm, remote_mitm, local_io, remote_io, method;
1922
1923 /* The preq/prsp contain the raw Pairing Request/Response PDUs
1924 * which are needed as inputs to some crypto functions. To get
1925 * the "struct smp_cmd_pairing" from them we need to skip the
1926 * first byte which contains the opcode.
1927 */
1928 if (hcon->out) {
1929 local = (void *) &smp->preq[1];
1930 remote = (void *) &smp->prsp[1];
1931 } else {
1932 local = (void *) &smp->prsp[1];
1933 remote = (void *) &smp->preq[1];
1934 }
1935
1936 local_io = local->io_capability;
1937 remote_io = remote->io_capability;
1938
1939 local_mitm = (local->auth_req & SMP_AUTH_MITM);
1940 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
1941
1942 /* If either side wants MITM, look up the method from the table,
1943 * otherwise use JUST WORKS.
1944 */
1945 if (local_mitm || remote_mitm)
1946 method = get_auth_method(smp, local_io, remote_io);
1947 else
1948 method = JUST_WORKS;
1949
1950 /* Don't confirm locally initiated pairing attempts */
1951 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
1952 method = JUST_WORKS;
1953
1954 return method;
1955}
1956
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03001957static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
1958{
1959 struct smp_cmd_public_key *key = (void *) skb->data;
1960 struct hci_conn *hcon = conn->hcon;
1961 struct l2cap_chan *chan = conn->smp;
1962 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001963 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03001964 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03001965 int err;
1966
1967 BT_DBG("conn %p", conn);
1968
1969 if (skb->len < sizeof(*key))
1970 return SMP_INVALID_PARAMS;
1971
1972 memcpy(smp->remote_pk, key, 64);
1973
1974 /* Non-initiating device sends its public key after receiving
1975 * the key from the initiating device.
1976 */
1977 if (!hcon->out) {
1978 err = sc_send_public_key(smp);
1979 if (err)
1980 return err;
1981 }
1982
1983 BT_DBG("Remote Public Key X: %32phN", smp->remote_pk);
1984 BT_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
1985
1986 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
1987 return SMP_UNSPECIFIED;
1988
1989 BT_DBG("DHKey %32phN", smp->dhkey);
1990
1991 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
1992
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001993 smp->method = sc_select_method(smp);
1994
1995 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
1996
1997 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
1998 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
1999 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2000 else
2001 hcon->pending_sec_level = BT_SECURITY_FIPS;
2002
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002003 /* The Initiating device waits for the non-initiating device to
2004 * send the confirm value.
2005 */
2006 if (conn->hcon->out)
2007 return 0;
2008
2009 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2010 0, cfm.confirm_val);
2011 if (err)
2012 return SMP_UNSPECIFIED;
2013
2014 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2015 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2016
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002017 return 0;
2018}
2019
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002020static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2021{
2022 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2023 struct l2cap_chan *chan = conn->smp;
2024 struct hci_conn *hcon = conn->hcon;
2025 struct smp_chan *smp = chan->data;
2026 u8 a[7], b[7], *local_addr, *remote_addr;
2027 u8 io_cap[3], r[16], e[16];
2028 int err;
2029
2030 BT_DBG("conn %p", conn);
2031
2032 if (skb->len < sizeof(*check))
2033 return SMP_INVALID_PARAMS;
2034
2035 memcpy(a, &hcon->init_addr, 6);
2036 memcpy(b, &hcon->resp_addr, 6);
2037 a[6] = hcon->init_addr_type;
2038 b[6] = hcon->resp_addr_type;
2039
2040 if (hcon->out) {
2041 local_addr = a;
2042 remote_addr = b;
2043 memcpy(io_cap, &smp->prsp[1], 3);
2044 } else {
2045 local_addr = b;
2046 remote_addr = a;
2047 memcpy(io_cap, &smp->preq[1], 3);
2048 }
2049
2050 memset(r, 0, sizeof(r));
2051
2052 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2053 io_cap, remote_addr, local_addr, e);
2054 if (err)
2055 return SMP_UNSPECIFIED;
2056
2057 if (memcmp(check->e, e, 16))
2058 return SMP_DHKEY_CHECK_FAILED;
2059
2060 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
2061 SMP_LTK_P256, 0, smp->tk, smp->enc_key_size,
2062 0, 0);
2063
2064 if (hcon->out) {
2065 hci_le_start_enc(hcon, 0, 0, smp->tk);
2066 hcon->enc_key_size = smp->enc_key_size;
2067 }
2068
2069 return 0;
2070}
2071
Johan Hedberg4befb862014-08-11 22:06:38 +03002072static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002073{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002074 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002075 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002076 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002077 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002078 int err = 0;
2079
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002080 if (hcon->type != LE_LINK) {
2081 kfree_skb(skb);
Johan Hedberg34327112013-10-16 11:37:01 +03002082 return 0;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002083 }
2084
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002085 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002086 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002087
Marcel Holtmann06ae3312013-10-18 03:43:00 -07002088 if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002089 reason = SMP_PAIRING_NOTSUPP;
2090 goto done;
2091 }
2092
Marcel Holtmann92381f52013-10-03 01:23:08 -07002093 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002094 skb_pull(skb, sizeof(code));
2095
Johan Hedbergb28b4942014-09-05 22:19:55 +03002096 smp = chan->data;
2097
2098 if (code > SMP_CMD_MAX)
2099 goto drop;
2100
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002101 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002102 goto drop;
2103
2104 /* If we don't have a context the only allowed commands are
2105 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002106 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002107 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2108 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002109
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002110 switch (code) {
2111 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002112 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002113 break;
2114
2115 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002116 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002117 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002118 break;
2119
2120 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002121 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002122 break;
2123
2124 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002125 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002126 break;
2127
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002128 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002129 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002130 break;
2131
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002132 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002133 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002134 break;
2135
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002136 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002137 reason = smp_cmd_encrypt_info(conn, skb);
2138 break;
2139
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002140 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002141 reason = smp_cmd_master_ident(conn, skb);
2142 break;
2143
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002144 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002145 reason = smp_cmd_ident_info(conn, skb);
2146 break;
2147
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002148 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002149 reason = smp_cmd_ident_addr_info(conn, skb);
2150 break;
2151
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002152 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002153 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002154 break;
2155
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002156 case SMP_CMD_PUBLIC_KEY:
2157 reason = smp_cmd_public_key(conn, skb);
2158 break;
2159
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002160 case SMP_CMD_DHKEY_CHECK:
2161 reason = smp_cmd_dhkey_check(conn, skb);
2162 break;
2163
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002164 default:
2165 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002166 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002167 goto done;
2168 }
2169
2170done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002171 if (!err) {
2172 if (reason)
2173 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002174 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002175 }
2176
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002177 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002178
2179drop:
2180 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2181 code, &hcon->dst);
2182 kfree_skb(skb);
2183 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002184}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002185
Johan Hedberg70db83c2014-08-08 09:37:16 +03002186static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2187{
2188 struct l2cap_conn *conn = chan->conn;
2189
2190 BT_DBG("chan %p", chan);
2191
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002192 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002193 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002194
Johan Hedberg70db83c2014-08-08 09:37:16 +03002195 conn->smp = NULL;
2196 l2cap_chan_put(chan);
2197}
2198
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002199static void smp_resume_cb(struct l2cap_chan *chan)
2200{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002201 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002202 struct l2cap_conn *conn = chan->conn;
2203 struct hci_conn *hcon = conn->hcon;
2204
2205 BT_DBG("chan %p", chan);
2206
Johan Hedberg86d14072014-08-11 22:06:43 +03002207 if (!smp)
2208 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002209
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002210 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2211 return;
2212
Johan Hedberg86d14072014-08-11 22:06:43 +03002213 cancel_delayed_work(&smp->security_timer);
2214
Johan Hedbergd6268e82014-09-05 22:19:51 +03002215 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002216}
2217
Johan Hedberg70db83c2014-08-08 09:37:16 +03002218static void smp_ready_cb(struct l2cap_chan *chan)
2219{
2220 struct l2cap_conn *conn = chan->conn;
2221
2222 BT_DBG("chan %p", chan);
2223
2224 conn->smp = chan;
2225 l2cap_chan_hold(chan);
2226}
2227
Johan Hedberg4befb862014-08-11 22:06:38 +03002228static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2229{
2230 int err;
2231
2232 BT_DBG("chan %p", chan);
2233
2234 err = smp_sig_channel(chan, skb);
2235 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002236 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002237
Johan Hedbergb68fda62014-08-11 22:06:40 +03002238 if (smp)
2239 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002240
Johan Hedberg1e91c292014-08-18 20:33:29 +03002241 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002242 }
2243
2244 return err;
2245}
2246
Johan Hedberg70db83c2014-08-08 09:37:16 +03002247static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2248 unsigned long hdr_len,
2249 unsigned long len, int nb)
2250{
2251 struct sk_buff *skb;
2252
2253 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2254 if (!skb)
2255 return ERR_PTR(-ENOMEM);
2256
2257 skb->priority = HCI_PRIO_MAX;
2258 bt_cb(skb)->chan = chan;
2259
2260 return skb;
2261}
2262
2263static const struct l2cap_ops smp_chan_ops = {
2264 .name = "Security Manager",
2265 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002266 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002267 .alloc_skb = smp_alloc_skb_cb,
2268 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002269 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002270
2271 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002272 .state_change = l2cap_chan_no_state_change,
2273 .close = l2cap_chan_no_close,
2274 .defer = l2cap_chan_no_defer,
2275 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002276 .set_shutdown = l2cap_chan_no_set_shutdown,
2277 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2278 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2279};
2280
2281static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2282{
2283 struct l2cap_chan *chan;
2284
2285 BT_DBG("pchan %p", pchan);
2286
2287 chan = l2cap_chan_create();
2288 if (!chan)
2289 return NULL;
2290
2291 chan->chan_type = pchan->chan_type;
2292 chan->ops = &smp_chan_ops;
2293 chan->scid = pchan->scid;
2294 chan->dcid = chan->scid;
2295 chan->imtu = pchan->imtu;
2296 chan->omtu = pchan->omtu;
2297 chan->mode = pchan->mode;
2298
Johan Hedbergabe84902014-11-12 22:22:21 +02002299 /* Other L2CAP channels may request SMP routines in order to
2300 * change the security level. This means that the SMP channel
2301 * lock must be considered in its own category to avoid lockdep
2302 * warnings.
2303 */
2304 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
2305
Johan Hedberg70db83c2014-08-08 09:37:16 +03002306 BT_DBG("created chan %p", chan);
2307
2308 return chan;
2309}
2310
2311static const struct l2cap_ops smp_root_chan_ops = {
2312 .name = "Security Manager Root",
2313 .new_connection = smp_new_conn_cb,
2314
2315 /* None of these are implemented for the root channel */
2316 .close = l2cap_chan_no_close,
2317 .alloc_skb = l2cap_chan_no_alloc_skb,
2318 .recv = l2cap_chan_no_recv,
2319 .state_change = l2cap_chan_no_state_change,
2320 .teardown = l2cap_chan_no_teardown,
2321 .ready = l2cap_chan_no_ready,
2322 .defer = l2cap_chan_no_defer,
2323 .suspend = l2cap_chan_no_suspend,
2324 .resume = l2cap_chan_no_resume,
2325 .set_shutdown = l2cap_chan_no_set_shutdown,
2326 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
2327 .memcpy_fromiovec = l2cap_chan_no_memcpy_fromiovec,
2328};
2329
Johan Hedberg711eafe2014-08-08 09:32:52 +03002330int smp_register(struct hci_dev *hdev)
2331{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002332 struct l2cap_chan *chan;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002333 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002334
Johan Hedberg711eafe2014-08-08 09:32:52 +03002335 BT_DBG("%s", hdev->name);
2336
Johan Hedbergadae20c2014-11-13 14:37:48 +02002337 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, 0);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002338 if (IS_ERR(tfm_aes)) {
2339 int err = PTR_ERR(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002340 BT_ERR("Unable to create crypto context");
Johan Hedberg711eafe2014-08-08 09:32:52 +03002341 return err;
2342 }
2343
Johan Hedberg70db83c2014-08-08 09:37:16 +03002344 chan = l2cap_chan_create();
2345 if (!chan) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002346 crypto_free_blkcipher(tfm_aes);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002347 return -ENOMEM;
2348 }
2349
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002350 chan->data = tfm_aes;
2351
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002352 l2cap_add_scid(chan, L2CAP_CID_SMP);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002353
2354 l2cap_chan_set_defaults(chan);
2355
2356 bacpy(&chan->src, &hdev->bdaddr);
2357 chan->src_type = BDADDR_LE_PUBLIC;
2358 chan->state = BT_LISTEN;
2359 chan->mode = L2CAP_MODE_BASIC;
2360 chan->imtu = L2CAP_DEFAULT_MTU;
2361 chan->ops = &smp_root_chan_ops;
2362
Johan Hedbergabe84902014-11-12 22:22:21 +02002363 /* Set correct nesting level for a parent/listening channel */
2364 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
2365
Johan Hedberg70db83c2014-08-08 09:37:16 +03002366 hdev->smp_data = chan;
2367
Johan Hedberg711eafe2014-08-08 09:32:52 +03002368 return 0;
2369}
2370
2371void smp_unregister(struct hci_dev *hdev)
2372{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002373 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002374 struct crypto_blkcipher *tfm_aes;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002375
2376 if (!chan)
2377 return;
2378
2379 BT_DBG("%s chan %p", hdev->name, chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002380
Johan Hedbergdefce9e2014-08-08 09:37:17 +03002381 tfm_aes = chan->data;
2382 if (tfm_aes) {
2383 chan->data = NULL;
2384 crypto_free_blkcipher(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002385 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03002386
2387 hdev->smp_data = NULL;
2388 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03002389}