blob: 1669e7127e2ee6eec3bf1ad872a3d38fad69b23c [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
Marcel Holtmann300acfde2014-12-31 14:43:16 -080023#include <linux/debugfs.h>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030024#include <linux/crypto.h>
25#include <linux/scatterlist.h>
26#include <crypto/b128ops.h>
27
Anderson Brigliaeb492e02011-06-09 18:50:40 -030028#include <net/bluetooth/bluetooth.h>
29#include <net/bluetooth/hci_core.h>
30#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080031#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070032
Johan Hedberg3b191462014-06-06 10:50:15 +030033#include "ecc.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070034#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030035
Johan Hedbergc7a3d572014-12-01 22:03:16 +020036/* Low-level debug macros to be used for stuff that we don't want
37 * accidentially in dmesg, i.e. the values of the various crypto keys
38 * and the inputs & outputs of crypto functions.
39 */
40#ifdef DEBUG
41#define SMP_DBG(fmt, ...) printk(KERN_DEBUG "%s: " fmt, __func__, \
42 ##__VA_ARGS__)
43#else
44#define SMP_DBG(fmt, ...) no_printk(KERN_DEBUG "%s: " fmt, __func__, \
45 ##__VA_ARGS__)
46#endif
47
Johan Hedbergb28b4942014-09-05 22:19:55 +030048#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030049
Johan Hedberg3b191462014-06-06 10:50:15 +030050/* Keys which are not distributed with Secure Connections */
51#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
52
Marcel Holtmann17b02e62012-03-01 14:32:37 -080053#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030054
Marcel Holtmannd7a5a112015-03-13 02:11:00 -070055#define AUTH_REQ_MASK(dev) (hci_dev_test_flag(dev, HCI_SC_ENABLED) ? \
Johan Hedberg0edb14d2014-05-26 13:29:28 +030056 0x1f : 0x07)
57#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020058
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030059/* Maximum message length that can be passed to aes_cmac */
60#define CMAC_MSG_MAX 80
61
Johan Hedberg533e35d2014-06-16 19:25:18 +030062enum {
63 SMP_FLAG_TK_VALID,
64 SMP_FLAG_CFM_PENDING,
65 SMP_FLAG_MITM_AUTH,
66 SMP_FLAG_COMPLETE,
67 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030068 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030069 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030070 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030071 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030072 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg02b05bd2014-10-26 21:19:10 +010073 SMP_FLAG_OOB,
Johan Hedberg533e35d2014-06-16 19:25:18 +030074};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030075
Marcel Holtmann88a479d2015-03-16 01:10:19 -070076struct smp_dev {
Marcel Holtmann60a27d62015-03-16 01:10:22 -070077 /* Secure Connections OOB data */
78 u8 local_pk[64];
79 u8 local_sk[32];
80 u8 local_rr[16];
81 bool debug_key;
82
Marcel Holtmann88a479d2015-03-16 01:10:19 -070083 struct crypto_blkcipher *tfm_aes;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -070084 struct crypto_hash *tfm_cmac;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070085};
86
Johan Hedberg4bc58f52014-05-20 09:45:47 +030087struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030088 struct l2cap_conn *conn;
89 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030090 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030091
Johan Hedberg4bc58f52014-05-20 09:45:47 +030092 u8 preq[7]; /* SMP Pairing Request */
93 u8 prsp[7]; /* SMP Pairing Response */
94 u8 prnd[16]; /* SMP Pairing Random (local) */
95 u8 rrnd[16]; /* SMP Pairing Random (remote) */
96 u8 pcnf[16]; /* SMP Pairing Confirm */
97 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberga29b0732014-10-28 15:17:05 +010098 u8 rr[16];
Johan Hedberg4bc58f52014-05-20 09:45:47 +030099 u8 enc_key_size;
100 u8 remote_key_dist;
101 bdaddr_t id_addr;
102 u8 id_addr_type;
103 u8 irk[16];
104 struct smp_csrk *csrk;
105 struct smp_csrk *slave_csrk;
106 struct smp_ltk *ltk;
107 struct smp_ltk *slave_ltk;
108 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300109 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300110 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300111 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300112 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300113
Johan Hedberg3b191462014-06-06 10:50:15 +0300114 /* Secure Connections variables */
115 u8 local_pk[64];
116 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300117 u8 remote_pk[64];
118 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300119 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300120
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300121 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +0300122 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300123};
124
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300125/* These debug key values are defined in the SMP section of the core
126 * specification. debug_pk is the public debug key and debug_sk the
127 * private debug key.
128 */
129static const u8 debug_pk[64] = {
130 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
131 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
132 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
133 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
134
135 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
136 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
137 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
138 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
139};
140
141static const u8 debug_sk[32] = {
142 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
143 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
144 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
145 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
146};
147
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300148static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300149{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300150 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300151
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300152 for (i = 0; i < len; i++)
153 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300154}
155
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200156/* The following functions map to the LE SC SMP crypto functions
157 * AES-CMAC, f4, f5, f6, g2 and h6.
158 */
159
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300160static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
161 size_t len, u8 mac[16])
162{
163 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
164 struct hash_desc desc;
165 struct scatterlist sg;
166 int err;
167
168 if (len > CMAC_MSG_MAX)
169 return -EFBIG;
170
171 if (!tfm) {
172 BT_ERR("tfm %p", tfm);
173 return -EINVAL;
174 }
175
176 desc.tfm = tfm;
177 desc.flags = 0;
178
179 crypto_hash_init(&desc);
180
181 /* Swap key and message from LSB to MSB */
182 swap_buf(k, tmp, 16);
183 swap_buf(m, msg_msb, len);
184
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200185 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
186 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300187
188 err = crypto_hash_setkey(tfm, tmp, 16);
189 if (err) {
190 BT_ERR("cipher setkey failed: %d", err);
191 return err;
192 }
193
194 sg_init_one(&sg, msg_msb, len);
195
196 err = crypto_hash_update(&desc, &sg, len);
197 if (err) {
198 BT_ERR("Hash update error %d", err);
199 return err;
200 }
201
202 err = crypto_hash_final(&desc, mac_msb);
203 if (err) {
204 BT_ERR("Hash final error %d", err);
205 return err;
206 }
207
208 swap_buf(mac_msb, mac, 16);
209
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200210 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300211
212 return 0;
213}
214
215static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
216 const u8 x[16], u8 z, u8 res[16])
217{
218 u8 m[65];
219 int err;
220
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200221 SMP_DBG("u %32phN", u);
222 SMP_DBG("v %32phN", v);
223 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300224
225 m[0] = z;
226 memcpy(m + 1, v, 32);
227 memcpy(m + 33, u, 32);
228
229 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
230 if (err)
231 return err;
232
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200233 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300234
235 return err;
236}
237
Johan Hedberg4da50de2014-12-29 12:04:10 +0200238static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32],
239 const u8 n1[16], const u8 n2[16], const u8 a1[7],
240 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300241{
242 /* The btle, salt and length "magic" values are as defined in
243 * the SMP section of the Bluetooth core specification. In ASCII
244 * the btle value ends up being 'btle'. The salt is just a
245 * random number whereas length is the value 256 in little
246 * endian format.
247 */
248 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
249 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
250 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
251 const u8 length[2] = { 0x00, 0x01 };
252 u8 m[53], t[16];
253 int err;
254
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200255 SMP_DBG("w %32phN", w);
256 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
257 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300258
259 err = aes_cmac(tfm_cmac, salt, w, 32, t);
260 if (err)
261 return err;
262
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200263 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300264
265 memcpy(m, length, 2);
266 memcpy(m + 2, a2, 7);
267 memcpy(m + 9, a1, 7);
268 memcpy(m + 16, n2, 16);
269 memcpy(m + 32, n1, 16);
270 memcpy(m + 48, btle, 4);
271
272 m[52] = 0; /* Counter */
273
274 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
275 if (err)
276 return err;
277
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200278 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300279
280 m[52] = 1; /* Counter */
281
282 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
283 if (err)
284 return err;
285
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200286 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300287
288 return 0;
289}
290
291static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200292 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300293 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
294 u8 res[16])
295{
296 u8 m[65];
297 int err;
298
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200299 SMP_DBG("w %16phN", w);
300 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
301 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300302
303 memcpy(m, a2, 7);
304 memcpy(m + 7, a1, 7);
305 memcpy(m + 14, io_cap, 3);
306 memcpy(m + 17, r, 16);
307 memcpy(m + 33, n2, 16);
308 memcpy(m + 49, n1, 16);
309
310 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
311 if (err)
312 return err;
313
Marcel Holtmann203de212014-12-31 20:01:22 -0800314 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300315
316 return err;
317}
318
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300319static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
320 const u8 x[16], const u8 y[16], u32 *val)
321{
322 u8 m[80], tmp[16];
323 int err;
324
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200325 SMP_DBG("u %32phN", u);
326 SMP_DBG("v %32phN", v);
327 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300328
329 memcpy(m, y, 16);
330 memcpy(m + 16, v, 32);
331 memcpy(m + 48, u, 32);
332
333 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
334 if (err)
335 return err;
336
337 *val = get_unaligned_le32(tmp);
338 *val %= 1000000;
339
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200340 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300341
342 return 0;
343}
344
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200345static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
346 const u8 key_id[4], u8 res[16])
347{
348 int err;
349
350 SMP_DBG("w %16phN key_id %4phN", w, key_id);
351
352 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
353 if (err)
354 return err;
355
356 SMP_DBG("res %16phN", res);
357
358 return err;
359}
360
361/* The following functions map to the legacy SMP crypto functions e, c1,
362 * s1 and ah.
363 */
364
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300365static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
366{
367 struct blkcipher_desc desc;
368 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200369 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200370 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300371
Johan Hedberg7f376cd2014-12-03 16:07:13 +0200372 if (!tfm) {
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300373 BT_ERR("tfm %p", tfm);
374 return -EINVAL;
375 }
376
377 desc.tfm = tfm;
378 desc.flags = 0;
379
Johan Hedberg943a7322014-03-18 12:58:24 +0200380 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300381 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200382
383 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300384 if (err) {
385 BT_ERR("cipher setkey failed: %d", err);
386 return err;
387 }
388
Johan Hedberg943a7322014-03-18 12:58:24 +0200389 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300390 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200391
392 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300393
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300394 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
395 if (err)
396 BT_ERR("Encrypt data error %d", err);
397
Johan Hedberg943a7322014-03-18 12:58:24 +0200398 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300399 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200400
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300401 return err;
402}
403
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200404static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
405 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
406 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
407{
408 u8 p1[16], p2[16];
409 int err;
410
411 memset(p1, 0, 16);
412
413 /* p1 = pres || preq || _rat || _iat */
414 p1[0] = _iat;
415 p1[1] = _rat;
416 memcpy(p1 + 2, preq, 7);
417 memcpy(p1 + 9, pres, 7);
418
419 /* p2 = padding || ia || ra */
420 memcpy(p2, ra, 6);
421 memcpy(p2 + 6, ia, 6);
422 memset(p2 + 12, 0, 4);
423
424 /* res = r XOR p1 */
425 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
426
427 /* res = e(k, res) */
428 err = smp_e(tfm_aes, k, res);
429 if (err) {
430 BT_ERR("Encrypt data error");
431 return err;
432 }
433
434 /* res = res XOR p2 */
435 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
436
437 /* res = e(k, res) */
438 err = smp_e(tfm_aes, k, res);
439 if (err)
440 BT_ERR("Encrypt data error");
441
442 return err;
443}
444
445static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
446 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300447{
448 int err;
449
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200450 /* Just least significant octets from r1 and r2 are considered */
451 memcpy(_r, r2, 8);
452 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300453
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200454 err = smp_e(tfm_aes, k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300455 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200456 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300457
458 return err;
459}
460
Johan Hedbergcd082792014-12-02 13:37:41 +0200461static int smp_ah(struct crypto_blkcipher *tfm, const u8 irk[16],
462 const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200463{
Johan Hedberg943a7322014-03-18 12:58:24 +0200464 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200465 int err;
466
467 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200468 memcpy(_res, r, 3);
469 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200470
Johan Hedberg943a7322014-03-18 12:58:24 +0200471 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200472 if (err) {
473 BT_ERR("Encrypt error");
474 return err;
475 }
476
477 /* The output of the random address function ah is:
478 * ah(h, r) = e(k, r') mod 2^24
479 * The output of the security function e is then truncated to 24 bits
480 * by taking the least significant 24 bits of the output of e as the
481 * result of ah.
482 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200483 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200484
485 return 0;
486}
487
Johan Hedbergcd082792014-12-02 13:37:41 +0200488bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
489 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200490{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300491 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700492 struct smp_dev *smp;
Johan Hedberg60478052014-02-18 10:19:31 +0200493 u8 hash[3];
494 int err;
495
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300496 if (!chan || !chan->data)
497 return false;
498
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700499 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300500
Johan Hedberg60478052014-02-18 10:19:31 +0200501 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
502
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700503 err = smp_ah(smp->tfm_aes, irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200504 if (err)
505 return false;
506
507 return !memcmp(bdaddr->b, hash, 3);
508}
509
Johan Hedbergcd082792014-12-02 13:37:41 +0200510int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200511{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300512 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700513 struct smp_dev *smp;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200514 int err;
515
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300516 if (!chan || !chan->data)
517 return -EOPNOTSUPP;
518
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700519 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300520
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200521 get_random_bytes(&rpa->b[3], 3);
522
523 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
524 rpa->b[5] |= 0x40; /* Set second most significant bit */
525
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700526 err = smp_ah(smp->tfm_aes, irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200527 if (err < 0)
528 return err;
529
530 BT_DBG("RPA %pMR", rpa);
531
532 return 0;
533}
534
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700535int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
536{
537 struct l2cap_chan *chan = hdev->smp_data;
538 struct smp_dev *smp;
539 int err;
540
541 if (!chan || !chan->data)
542 return -EOPNOTSUPP;
543
544 smp = chan->data;
545
546 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
547 BT_DBG("Using debug keys");
548 memcpy(smp->local_pk, debug_pk, 64);
549 memcpy(smp->local_sk, debug_sk, 32);
550 smp->debug_key = true;
551 } else {
552 while (true) {
553 /* Generate local key pair for Secure Connections */
554 if (!ecc_make_key(smp->local_pk, smp->local_sk))
555 return -EIO;
556
557 /* This is unlikely, but we need to check that
558 * we didn't accidentially generate a debug key.
559 */
560 if (memcmp(smp->local_sk, debug_sk, 32))
561 break;
562 }
563 smp->debug_key = false;
564 }
565
566 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
567 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
568 SMP_DBG("OOB Private Key: %32phN", smp->local_sk);
569
570 get_random_bytes(smp->local_rr, 16);
571
572 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
573 smp->local_rr, 0, hash);
574 if (err < 0)
575 return err;
576
577 memcpy(rand, smp->local_rr, 16);
578
579 return 0;
580}
581
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300582static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
583{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300584 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300585 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300586 struct kvec iv[2];
587 struct msghdr msg;
588
589 if (!chan)
590 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300591
592 BT_DBG("code 0x%2.2x", code);
593
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300594 iv[0].iov_base = &code;
595 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300596
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300597 iv[1].iov_base = data;
598 iv[1].iov_len = len;
599
600 memset(&msg, 0, sizeof(msg));
601
Al Viro17836392014-11-24 17:07:38 -0500602 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300603
604 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300605
Johan Hedbergb68fda62014-08-11 22:06:40 +0300606 if (!chan->data)
607 return;
608
609 smp = chan->data;
610
611 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300612 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300613}
614
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300615static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800616{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300617 if (authreq & SMP_AUTH_MITM) {
618 if (authreq & SMP_AUTH_SC)
619 return BT_SECURITY_FIPS;
620 else
621 return BT_SECURITY_HIGH;
622 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800623 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300624 }
Brian Gix2b64d152011-12-21 16:12:12 -0800625}
626
627static __u8 seclevel_to_authreq(__u8 sec_level)
628{
629 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300630 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800631 case BT_SECURITY_HIGH:
632 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
633 case BT_SECURITY_MEDIUM:
634 return SMP_AUTH_BONDING;
635 default:
636 return SMP_AUTH_NONE;
637 }
638}
639
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300640static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700641 struct smp_cmd_pairing *req,
642 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300643{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300644 struct l2cap_chan *chan = conn->smp;
645 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200646 struct hci_conn *hcon = conn->hcon;
647 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100648 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300649
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700650 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700651 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
652 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300653 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800654 } else {
655 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300656 }
657
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700658 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200659 remote_dist |= SMP_DIST_ID_KEY;
660
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700661 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200662 local_dist |= SMP_DIST_ID_KEY;
663
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700664 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100665 (authreq & SMP_AUTH_SC)) {
666 struct oob_data *oob_data;
667 u8 bdaddr_type;
668
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700669 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300670 local_dist |= SMP_DIST_LINK_KEY;
671 remote_dist |= SMP_DIST_LINK_KEY;
672 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100673
674 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
675 bdaddr_type = BDADDR_LE_PUBLIC;
676 else
677 bdaddr_type = BDADDR_LE_RANDOM;
678
679 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
680 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800681 if (oob_data && oob_data->present) {
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100682 set_bit(SMP_FLAG_OOB, &smp->flags);
683 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100684 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100685 memcpy(smp->pcnf, oob_data->hash256, 16);
686 }
687
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300688 } else {
689 authreq &= ~SMP_AUTH_SC;
690 }
691
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300692 if (rsp == NULL) {
693 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100694 req->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300695 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200696 req->init_key_dist = local_dist;
697 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300698 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200699
700 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300701 return;
702 }
703
704 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100705 rsp->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300706 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200707 rsp->init_key_dist = req->init_key_dist & remote_dist;
708 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300709 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200710
711 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300712}
713
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300714static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
715{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300716 struct l2cap_chan *chan = conn->smp;
717 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300718
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300719 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700720 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300721 return SMP_ENC_KEY_SIZE;
722
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300723 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300724
725 return 0;
726}
727
Johan Hedberg6f48e262014-08-11 22:06:44 +0300728static void smp_chan_destroy(struct l2cap_conn *conn)
729{
730 struct l2cap_chan *chan = conn->smp;
731 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200732 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300733 bool complete;
734
735 BUG_ON(!smp);
736
737 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300738
Johan Hedberg6f48e262014-08-11 22:06:44 +0300739 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200740 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300741
Marcel Holtmann276812e2015-03-16 01:10:18 -0700742 kzfree(smp->csrk);
743 kzfree(smp->slave_csrk);
744 kzfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300745
746 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300747 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300748
Johan Hedberg923e2412014-12-03 12:43:39 +0200749 /* Ensure that we don't leave any debug key around if debug key
750 * support hasn't been explicitly enabled.
751 */
752 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700753 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200754 list_del_rcu(&smp->ltk->list);
755 kfree_rcu(smp->ltk, rcu);
756 smp->ltk = NULL;
757 }
758
Johan Hedberg6f48e262014-08-11 22:06:44 +0300759 /* If pairing failed clean up any keys we might have */
760 if (!complete) {
761 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200762 list_del_rcu(&smp->ltk->list);
763 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300764 }
765
766 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200767 list_del_rcu(&smp->slave_ltk->list);
768 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300769 }
770
771 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200772 list_del_rcu(&smp->remote_irk->list);
773 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300774 }
775 }
776
777 chan->data = NULL;
Marcel Holtmann276812e2015-03-16 01:10:18 -0700778 kzfree(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200779 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300780}
781
Johan Hedberg84794e12013-11-06 11:24:57 +0200782static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800783{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200784 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300785 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200786
Johan Hedberg84794e12013-11-06 11:24:57 +0200787 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800788 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700789 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800790
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700791 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700792 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300793
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300794 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300795 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800796}
797
Brian Gix2b64d152011-12-21 16:12:12 -0800798#define JUST_WORKS 0x00
799#define JUST_CFM 0x01
800#define REQ_PASSKEY 0x02
801#define CFM_PASSKEY 0x03
802#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300803#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800804#define OVERLAP 0xFF
805
806static const u8 gen_method[5][5] = {
807 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
808 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
809 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
810 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
811 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
812};
813
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300814static const u8 sc_method[5][5] = {
815 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
816 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
817 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
818 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
819 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
820};
821
Johan Hedberg581370c2014-06-17 13:07:38 +0300822static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
823{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300824 /* If either side has unknown io_caps, use JUST_CFM (which gets
825 * converted later to JUST_WORKS if we're initiators.
826 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300827 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
828 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300829 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300830
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300831 if (test_bit(SMP_FLAG_SC, &smp->flags))
832 return sc_method[remote_io][local_io];
833
Johan Hedberg581370c2014-06-17 13:07:38 +0300834 return gen_method[remote_io][local_io];
835}
836
Brian Gix2b64d152011-12-21 16:12:12 -0800837static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
838 u8 local_io, u8 remote_io)
839{
840 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300841 struct l2cap_chan *chan = conn->smp;
842 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800843 u32 passkey = 0;
844 int ret = 0;
845
846 /* Initialize key for JUST WORKS */
847 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300848 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800849
850 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
851
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300852 /* If neither side wants MITM, either "just" confirm an incoming
853 * request or use just-works for outgoing ones. The JUST_CFM
854 * will be converted to JUST_WORKS if necessary later in this
855 * function. If either side has MITM look up the method from the
856 * table.
857 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300858 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300859 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800860 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300861 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800862
Johan Hedberga82505c2014-03-24 14:39:07 +0200863 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300864 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
865 &smp->flags))
866 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200867
Johan Hedberg02f3e252014-07-16 15:09:13 +0300868 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300869 if (smp->method == JUST_CFM &&
870 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
871 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300872
Brian Gix2b64d152011-12-21 16:12:12 -0800873 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300874 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300875 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800876 return 0;
877 }
878
879 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300880 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300881 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300882 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
883 hcon->pending_sec_level = BT_SECURITY_HIGH;
884 }
Brian Gix2b64d152011-12-21 16:12:12 -0800885
886 /* If both devices have Keyoard-Display I/O, the master
887 * Confirms and the slave Enters the passkey.
888 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300889 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300890 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300891 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800892 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300893 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800894 }
895
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200896 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300897 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200898 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800899 get_random_bytes(&passkey, sizeof(passkey));
900 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200901 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800902 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300903 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800904 }
905
Johan Hedberg783e0572014-05-31 18:48:26 +0300906 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700907 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200908 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300909 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200910 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
911 hcon->type, hcon->dst_type,
912 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800913 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200914 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200915 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200916 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800917
Brian Gix2b64d152011-12-21 16:12:12 -0800918 return ret;
919}
920
Johan Hedberg1cc61142014-05-20 09:45:52 +0300921static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300922{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300923 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300924 struct smp_cmd_pairing_confirm cp;
925 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300926
927 BT_DBG("conn %p", conn);
928
Johan Hedberge491eaf2014-10-25 21:15:37 +0200929 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200930 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200931 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
932 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300933 if (ret)
934 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300935
Johan Hedberg4a74d652014-05-20 09:45:50 +0300936 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800937
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300938 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
939
Johan Hedbergb28b4942014-09-05 22:19:55 +0300940 if (conn->hcon->out)
941 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
942 else
943 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
944
Johan Hedberg1cc61142014-05-20 09:45:52 +0300945 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300946}
947
Johan Hedberg861580a2014-05-20 09:45:51 +0300948static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300949{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300950 struct l2cap_conn *conn = smp->conn;
951 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300952 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300953 int ret;
954
Johan Hedbergec70f362014-06-27 14:23:04 +0300955 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300956 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300957
958 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
959
Johan Hedberge491eaf2014-10-25 21:15:37 +0200960 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200961 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200962 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300963 if (ret)
964 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300965
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300966 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
967 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300968 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300969 }
970
971 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800972 u8 stk[16];
973 __le64 rand = 0;
974 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300975
Johan Hedberge491eaf2014-10-25 21:15:37 +0200976 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300977
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300978 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300979 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300980
Johan Hedberg861580a2014-05-20 09:45:51 +0300981 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
982 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300983
984 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300985 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300986 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300987 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300988 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800989 __le64 rand = 0;
990 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300991
Johan Hedberg943a7322014-03-18 12:58:24 +0200992 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
993 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300994
Johan Hedberge491eaf2014-10-25 21:15:37 +0200995 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300996
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300997 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700998 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300999
Johan Hedbergfff34902014-06-10 15:19:50 +03001000 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1001 auth = 1;
1002 else
1003 auth = 0;
1004
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001005 /* Even though there's no _SLAVE suffix this is the
1006 * slave STK we're adding for later lookup (the master
1007 * STK never needs to be stored).
1008 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001009 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001010 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001011 }
1012
Johan Hedberg861580a2014-05-20 09:45:51 +03001013 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001014}
1015
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001016static void smp_notify_keys(struct l2cap_conn *conn)
1017{
1018 struct l2cap_chan *chan = conn->smp;
1019 struct smp_chan *smp = chan->data;
1020 struct hci_conn *hcon = conn->hcon;
1021 struct hci_dev *hdev = hcon->hdev;
1022 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1023 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1024 bool persistent;
1025
1026 if (smp->remote_irk) {
1027 mgmt_new_irk(hdev, smp->remote_irk);
1028 /* Now that user space can be considered to know the
1029 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001030 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001031 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001032 if (hcon->type == LE_LINK) {
1033 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1034 hcon->dst_type = smp->remote_irk->addr_type;
1035 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1036 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001037
1038 /* When receiving an indentity resolving key for
1039 * a remote device that does not use a resolvable
1040 * private address, just remove the key so that
1041 * it is possible to use the controller white
1042 * list for scanning.
1043 *
1044 * Userspace will have been told to not store
1045 * this key at this point. So it is safe to
1046 * just remove it.
1047 */
1048 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +02001049 list_del_rcu(&smp->remote_irk->list);
1050 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001051 smp->remote_irk = NULL;
1052 }
1053 }
1054
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001055 if (hcon->type == ACL_LINK) {
1056 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1057 persistent = false;
1058 else
1059 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1060 &hcon->flags);
1061 } else {
1062 /* The LTKs and CSRKs should be persistent only if both sides
1063 * had the bonding bit set in their authentication requests.
1064 */
1065 persistent = !!((req->auth_req & rsp->auth_req) &
1066 SMP_AUTH_BONDING);
1067 }
1068
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001069
1070 if (smp->csrk) {
1071 smp->csrk->bdaddr_type = hcon->dst_type;
1072 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1073 mgmt_new_csrk(hdev, smp->csrk, persistent);
1074 }
1075
1076 if (smp->slave_csrk) {
1077 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1078 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1079 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1080 }
1081
1082 if (smp->ltk) {
1083 smp->ltk->bdaddr_type = hcon->dst_type;
1084 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1085 mgmt_new_ltk(hdev, smp->ltk, persistent);
1086 }
1087
1088 if (smp->slave_ltk) {
1089 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1090 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1091 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1092 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001093
1094 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001095 struct link_key *key;
1096 u8 type;
1097
1098 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1099 type = HCI_LK_DEBUG_COMBINATION;
1100 else if (hcon->sec_level == BT_SECURITY_FIPS)
1101 type = HCI_LK_AUTH_COMBINATION_P256;
1102 else
1103 type = HCI_LK_UNAUTH_COMBINATION_P256;
1104
1105 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1106 smp->link_key, type, 0, &persistent);
1107 if (key) {
1108 mgmt_new_link_key(hdev, key, persistent);
1109
1110 /* Don't keep debug keys around if the relevant
1111 * flag is not set.
1112 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001113 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001114 key->type == HCI_LK_DEBUG_COMBINATION) {
1115 list_del_rcu(&key->list);
1116 kfree_rcu(key, rcu);
1117 }
1118 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001119 }
1120}
1121
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001122static void sc_add_ltk(struct smp_chan *smp)
1123{
1124 struct hci_conn *hcon = smp->conn->hcon;
1125 u8 key_type, auth;
1126
1127 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1128 key_type = SMP_LTK_P256_DEBUG;
1129 else
1130 key_type = SMP_LTK_P256;
1131
1132 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1133 auth = 1;
1134 else
1135 auth = 0;
1136
1137 memset(smp->tk + smp->enc_key_size, 0,
1138 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
1139
1140 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1141 key_type, auth, smp->tk, smp->enc_key_size,
1142 0, 0);
1143}
1144
Johan Hedberg6a770832014-06-06 11:54:04 +03001145static void sc_generate_link_key(struct smp_chan *smp)
1146{
1147 /* These constants are as specified in the core specification.
1148 * In ASCII they spell out to 'tmp1' and 'lebr'.
1149 */
1150 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1151 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1152
1153 smp->link_key = kzalloc(16, GFP_KERNEL);
1154 if (!smp->link_key)
1155 return;
1156
1157 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001158 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001159 smp->link_key = NULL;
1160 return;
1161 }
1162
1163 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001164 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001165 smp->link_key = NULL;
1166 return;
1167 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001168}
1169
Johan Hedbergb28b4942014-09-05 22:19:55 +03001170static void smp_allow_key_dist(struct smp_chan *smp)
1171{
1172 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1173 * will be allowed in each PDU handler to ensure we receive
1174 * them in the correct order.
1175 */
1176 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1177 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1178 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1179 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1180 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1181 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1182}
1183
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001184static void sc_generate_ltk(struct smp_chan *smp)
1185{
1186 /* These constants are as specified in the core specification.
1187 * In ASCII they spell out to 'tmp2' and 'brle'.
1188 */
1189 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1190 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1191 struct hci_conn *hcon = smp->conn->hcon;
1192 struct hci_dev *hdev = hcon->hdev;
1193 struct link_key *key;
1194
1195 key = hci_find_link_key(hdev, &hcon->dst);
1196 if (!key) {
1197 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1198 return;
1199 }
1200
1201 if (key->type == HCI_LK_DEBUG_COMBINATION)
1202 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1203
1204 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1205 return;
1206
1207 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1208 return;
1209
1210 sc_add_ltk(smp);
1211}
1212
Johan Hedbergd6268e82014-09-05 22:19:51 +03001213static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001214{
1215 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001216 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001217 struct hci_conn *hcon = conn->hcon;
1218 struct hci_dev *hdev = hcon->hdev;
1219 __u8 *keydist;
1220
1221 BT_DBG("conn %p", conn);
1222
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001223 rsp = (void *) &smp->prsp[1];
1224
1225 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001226 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1227 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001228 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001229 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001230
1231 req = (void *) &smp->preq[1];
1232
1233 if (hcon->out) {
1234 keydist = &rsp->init_key_dist;
1235 *keydist &= req->init_key_dist;
1236 } else {
1237 keydist = &rsp->resp_key_dist;
1238 *keydist &= req->resp_key_dist;
1239 }
1240
Johan Hedberg6a770832014-06-06 11:54:04 +03001241 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001242 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001243 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001244 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1245 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001246
1247 /* Clear the keys which are generated but not distributed */
1248 *keydist &= ~SMP_SC_NO_DIST;
1249 }
1250
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001251 BT_DBG("keydist 0x%x", *keydist);
1252
1253 if (*keydist & SMP_DIST_ENC_KEY) {
1254 struct smp_cmd_encrypt_info enc;
1255 struct smp_cmd_master_ident ident;
1256 struct smp_ltk *ltk;
1257 u8 authenticated;
1258 __le16 ediv;
1259 __le64 rand;
1260
1261 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1262 get_random_bytes(&ediv, sizeof(ediv));
1263 get_random_bytes(&rand, sizeof(rand));
1264
1265 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1266
1267 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1268 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1269 SMP_LTK_SLAVE, authenticated, enc.ltk,
1270 smp->enc_key_size, ediv, rand);
1271 smp->slave_ltk = ltk;
1272
1273 ident.ediv = ediv;
1274 ident.rand = rand;
1275
1276 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1277
1278 *keydist &= ~SMP_DIST_ENC_KEY;
1279 }
1280
1281 if (*keydist & SMP_DIST_ID_KEY) {
1282 struct smp_cmd_ident_addr_info addrinfo;
1283 struct smp_cmd_ident_info idinfo;
1284
1285 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1286
1287 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1288
1289 /* The hci_conn contains the local identity address
1290 * after the connection has been established.
1291 *
1292 * This is true even when the connection has been
1293 * established using a resolvable random address.
1294 */
1295 bacpy(&addrinfo.bdaddr, &hcon->src);
1296 addrinfo.addr_type = hcon->src_type;
1297
1298 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1299 &addrinfo);
1300
1301 *keydist &= ~SMP_DIST_ID_KEY;
1302 }
1303
1304 if (*keydist & SMP_DIST_SIGN) {
1305 struct smp_cmd_sign_info sign;
1306 struct smp_csrk *csrk;
1307
1308 /* Generate a new random key */
1309 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1310
1311 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1312 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001313 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1314 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1315 else
1316 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001317 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1318 }
1319 smp->slave_csrk = csrk;
1320
1321 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1322
1323 *keydist &= ~SMP_DIST_SIGN;
1324 }
1325
1326 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001327 if (smp->remote_key_dist & KEY_DIST_MASK) {
1328 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001329 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001330 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001331
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001332 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1333 smp_notify_keys(conn);
1334
1335 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001336}
1337
Johan Hedbergb68fda62014-08-11 22:06:40 +03001338static void smp_timeout(struct work_struct *work)
1339{
1340 struct smp_chan *smp = container_of(work, struct smp_chan,
1341 security_timer.work);
1342 struct l2cap_conn *conn = smp->conn;
1343
1344 BT_DBG("conn %p", conn);
1345
Johan Hedberg1e91c292014-08-18 20:33:29 +03001346 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001347}
1348
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001349static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1350{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001351 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001352 struct smp_chan *smp;
1353
Marcel Holtmannf1560462013-10-13 05:43:25 -07001354 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001355 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001356 return NULL;
1357
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001358 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1359 if (IS_ERR(smp->tfm_aes)) {
1360 BT_ERR("Unable to create ECB crypto context");
Marcel Holtmann276812e2015-03-16 01:10:18 -07001361 kzfree(smp);
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001362 return NULL;
1363 }
1364
Johan Hedberg407cecf2014-05-02 14:19:47 +03001365 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1366 if (IS_ERR(smp->tfm_cmac)) {
1367 BT_ERR("Unable to create CMAC crypto context");
1368 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann276812e2015-03-16 01:10:18 -07001369 kzfree(smp);
Johan Hedberg407cecf2014-05-02 14:19:47 +03001370 return NULL;
1371 }
1372
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001373 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001374 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001375
Johan Hedbergb28b4942014-09-05 22:19:55 +03001376 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1377
Johan Hedbergb68fda62014-08-11 22:06:40 +03001378 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1379
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001380 hci_conn_hold(conn->hcon);
1381
1382 return smp;
1383}
1384
Johan Hedberg760b0182014-06-06 11:44:05 +03001385static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1386{
1387 struct hci_conn *hcon = smp->conn->hcon;
1388 u8 *na, *nb, a[7], b[7];
1389
1390 if (hcon->out) {
1391 na = smp->prnd;
1392 nb = smp->rrnd;
1393 } else {
1394 na = smp->rrnd;
1395 nb = smp->prnd;
1396 }
1397
1398 memcpy(a, &hcon->init_addr, 6);
1399 memcpy(b, &hcon->resp_addr, 6);
1400 a[6] = hcon->init_addr_type;
1401 b[6] = hcon->resp_addr_type;
1402
1403 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1404}
1405
Johan Hedberg38606f12014-06-25 11:10:28 +03001406static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001407{
1408 struct hci_conn *hcon = smp->conn->hcon;
1409 struct smp_cmd_dhkey_check check;
1410 u8 a[7], b[7], *local_addr, *remote_addr;
1411 u8 io_cap[3], r[16];
1412
Johan Hedberg760b0182014-06-06 11:44:05 +03001413 memcpy(a, &hcon->init_addr, 6);
1414 memcpy(b, &hcon->resp_addr, 6);
1415 a[6] = hcon->init_addr_type;
1416 b[6] = hcon->resp_addr_type;
1417
1418 if (hcon->out) {
1419 local_addr = a;
1420 remote_addr = b;
1421 memcpy(io_cap, &smp->preq[1], 3);
1422 } else {
1423 local_addr = b;
1424 remote_addr = a;
1425 memcpy(io_cap, &smp->prsp[1], 3);
1426 }
1427
Johan Hedbergdddd3052014-06-01 15:38:09 +03001428 memset(r, 0, sizeof(r));
1429
1430 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001431 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001432
Johan Hedberga29b0732014-10-28 15:17:05 +01001433 if (smp->method == REQ_OOB)
1434 memcpy(r, smp->rr, 16);
1435
Johan Hedberg760b0182014-06-06 11:44:05 +03001436 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1437 local_addr, remote_addr, check.e);
1438
1439 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001440}
1441
Johan Hedberg38606f12014-06-25 11:10:28 +03001442static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1443{
1444 struct l2cap_conn *conn = smp->conn;
1445 struct hci_conn *hcon = conn->hcon;
1446 struct smp_cmd_pairing_confirm cfm;
1447 u8 r;
1448
1449 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1450 r |= 0x80;
1451
1452 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1453
1454 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1455 cfm.confirm_val))
1456 return SMP_UNSPECIFIED;
1457
1458 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1459
1460 return 0;
1461}
1462
1463static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1464{
1465 struct l2cap_conn *conn = smp->conn;
1466 struct hci_conn *hcon = conn->hcon;
1467 struct hci_dev *hdev = hcon->hdev;
1468 u8 cfm[16], r;
1469
1470 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1471 if (smp->passkey_round >= 20)
1472 return 0;
1473
1474 switch (smp_op) {
1475 case SMP_CMD_PAIRING_RANDOM:
1476 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1477 r |= 0x80;
1478
1479 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1480 smp->rrnd, r, cfm))
1481 return SMP_UNSPECIFIED;
1482
1483 if (memcmp(smp->pcnf, cfm, 16))
1484 return SMP_CONFIRM_FAILED;
1485
1486 smp->passkey_round++;
1487
1488 if (smp->passkey_round == 20) {
1489 /* Generate MacKey and LTK */
1490 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1491 return SMP_UNSPECIFIED;
1492 }
1493
1494 /* The round is only complete when the initiator
1495 * receives pairing random.
1496 */
1497 if (!hcon->out) {
1498 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1499 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001500 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001501 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001502 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001503 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001504 return 0;
1505 }
1506
1507 /* Start the next round */
1508 if (smp->passkey_round != 20)
1509 return sc_passkey_round(smp, 0);
1510
1511 /* Passkey rounds are complete - start DHKey Check */
1512 sc_dhkey_check(smp);
1513 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1514
1515 break;
1516
1517 case SMP_CMD_PAIRING_CONFIRM:
1518 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1519 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1520 return 0;
1521 }
1522
1523 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1524
1525 if (hcon->out) {
1526 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1527 sizeof(smp->prnd), smp->prnd);
1528 return 0;
1529 }
1530
1531 return sc_passkey_send_confirm(smp);
1532
1533 case SMP_CMD_PUBLIC_KEY:
1534 default:
1535 /* Initiating device starts the round */
1536 if (!hcon->out)
1537 return 0;
1538
1539 BT_DBG("%s Starting passkey round %u", hdev->name,
1540 smp->passkey_round + 1);
1541
1542 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1543
1544 return sc_passkey_send_confirm(smp);
1545 }
1546
1547 return 0;
1548}
1549
Johan Hedbergdddd3052014-06-01 15:38:09 +03001550static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1551{
Johan Hedberg38606f12014-06-25 11:10:28 +03001552 struct l2cap_conn *conn = smp->conn;
1553 struct hci_conn *hcon = conn->hcon;
1554 u8 smp_op;
1555
1556 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1557
Johan Hedbergdddd3052014-06-01 15:38:09 +03001558 switch (mgmt_op) {
1559 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1560 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1561 return 0;
1562 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1563 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1564 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001565 case MGMT_OP_USER_PASSKEY_REPLY:
1566 hcon->passkey_notify = le32_to_cpu(passkey);
1567 smp->passkey_round = 0;
1568
1569 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1570 smp_op = SMP_CMD_PAIRING_CONFIRM;
1571 else
1572 smp_op = 0;
1573
1574 if (sc_passkey_round(smp, smp_op))
1575 return -EIO;
1576
1577 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001578 }
1579
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001580 /* Initiator sends DHKey check first */
1581 if (hcon->out) {
1582 sc_dhkey_check(smp);
1583 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1584 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1585 sc_dhkey_check(smp);
1586 sc_add_ltk(smp);
1587 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001588
1589 return 0;
1590}
1591
Brian Gix2b64d152011-12-21 16:12:12 -08001592int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1593{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001594 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001595 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001596 struct smp_chan *smp;
1597 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001598 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001599
1600 BT_DBG("");
1601
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001602 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001603 return -ENOTCONN;
1604
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001605 chan = conn->smp;
1606 if (!chan)
1607 return -ENOTCONN;
1608
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001609 l2cap_chan_lock(chan);
1610 if (!chan->data) {
1611 err = -ENOTCONN;
1612 goto unlock;
1613 }
1614
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001615 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001616
Johan Hedberg760b0182014-06-06 11:44:05 +03001617 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1618 err = sc_user_reply(smp, mgmt_op, passkey);
1619 goto unlock;
1620 }
1621
Brian Gix2b64d152011-12-21 16:12:12 -08001622 switch (mgmt_op) {
1623 case MGMT_OP_USER_PASSKEY_REPLY:
1624 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001625 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001626 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001627 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001628 /* Fall Through */
1629 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001630 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001631 break;
1632 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1633 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001634 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001635 err = 0;
1636 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001637 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001638 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001639 err = -EOPNOTSUPP;
1640 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001641 }
1642
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001643 err = 0;
1644
Brian Gix2b64d152011-12-21 16:12:12 -08001645 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001646 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1647 u8 rsp = smp_confirm(smp);
1648 if (rsp)
1649 smp_failure(conn, rsp);
1650 }
Brian Gix2b64d152011-12-21 16:12:12 -08001651
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001652unlock:
1653 l2cap_chan_unlock(chan);
1654 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001655}
1656
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001657static void build_bredr_pairing_cmd(struct smp_chan *smp,
1658 struct smp_cmd_pairing *req,
1659 struct smp_cmd_pairing *rsp)
1660{
1661 struct l2cap_conn *conn = smp->conn;
1662 struct hci_dev *hdev = conn->hcon->hdev;
1663 u8 local_dist = 0, remote_dist = 0;
1664
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001665 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001666 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1667 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1668 }
1669
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001670 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001671 remote_dist |= SMP_DIST_ID_KEY;
1672
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001673 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001674 local_dist |= SMP_DIST_ID_KEY;
1675
1676 if (!rsp) {
1677 memset(req, 0, sizeof(*req));
1678
1679 req->init_key_dist = local_dist;
1680 req->resp_key_dist = remote_dist;
1681 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1682
1683 smp->remote_key_dist = remote_dist;
1684
1685 return;
1686 }
1687
1688 memset(rsp, 0, sizeof(*rsp));
1689
1690 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1691 rsp->init_key_dist = req->init_key_dist & remote_dist;
1692 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1693
1694 smp->remote_key_dist = rsp->init_key_dist;
1695}
1696
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001697static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001698{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001699 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001700 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001701 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001702 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001703 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001704 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001705
1706 BT_DBG("conn %p", conn);
1707
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001708 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001709 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001710
Johan Hedberg40bef302014-07-16 11:42:27 +03001711 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001712 return SMP_CMD_NOTSUPP;
1713
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001714 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001715 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001716 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001717 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001718
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001719 if (!smp)
1720 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001721
Johan Hedbergc05b9332014-09-10 17:37:42 -07001722 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001723 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001724
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001725 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001726 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001727 return SMP_PAIRING_NOTSUPP;
1728
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001729 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001730 return SMP_AUTH_REQUIREMENTS;
1731
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001732 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1733 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001734 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001735
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001736 /* SMP over BR/EDR requires special treatment */
1737 if (conn->hcon->type == ACL_LINK) {
1738 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001739 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001740 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001741 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1742
1743 set_bit(SMP_FLAG_SC, &smp->flags);
1744
1745 build_bredr_pairing_cmd(smp, req, &rsp);
1746
1747 key_size = min(req->max_key_size, rsp.max_key_size);
1748 if (check_enc_key_size(conn, key_size))
1749 return SMP_ENC_KEY_SIZE;
1750
1751 /* Clear bits which are generated but not distributed */
1752 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1753
1754 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1755 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1756 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1757
1758 smp_distribute_keys(smp);
1759 return 0;
1760 }
1761
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001762 build_pairing_cmd(conn, req, &rsp, auth);
1763
1764 if (rsp.auth_req & SMP_AUTH_SC)
1765 set_bit(SMP_FLAG_SC, &smp->flags);
1766
Johan Hedberg5be5e272014-09-10 17:58:54 -07001767 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001768 sec_level = BT_SECURITY_MEDIUM;
1769 else
1770 sec_level = authreq_to_seclevel(auth);
1771
Johan Hedbergc7262e72014-06-17 13:07:37 +03001772 if (sec_level > conn->hcon->pending_sec_level)
1773 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001774
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001775 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001776 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1777 u8 method;
1778
1779 method = get_auth_method(smp, conn->hcon->io_capability,
1780 req->io_capability);
1781 if (method == JUST_WORKS || method == JUST_CFM)
1782 return SMP_AUTH_REQUIREMENTS;
1783 }
1784
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001785 key_size = min(req->max_key_size, rsp.max_key_size);
1786 if (check_enc_key_size(conn, key_size))
1787 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001788
Johan Hedberge84a6b12013-12-02 10:49:03 +02001789 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001790
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001791 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1792 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001793
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001794 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001795
1796 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1797
1798 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1799 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1800 /* Clear bits which are generated but not distributed */
1801 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1802 /* Wait for Public Key from Initiating Device */
1803 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001804 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001805
Marcel Holtmann983f9812015-03-11 17:47:40 -07001806 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1807
Brian Gix2b64d152011-12-21 16:12:12 -08001808 /* Request setup of TK */
1809 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1810 if (ret)
1811 return SMP_UNSPECIFIED;
1812
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001813 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001814}
1815
Johan Hedberg3b191462014-06-06 10:50:15 +03001816static u8 sc_send_public_key(struct smp_chan *smp)
1817{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001818 struct hci_dev *hdev = smp->conn->hcon->hdev;
1819
Johan Hedberg3b191462014-06-06 10:50:15 +03001820 BT_DBG("");
1821
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001822 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Johan Hedberg70157ef2014-06-24 15:22:59 +03001823 BT_DBG("Using debug keys");
1824 memcpy(smp->local_pk, debug_pk, 64);
1825 memcpy(smp->local_sk, debug_sk, 32);
1826 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1827 } else {
1828 while (true) {
1829 /* Generate local key pair for Secure Connections */
1830 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1831 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001832
Johan Hedberg70157ef2014-06-24 15:22:59 +03001833 /* This is unlikely, but we need to check that
1834 * we didn't accidentially generate a debug key.
1835 */
1836 if (memcmp(smp->local_sk, debug_sk, 32))
1837 break;
1838 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001839 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001840
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001841 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
1842 SMP_DBG("Local Public Key Y: %32phN", &smp->local_pk[32]);
1843 SMP_DBG("Local Private Key: %32phN", smp->local_sk);
Johan Hedberg3b191462014-06-06 10:50:15 +03001844
1845 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1846
1847 return 0;
1848}
1849
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001850static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001851{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001852 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001853 struct l2cap_chan *chan = conn->smp;
1854 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001855 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001856 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001857 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001858
1859 BT_DBG("conn %p", conn);
1860
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001861 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001862 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001863
Johan Hedberg40bef302014-07-16 11:42:27 +03001864 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001865 return SMP_CMD_NOTSUPP;
1866
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001867 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001868
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001869 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001870
1871 key_size = min(req->max_key_size, rsp->max_key_size);
1872 if (check_enc_key_size(conn, key_size))
1873 return SMP_ENC_KEY_SIZE;
1874
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001875 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001876
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001877 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001878 return SMP_AUTH_REQUIREMENTS;
1879
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001880 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1881 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1882
1883 /* Update remote key distribution in case the remote cleared
1884 * some bits that we had enabled in our request.
1885 */
1886 smp->remote_key_dist &= rsp->resp_key_dist;
1887
1888 /* For BR/EDR this means we're done and can start phase 3 */
1889 if (conn->hcon->type == ACL_LINK) {
1890 /* Clear bits which are generated but not distributed */
1891 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1892 smp_distribute_keys(smp);
1893 return 0;
1894 }
1895
Johan Hedberg65668772014-05-16 11:03:34 +03001896 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1897 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001898 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1899 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001900
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001901 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001902 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1903 u8 method;
1904
1905 method = get_auth_method(smp, req->io_capability,
1906 rsp->io_capability);
1907 if (method == JUST_WORKS || method == JUST_CFM)
1908 return SMP_AUTH_REQUIREMENTS;
1909 }
1910
Johan Hedberge84a6b12013-12-02 10:49:03 +02001911 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001912
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001913 /* Update remote key distribution in case the remote cleared
1914 * some bits that we had enabled in our request.
1915 */
1916 smp->remote_key_dist &= rsp->resp_key_dist;
1917
Johan Hedberg3b191462014-06-06 10:50:15 +03001918 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1919 /* Clear bits which are generated but not distributed */
1920 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1921 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1922 return sc_send_public_key(smp);
1923 }
1924
Johan Hedbergc05b9332014-09-10 17:37:42 -07001925 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001926
Johan Hedberg476585e2012-06-06 18:54:15 +08001927 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001928 if (ret)
1929 return SMP_UNSPECIFIED;
1930
Johan Hedberg4a74d652014-05-20 09:45:50 +03001931 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001932
1933 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001934 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001935 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001936
1937 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001938}
1939
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001940static u8 sc_check_confirm(struct smp_chan *smp)
1941{
1942 struct l2cap_conn *conn = smp->conn;
1943
1944 BT_DBG("");
1945
1946 /* Public Key exchange must happen before any other steps */
1947 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1948 return SMP_UNSPECIFIED;
1949
Johan Hedberg38606f12014-06-25 11:10:28 +03001950 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1951 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1952
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001953 if (conn->hcon->out) {
1954 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1955 smp->prnd);
1956 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1957 }
1958
1959 return 0;
1960}
1961
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001962static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001963{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001964 struct l2cap_chan *chan = conn->smp;
1965 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001966
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001967 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
1968
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001969 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001970 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001971
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001972 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
1973 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001974
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001975 if (test_bit(SMP_FLAG_SC, &smp->flags))
1976 return sc_check_confirm(smp);
1977
Johan Hedbergb28b4942014-09-05 22:19:55 +03001978 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02001979 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1980 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03001981 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1982 return 0;
1983 }
1984
1985 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001986 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07001987
1988 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001989
1990 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001991}
1992
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001993static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001994{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001995 struct l2cap_chan *chan = conn->smp;
1996 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03001997 struct hci_conn *hcon = conn->hcon;
1998 u8 *pkax, *pkbx, *na, *nb;
1999 u32 passkey;
2000 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002001
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002002 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002003
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002004 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002005 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002006
Johan Hedberg943a7322014-03-18 12:58:24 +02002007 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002008 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002009
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002010 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2011 return smp_random(smp);
2012
Johan Hedberg580039e2014-12-03 16:26:37 +02002013 if (hcon->out) {
2014 pkax = smp->local_pk;
2015 pkbx = smp->remote_pk;
2016 na = smp->prnd;
2017 nb = smp->rrnd;
2018 } else {
2019 pkax = smp->remote_pk;
2020 pkbx = smp->local_pk;
2021 na = smp->rrnd;
2022 nb = smp->prnd;
2023 }
2024
Johan Hedberga29b0732014-10-28 15:17:05 +01002025 if (smp->method == REQ_OOB) {
2026 if (!hcon->out)
2027 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2028 sizeof(smp->prnd), smp->prnd);
2029 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2030 goto mackey_and_ltk;
2031 }
2032
Johan Hedberg38606f12014-06-25 11:10:28 +03002033 /* Passkey entry has special treatment */
2034 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2035 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2036
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002037 if (hcon->out) {
2038 u8 cfm[16];
2039
2040 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2041 smp->rrnd, 0, cfm);
2042 if (err)
2043 return SMP_UNSPECIFIED;
2044
2045 if (memcmp(smp->pcnf, cfm, 16))
2046 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002047 } else {
2048 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2049 smp->prnd);
2050 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002051 }
2052
Johan Hedberga29b0732014-10-28 15:17:05 +01002053mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002054 /* Generate MacKey and LTK */
2055 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2056 if (err)
2057 return SMP_UNSPECIFIED;
2058
Johan Hedberga29b0732014-10-28 15:17:05 +01002059 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002060 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002061 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002062 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2063 }
2064 return 0;
2065 }
2066
Johan Hedberg38606f12014-06-25 11:10:28 +03002067 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002068 if (err)
2069 return SMP_UNSPECIFIED;
2070
Johan Hedberg38606f12014-06-25 11:10:28 +03002071 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
2072 hcon->dst_type, passkey, 0);
2073 if (err)
2074 return SMP_UNSPECIFIED;
2075
2076 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2077
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002078 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002079}
2080
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002081static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002082{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002083 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002084 struct hci_conn *hcon = conn->hcon;
2085
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002086 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002087 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002088 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002089
Johan Hedberga6f78332014-09-10 17:37:45 -07002090 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002091 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002092
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002093 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002094 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002095
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002096 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
2097 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002098
Johan Hedbergfe59a052014-07-01 19:14:12 +03002099 /* We never store STKs for master role, so clear this flag */
2100 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2101
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002102 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002103}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002104
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002105bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2106 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002107{
2108 if (sec_level == BT_SECURITY_LOW)
2109 return true;
2110
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002111 /* If we're encrypted with an STK but the caller prefers using
2112 * LTK claim insufficient security. This way we allow the
2113 * connection to be re-encrypted with an LTK, even if the LTK
2114 * provides the same level of security. Only exception is if we
2115 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002116 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002117 if (key_pref == SMP_USE_LTK &&
2118 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002119 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002120 return false;
2121
Johan Hedberg854f4722014-07-01 18:40:20 +03002122 if (hcon->sec_level >= sec_level)
2123 return true;
2124
2125 return false;
2126}
2127
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002128static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002129{
2130 struct smp_cmd_security_req *rp = (void *) skb->data;
2131 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002132 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002133 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002134 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002135 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002136
2137 BT_DBG("conn %p", conn);
2138
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002139 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002140 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002141
Johan Hedberg40bef302014-07-16 11:42:27 +03002142 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002143 return SMP_CMD_NOTSUPP;
2144
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002145 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002146
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002147 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002148 return SMP_AUTH_REQUIREMENTS;
2149
Johan Hedberg5be5e272014-09-10 17:58:54 -07002150 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002151 sec_level = BT_SECURITY_MEDIUM;
2152 else
2153 sec_level = authreq_to_seclevel(auth);
2154
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002155 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002156 return 0;
2157
Johan Hedbergc7262e72014-06-17 13:07:37 +03002158 if (sec_level > hcon->pending_sec_level)
2159 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002160
Johan Hedberg4dab7862012-06-07 14:58:37 +08002161 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002162 return 0;
2163
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002164 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002165 if (!smp)
2166 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002167
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002168 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002169 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55be42014-07-29 14:18:48 +03002170 return SMP_PAIRING_NOTSUPP;
2171
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002172 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002173
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002174 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002175 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002176
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002177 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2178 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002179
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002180 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002181 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002182
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002183 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002184}
2185
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002186int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002187{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002188 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002189 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002190 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002191 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002192 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002193
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002194 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2195
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002196 /* This may be NULL if there's an unexpected disconnection */
2197 if (!conn)
2198 return 1;
2199
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002200 chan = conn->smp;
2201
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002202 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002203 return 1;
2204
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002205 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002206 return 1;
2207
Johan Hedbergc7262e72014-06-17 13:07:37 +03002208 if (sec_level > hcon->pending_sec_level)
2209 hcon->pending_sec_level = sec_level;
2210
Johan Hedberg40bef302014-07-16 11:42:27 +03002211 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002212 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2213 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002214
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002215 l2cap_chan_lock(chan);
2216
2217 /* If SMP is already in progress ignore this request */
2218 if (chan->data) {
2219 ret = 0;
2220 goto unlock;
2221 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002222
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002223 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002224 if (!smp) {
2225 ret = 1;
2226 goto unlock;
2227 }
Brian Gix2b64d152011-12-21 16:12:12 -08002228
2229 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002230
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002231 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED))
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002232 authreq |= SMP_AUTH_SC;
2233
Johan Hedberg79897d22014-06-01 09:45:24 +03002234 /* Require MITM if IO Capability allows or the security level
2235 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002236 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002237 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002238 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002239 authreq |= SMP_AUTH_MITM;
2240
Johan Hedberg40bef302014-07-16 11:42:27 +03002241 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002242 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002243
Brian Gix2b64d152011-12-21 16:12:12 -08002244 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002245 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2246 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002247
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002248 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002249 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002250 } else {
2251 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002252 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002253 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002254 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002255 }
2256
Johan Hedberg4a74d652014-05-20 09:45:50 +03002257 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002258 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002259
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002260unlock:
2261 l2cap_chan_unlock(chan);
2262 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002263}
2264
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002265static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2266{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002267 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002268 struct l2cap_chan *chan = conn->smp;
2269 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002270
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002271 BT_DBG("conn %p", conn);
2272
2273 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002274 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002275
Johan Hedbergb28b4942014-09-05 22:19:55 +03002276 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002277
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002278 skb_pull(skb, sizeof(*rp));
2279
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002280 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002281
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002282 return 0;
2283}
2284
2285static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2286{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002287 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002288 struct l2cap_chan *chan = conn->smp;
2289 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002290 struct hci_dev *hdev = conn->hcon->hdev;
2291 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002292 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002293 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002294
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002295 BT_DBG("conn %p", conn);
2296
2297 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002298 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002299
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002300 /* Mark the information as received */
2301 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2302
Johan Hedbergb28b4942014-09-05 22:19:55 +03002303 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2304 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002305 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2306 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002307
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002308 skb_pull(skb, sizeof(*rp));
2309
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002310 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002311 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002312 authenticated, smp->tk, smp->enc_key_size,
2313 rp->ediv, rp->rand);
2314 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002315 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002316 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002317
2318 return 0;
2319}
2320
Johan Hedbergfd349c02014-02-18 10:19:36 +02002321static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2322{
2323 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002324 struct l2cap_chan *chan = conn->smp;
2325 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002326
2327 BT_DBG("");
2328
2329 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002330 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002331
Johan Hedbergb28b4942014-09-05 22:19:55 +03002332 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002333
Johan Hedbergfd349c02014-02-18 10:19:36 +02002334 skb_pull(skb, sizeof(*info));
2335
2336 memcpy(smp->irk, info->irk, 16);
2337
2338 return 0;
2339}
2340
2341static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2342 struct sk_buff *skb)
2343{
2344 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002345 struct l2cap_chan *chan = conn->smp;
2346 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002347 struct hci_conn *hcon = conn->hcon;
2348 bdaddr_t rpa;
2349
2350 BT_DBG("");
2351
2352 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002353 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002354
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002355 /* Mark the information as received */
2356 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2357
Johan Hedbergb28b4942014-09-05 22:19:55 +03002358 if (smp->remote_key_dist & SMP_DIST_SIGN)
2359 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2360
Johan Hedbergfd349c02014-02-18 10:19:36 +02002361 skb_pull(skb, sizeof(*info));
2362
Johan Hedberga9a58f82014-02-25 22:24:37 +02002363 /* Strictly speaking the Core Specification (4.1) allows sending
2364 * an empty address which would force us to rely on just the IRK
2365 * as "identity information". However, since such
2366 * implementations are not known of and in order to not over
2367 * complicate our implementation, simply pretend that we never
2368 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002369 *
2370 * The Identity Address must also be a Static Random or Public
2371 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002372 */
Johan Hedberge12af482015-01-14 20:51:37 +02002373 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2374 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Johan Hedberga9a58f82014-02-25 22:24:37 +02002375 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002376 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002377 }
2378
Johan Hedbergfd349c02014-02-18 10:19:36 +02002379 bacpy(&smp->id_addr, &info->bdaddr);
2380 smp->id_addr_type = info->addr_type;
2381
2382 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2383 bacpy(&rpa, &hcon->dst);
2384 else
2385 bacpy(&rpa, BDADDR_ANY);
2386
Johan Hedberg23d0e122014-02-19 14:57:46 +02002387 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2388 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002389
Johan Hedberg31dd6242014-06-27 14:23:02 +03002390distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002391 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2392 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002393
2394 return 0;
2395}
2396
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002397static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2398{
2399 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002400 struct l2cap_chan *chan = conn->smp;
2401 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002402 struct smp_csrk *csrk;
2403
2404 BT_DBG("conn %p", conn);
2405
2406 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002407 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002408
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002409 /* Mark the information as received */
2410 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2411
2412 skb_pull(skb, sizeof(*rp));
2413
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002414 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2415 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002416 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2417 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2418 else
2419 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002420 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2421 }
2422 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002423 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002424
2425 return 0;
2426}
2427
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002428static u8 sc_select_method(struct smp_chan *smp)
2429{
2430 struct l2cap_conn *conn = smp->conn;
2431 struct hci_conn *hcon = conn->hcon;
2432 struct smp_cmd_pairing *local, *remote;
2433 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2434
Johan Hedberga29b0732014-10-28 15:17:05 +01002435 if (test_bit(SMP_FLAG_OOB, &smp->flags))
2436 return REQ_OOB;
2437
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002438 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2439 * which are needed as inputs to some crypto functions. To get
2440 * the "struct smp_cmd_pairing" from them we need to skip the
2441 * first byte which contains the opcode.
2442 */
2443 if (hcon->out) {
2444 local = (void *) &smp->preq[1];
2445 remote = (void *) &smp->prsp[1];
2446 } else {
2447 local = (void *) &smp->prsp[1];
2448 remote = (void *) &smp->preq[1];
2449 }
2450
2451 local_io = local->io_capability;
2452 remote_io = remote->io_capability;
2453
2454 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2455 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2456
2457 /* If either side wants MITM, look up the method from the table,
2458 * otherwise use JUST WORKS.
2459 */
2460 if (local_mitm || remote_mitm)
2461 method = get_auth_method(smp, local_io, remote_io);
2462 else
2463 method = JUST_WORKS;
2464
2465 /* Don't confirm locally initiated pairing attempts */
2466 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2467 method = JUST_WORKS;
2468
2469 return method;
2470}
2471
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002472static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2473{
2474 struct smp_cmd_public_key *key = (void *) skb->data;
2475 struct hci_conn *hcon = conn->hcon;
2476 struct l2cap_chan *chan = conn->smp;
2477 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002478 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002479 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002480 int err;
2481
2482 BT_DBG("conn %p", conn);
2483
2484 if (skb->len < sizeof(*key))
2485 return SMP_INVALID_PARAMS;
2486
2487 memcpy(smp->remote_pk, key, 64);
2488
2489 /* Non-initiating device sends its public key after receiving
2490 * the key from the initiating device.
2491 */
2492 if (!hcon->out) {
2493 err = sc_send_public_key(smp);
2494 if (err)
2495 return err;
2496 }
2497
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002498 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
2499 SMP_DBG("Remote Public Key Y: %32phN", &smp->remote_pk[32]);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002500
2501 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2502 return SMP_UNSPECIFIED;
2503
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002504 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002505
2506 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2507
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002508 smp->method = sc_select_method(smp);
2509
2510 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2511
2512 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2513 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2514 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2515 else
2516 hcon->pending_sec_level = BT_SECURITY_FIPS;
2517
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002518 if (!memcmp(debug_pk, smp->remote_pk, 64))
2519 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2520
Johan Hedberg38606f12014-06-25 11:10:28 +03002521 if (smp->method == DSP_PASSKEY) {
2522 get_random_bytes(&hcon->passkey_notify,
2523 sizeof(hcon->passkey_notify));
2524 hcon->passkey_notify %= 1000000;
2525 hcon->passkey_entered = 0;
2526 smp->passkey_round = 0;
2527 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2528 hcon->dst_type,
2529 hcon->passkey_notify,
2530 hcon->passkey_entered))
2531 return SMP_UNSPECIFIED;
2532 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2533 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2534 }
2535
Johan Hedberga29b0732014-10-28 15:17:05 +01002536 if (smp->method == REQ_OOB) {
2537 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2538 smp->rr, 0, cfm.confirm_val);
2539 if (err)
2540 return SMP_UNSPECIFIED;
2541
2542 if (memcmp(cfm.confirm_val, smp->pcnf, 16))
2543 return SMP_CONFIRM_FAILED;
2544
2545 if (hcon->out)
2546 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2547 sizeof(smp->prnd), smp->prnd);
2548
2549 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2550
2551 return 0;
2552 }
2553
Johan Hedberg38606f12014-06-25 11:10:28 +03002554 if (hcon->out)
2555 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2556
2557 if (smp->method == REQ_PASSKEY) {
2558 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2559 hcon->dst_type))
2560 return SMP_UNSPECIFIED;
2561 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2562 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2563 return 0;
2564 }
2565
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002566 /* The Initiating device waits for the non-initiating device to
2567 * send the confirm value.
2568 */
2569 if (conn->hcon->out)
2570 return 0;
2571
2572 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2573 0, cfm.confirm_val);
2574 if (err)
2575 return SMP_UNSPECIFIED;
2576
2577 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2578 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2579
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002580 return 0;
2581}
2582
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002583static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2584{
2585 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2586 struct l2cap_chan *chan = conn->smp;
2587 struct hci_conn *hcon = conn->hcon;
2588 struct smp_chan *smp = chan->data;
2589 u8 a[7], b[7], *local_addr, *remote_addr;
2590 u8 io_cap[3], r[16], e[16];
2591 int err;
2592
2593 BT_DBG("conn %p", conn);
2594
2595 if (skb->len < sizeof(*check))
2596 return SMP_INVALID_PARAMS;
2597
2598 memcpy(a, &hcon->init_addr, 6);
2599 memcpy(b, &hcon->resp_addr, 6);
2600 a[6] = hcon->init_addr_type;
2601 b[6] = hcon->resp_addr_type;
2602
2603 if (hcon->out) {
2604 local_addr = a;
2605 remote_addr = b;
2606 memcpy(io_cap, &smp->prsp[1], 3);
2607 } else {
2608 local_addr = b;
2609 remote_addr = a;
2610 memcpy(io_cap, &smp->preq[1], 3);
2611 }
2612
2613 memset(r, 0, sizeof(r));
2614
Johan Hedberg38606f12014-06-25 11:10:28 +03002615 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2616 put_unaligned_le32(hcon->passkey_notify, r);
2617
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002618 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2619 io_cap, remote_addr, local_addr, e);
2620 if (err)
2621 return SMP_UNSPECIFIED;
2622
2623 if (memcmp(check->e, e, 16))
2624 return SMP_DHKEY_CHECK_FAILED;
2625
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002626 if (!hcon->out) {
2627 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2628 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2629 return 0;
2630 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002631
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002632 /* Slave sends DHKey check as response to master */
2633 sc_dhkey_check(smp);
2634 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002635
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002636 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002637
2638 if (hcon->out) {
2639 hci_le_start_enc(hcon, 0, 0, smp->tk);
2640 hcon->enc_key_size = smp->enc_key_size;
2641 }
2642
2643 return 0;
2644}
2645
Johan Hedberg1408bb62014-06-04 22:45:57 +03002646static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2647 struct sk_buff *skb)
2648{
2649 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2650
2651 BT_DBG("value 0x%02x", kp->value);
2652
2653 return 0;
2654}
2655
Johan Hedberg4befb862014-08-11 22:06:38 +03002656static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002657{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002658 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002659 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002660 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002661 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002662 int err = 0;
2663
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002664 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002665 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002666
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002667 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002668 reason = SMP_PAIRING_NOTSUPP;
2669 goto done;
2670 }
2671
Marcel Holtmann92381f52013-10-03 01:23:08 -07002672 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002673 skb_pull(skb, sizeof(code));
2674
Johan Hedbergb28b4942014-09-05 22:19:55 +03002675 smp = chan->data;
2676
2677 if (code > SMP_CMD_MAX)
2678 goto drop;
2679
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002680 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002681 goto drop;
2682
2683 /* If we don't have a context the only allowed commands are
2684 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002685 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002686 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2687 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002688
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002689 switch (code) {
2690 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002691 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002692 break;
2693
2694 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002695 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002696 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002697 break;
2698
2699 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002700 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002701 break;
2702
2703 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002704 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002705 break;
2706
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002707 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002708 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002709 break;
2710
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002711 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002712 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002713 break;
2714
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002715 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002716 reason = smp_cmd_encrypt_info(conn, skb);
2717 break;
2718
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002719 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002720 reason = smp_cmd_master_ident(conn, skb);
2721 break;
2722
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002723 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002724 reason = smp_cmd_ident_info(conn, skb);
2725 break;
2726
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002727 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002728 reason = smp_cmd_ident_addr_info(conn, skb);
2729 break;
2730
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002731 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002732 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002733 break;
2734
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002735 case SMP_CMD_PUBLIC_KEY:
2736 reason = smp_cmd_public_key(conn, skb);
2737 break;
2738
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002739 case SMP_CMD_DHKEY_CHECK:
2740 reason = smp_cmd_dhkey_check(conn, skb);
2741 break;
2742
Johan Hedberg1408bb62014-06-04 22:45:57 +03002743 case SMP_CMD_KEYPRESS_NOTIFY:
2744 reason = smp_cmd_keypress_notify(conn, skb);
2745 break;
2746
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002747 default:
2748 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002749 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002750 goto done;
2751 }
2752
2753done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002754 if (!err) {
2755 if (reason)
2756 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002757 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002758 }
2759
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002760 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002761
2762drop:
2763 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2764 code, &hcon->dst);
2765 kfree_skb(skb);
2766 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002767}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002768
Johan Hedberg70db83c2014-08-08 09:37:16 +03002769static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2770{
2771 struct l2cap_conn *conn = chan->conn;
2772
2773 BT_DBG("chan %p", chan);
2774
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002775 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002776 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002777
Johan Hedberg70db83c2014-08-08 09:37:16 +03002778 conn->smp = NULL;
2779 l2cap_chan_put(chan);
2780}
2781
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002782static void bredr_pairing(struct l2cap_chan *chan)
2783{
2784 struct l2cap_conn *conn = chan->conn;
2785 struct hci_conn *hcon = conn->hcon;
2786 struct hci_dev *hdev = hcon->hdev;
2787 struct smp_cmd_pairing req;
2788 struct smp_chan *smp;
2789
2790 BT_DBG("chan %p", chan);
2791
2792 /* Only new pairings are interesting */
2793 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2794 return;
2795
2796 /* Don't bother if we're not encrypted */
2797 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2798 return;
2799
2800 /* Only master may initiate SMP over BR/EDR */
2801 if (hcon->role != HCI_ROLE_MASTER)
2802 return;
2803
2804 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002805 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002806 return;
2807
2808 /* BR/EDR must use Secure Connections for SMP */
2809 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07002810 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002811 return;
2812
2813 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002814 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002815 return;
2816
2817 /* Don't bother if remote LE support is not enabled */
2818 if (!lmp_host_le_capable(hcon))
2819 return;
2820
2821 /* Remote must support SMP fixed chan for BR/EDR */
2822 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2823 return;
2824
2825 /* Don't bother if SMP is already ongoing */
2826 if (chan->data)
2827 return;
2828
2829 smp = smp_chan_create(conn);
2830 if (!smp) {
2831 BT_ERR("%s unable to create SMP context for BR/EDR",
2832 hdev->name);
2833 return;
2834 }
2835
2836 set_bit(SMP_FLAG_SC, &smp->flags);
2837
2838 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2839
2840 /* Prepare and send the BR/EDR SMP Pairing Request */
2841 build_bredr_pairing_cmd(smp, &req, NULL);
2842
2843 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2844 memcpy(&smp->preq[1], &req, sizeof(req));
2845
2846 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2847 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2848}
2849
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002850static void smp_resume_cb(struct l2cap_chan *chan)
2851{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002852 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002853 struct l2cap_conn *conn = chan->conn;
2854 struct hci_conn *hcon = conn->hcon;
2855
2856 BT_DBG("chan %p", chan);
2857
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002858 if (hcon->type == ACL_LINK) {
2859 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002860 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002861 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002862
Johan Hedberg86d14072014-08-11 22:06:43 +03002863 if (!smp)
2864 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002865
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002866 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2867 return;
2868
Johan Hedberg86d14072014-08-11 22:06:43 +03002869 cancel_delayed_work(&smp->security_timer);
2870
Johan Hedbergd6268e82014-09-05 22:19:51 +03002871 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002872}
2873
Johan Hedberg70db83c2014-08-08 09:37:16 +03002874static void smp_ready_cb(struct l2cap_chan *chan)
2875{
2876 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002877 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002878
2879 BT_DBG("chan %p", chan);
2880
2881 conn->smp = chan;
2882 l2cap_chan_hold(chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002883
2884 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2885 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002886}
2887
Johan Hedberg4befb862014-08-11 22:06:38 +03002888static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2889{
2890 int err;
2891
2892 BT_DBG("chan %p", chan);
2893
2894 err = smp_sig_channel(chan, skb);
2895 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002896 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002897
Johan Hedbergb68fda62014-08-11 22:06:40 +03002898 if (smp)
2899 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002900
Johan Hedberg1e91c292014-08-18 20:33:29 +03002901 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002902 }
2903
2904 return err;
2905}
2906
Johan Hedberg70db83c2014-08-08 09:37:16 +03002907static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2908 unsigned long hdr_len,
2909 unsigned long len, int nb)
2910{
2911 struct sk_buff *skb;
2912
2913 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2914 if (!skb)
2915 return ERR_PTR(-ENOMEM);
2916
2917 skb->priority = HCI_PRIO_MAX;
2918 bt_cb(skb)->chan = chan;
2919
2920 return skb;
2921}
2922
2923static const struct l2cap_ops smp_chan_ops = {
2924 .name = "Security Manager",
2925 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002926 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002927 .alloc_skb = smp_alloc_skb_cb,
2928 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002929 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002930
2931 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002932 .state_change = l2cap_chan_no_state_change,
2933 .close = l2cap_chan_no_close,
2934 .defer = l2cap_chan_no_defer,
2935 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002936 .set_shutdown = l2cap_chan_no_set_shutdown,
2937 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002938};
2939
2940static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2941{
2942 struct l2cap_chan *chan;
2943
2944 BT_DBG("pchan %p", pchan);
2945
2946 chan = l2cap_chan_create();
2947 if (!chan)
2948 return NULL;
2949
2950 chan->chan_type = pchan->chan_type;
2951 chan->ops = &smp_chan_ops;
2952 chan->scid = pchan->scid;
2953 chan->dcid = chan->scid;
2954 chan->imtu = pchan->imtu;
2955 chan->omtu = pchan->omtu;
2956 chan->mode = pchan->mode;
2957
Johan Hedbergabe84902014-11-12 22:22:21 +02002958 /* Other L2CAP channels may request SMP routines in order to
2959 * change the security level. This means that the SMP channel
2960 * lock must be considered in its own category to avoid lockdep
2961 * warnings.
2962 */
2963 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
2964
Johan Hedberg70db83c2014-08-08 09:37:16 +03002965 BT_DBG("created chan %p", chan);
2966
2967 return chan;
2968}
2969
2970static const struct l2cap_ops smp_root_chan_ops = {
2971 .name = "Security Manager Root",
2972 .new_connection = smp_new_conn_cb,
2973
2974 /* None of these are implemented for the root channel */
2975 .close = l2cap_chan_no_close,
2976 .alloc_skb = l2cap_chan_no_alloc_skb,
2977 .recv = l2cap_chan_no_recv,
2978 .state_change = l2cap_chan_no_state_change,
2979 .teardown = l2cap_chan_no_teardown,
2980 .ready = l2cap_chan_no_ready,
2981 .defer = l2cap_chan_no_defer,
2982 .suspend = l2cap_chan_no_suspend,
2983 .resume = l2cap_chan_no_resume,
2984 .set_shutdown = l2cap_chan_no_set_shutdown,
2985 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002986};
2987
Johan Hedbergef8efe42014-08-13 15:12:32 +03002988static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03002989{
Johan Hedberg70db83c2014-08-08 09:37:16 +03002990 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07002991 struct smp_dev *smp;
2992 struct crypto_blkcipher *tfm_aes;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07002993 struct crypto_hash *tfm_cmac;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002994
Johan Hedbergef8efe42014-08-13 15:12:32 +03002995 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07002996 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03002997 goto create_chan;
2998 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03002999
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003000 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3001 if (!smp)
3002 return ERR_PTR(-ENOMEM);
3003
3004 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003005 if (IS_ERR(tfm_aes)) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003006 BT_ERR("Unable to create ECB crypto context");
3007 kzfree(smp);
Fengguang Wufe700772014-12-08 03:04:38 +08003008 return ERR_CAST(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003009 }
3010
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003011 tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
3012 if (IS_ERR(tfm_cmac)) {
3013 BT_ERR("Unable to create CMAC crypto context");
3014 crypto_free_blkcipher(tfm_aes);
3015 kzfree(smp);
3016 return ERR_CAST(tfm_cmac);
3017 }
3018
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003019 smp->tfm_aes = tfm_aes;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003020 smp->tfm_cmac = tfm_cmac;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003021
Johan Hedbergef8efe42014-08-13 15:12:32 +03003022create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003023 chan = l2cap_chan_create();
3024 if (!chan) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003025 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003026 crypto_free_hash(smp->tfm_cmac);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003027 kzfree(smp);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003028 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003029 }
3030
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003031 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003032
Johan Hedbergef8efe42014-08-13 15:12:32 +03003033 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003034
3035 l2cap_chan_set_defaults(chan);
3036
Marcel Holtmann157029b2015-01-14 15:43:09 -08003037 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003038 u8 bdaddr_type;
3039
3040 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3041
3042 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003043 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003044 else
3045 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003046 } else {
3047 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003048 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003049 }
3050
Johan Hedberg70db83c2014-08-08 09:37:16 +03003051 chan->state = BT_LISTEN;
3052 chan->mode = L2CAP_MODE_BASIC;
3053 chan->imtu = L2CAP_DEFAULT_MTU;
3054 chan->ops = &smp_root_chan_ops;
3055
Johan Hedbergabe84902014-11-12 22:22:21 +02003056 /* Set correct nesting level for a parent/listening channel */
3057 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3058
Johan Hedbergef8efe42014-08-13 15:12:32 +03003059 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003060}
3061
Johan Hedbergef8efe42014-08-13 15:12:32 +03003062static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003063{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003064 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003065
Johan Hedbergef8efe42014-08-13 15:12:32 +03003066 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003067
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003068 smp = chan->data;
3069 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003070 chan->data = NULL;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003071 if (smp->tfm_aes)
3072 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003073 if (smp->tfm_cmac)
3074 crypto_free_hash(smp->tfm_cmac);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003075 kzfree(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003076 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003077
Johan Hedberg70db83c2014-08-08 09:37:16 +03003078 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003079}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003080
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003081static ssize_t force_bredr_smp_read(struct file *file,
3082 char __user *user_buf,
3083 size_t count, loff_t *ppos)
3084{
3085 struct hci_dev *hdev = file->private_data;
3086 char buf[3];
3087
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003088 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP) ? 'Y': 'N';
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003089 buf[1] = '\n';
3090 buf[2] = '\0';
3091 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3092}
3093
3094static ssize_t force_bredr_smp_write(struct file *file,
3095 const char __user *user_buf,
3096 size_t count, loff_t *ppos)
3097{
3098 struct hci_dev *hdev = file->private_data;
3099 char buf[32];
3100 size_t buf_size = min(count, (sizeof(buf)-1));
3101 bool enable;
3102
3103 if (copy_from_user(buf, user_buf, buf_size))
3104 return -EFAULT;
3105
3106 buf[buf_size] = '\0';
3107 if (strtobool(buf, &enable))
3108 return -EINVAL;
3109
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003110 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003111 return -EALREADY;
3112
3113 if (enable) {
3114 struct l2cap_chan *chan;
3115
3116 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3117 if (IS_ERR(chan))
3118 return PTR_ERR(chan);
3119
3120 hdev->smp_bredr_data = chan;
3121 } else {
3122 struct l2cap_chan *chan;
3123
3124 chan = hdev->smp_bredr_data;
3125 hdev->smp_bredr_data = NULL;
3126 smp_del_chan(chan);
3127 }
3128
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003129 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003130
3131 return count;
3132}
3133
3134static const struct file_operations force_bredr_smp_fops = {
3135 .open = simple_open,
3136 .read = force_bredr_smp_read,
3137 .write = force_bredr_smp_write,
3138 .llseek = default_llseek,
3139};
3140
Johan Hedbergef8efe42014-08-13 15:12:32 +03003141int smp_register(struct hci_dev *hdev)
3142{
3143 struct l2cap_chan *chan;
3144
3145 BT_DBG("%s", hdev->name);
3146
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003147 /* If the controller does not support Low Energy operation, then
3148 * there is also no need to register any SMP channel.
3149 */
3150 if (!lmp_le_capable(hdev))
3151 return 0;
3152
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003153 if (WARN_ON(hdev->smp_data)) {
3154 chan = hdev->smp_data;
3155 hdev->smp_data = NULL;
3156 smp_del_chan(chan);
3157 }
3158
Johan Hedbergef8efe42014-08-13 15:12:32 +03003159 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3160 if (IS_ERR(chan))
3161 return PTR_ERR(chan);
3162
3163 hdev->smp_data = chan;
3164
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003165 /* If the controller does not support BR/EDR Secure Connections
3166 * feature, then the BR/EDR SMP channel shall not be present.
3167 *
3168 * To test this with Bluetooth 4.0 controllers, create a debugfs
3169 * switch that allows forcing BR/EDR SMP support and accepting
3170 * cross-transport pairing on non-AES encrypted connections.
3171 */
3172 if (!lmp_sc_capable(hdev)) {
3173 debugfs_create_file("force_bredr_smp", 0644, hdev->debugfs,
3174 hdev, &force_bredr_smp_fops);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003175 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003176 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003177
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003178 if (WARN_ON(hdev->smp_bredr_data)) {
3179 chan = hdev->smp_bredr_data;
3180 hdev->smp_bredr_data = NULL;
3181 smp_del_chan(chan);
3182 }
3183
Johan Hedbergef8efe42014-08-13 15:12:32 +03003184 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3185 if (IS_ERR(chan)) {
3186 int err = PTR_ERR(chan);
3187 chan = hdev->smp_data;
3188 hdev->smp_data = NULL;
3189 smp_del_chan(chan);
3190 return err;
3191 }
3192
3193 hdev->smp_bredr_data = chan;
3194
3195 return 0;
3196}
3197
3198void smp_unregister(struct hci_dev *hdev)
3199{
3200 struct l2cap_chan *chan;
3201
3202 if (hdev->smp_bredr_data) {
3203 chan = hdev->smp_bredr_data;
3204 hdev->smp_bredr_data = NULL;
3205 smp_del_chan(chan);
3206 }
3207
3208 if (hdev->smp_data) {
3209 chan = hdev->smp_data;
3210 hdev->smp_data = NULL;
3211 smp_del_chan(chan);
3212 }
3213}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003214
3215#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3216
Johan Hedbergcfc41982014-12-30 09:50:40 +02003217static int __init test_ah(struct crypto_blkcipher *tfm_aes)
3218{
3219 const u8 irk[16] = {
3220 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3221 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3222 const u8 r[3] = { 0x94, 0x81, 0x70 };
3223 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3224 u8 res[3];
3225 int err;
3226
3227 err = smp_ah(tfm_aes, irk, r, res);
3228 if (err)
3229 return err;
3230
3231 if (memcmp(res, exp, 3))
3232 return -EINVAL;
3233
3234 return 0;
3235}
3236
3237static int __init test_c1(struct crypto_blkcipher *tfm_aes)
3238{
3239 const u8 k[16] = {
3240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3242 const u8 r[16] = {
3243 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3244 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3245 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3246 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3247 const u8 _iat = 0x01;
3248 const u8 _rat = 0x00;
3249 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3250 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3251 const u8 exp[16] = {
3252 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3253 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3254 u8 res[16];
3255 int err;
3256
3257 err = smp_c1(tfm_aes, k, r, preq, pres, _iat, &ia, _rat, &ra, res);
3258 if (err)
3259 return err;
3260
3261 if (memcmp(res, exp, 16))
3262 return -EINVAL;
3263
3264 return 0;
3265}
3266
3267static int __init test_s1(struct crypto_blkcipher *tfm_aes)
3268{
3269 const u8 k[16] = {
3270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3272 const u8 r1[16] = {
3273 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3274 const u8 r2[16] = {
3275 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3276 const u8 exp[16] = {
3277 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3278 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3279 u8 res[16];
3280 int err;
3281
3282 err = smp_s1(tfm_aes, k, r1, r2, res);
3283 if (err)
3284 return err;
3285
3286 if (memcmp(res, exp, 16))
3287 return -EINVAL;
3288
3289 return 0;
3290}
3291
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003292static int __init test_f4(struct crypto_hash *tfm_cmac)
3293{
3294 const u8 u[32] = {
3295 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3296 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3297 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3298 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3299 const u8 v[32] = {
3300 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3301 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3302 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3303 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3304 const u8 x[16] = {
3305 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3306 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3307 const u8 z = 0x00;
3308 const u8 exp[16] = {
3309 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3310 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3311 u8 res[16];
3312 int err;
3313
3314 err = smp_f4(tfm_cmac, u, v, x, z, res);
3315 if (err)
3316 return err;
3317
3318 if (memcmp(res, exp, 16))
3319 return -EINVAL;
3320
3321 return 0;
3322}
3323
3324static int __init test_f5(struct crypto_hash *tfm_cmac)
3325{
3326 const u8 w[32] = {
3327 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3328 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3329 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3330 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3331 const u8 n1[16] = {
3332 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3333 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3334 const u8 n2[16] = {
3335 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3336 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3337 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3338 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3339 const u8 exp_ltk[16] = {
3340 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3341 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3342 const u8 exp_mackey[16] = {
3343 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3344 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3345 u8 mackey[16], ltk[16];
3346 int err;
3347
3348 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3349 if (err)
3350 return err;
3351
3352 if (memcmp(mackey, exp_mackey, 16))
3353 return -EINVAL;
3354
3355 if (memcmp(ltk, exp_ltk, 16))
3356 return -EINVAL;
3357
3358 return 0;
3359}
3360
3361static int __init test_f6(struct crypto_hash *tfm_cmac)
3362{
3363 const u8 w[16] = {
3364 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3365 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3366 const u8 n1[16] = {
3367 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3368 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3369 const u8 n2[16] = {
3370 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3371 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3372 const u8 r[16] = {
3373 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3374 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3375 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3376 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3377 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3378 const u8 exp[16] = {
3379 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3380 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3381 u8 res[16];
3382 int err;
3383
3384 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3385 if (err)
3386 return err;
3387
3388 if (memcmp(res, exp, 16))
3389 return -EINVAL;
3390
3391 return 0;
3392}
3393
3394static int __init test_g2(struct crypto_hash *tfm_cmac)
3395{
3396 const u8 u[32] = {
3397 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3398 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3399 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3400 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3401 const u8 v[32] = {
3402 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3403 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3404 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3405 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3406 const u8 x[16] = {
3407 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3408 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3409 const u8 y[16] = {
3410 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3411 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3412 const u32 exp_val = 0x2f9ed5ba % 1000000;
3413 u32 val;
3414 int err;
3415
3416 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3417 if (err)
3418 return err;
3419
3420 if (val != exp_val)
3421 return -EINVAL;
3422
3423 return 0;
3424}
3425
3426static int __init test_h6(struct crypto_hash *tfm_cmac)
3427{
3428 const u8 w[16] = {
3429 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3430 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3431 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3432 const u8 exp[16] = {
3433 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3434 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3435 u8 res[16];
3436 int err;
3437
3438 err = smp_h6(tfm_cmac, w, key_id, res);
3439 if (err)
3440 return err;
3441
3442 if (memcmp(res, exp, 16))
3443 return -EINVAL;
3444
3445 return 0;
3446}
3447
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003448static int __init run_selftests(struct crypto_blkcipher *tfm_aes,
3449 struct crypto_hash *tfm_cmac)
3450{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003451 ktime_t calltime, delta, rettime;
3452 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003453 int err;
3454
Marcel Holtmann255047b2014-12-30 00:11:20 -08003455 calltime = ktime_get();
3456
Johan Hedbergcfc41982014-12-30 09:50:40 +02003457 err = test_ah(tfm_aes);
3458 if (err) {
3459 BT_ERR("smp_ah test failed");
3460 return err;
3461 }
3462
3463 err = test_c1(tfm_aes);
3464 if (err) {
3465 BT_ERR("smp_c1 test failed");
3466 return err;
3467 }
3468
3469 err = test_s1(tfm_aes);
3470 if (err) {
3471 BT_ERR("smp_s1 test failed");
3472 return err;
3473 }
3474
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003475 err = test_f4(tfm_cmac);
3476 if (err) {
3477 BT_ERR("smp_f4 test failed");
3478 return err;
3479 }
3480
3481 err = test_f5(tfm_cmac);
3482 if (err) {
3483 BT_ERR("smp_f5 test failed");
3484 return err;
3485 }
3486
3487 err = test_f6(tfm_cmac);
3488 if (err) {
3489 BT_ERR("smp_f6 test failed");
3490 return err;
3491 }
3492
3493 err = test_g2(tfm_cmac);
3494 if (err) {
3495 BT_ERR("smp_g2 test failed");
3496 return err;
3497 }
3498
3499 err = test_h6(tfm_cmac);
3500 if (err) {
3501 BT_ERR("smp_h6 test failed");
3502 return err;
3503 }
3504
Marcel Holtmann255047b2014-12-30 00:11:20 -08003505 rettime = ktime_get();
3506 delta = ktime_sub(rettime, calltime);
3507 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3508
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003509 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003510
3511 return 0;
3512}
3513
3514int __init bt_selftest_smp(void)
3515{
3516 struct crypto_blkcipher *tfm_aes;
3517 struct crypto_hash *tfm_cmac;
3518 int err;
3519
3520 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
3521 if (IS_ERR(tfm_aes)) {
3522 BT_ERR("Unable to create ECB crypto context");
3523 return PTR_ERR(tfm_aes);
3524 }
3525
3526 tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
3527 if (IS_ERR(tfm_cmac)) {
3528 BT_ERR("Unable to create CMAC crypto context");
3529 crypto_free_blkcipher(tfm_aes);
3530 return PTR_ERR(tfm_cmac);
3531 }
3532
3533 err = run_selftests(tfm_aes, tfm_cmac);
3534
3535 crypto_free_hash(tfm_cmac);
3536 crypto_free_blkcipher(tfm_aes);
3537
3538 return err;
3539}
3540
3541#endif