blob: 60180b47ce715d907f0279fe28f9d8abf32a98d9 [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 Hedberg1a8bab42015-03-16 11:45:44 +020073 SMP_FLAG_REMOTE_OOB,
74 SMP_FLAG_LOCAL_OOB,
Johan Hedberg533e35d2014-06-16 19:25:18 +030075};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030076
Marcel Holtmann88a479d2015-03-16 01:10:19 -070077struct smp_dev {
Marcel Holtmann60a27d62015-03-16 01:10:22 -070078 /* Secure Connections OOB data */
79 u8 local_pk[64];
80 u8 local_sk[32];
Marcel Holtmannfb334fe2015-03-16 12:34:57 -070081 u8 local_rand[16];
Marcel Holtmann60a27d62015-03-16 01:10:22 -070082 bool debug_key;
83
Marcel Holtmann88a479d2015-03-16 01:10:19 -070084 struct crypto_blkcipher *tfm_aes;
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -070085 struct crypto_hash *tfm_cmac;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070086};
87
Johan Hedberg4bc58f52014-05-20 09:45:47 +030088struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030089 struct l2cap_conn *conn;
90 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030091 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030092
Johan Hedberg4bc58f52014-05-20 09:45:47 +030093 u8 preq[7]; /* SMP Pairing Request */
94 u8 prsp[7]; /* SMP Pairing Response */
95 u8 prnd[16]; /* SMP Pairing Random (local) */
96 u8 rrnd[16]; /* SMP Pairing Random (remote) */
97 u8 pcnf[16]; /* SMP Pairing Confirm */
98 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberg882fafa2015-03-16 11:45:43 +020099 u8 rr[16]; /* Remote OOB ra/rb value */
100 u8 lr[16]; /* Local OOB ra/rb value */
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300101 u8 enc_key_size;
102 u8 remote_key_dist;
103 bdaddr_t id_addr;
104 u8 id_addr_type;
105 u8 irk[16];
106 struct smp_csrk *csrk;
107 struct smp_csrk *slave_csrk;
108 struct smp_ltk *ltk;
109 struct smp_ltk *slave_ltk;
110 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300111 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300112 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300113 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300114 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300115
Johan Hedberg3b191462014-06-06 10:50:15 +0300116 /* Secure Connections variables */
117 u8 local_pk[64];
118 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300119 u8 remote_pk[64];
120 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300121 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300122
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300123 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +0300124 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300125};
126
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300127/* These debug key values are defined in the SMP section of the core
128 * specification. debug_pk is the public debug key and debug_sk the
129 * private debug key.
130 */
131static const u8 debug_pk[64] = {
132 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
133 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
134 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
135 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
136
137 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
138 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
139 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
140 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
141};
142
143static const u8 debug_sk[32] = {
144 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
145 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
146 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
147 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
148};
149
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300150static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300151{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300152 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300153
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300154 for (i = 0; i < len; i++)
155 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300156}
157
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200158/* The following functions map to the LE SC SMP crypto functions
159 * AES-CMAC, f4, f5, f6, g2 and h6.
160 */
161
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300162static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
163 size_t len, u8 mac[16])
164{
165 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
166 struct hash_desc desc;
167 struct scatterlist sg;
168 int err;
169
170 if (len > CMAC_MSG_MAX)
171 return -EFBIG;
172
173 if (!tfm) {
174 BT_ERR("tfm %p", tfm);
175 return -EINVAL;
176 }
177
178 desc.tfm = tfm;
179 desc.flags = 0;
180
181 crypto_hash_init(&desc);
182
183 /* Swap key and message from LSB to MSB */
184 swap_buf(k, tmp, 16);
185 swap_buf(m, msg_msb, len);
186
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200187 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
188 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300189
190 err = crypto_hash_setkey(tfm, tmp, 16);
191 if (err) {
192 BT_ERR("cipher setkey failed: %d", err);
193 return err;
194 }
195
196 sg_init_one(&sg, msg_msb, len);
197
198 err = crypto_hash_update(&desc, &sg, len);
199 if (err) {
200 BT_ERR("Hash update error %d", err);
201 return err;
202 }
203
204 err = crypto_hash_final(&desc, mac_msb);
205 if (err) {
206 BT_ERR("Hash final error %d", err);
207 return err;
208 }
209
210 swap_buf(mac_msb, mac, 16);
211
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200212 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300213
214 return 0;
215}
216
217static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
218 const u8 x[16], u8 z, u8 res[16])
219{
220 u8 m[65];
221 int err;
222
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200223 SMP_DBG("u %32phN", u);
224 SMP_DBG("v %32phN", v);
225 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300226
227 m[0] = z;
228 memcpy(m + 1, v, 32);
229 memcpy(m + 33, u, 32);
230
231 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
232 if (err)
233 return err;
234
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200235 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300236
237 return err;
238}
239
Johan Hedberg4da50de2014-12-29 12:04:10 +0200240static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32],
241 const u8 n1[16], const u8 n2[16], const u8 a1[7],
242 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300243{
244 /* The btle, salt and length "magic" values are as defined in
245 * the SMP section of the Bluetooth core specification. In ASCII
246 * the btle value ends up being 'btle'. The salt is just a
247 * random number whereas length is the value 256 in little
248 * endian format.
249 */
250 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
251 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
252 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
253 const u8 length[2] = { 0x00, 0x01 };
254 u8 m[53], t[16];
255 int err;
256
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200257 SMP_DBG("w %32phN", w);
258 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
259 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300260
261 err = aes_cmac(tfm_cmac, salt, w, 32, t);
262 if (err)
263 return err;
264
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200265 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300266
267 memcpy(m, length, 2);
268 memcpy(m + 2, a2, 7);
269 memcpy(m + 9, a1, 7);
270 memcpy(m + 16, n2, 16);
271 memcpy(m + 32, n1, 16);
272 memcpy(m + 48, btle, 4);
273
274 m[52] = 0; /* Counter */
275
276 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
277 if (err)
278 return err;
279
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200280 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300281
282 m[52] = 1; /* Counter */
283
284 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
285 if (err)
286 return err;
287
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200288 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300289
290 return 0;
291}
292
293static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200294 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300295 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
296 u8 res[16])
297{
298 u8 m[65];
299 int err;
300
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200301 SMP_DBG("w %16phN", w);
302 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
303 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300304
305 memcpy(m, a2, 7);
306 memcpy(m + 7, a1, 7);
307 memcpy(m + 14, io_cap, 3);
308 memcpy(m + 17, r, 16);
309 memcpy(m + 33, n2, 16);
310 memcpy(m + 49, n1, 16);
311
312 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
313 if (err)
314 return err;
315
Marcel Holtmann203de212014-12-31 20:01:22 -0800316 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300317
318 return err;
319}
320
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300321static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
322 const u8 x[16], const u8 y[16], u32 *val)
323{
324 u8 m[80], tmp[16];
325 int err;
326
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200327 SMP_DBG("u %32phN", u);
328 SMP_DBG("v %32phN", v);
329 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300330
331 memcpy(m, y, 16);
332 memcpy(m + 16, v, 32);
333 memcpy(m + 48, u, 32);
334
335 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
336 if (err)
337 return err;
338
339 *val = get_unaligned_le32(tmp);
340 *val %= 1000000;
341
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200342 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300343
344 return 0;
345}
346
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200347static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
348 const u8 key_id[4], u8 res[16])
349{
350 int err;
351
352 SMP_DBG("w %16phN key_id %4phN", w, key_id);
353
354 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
355 if (err)
356 return err;
357
358 SMP_DBG("res %16phN", res);
359
360 return err;
361}
362
363/* The following functions map to the legacy SMP crypto functions e, c1,
364 * s1 and ah.
365 */
366
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300367static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
368{
369 struct blkcipher_desc desc;
370 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200371 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200372 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300373
Johan Hedberg7f376cd2014-12-03 16:07:13 +0200374 if (!tfm) {
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300375 BT_ERR("tfm %p", tfm);
376 return -EINVAL;
377 }
378
379 desc.tfm = tfm;
380 desc.flags = 0;
381
Johan Hedberg943a7322014-03-18 12:58:24 +0200382 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300383 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200384
385 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300386 if (err) {
387 BT_ERR("cipher setkey failed: %d", err);
388 return err;
389 }
390
Johan Hedberg943a7322014-03-18 12:58:24 +0200391 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300392 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200393
394 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300395
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300396 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
397 if (err)
398 BT_ERR("Encrypt data error %d", err);
399
Johan Hedberg943a7322014-03-18 12:58:24 +0200400 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300401 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200402
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300403 return err;
404}
405
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200406static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
407 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
408 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
409{
410 u8 p1[16], p2[16];
411 int err;
412
413 memset(p1, 0, 16);
414
415 /* p1 = pres || preq || _rat || _iat */
416 p1[0] = _iat;
417 p1[1] = _rat;
418 memcpy(p1 + 2, preq, 7);
419 memcpy(p1 + 9, pres, 7);
420
421 /* p2 = padding || ia || ra */
422 memcpy(p2, ra, 6);
423 memcpy(p2 + 6, ia, 6);
424 memset(p2 + 12, 0, 4);
425
426 /* res = r XOR p1 */
427 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
428
429 /* res = e(k, res) */
430 err = smp_e(tfm_aes, k, res);
431 if (err) {
432 BT_ERR("Encrypt data error");
433 return err;
434 }
435
436 /* res = res XOR p2 */
437 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
438
439 /* res = e(k, res) */
440 err = smp_e(tfm_aes, k, res);
441 if (err)
442 BT_ERR("Encrypt data error");
443
444 return err;
445}
446
447static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
448 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300449{
450 int err;
451
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200452 /* Just least significant octets from r1 and r2 are considered */
453 memcpy(_r, r2, 8);
454 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300455
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200456 err = smp_e(tfm_aes, k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300457 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200458 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300459
460 return err;
461}
462
Johan Hedbergcd082792014-12-02 13:37:41 +0200463static int smp_ah(struct crypto_blkcipher *tfm, const u8 irk[16],
464 const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200465{
Johan Hedberg943a7322014-03-18 12:58:24 +0200466 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200467 int err;
468
469 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200470 memcpy(_res, r, 3);
471 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200472
Johan Hedberg943a7322014-03-18 12:58:24 +0200473 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200474 if (err) {
475 BT_ERR("Encrypt error");
476 return err;
477 }
478
479 /* The output of the random address function ah is:
480 * ah(h, r) = e(k, r') mod 2^24
481 * The output of the security function e is then truncated to 24 bits
482 * by taking the least significant 24 bits of the output of e as the
483 * result of ah.
484 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200485 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200486
487 return 0;
488}
489
Johan Hedbergcd082792014-12-02 13:37:41 +0200490bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
491 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200492{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300493 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700494 struct smp_dev *smp;
Johan Hedberg60478052014-02-18 10:19:31 +0200495 u8 hash[3];
496 int err;
497
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300498 if (!chan || !chan->data)
499 return false;
500
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700501 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300502
Johan Hedberg60478052014-02-18 10:19:31 +0200503 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
504
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700505 err = smp_ah(smp->tfm_aes, irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200506 if (err)
507 return false;
508
509 return !memcmp(bdaddr->b, hash, 3);
510}
511
Johan Hedbergcd082792014-12-02 13:37:41 +0200512int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200513{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300514 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700515 struct smp_dev *smp;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200516 int err;
517
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300518 if (!chan || !chan->data)
519 return -EOPNOTSUPP;
520
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700521 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300522
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200523 get_random_bytes(&rpa->b[3], 3);
524
525 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
526 rpa->b[5] |= 0x40; /* Set second most significant bit */
527
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700528 err = smp_ah(smp->tfm_aes, irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200529 if (err < 0)
530 return err;
531
532 BT_DBG("RPA %pMR", rpa);
533
534 return 0;
535}
536
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700537int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
538{
539 struct l2cap_chan *chan = hdev->smp_data;
540 struct smp_dev *smp;
541 int err;
542
543 if (!chan || !chan->data)
544 return -EOPNOTSUPP;
545
546 smp = chan->data;
547
548 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
549 BT_DBG("Using debug keys");
550 memcpy(smp->local_pk, debug_pk, 64);
551 memcpy(smp->local_sk, debug_sk, 32);
552 smp->debug_key = true;
553 } else {
554 while (true) {
555 /* Generate local key pair for Secure Connections */
556 if (!ecc_make_key(smp->local_pk, smp->local_sk))
557 return -EIO;
558
559 /* This is unlikely, but we need to check that
560 * we didn't accidentially generate a debug key.
561 */
562 if (memcmp(smp->local_sk, debug_sk, 32))
563 break;
564 }
565 smp->debug_key = false;
566 }
567
568 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
569 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
570 SMP_DBG("OOB Private Key: %32phN", smp->local_sk);
571
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700572 get_random_bytes(smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700573
574 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700575 smp->local_rand, 0, hash);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700576 if (err < 0)
577 return err;
578
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700579 memcpy(rand, smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700580
581 return 0;
582}
583
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300584static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
585{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300586 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300587 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300588 struct kvec iv[2];
589 struct msghdr msg;
590
591 if (!chan)
592 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300593
594 BT_DBG("code 0x%2.2x", code);
595
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300596 iv[0].iov_base = &code;
597 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300598
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300599 iv[1].iov_base = data;
600 iv[1].iov_len = len;
601
602 memset(&msg, 0, sizeof(msg));
603
Al Viro17836392014-11-24 17:07:38 -0500604 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300605
606 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300607
Johan Hedbergb68fda62014-08-11 22:06:40 +0300608 if (!chan->data)
609 return;
610
611 smp = chan->data;
612
613 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300614 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300615}
616
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300617static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800618{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300619 if (authreq & SMP_AUTH_MITM) {
620 if (authreq & SMP_AUTH_SC)
621 return BT_SECURITY_FIPS;
622 else
623 return BT_SECURITY_HIGH;
624 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800625 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300626 }
Brian Gix2b64d152011-12-21 16:12:12 -0800627}
628
629static __u8 seclevel_to_authreq(__u8 sec_level)
630{
631 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300632 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800633 case BT_SECURITY_HIGH:
634 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
635 case BT_SECURITY_MEDIUM:
636 return SMP_AUTH_BONDING;
637 default:
638 return SMP_AUTH_NONE;
639 }
640}
641
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300642static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700643 struct smp_cmd_pairing *req,
644 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300645{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300646 struct l2cap_chan *chan = conn->smp;
647 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200648 struct hci_conn *hcon = conn->hcon;
649 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100650 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300651
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700652 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700653 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
654 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300655 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800656 } else {
657 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300658 }
659
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700660 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200661 remote_dist |= SMP_DIST_ID_KEY;
662
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700663 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200664 local_dist |= SMP_DIST_ID_KEY;
665
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700666 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100667 (authreq & SMP_AUTH_SC)) {
668 struct oob_data *oob_data;
669 u8 bdaddr_type;
670
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700671 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300672 local_dist |= SMP_DIST_LINK_KEY;
673 remote_dist |= SMP_DIST_LINK_KEY;
674 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100675
676 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
677 bdaddr_type = BDADDR_LE_PUBLIC;
678 else
679 bdaddr_type = BDADDR_LE_RANDOM;
680
681 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
682 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800683 if (oob_data && oob_data->present) {
Johan Hedberg1a8bab42015-03-16 11:45:44 +0200684 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100685 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100686 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100687 memcpy(smp->pcnf, oob_data->hash256, 16);
Marcel Holtmannbc07cd62015-03-16 12:34:56 -0700688 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf);
689 SMP_DBG("OOB Remote Random: %16phN", smp->rr);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100690 }
691
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300692 } else {
693 authreq &= ~SMP_AUTH_SC;
694 }
695
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300696 if (rsp == NULL) {
697 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100698 req->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300699 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200700 req->init_key_dist = local_dist;
701 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300702 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200703
704 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300705 return;
706 }
707
708 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100709 rsp->oob_flag = oob_flag;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300710 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200711 rsp->init_key_dist = req->init_key_dist & remote_dist;
712 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300713 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200714
715 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300716}
717
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300718static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
719{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300720 struct l2cap_chan *chan = conn->smp;
721 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300722
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300723 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
Marcel Holtmannf1560462013-10-13 05:43:25 -0700724 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300725 return SMP_ENC_KEY_SIZE;
726
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300727 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300728
729 return 0;
730}
731
Johan Hedberg6f48e262014-08-11 22:06:44 +0300732static void smp_chan_destroy(struct l2cap_conn *conn)
733{
734 struct l2cap_chan *chan = conn->smp;
735 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200736 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300737 bool complete;
738
739 BUG_ON(!smp);
740
741 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300742
Johan Hedberg6f48e262014-08-11 22:06:44 +0300743 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200744 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300745
Marcel Holtmann276812e2015-03-16 01:10:18 -0700746 kzfree(smp->csrk);
747 kzfree(smp->slave_csrk);
748 kzfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300749
750 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300751 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300752
Johan Hedberg923e2412014-12-03 12:43:39 +0200753 /* Ensure that we don't leave any debug key around if debug key
754 * support hasn't been explicitly enabled.
755 */
756 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700757 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200758 list_del_rcu(&smp->ltk->list);
759 kfree_rcu(smp->ltk, rcu);
760 smp->ltk = NULL;
761 }
762
Johan Hedberg6f48e262014-08-11 22:06:44 +0300763 /* If pairing failed clean up any keys we might have */
764 if (!complete) {
765 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200766 list_del_rcu(&smp->ltk->list);
767 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300768 }
769
770 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200771 list_del_rcu(&smp->slave_ltk->list);
772 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300773 }
774
775 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200776 list_del_rcu(&smp->remote_irk->list);
777 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300778 }
779 }
780
781 chan->data = NULL;
Marcel Holtmann276812e2015-03-16 01:10:18 -0700782 kzfree(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200783 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300784}
785
Johan Hedberg84794e12013-11-06 11:24:57 +0200786static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800787{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200788 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300789 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200790
Johan Hedberg84794e12013-11-06 11:24:57 +0200791 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800792 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700793 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800794
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700795 clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
Johan Hedberge1e930f2014-09-08 17:09:49 -0700796 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300797
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300798 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300799 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800800}
801
Brian Gix2b64d152011-12-21 16:12:12 -0800802#define JUST_WORKS 0x00
803#define JUST_CFM 0x01
804#define REQ_PASSKEY 0x02
805#define CFM_PASSKEY 0x03
806#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300807#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800808#define OVERLAP 0xFF
809
810static const u8 gen_method[5][5] = {
811 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
812 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
813 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
814 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
815 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
816};
817
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300818static const u8 sc_method[5][5] = {
819 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
820 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
821 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
822 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
823 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
824};
825
Johan Hedberg581370c2014-06-17 13:07:38 +0300826static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
827{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300828 /* If either side has unknown io_caps, use JUST_CFM (which gets
829 * converted later to JUST_WORKS if we're initiators.
830 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300831 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
832 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300833 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300834
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300835 if (test_bit(SMP_FLAG_SC, &smp->flags))
836 return sc_method[remote_io][local_io];
837
Johan Hedberg581370c2014-06-17 13:07:38 +0300838 return gen_method[remote_io][local_io];
839}
840
Brian Gix2b64d152011-12-21 16:12:12 -0800841static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
842 u8 local_io, u8 remote_io)
843{
844 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300845 struct l2cap_chan *chan = conn->smp;
846 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800847 u32 passkey = 0;
848 int ret = 0;
849
850 /* Initialize key for JUST WORKS */
851 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300852 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800853
854 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
855
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300856 /* If neither side wants MITM, either "just" confirm an incoming
857 * request or use just-works for outgoing ones. The JUST_CFM
858 * will be converted to JUST_WORKS if necessary later in this
859 * function. If either side has MITM look up the method from the
860 * table.
861 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300862 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300863 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800864 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300865 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800866
Johan Hedberga82505c2014-03-24 14:39:07 +0200867 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300868 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
869 &smp->flags))
870 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200871
Johan Hedberg02f3e252014-07-16 15:09:13 +0300872 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300873 if (smp->method == JUST_CFM &&
874 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
875 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300876
Brian Gix2b64d152011-12-21 16:12:12 -0800877 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300878 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300879 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800880 return 0;
881 }
882
883 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300884 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300885 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300886 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
887 hcon->pending_sec_level = BT_SECURITY_HIGH;
888 }
Brian Gix2b64d152011-12-21 16:12:12 -0800889
890 /* If both devices have Keyoard-Display I/O, the master
891 * Confirms and the slave Enters the passkey.
892 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300893 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300894 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300895 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800896 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300897 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800898 }
899
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200900 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300901 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200902 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800903 get_random_bytes(&passkey, sizeof(passkey));
904 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200905 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800906 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300907 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800908 }
909
Johan Hedberg783e0572014-05-31 18:48:26 +0300910 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700911 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200912 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300913 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200914 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
915 hcon->type, hcon->dst_type,
916 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800917 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200918 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200919 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200920 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800921
Brian Gix2b64d152011-12-21 16:12:12 -0800922 return ret;
923}
924
Johan Hedberg1cc61142014-05-20 09:45:52 +0300925static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300926{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300927 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300928 struct smp_cmd_pairing_confirm cp;
929 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300930
931 BT_DBG("conn %p", conn);
932
Johan Hedberge491eaf2014-10-25 21:15:37 +0200933 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200934 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200935 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
936 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300937 if (ret)
938 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300939
Johan Hedberg4a74d652014-05-20 09:45:50 +0300940 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800941
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300942 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
943
Johan Hedbergb28b4942014-09-05 22:19:55 +0300944 if (conn->hcon->out)
945 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
946 else
947 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
948
Johan Hedberg1cc61142014-05-20 09:45:52 +0300949 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300950}
951
Johan Hedberg861580a2014-05-20 09:45:51 +0300952static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300953{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300954 struct l2cap_conn *conn = smp->conn;
955 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300956 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300957 int ret;
958
Johan Hedbergec70f362014-06-27 14:23:04 +0300959 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300960 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300961
962 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
963
Johan Hedberge491eaf2014-10-25 21:15:37 +0200964 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200965 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200966 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300967 if (ret)
968 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300969
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300970 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
971 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300972 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300973 }
974
975 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800976 u8 stk[16];
977 __le64 rand = 0;
978 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300979
Johan Hedberge491eaf2014-10-25 21:15:37 +0200980 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300981
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300982 memset(stk + smp->enc_key_size, 0,
Gustavo F. Padovan04124682012-03-08 01:25:00 -0300983 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300984
Johan Hedberg861580a2014-05-20 09:45:51 +0300985 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
986 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300987
988 hci_le_start_enc(hcon, ediv, rand, stk);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300989 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +0300990 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300991 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +0300992 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800993 __le64 rand = 0;
994 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300995
Johan Hedberg943a7322014-03-18 12:58:24 +0200996 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
997 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300998
Johan Hedberge491eaf2014-10-25 21:15:37 +0200999 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001000
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -03001001 memset(stk + smp->enc_key_size, 0,
Marcel Holtmannf1560462013-10-13 05:43:25 -07001002 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001003
Johan Hedbergfff34902014-06-10 15:19:50 +03001004 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1005 auth = 1;
1006 else
1007 auth = 0;
1008
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001009 /* Even though there's no _SLAVE suffix this is the
1010 * slave STK we're adding for later lookup (the master
1011 * STK never needs to be stored).
1012 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001013 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001014 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001015 }
1016
Johan Hedberg861580a2014-05-20 09:45:51 +03001017 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001018}
1019
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001020static void smp_notify_keys(struct l2cap_conn *conn)
1021{
1022 struct l2cap_chan *chan = conn->smp;
1023 struct smp_chan *smp = chan->data;
1024 struct hci_conn *hcon = conn->hcon;
1025 struct hci_dev *hdev = hcon->hdev;
1026 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1027 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1028 bool persistent;
1029
1030 if (smp->remote_irk) {
1031 mgmt_new_irk(hdev, smp->remote_irk);
1032 /* Now that user space can be considered to know the
1033 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001034 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001035 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001036 if (hcon->type == LE_LINK) {
1037 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1038 hcon->dst_type = smp->remote_irk->addr_type;
1039 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1040 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001041
1042 /* When receiving an indentity resolving key for
1043 * a remote device that does not use a resolvable
1044 * private address, just remove the key so that
1045 * it is possible to use the controller white
1046 * list for scanning.
1047 *
1048 * Userspace will have been told to not store
1049 * this key at this point. So it is safe to
1050 * just remove it.
1051 */
1052 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +02001053 list_del_rcu(&smp->remote_irk->list);
1054 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001055 smp->remote_irk = NULL;
1056 }
1057 }
1058
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001059 if (hcon->type == ACL_LINK) {
1060 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1061 persistent = false;
1062 else
1063 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1064 &hcon->flags);
1065 } else {
1066 /* The LTKs and CSRKs should be persistent only if both sides
1067 * had the bonding bit set in their authentication requests.
1068 */
1069 persistent = !!((req->auth_req & rsp->auth_req) &
1070 SMP_AUTH_BONDING);
1071 }
1072
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001073
1074 if (smp->csrk) {
1075 smp->csrk->bdaddr_type = hcon->dst_type;
1076 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1077 mgmt_new_csrk(hdev, smp->csrk, persistent);
1078 }
1079
1080 if (smp->slave_csrk) {
1081 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1082 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1083 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1084 }
1085
1086 if (smp->ltk) {
1087 smp->ltk->bdaddr_type = hcon->dst_type;
1088 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1089 mgmt_new_ltk(hdev, smp->ltk, persistent);
1090 }
1091
1092 if (smp->slave_ltk) {
1093 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1094 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1095 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1096 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001097
1098 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001099 struct link_key *key;
1100 u8 type;
1101
1102 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1103 type = HCI_LK_DEBUG_COMBINATION;
1104 else if (hcon->sec_level == BT_SECURITY_FIPS)
1105 type = HCI_LK_AUTH_COMBINATION_P256;
1106 else
1107 type = HCI_LK_UNAUTH_COMBINATION_P256;
1108
1109 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1110 smp->link_key, type, 0, &persistent);
1111 if (key) {
1112 mgmt_new_link_key(hdev, key, persistent);
1113
1114 /* Don't keep debug keys around if the relevant
1115 * flag is not set.
1116 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001117 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001118 key->type == HCI_LK_DEBUG_COMBINATION) {
1119 list_del_rcu(&key->list);
1120 kfree_rcu(key, rcu);
1121 }
1122 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001123 }
1124}
1125
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001126static void sc_add_ltk(struct smp_chan *smp)
1127{
1128 struct hci_conn *hcon = smp->conn->hcon;
1129 u8 key_type, auth;
1130
1131 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1132 key_type = SMP_LTK_P256_DEBUG;
1133 else
1134 key_type = SMP_LTK_P256;
1135
1136 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1137 auth = 1;
1138 else
1139 auth = 0;
1140
1141 memset(smp->tk + smp->enc_key_size, 0,
1142 SMP_MAX_ENC_KEY_SIZE - smp->enc_key_size);
1143
1144 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1145 key_type, auth, smp->tk, smp->enc_key_size,
1146 0, 0);
1147}
1148
Johan Hedberg6a770832014-06-06 11:54:04 +03001149static void sc_generate_link_key(struct smp_chan *smp)
1150{
1151 /* These constants are as specified in the core specification.
1152 * In ASCII they spell out to 'tmp1' and 'lebr'.
1153 */
1154 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1155 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1156
1157 smp->link_key = kzalloc(16, GFP_KERNEL);
1158 if (!smp->link_key)
1159 return;
1160
1161 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001162 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001163 smp->link_key = NULL;
1164 return;
1165 }
1166
1167 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001168 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001169 smp->link_key = NULL;
1170 return;
1171 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001172}
1173
Johan Hedbergb28b4942014-09-05 22:19:55 +03001174static void smp_allow_key_dist(struct smp_chan *smp)
1175{
1176 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1177 * will be allowed in each PDU handler to ensure we receive
1178 * them in the correct order.
1179 */
1180 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1181 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1182 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1183 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1184 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1185 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1186}
1187
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001188static void sc_generate_ltk(struct smp_chan *smp)
1189{
1190 /* These constants are as specified in the core specification.
1191 * In ASCII they spell out to 'tmp2' and 'brle'.
1192 */
1193 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1194 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1195 struct hci_conn *hcon = smp->conn->hcon;
1196 struct hci_dev *hdev = hcon->hdev;
1197 struct link_key *key;
1198
1199 key = hci_find_link_key(hdev, &hcon->dst);
1200 if (!key) {
1201 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1202 return;
1203 }
1204
1205 if (key->type == HCI_LK_DEBUG_COMBINATION)
1206 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1207
1208 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1209 return;
1210
1211 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1212 return;
1213
1214 sc_add_ltk(smp);
1215}
1216
Johan Hedbergd6268e82014-09-05 22:19:51 +03001217static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001218{
1219 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001220 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001221 struct hci_conn *hcon = conn->hcon;
1222 struct hci_dev *hdev = hcon->hdev;
1223 __u8 *keydist;
1224
1225 BT_DBG("conn %p", conn);
1226
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001227 rsp = (void *) &smp->prsp[1];
1228
1229 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001230 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1231 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001232 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001233 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001234
1235 req = (void *) &smp->preq[1];
1236
1237 if (hcon->out) {
1238 keydist = &rsp->init_key_dist;
1239 *keydist &= req->init_key_dist;
1240 } else {
1241 keydist = &rsp->resp_key_dist;
1242 *keydist &= req->resp_key_dist;
1243 }
1244
Johan Hedberg6a770832014-06-06 11:54:04 +03001245 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001246 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001247 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001248 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1249 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001250
1251 /* Clear the keys which are generated but not distributed */
1252 *keydist &= ~SMP_SC_NO_DIST;
1253 }
1254
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001255 BT_DBG("keydist 0x%x", *keydist);
1256
1257 if (*keydist & SMP_DIST_ENC_KEY) {
1258 struct smp_cmd_encrypt_info enc;
1259 struct smp_cmd_master_ident ident;
1260 struct smp_ltk *ltk;
1261 u8 authenticated;
1262 __le16 ediv;
1263 __le64 rand;
1264
1265 get_random_bytes(enc.ltk, sizeof(enc.ltk));
1266 get_random_bytes(&ediv, sizeof(ediv));
1267 get_random_bytes(&rand, sizeof(rand));
1268
1269 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1270
1271 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1272 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1273 SMP_LTK_SLAVE, authenticated, enc.ltk,
1274 smp->enc_key_size, ediv, rand);
1275 smp->slave_ltk = ltk;
1276
1277 ident.ediv = ediv;
1278 ident.rand = rand;
1279
1280 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1281
1282 *keydist &= ~SMP_DIST_ENC_KEY;
1283 }
1284
1285 if (*keydist & SMP_DIST_ID_KEY) {
1286 struct smp_cmd_ident_addr_info addrinfo;
1287 struct smp_cmd_ident_info idinfo;
1288
1289 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1290
1291 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1292
1293 /* The hci_conn contains the local identity address
1294 * after the connection has been established.
1295 *
1296 * This is true even when the connection has been
1297 * established using a resolvable random address.
1298 */
1299 bacpy(&addrinfo.bdaddr, &hcon->src);
1300 addrinfo.addr_type = hcon->src_type;
1301
1302 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1303 &addrinfo);
1304
1305 *keydist &= ~SMP_DIST_ID_KEY;
1306 }
1307
1308 if (*keydist & SMP_DIST_SIGN) {
1309 struct smp_cmd_sign_info sign;
1310 struct smp_csrk *csrk;
1311
1312 /* Generate a new random key */
1313 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1314
1315 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1316 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001317 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1318 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1319 else
1320 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001321 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1322 }
1323 smp->slave_csrk = csrk;
1324
1325 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1326
1327 *keydist &= ~SMP_DIST_SIGN;
1328 }
1329
1330 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001331 if (smp->remote_key_dist & KEY_DIST_MASK) {
1332 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001333 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001334 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001335
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001336 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1337 smp_notify_keys(conn);
1338
1339 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001340}
1341
Johan Hedbergb68fda62014-08-11 22:06:40 +03001342static void smp_timeout(struct work_struct *work)
1343{
1344 struct smp_chan *smp = container_of(work, struct smp_chan,
1345 security_timer.work);
1346 struct l2cap_conn *conn = smp->conn;
1347
1348 BT_DBG("conn %p", conn);
1349
Johan Hedberg1e91c292014-08-18 20:33:29 +03001350 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001351}
1352
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001353static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1354{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001355 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001356 struct smp_chan *smp;
1357
Marcel Holtmannf1560462013-10-13 05:43:25 -07001358 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001359 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001360 return NULL;
1361
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001362 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1363 if (IS_ERR(smp->tfm_aes)) {
1364 BT_ERR("Unable to create ECB crypto context");
Marcel Holtmann276812e2015-03-16 01:10:18 -07001365 kzfree(smp);
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001366 return NULL;
1367 }
1368
Johan Hedberg407cecf2014-05-02 14:19:47 +03001369 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1370 if (IS_ERR(smp->tfm_cmac)) {
1371 BT_ERR("Unable to create CMAC crypto context");
1372 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann276812e2015-03-16 01:10:18 -07001373 kzfree(smp);
Johan Hedberg407cecf2014-05-02 14:19:47 +03001374 return NULL;
1375 }
1376
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001377 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001378 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001379
Johan Hedbergb28b4942014-09-05 22:19:55 +03001380 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1381
Johan Hedbergb68fda62014-08-11 22:06:40 +03001382 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1383
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001384 hci_conn_hold(conn->hcon);
1385
1386 return smp;
1387}
1388
Johan Hedberg760b0182014-06-06 11:44:05 +03001389static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1390{
1391 struct hci_conn *hcon = smp->conn->hcon;
1392 u8 *na, *nb, a[7], b[7];
1393
1394 if (hcon->out) {
1395 na = smp->prnd;
1396 nb = smp->rrnd;
1397 } else {
1398 na = smp->rrnd;
1399 nb = smp->prnd;
1400 }
1401
1402 memcpy(a, &hcon->init_addr, 6);
1403 memcpy(b, &hcon->resp_addr, 6);
1404 a[6] = hcon->init_addr_type;
1405 b[6] = hcon->resp_addr_type;
1406
1407 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1408}
1409
Johan Hedberg38606f12014-06-25 11:10:28 +03001410static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001411{
1412 struct hci_conn *hcon = smp->conn->hcon;
1413 struct smp_cmd_dhkey_check check;
1414 u8 a[7], b[7], *local_addr, *remote_addr;
1415 u8 io_cap[3], r[16];
1416
Johan Hedberg760b0182014-06-06 11:44:05 +03001417 memcpy(a, &hcon->init_addr, 6);
1418 memcpy(b, &hcon->resp_addr, 6);
1419 a[6] = hcon->init_addr_type;
1420 b[6] = hcon->resp_addr_type;
1421
1422 if (hcon->out) {
1423 local_addr = a;
1424 remote_addr = b;
1425 memcpy(io_cap, &smp->preq[1], 3);
1426 } else {
1427 local_addr = b;
1428 remote_addr = a;
1429 memcpy(io_cap, &smp->prsp[1], 3);
1430 }
1431
Johan Hedbergdddd3052014-06-01 15:38:09 +03001432 memset(r, 0, sizeof(r));
1433
1434 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001435 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001436
Johan Hedberga29b0732014-10-28 15:17:05 +01001437 if (smp->method == REQ_OOB)
1438 memcpy(r, smp->rr, 16);
1439
Johan Hedberg760b0182014-06-06 11:44:05 +03001440 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1441 local_addr, remote_addr, check.e);
1442
1443 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001444}
1445
Johan Hedberg38606f12014-06-25 11:10:28 +03001446static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1447{
1448 struct l2cap_conn *conn = smp->conn;
1449 struct hci_conn *hcon = conn->hcon;
1450 struct smp_cmd_pairing_confirm cfm;
1451 u8 r;
1452
1453 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1454 r |= 0x80;
1455
1456 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1457
1458 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1459 cfm.confirm_val))
1460 return SMP_UNSPECIFIED;
1461
1462 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1463
1464 return 0;
1465}
1466
1467static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1468{
1469 struct l2cap_conn *conn = smp->conn;
1470 struct hci_conn *hcon = conn->hcon;
1471 struct hci_dev *hdev = hcon->hdev;
1472 u8 cfm[16], r;
1473
1474 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1475 if (smp->passkey_round >= 20)
1476 return 0;
1477
1478 switch (smp_op) {
1479 case SMP_CMD_PAIRING_RANDOM:
1480 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1481 r |= 0x80;
1482
1483 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1484 smp->rrnd, r, cfm))
1485 return SMP_UNSPECIFIED;
1486
1487 if (memcmp(smp->pcnf, cfm, 16))
1488 return SMP_CONFIRM_FAILED;
1489
1490 smp->passkey_round++;
1491
1492 if (smp->passkey_round == 20) {
1493 /* Generate MacKey and LTK */
1494 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1495 return SMP_UNSPECIFIED;
1496 }
1497
1498 /* The round is only complete when the initiator
1499 * receives pairing random.
1500 */
1501 if (!hcon->out) {
1502 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1503 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001504 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001505 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001506 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001507 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001508 return 0;
1509 }
1510
1511 /* Start the next round */
1512 if (smp->passkey_round != 20)
1513 return sc_passkey_round(smp, 0);
1514
1515 /* Passkey rounds are complete - start DHKey Check */
1516 sc_dhkey_check(smp);
1517 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1518
1519 break;
1520
1521 case SMP_CMD_PAIRING_CONFIRM:
1522 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1523 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1524 return 0;
1525 }
1526
1527 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1528
1529 if (hcon->out) {
1530 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1531 sizeof(smp->prnd), smp->prnd);
1532 return 0;
1533 }
1534
1535 return sc_passkey_send_confirm(smp);
1536
1537 case SMP_CMD_PUBLIC_KEY:
1538 default:
1539 /* Initiating device starts the round */
1540 if (!hcon->out)
1541 return 0;
1542
1543 BT_DBG("%s Starting passkey round %u", hdev->name,
1544 smp->passkey_round + 1);
1545
1546 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1547
1548 return sc_passkey_send_confirm(smp);
1549 }
1550
1551 return 0;
1552}
1553
Johan Hedbergdddd3052014-06-01 15:38:09 +03001554static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1555{
Johan Hedberg38606f12014-06-25 11:10:28 +03001556 struct l2cap_conn *conn = smp->conn;
1557 struct hci_conn *hcon = conn->hcon;
1558 u8 smp_op;
1559
1560 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1561
Johan Hedbergdddd3052014-06-01 15:38:09 +03001562 switch (mgmt_op) {
1563 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1564 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1565 return 0;
1566 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1567 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1568 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001569 case MGMT_OP_USER_PASSKEY_REPLY:
1570 hcon->passkey_notify = le32_to_cpu(passkey);
1571 smp->passkey_round = 0;
1572
1573 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1574 smp_op = SMP_CMD_PAIRING_CONFIRM;
1575 else
1576 smp_op = 0;
1577
1578 if (sc_passkey_round(smp, smp_op))
1579 return -EIO;
1580
1581 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001582 }
1583
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001584 /* Initiator sends DHKey check first */
1585 if (hcon->out) {
1586 sc_dhkey_check(smp);
1587 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1588 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1589 sc_dhkey_check(smp);
1590 sc_add_ltk(smp);
1591 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001592
1593 return 0;
1594}
1595
Brian Gix2b64d152011-12-21 16:12:12 -08001596int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1597{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001598 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001599 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001600 struct smp_chan *smp;
1601 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001602 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001603
1604 BT_DBG("");
1605
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001606 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001607 return -ENOTCONN;
1608
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001609 chan = conn->smp;
1610 if (!chan)
1611 return -ENOTCONN;
1612
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001613 l2cap_chan_lock(chan);
1614 if (!chan->data) {
1615 err = -ENOTCONN;
1616 goto unlock;
1617 }
1618
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001619 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001620
Johan Hedberg760b0182014-06-06 11:44:05 +03001621 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1622 err = sc_user_reply(smp, mgmt_op, passkey);
1623 goto unlock;
1624 }
1625
Brian Gix2b64d152011-12-21 16:12:12 -08001626 switch (mgmt_op) {
1627 case MGMT_OP_USER_PASSKEY_REPLY:
1628 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001629 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001630 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001631 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001632 /* Fall Through */
1633 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001634 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001635 break;
1636 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1637 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001638 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001639 err = 0;
1640 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001641 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001642 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001643 err = -EOPNOTSUPP;
1644 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001645 }
1646
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001647 err = 0;
1648
Brian Gix2b64d152011-12-21 16:12:12 -08001649 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001650 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1651 u8 rsp = smp_confirm(smp);
1652 if (rsp)
1653 smp_failure(conn, rsp);
1654 }
Brian Gix2b64d152011-12-21 16:12:12 -08001655
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001656unlock:
1657 l2cap_chan_unlock(chan);
1658 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001659}
1660
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001661static void build_bredr_pairing_cmd(struct smp_chan *smp,
1662 struct smp_cmd_pairing *req,
1663 struct smp_cmd_pairing *rsp)
1664{
1665 struct l2cap_conn *conn = smp->conn;
1666 struct hci_dev *hdev = conn->hcon->hdev;
1667 u8 local_dist = 0, remote_dist = 0;
1668
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001669 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001670 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1671 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1672 }
1673
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001674 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001675 remote_dist |= SMP_DIST_ID_KEY;
1676
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001677 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001678 local_dist |= SMP_DIST_ID_KEY;
1679
1680 if (!rsp) {
1681 memset(req, 0, sizeof(*req));
1682
1683 req->init_key_dist = local_dist;
1684 req->resp_key_dist = remote_dist;
1685 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1686
1687 smp->remote_key_dist = remote_dist;
1688
1689 return;
1690 }
1691
1692 memset(rsp, 0, sizeof(*rsp));
1693
1694 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
1695 rsp->init_key_dist = req->init_key_dist & remote_dist;
1696 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1697
1698 smp->remote_key_dist = rsp->init_key_dist;
1699}
1700
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001701static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001702{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001703 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001704 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001705 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001706 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001707 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001708 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001709
1710 BT_DBG("conn %p", conn);
1711
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001712 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001713 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001714
Johan Hedberg40bef302014-07-16 11:42:27 +03001715 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001716 return SMP_CMD_NOTSUPP;
1717
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001718 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001719 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001720 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001721 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001722
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001723 if (!smp)
1724 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001725
Johan Hedbergc05b9332014-09-10 17:37:42 -07001726 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001727 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001728
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001729 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001730 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001731 return SMP_PAIRING_NOTSUPP;
1732
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001733 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001734 return SMP_AUTH_REQUIREMENTS;
1735
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001736 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1737 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001738 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001739
Johan Hedbergcb06d362015-03-16 21:12:34 +02001740 /* If the remote side's OOB flag is set it means it has
1741 * successfully received our local OOB data - therefore set the
1742 * flag to indicate that local OOB is in use.
1743 */
Johan Hedberg58428562015-03-16 11:45:45 +02001744 if (req->oob_flag == SMP_OOB_PRESENT)
1745 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1746
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001747 /* SMP over BR/EDR requires special treatment */
1748 if (conn->hcon->type == ACL_LINK) {
1749 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001750 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001751 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001752 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1753
1754 set_bit(SMP_FLAG_SC, &smp->flags);
1755
1756 build_bredr_pairing_cmd(smp, req, &rsp);
1757
1758 key_size = min(req->max_key_size, rsp.max_key_size);
1759 if (check_enc_key_size(conn, key_size))
1760 return SMP_ENC_KEY_SIZE;
1761
1762 /* Clear bits which are generated but not distributed */
1763 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1764
1765 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1766 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1767 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1768
1769 smp_distribute_keys(smp);
1770 return 0;
1771 }
1772
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001773 build_pairing_cmd(conn, req, &rsp, auth);
1774
1775 if (rsp.auth_req & SMP_AUTH_SC)
1776 set_bit(SMP_FLAG_SC, &smp->flags);
1777
Johan Hedberg5be5e272014-09-10 17:58:54 -07001778 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001779 sec_level = BT_SECURITY_MEDIUM;
1780 else
1781 sec_level = authreq_to_seclevel(auth);
1782
Johan Hedbergc7262e72014-06-17 13:07:37 +03001783 if (sec_level > conn->hcon->pending_sec_level)
1784 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001785
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001786 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001787 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1788 u8 method;
1789
1790 method = get_auth_method(smp, conn->hcon->io_capability,
1791 req->io_capability);
1792 if (method == JUST_WORKS || method == JUST_CFM)
1793 return SMP_AUTH_REQUIREMENTS;
1794 }
1795
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001796 key_size = min(req->max_key_size, rsp.max_key_size);
1797 if (check_enc_key_size(conn, key_size))
1798 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001799
Johan Hedberge84a6b12013-12-02 10:49:03 +02001800 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001801
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001802 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1803 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001804
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001805 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001806
1807 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1808
1809 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1810 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1811 /* Clear bits which are generated but not distributed */
1812 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1813 /* Wait for Public Key from Initiating Device */
1814 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001815 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001816
Marcel Holtmann983f9812015-03-11 17:47:40 -07001817 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1818
Brian Gix2b64d152011-12-21 16:12:12 -08001819 /* Request setup of TK */
1820 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1821 if (ret)
1822 return SMP_UNSPECIFIED;
1823
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001824 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001825}
1826
Johan Hedberg3b191462014-06-06 10:50:15 +03001827static u8 sc_send_public_key(struct smp_chan *smp)
1828{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001829 struct hci_dev *hdev = smp->conn->hcon->hdev;
1830
Johan Hedberg3b191462014-06-06 10:50:15 +03001831 BT_DBG("");
1832
Johan Hedberg1a8bab42015-03-16 11:45:44 +02001833 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001834 struct l2cap_chan *chan = hdev->smp_data;
1835 struct smp_dev *smp_dev;
1836
1837 if (!chan || !chan->data)
1838 return SMP_UNSPECIFIED;
1839
1840 smp_dev = chan->data;
1841
1842 memcpy(smp->local_pk, smp_dev->local_pk, 64);
1843 memcpy(smp->local_sk, smp_dev->local_sk, 32);
Marcel Holtmannfb334fe2015-03-16 12:34:57 -07001844 memcpy(smp->lr, smp_dev->local_rand, 16);
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001845
1846 if (smp_dev->debug_key)
1847 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1848
1849 goto done;
1850 }
1851
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001852 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Johan Hedberg70157ef2014-06-24 15:22:59 +03001853 BT_DBG("Using debug keys");
1854 memcpy(smp->local_pk, debug_pk, 64);
1855 memcpy(smp->local_sk, debug_sk, 32);
1856 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1857 } else {
1858 while (true) {
1859 /* Generate local key pair for Secure Connections */
1860 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1861 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001862
Johan Hedberg70157ef2014-06-24 15:22:59 +03001863 /* This is unlikely, but we need to check that
1864 * we didn't accidentially generate a debug key.
1865 */
1866 if (memcmp(smp->local_sk, debug_sk, 32))
1867 break;
1868 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001869 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001870
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001871done:
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001872 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
Marcel Holtmann8e4e2ee2015-03-16 01:10:25 -07001873 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32);
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001874 SMP_DBG("Local Private Key: %32phN", smp->local_sk);
Johan Hedberg3b191462014-06-06 10:50:15 +03001875
1876 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1877
1878 return 0;
1879}
1880
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001881static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001882{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001883 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001884 struct l2cap_chan *chan = conn->smp;
1885 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001886 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001887 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001888 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001889
1890 BT_DBG("conn %p", conn);
1891
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001892 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001893 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001894
Johan Hedberg40bef302014-07-16 11:42:27 +03001895 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001896 return SMP_CMD_NOTSUPP;
1897
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001898 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001899
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001900 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001901
1902 key_size = min(req->max_key_size, rsp->max_key_size);
1903 if (check_enc_key_size(conn, key_size))
1904 return SMP_ENC_KEY_SIZE;
1905
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001906 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001907
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001908 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001909 return SMP_AUTH_REQUIREMENTS;
1910
Johan Hedbergcb06d362015-03-16 21:12:34 +02001911 /* If the remote side's OOB flag is set it means it has
1912 * successfully received our local OOB data - therefore set the
1913 * flag to indicate that local OOB is in use.
1914 */
Johan Hedberg58428562015-03-16 11:45:45 +02001915 if (rsp->oob_flag == SMP_OOB_PRESENT)
1916 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1917
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001918 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1919 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1920
1921 /* Update remote key distribution in case the remote cleared
1922 * some bits that we had enabled in our request.
1923 */
1924 smp->remote_key_dist &= rsp->resp_key_dist;
1925
1926 /* For BR/EDR this means we're done and can start phase 3 */
1927 if (conn->hcon->type == ACL_LINK) {
1928 /* Clear bits which are generated but not distributed */
1929 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1930 smp_distribute_keys(smp);
1931 return 0;
1932 }
1933
Johan Hedberg65668772014-05-16 11:03:34 +03001934 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1935 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001936 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1937 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001938
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001939 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001940 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1941 u8 method;
1942
1943 method = get_auth_method(smp, req->io_capability,
1944 rsp->io_capability);
1945 if (method == JUST_WORKS || method == JUST_CFM)
1946 return SMP_AUTH_REQUIREMENTS;
1947 }
1948
Johan Hedberge84a6b12013-12-02 10:49:03 +02001949 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001950
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001951 /* Update remote key distribution in case the remote cleared
1952 * some bits that we had enabled in our request.
1953 */
1954 smp->remote_key_dist &= rsp->resp_key_dist;
1955
Johan Hedberg3b191462014-06-06 10:50:15 +03001956 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1957 /* Clear bits which are generated but not distributed */
1958 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1959 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1960 return sc_send_public_key(smp);
1961 }
1962
Johan Hedbergc05b9332014-09-10 17:37:42 -07001963 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001964
Johan Hedberg476585e2012-06-06 18:54:15 +08001965 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001966 if (ret)
1967 return SMP_UNSPECIFIED;
1968
Johan Hedberg4a74d652014-05-20 09:45:50 +03001969 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001970
1971 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001972 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001973 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001974
1975 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001976}
1977
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001978static u8 sc_check_confirm(struct smp_chan *smp)
1979{
1980 struct l2cap_conn *conn = smp->conn;
1981
1982 BT_DBG("");
1983
1984 /* Public Key exchange must happen before any other steps */
1985 if (!test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
1986 return SMP_UNSPECIFIED;
1987
Johan Hedberg38606f12014-06-25 11:10:28 +03001988 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1989 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1990
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001991 if (conn->hcon->out) {
1992 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1993 smp->prnd);
1994 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1995 }
1996
1997 return 0;
1998}
1999
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002000static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002001{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002002 struct l2cap_chan *chan = conn->smp;
2003 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002004
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002005 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
2006
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002007 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002008 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002009
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002010 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
2011 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002012
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002013 if (test_bit(SMP_FLAG_SC, &smp->flags))
2014 return sc_check_confirm(smp);
2015
Johan Hedbergb28b4942014-09-05 22:19:55 +03002016 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02002017 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2018 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002019 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2020 return 0;
2021 }
2022
2023 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002024 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07002025
2026 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002027
2028 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002029}
2030
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002031static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002032{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002033 struct l2cap_chan *chan = conn->smp;
2034 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002035 struct hci_conn *hcon = conn->hcon;
2036 u8 *pkax, *pkbx, *na, *nb;
2037 u32 passkey;
2038 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002039
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002040 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002041
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002042 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002043 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002044
Johan Hedberg943a7322014-03-18 12:58:24 +02002045 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002046 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002047
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002048 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2049 return smp_random(smp);
2050
Johan Hedberg580039e2014-12-03 16:26:37 +02002051 if (hcon->out) {
2052 pkax = smp->local_pk;
2053 pkbx = smp->remote_pk;
2054 na = smp->prnd;
2055 nb = smp->rrnd;
2056 } else {
2057 pkax = smp->remote_pk;
2058 pkbx = smp->local_pk;
2059 na = smp->rrnd;
2060 nb = smp->prnd;
2061 }
2062
Johan Hedberga29b0732014-10-28 15:17:05 +01002063 if (smp->method == REQ_OOB) {
2064 if (!hcon->out)
2065 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2066 sizeof(smp->prnd), smp->prnd);
2067 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2068 goto mackey_and_ltk;
2069 }
2070
Johan Hedberg38606f12014-06-25 11:10:28 +03002071 /* Passkey entry has special treatment */
2072 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2073 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2074
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002075 if (hcon->out) {
2076 u8 cfm[16];
2077
2078 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2079 smp->rrnd, 0, cfm);
2080 if (err)
2081 return SMP_UNSPECIFIED;
2082
2083 if (memcmp(smp->pcnf, cfm, 16))
2084 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002085 } else {
2086 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2087 smp->prnd);
2088 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002089 }
2090
Johan Hedberga29b0732014-10-28 15:17:05 +01002091mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002092 /* Generate MacKey and LTK */
2093 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2094 if (err)
2095 return SMP_UNSPECIFIED;
2096
Johan Hedberga29b0732014-10-28 15:17:05 +01002097 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002098 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002099 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002100 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2101 }
2102 return 0;
2103 }
2104
Johan Hedberg38606f12014-06-25 11:10:28 +03002105 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002106 if (err)
2107 return SMP_UNSPECIFIED;
2108
Johan Hedberg38606f12014-06-25 11:10:28 +03002109 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
2110 hcon->dst_type, passkey, 0);
2111 if (err)
2112 return SMP_UNSPECIFIED;
2113
2114 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2115
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002116 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002117}
2118
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002119static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002120{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002121 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002122 struct hci_conn *hcon = conn->hcon;
2123
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002124 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002125 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002126 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002127
Johan Hedberga6f78332014-09-10 17:37:45 -07002128 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002129 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002130
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002131 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002132 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002133
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002134 hci_le_start_enc(hcon, key->ediv, key->rand, key->val);
2135 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002136
Johan Hedbergfe59a052014-07-01 19:14:12 +03002137 /* We never store STKs for master role, so clear this flag */
2138 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2139
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002140 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002141}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002142
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002143bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2144 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002145{
2146 if (sec_level == BT_SECURITY_LOW)
2147 return true;
2148
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002149 /* If we're encrypted with an STK but the caller prefers using
2150 * LTK claim insufficient security. This way we allow the
2151 * connection to be re-encrypted with an LTK, even if the LTK
2152 * provides the same level of security. Only exception is if we
2153 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002154 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002155 if (key_pref == SMP_USE_LTK &&
2156 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002157 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002158 return false;
2159
Johan Hedberg854f4722014-07-01 18:40:20 +03002160 if (hcon->sec_level >= sec_level)
2161 return true;
2162
2163 return false;
2164}
2165
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002166static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002167{
2168 struct smp_cmd_security_req *rp = (void *) skb->data;
2169 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002170 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002171 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002172 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002173 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002174
2175 BT_DBG("conn %p", conn);
2176
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002177 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002178 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002179
Johan Hedberg40bef302014-07-16 11:42:27 +03002180 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002181 return SMP_CMD_NOTSUPP;
2182
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002183 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002184
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002185 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002186 return SMP_AUTH_REQUIREMENTS;
2187
Johan Hedberg5be5e272014-09-10 17:58:54 -07002188 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002189 sec_level = BT_SECURITY_MEDIUM;
2190 else
2191 sec_level = authreq_to_seclevel(auth);
2192
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002193 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002194 return 0;
2195
Johan Hedbergc7262e72014-06-17 13:07:37 +03002196 if (sec_level > hcon->pending_sec_level)
2197 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002198
Johan Hedberg4dab7862012-06-07 14:58:37 +08002199 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002200 return 0;
2201
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002202 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002203 if (!smp)
2204 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002205
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002206 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002207 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002208 return SMP_PAIRING_NOTSUPP;
2209
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002210 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002211
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002212 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002213 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002214
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002215 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2216 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002217
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002218 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002219 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002220
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002221 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002222}
2223
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002224int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002225{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002226 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002227 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002228 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002229 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002230 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002231
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002232 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2233
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002234 /* This may be NULL if there's an unexpected disconnection */
2235 if (!conn)
2236 return 1;
2237
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002238 chan = conn->smp;
2239
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002240 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002241 return 1;
2242
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002243 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002244 return 1;
2245
Johan Hedbergc7262e72014-06-17 13:07:37 +03002246 if (sec_level > hcon->pending_sec_level)
2247 hcon->pending_sec_level = sec_level;
2248
Johan Hedberg40bef302014-07-16 11:42:27 +03002249 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002250 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2251 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002252
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002253 l2cap_chan_lock(chan);
2254
2255 /* If SMP is already in progress ignore this request */
2256 if (chan->data) {
2257 ret = 0;
2258 goto unlock;
2259 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002260
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002261 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002262 if (!smp) {
2263 ret = 1;
2264 goto unlock;
2265 }
Brian Gix2b64d152011-12-21 16:12:12 -08002266
2267 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002268
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002269 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED))
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002270 authreq |= SMP_AUTH_SC;
2271
Johan Hedberg79897d22014-06-01 09:45:24 +03002272 /* Require MITM if IO Capability allows or the security level
2273 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002274 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002275 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002276 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002277 authreq |= SMP_AUTH_MITM;
2278
Johan Hedberg40bef302014-07-16 11:42:27 +03002279 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002280 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002281
Brian Gix2b64d152011-12-21 16:12:12 -08002282 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002283 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2284 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002285
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002286 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002287 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002288 } else {
2289 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002290 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002291 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002292 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002293 }
2294
Johan Hedberg4a74d652014-05-20 09:45:50 +03002295 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002296 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002297
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002298unlock:
2299 l2cap_chan_unlock(chan);
2300 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002301}
2302
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002303static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2304{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002305 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002306 struct l2cap_chan *chan = conn->smp;
2307 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002308
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002309 BT_DBG("conn %p", conn);
2310
2311 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002312 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002313
Johan Hedbergb28b4942014-09-05 22:19:55 +03002314 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002315
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002316 skb_pull(skb, sizeof(*rp));
2317
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002318 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002319
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002320 return 0;
2321}
2322
2323static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2324{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002325 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002326 struct l2cap_chan *chan = conn->smp;
2327 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002328 struct hci_dev *hdev = conn->hcon->hdev;
2329 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002330 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002331 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002332
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002333 BT_DBG("conn %p", conn);
2334
2335 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002336 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002337
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002338 /* Mark the information as received */
2339 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2340
Johan Hedbergb28b4942014-09-05 22:19:55 +03002341 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2342 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002343 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2344 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002345
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002346 skb_pull(skb, sizeof(*rp));
2347
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002348 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002349 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002350 authenticated, smp->tk, smp->enc_key_size,
2351 rp->ediv, rp->rand);
2352 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002353 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002354 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002355
2356 return 0;
2357}
2358
Johan Hedbergfd349c02014-02-18 10:19:36 +02002359static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2360{
2361 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002362 struct l2cap_chan *chan = conn->smp;
2363 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002364
2365 BT_DBG("");
2366
2367 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002368 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002369
Johan Hedbergb28b4942014-09-05 22:19:55 +03002370 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002371
Johan Hedbergfd349c02014-02-18 10:19:36 +02002372 skb_pull(skb, sizeof(*info));
2373
2374 memcpy(smp->irk, info->irk, 16);
2375
2376 return 0;
2377}
2378
2379static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2380 struct sk_buff *skb)
2381{
2382 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002383 struct l2cap_chan *chan = conn->smp;
2384 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002385 struct hci_conn *hcon = conn->hcon;
2386 bdaddr_t rpa;
2387
2388 BT_DBG("");
2389
2390 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002391 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002392
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002393 /* Mark the information as received */
2394 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2395
Johan Hedbergb28b4942014-09-05 22:19:55 +03002396 if (smp->remote_key_dist & SMP_DIST_SIGN)
2397 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2398
Johan Hedbergfd349c02014-02-18 10:19:36 +02002399 skb_pull(skb, sizeof(*info));
2400
Johan Hedberga9a58f82014-02-25 22:24:37 +02002401 /* Strictly speaking the Core Specification (4.1) allows sending
2402 * an empty address which would force us to rely on just the IRK
2403 * as "identity information". However, since such
2404 * implementations are not known of and in order to not over
2405 * complicate our implementation, simply pretend that we never
2406 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002407 *
2408 * The Identity Address must also be a Static Random or Public
2409 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002410 */
Johan Hedberge12af482015-01-14 20:51:37 +02002411 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2412 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Johan Hedberga9a58f82014-02-25 22:24:37 +02002413 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002414 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002415 }
2416
Johan Hedbergfd349c02014-02-18 10:19:36 +02002417 bacpy(&smp->id_addr, &info->bdaddr);
2418 smp->id_addr_type = info->addr_type;
2419
2420 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2421 bacpy(&rpa, &hcon->dst);
2422 else
2423 bacpy(&rpa, BDADDR_ANY);
2424
Johan Hedberg23d0e122014-02-19 14:57:46 +02002425 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2426 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002427
Johan Hedberg31dd6242014-06-27 14:23:02 +03002428distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002429 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2430 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002431
2432 return 0;
2433}
2434
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002435static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2436{
2437 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002438 struct l2cap_chan *chan = conn->smp;
2439 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002440 struct smp_csrk *csrk;
2441
2442 BT_DBG("conn %p", conn);
2443
2444 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002445 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002446
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002447 /* Mark the information as received */
2448 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2449
2450 skb_pull(skb, sizeof(*rp));
2451
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002452 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2453 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002454 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2455 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2456 else
2457 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002458 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2459 }
2460 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002461 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002462
2463 return 0;
2464}
2465
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002466static u8 sc_select_method(struct smp_chan *smp)
2467{
2468 struct l2cap_conn *conn = smp->conn;
2469 struct hci_conn *hcon = conn->hcon;
2470 struct smp_cmd_pairing *local, *remote;
2471 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2472
Johan Hedberg1a8bab42015-03-16 11:45:44 +02002473 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) ||
2474 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags))
Johan Hedberga29b0732014-10-28 15:17:05 +01002475 return REQ_OOB;
2476
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002477 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2478 * which are needed as inputs to some crypto functions. To get
2479 * the "struct smp_cmd_pairing" from them we need to skip the
2480 * first byte which contains the opcode.
2481 */
2482 if (hcon->out) {
2483 local = (void *) &smp->preq[1];
2484 remote = (void *) &smp->prsp[1];
2485 } else {
2486 local = (void *) &smp->prsp[1];
2487 remote = (void *) &smp->preq[1];
2488 }
2489
2490 local_io = local->io_capability;
2491 remote_io = remote->io_capability;
2492
2493 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2494 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2495
2496 /* If either side wants MITM, look up the method from the table,
2497 * otherwise use JUST WORKS.
2498 */
2499 if (local_mitm || remote_mitm)
2500 method = get_auth_method(smp, local_io, remote_io);
2501 else
2502 method = JUST_WORKS;
2503
2504 /* Don't confirm locally initiated pairing attempts */
2505 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2506 method = JUST_WORKS;
2507
2508 return method;
2509}
2510
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002511static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2512{
2513 struct smp_cmd_public_key *key = (void *) skb->data;
2514 struct hci_conn *hcon = conn->hcon;
2515 struct l2cap_chan *chan = conn->smp;
2516 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002517 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002518 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002519 int err;
2520
2521 BT_DBG("conn %p", conn);
2522
2523 if (skb->len < sizeof(*key))
2524 return SMP_INVALID_PARAMS;
2525
2526 memcpy(smp->remote_pk, key, 64);
2527
Johan Hedberga8ca6172015-03-16 18:12:57 +02002528 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {
2529 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2530 smp->rr, 0, cfm.confirm_val);
2531 if (err)
2532 return SMP_UNSPECIFIED;
2533
2534 if (memcmp(cfm.confirm_val, smp->pcnf, 16))
2535 return SMP_CONFIRM_FAILED;
2536 }
2537
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002538 /* Non-initiating device sends its public key after receiving
2539 * the key from the initiating device.
2540 */
2541 if (!hcon->out) {
2542 err = sc_send_public_key(smp);
2543 if (err)
2544 return err;
2545 }
2546
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002547 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
Marcel Holtmanne0915262015-03-16 12:34:55 -07002548 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002549
2550 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2551 return SMP_UNSPECIFIED;
2552
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002553 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002554
2555 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2556
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002557 smp->method = sc_select_method(smp);
2558
2559 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2560
2561 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2562 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2563 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2564 else
2565 hcon->pending_sec_level = BT_SECURITY_FIPS;
2566
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002567 if (!memcmp(debug_pk, smp->remote_pk, 64))
2568 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2569
Johan Hedberg38606f12014-06-25 11:10:28 +03002570 if (smp->method == DSP_PASSKEY) {
2571 get_random_bytes(&hcon->passkey_notify,
2572 sizeof(hcon->passkey_notify));
2573 hcon->passkey_notify %= 1000000;
2574 hcon->passkey_entered = 0;
2575 smp->passkey_round = 0;
2576 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2577 hcon->dst_type,
2578 hcon->passkey_notify,
2579 hcon->passkey_entered))
2580 return SMP_UNSPECIFIED;
2581 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2582 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2583 }
2584
Johan Hedberg94ea7252015-03-16 11:45:46 +02002585 if (smp->method == REQ_OOB) {
Johan Hedberga29b0732014-10-28 15:17:05 +01002586 if (hcon->out)
2587 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2588 sizeof(smp->prnd), smp->prnd);
2589
2590 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2591
2592 return 0;
2593 }
2594
Johan Hedberg38606f12014-06-25 11:10:28 +03002595 if (hcon->out)
2596 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2597
2598 if (smp->method == REQ_PASSKEY) {
2599 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2600 hcon->dst_type))
2601 return SMP_UNSPECIFIED;
2602 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2603 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2604 return 0;
2605 }
2606
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002607 /* The Initiating device waits for the non-initiating device to
2608 * send the confirm value.
2609 */
2610 if (conn->hcon->out)
2611 return 0;
2612
2613 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2614 0, cfm.confirm_val);
2615 if (err)
2616 return SMP_UNSPECIFIED;
2617
2618 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2619 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2620
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002621 return 0;
2622}
2623
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002624static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2625{
2626 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2627 struct l2cap_chan *chan = conn->smp;
2628 struct hci_conn *hcon = conn->hcon;
2629 struct smp_chan *smp = chan->data;
2630 u8 a[7], b[7], *local_addr, *remote_addr;
2631 u8 io_cap[3], r[16], e[16];
2632 int err;
2633
2634 BT_DBG("conn %p", conn);
2635
2636 if (skb->len < sizeof(*check))
2637 return SMP_INVALID_PARAMS;
2638
2639 memcpy(a, &hcon->init_addr, 6);
2640 memcpy(b, &hcon->resp_addr, 6);
2641 a[6] = hcon->init_addr_type;
2642 b[6] = hcon->resp_addr_type;
2643
2644 if (hcon->out) {
2645 local_addr = a;
2646 remote_addr = b;
2647 memcpy(io_cap, &smp->prsp[1], 3);
2648 } else {
2649 local_addr = b;
2650 remote_addr = a;
2651 memcpy(io_cap, &smp->preq[1], 3);
2652 }
2653
2654 memset(r, 0, sizeof(r));
2655
Johan Hedberg38606f12014-06-25 11:10:28 +03002656 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2657 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg882fafa2015-03-16 11:45:43 +02002658 else if (smp->method == REQ_OOB)
2659 memcpy(r, smp->lr, 16);
Johan Hedberg38606f12014-06-25 11:10:28 +03002660
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002661 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2662 io_cap, remote_addr, local_addr, e);
2663 if (err)
2664 return SMP_UNSPECIFIED;
2665
2666 if (memcmp(check->e, e, 16))
2667 return SMP_DHKEY_CHECK_FAILED;
2668
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002669 if (!hcon->out) {
2670 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2671 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2672 return 0;
2673 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002674
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002675 /* Slave sends DHKey check as response to master */
2676 sc_dhkey_check(smp);
2677 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002678
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002679 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002680
2681 if (hcon->out) {
2682 hci_le_start_enc(hcon, 0, 0, smp->tk);
2683 hcon->enc_key_size = smp->enc_key_size;
2684 }
2685
2686 return 0;
2687}
2688
Johan Hedberg1408bb62014-06-04 22:45:57 +03002689static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2690 struct sk_buff *skb)
2691{
2692 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2693
2694 BT_DBG("value 0x%02x", kp->value);
2695
2696 return 0;
2697}
2698
Johan Hedberg4befb862014-08-11 22:06:38 +03002699static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002700{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002701 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002702 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002703 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002704 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002705 int err = 0;
2706
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002707 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002708 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002709
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002710 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002711 reason = SMP_PAIRING_NOTSUPP;
2712 goto done;
2713 }
2714
Marcel Holtmann92381f52013-10-03 01:23:08 -07002715 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002716 skb_pull(skb, sizeof(code));
2717
Johan Hedbergb28b4942014-09-05 22:19:55 +03002718 smp = chan->data;
2719
2720 if (code > SMP_CMD_MAX)
2721 goto drop;
2722
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002723 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002724 goto drop;
2725
2726 /* If we don't have a context the only allowed commands are
2727 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002728 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002729 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2730 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002731
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002732 switch (code) {
2733 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002734 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002735 break;
2736
2737 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002738 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002739 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002740 break;
2741
2742 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002743 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002744 break;
2745
2746 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002747 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002748 break;
2749
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002750 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002751 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002752 break;
2753
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002754 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002755 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002756 break;
2757
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002758 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002759 reason = smp_cmd_encrypt_info(conn, skb);
2760 break;
2761
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002762 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002763 reason = smp_cmd_master_ident(conn, skb);
2764 break;
2765
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002766 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002767 reason = smp_cmd_ident_info(conn, skb);
2768 break;
2769
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002770 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002771 reason = smp_cmd_ident_addr_info(conn, skb);
2772 break;
2773
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002774 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002775 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002776 break;
2777
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002778 case SMP_CMD_PUBLIC_KEY:
2779 reason = smp_cmd_public_key(conn, skb);
2780 break;
2781
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002782 case SMP_CMD_DHKEY_CHECK:
2783 reason = smp_cmd_dhkey_check(conn, skb);
2784 break;
2785
Johan Hedberg1408bb62014-06-04 22:45:57 +03002786 case SMP_CMD_KEYPRESS_NOTIFY:
2787 reason = smp_cmd_keypress_notify(conn, skb);
2788 break;
2789
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002790 default:
2791 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002792 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002793 goto done;
2794 }
2795
2796done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002797 if (!err) {
2798 if (reason)
2799 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002800 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002801 }
2802
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002803 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002804
2805drop:
2806 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2807 code, &hcon->dst);
2808 kfree_skb(skb);
2809 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002810}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002811
Johan Hedberg70db83c2014-08-08 09:37:16 +03002812static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2813{
2814 struct l2cap_conn *conn = chan->conn;
2815
2816 BT_DBG("chan %p", chan);
2817
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002818 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002819 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002820
Johan Hedberg70db83c2014-08-08 09:37:16 +03002821 conn->smp = NULL;
2822 l2cap_chan_put(chan);
2823}
2824
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002825static void bredr_pairing(struct l2cap_chan *chan)
2826{
2827 struct l2cap_conn *conn = chan->conn;
2828 struct hci_conn *hcon = conn->hcon;
2829 struct hci_dev *hdev = hcon->hdev;
2830 struct smp_cmd_pairing req;
2831 struct smp_chan *smp;
2832
2833 BT_DBG("chan %p", chan);
2834
2835 /* Only new pairings are interesting */
2836 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2837 return;
2838
2839 /* Don't bother if we're not encrypted */
2840 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2841 return;
2842
2843 /* Only master may initiate SMP over BR/EDR */
2844 if (hcon->role != HCI_ROLE_MASTER)
2845 return;
2846
2847 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002848 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002849 return;
2850
2851 /* BR/EDR must use Secure Connections for SMP */
2852 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07002853 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002854 return;
2855
2856 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002857 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002858 return;
2859
2860 /* Don't bother if remote LE support is not enabled */
2861 if (!lmp_host_le_capable(hcon))
2862 return;
2863
2864 /* Remote must support SMP fixed chan for BR/EDR */
2865 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2866 return;
2867
2868 /* Don't bother if SMP is already ongoing */
2869 if (chan->data)
2870 return;
2871
2872 smp = smp_chan_create(conn);
2873 if (!smp) {
2874 BT_ERR("%s unable to create SMP context for BR/EDR",
2875 hdev->name);
2876 return;
2877 }
2878
2879 set_bit(SMP_FLAG_SC, &smp->flags);
2880
2881 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2882
2883 /* Prepare and send the BR/EDR SMP Pairing Request */
2884 build_bredr_pairing_cmd(smp, &req, NULL);
2885
2886 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2887 memcpy(&smp->preq[1], &req, sizeof(req));
2888
2889 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2890 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2891}
2892
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002893static void smp_resume_cb(struct l2cap_chan *chan)
2894{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002895 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002896 struct l2cap_conn *conn = chan->conn;
2897 struct hci_conn *hcon = conn->hcon;
2898
2899 BT_DBG("chan %p", chan);
2900
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002901 if (hcon->type == ACL_LINK) {
2902 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002903 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002904 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002905
Johan Hedberg86d14072014-08-11 22:06:43 +03002906 if (!smp)
2907 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002908
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002909 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2910 return;
2911
Johan Hedberg86d14072014-08-11 22:06:43 +03002912 cancel_delayed_work(&smp->security_timer);
2913
Johan Hedbergd6268e82014-09-05 22:19:51 +03002914 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002915}
2916
Johan Hedberg70db83c2014-08-08 09:37:16 +03002917static void smp_ready_cb(struct l2cap_chan *chan)
2918{
2919 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002920 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03002921
2922 BT_DBG("chan %p", chan);
2923
2924 conn->smp = chan;
2925 l2cap_chan_hold(chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002926
2927 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2928 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03002929}
2930
Johan Hedberg4befb862014-08-11 22:06:38 +03002931static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
2932{
2933 int err;
2934
2935 BT_DBG("chan %p", chan);
2936
2937 err = smp_sig_channel(chan, skb);
2938 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03002939 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03002940
Johan Hedbergb68fda62014-08-11 22:06:40 +03002941 if (smp)
2942 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03002943
Johan Hedberg1e91c292014-08-18 20:33:29 +03002944 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03002945 }
2946
2947 return err;
2948}
2949
Johan Hedberg70db83c2014-08-08 09:37:16 +03002950static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
2951 unsigned long hdr_len,
2952 unsigned long len, int nb)
2953{
2954 struct sk_buff *skb;
2955
2956 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
2957 if (!skb)
2958 return ERR_PTR(-ENOMEM);
2959
2960 skb->priority = HCI_PRIO_MAX;
2961 bt_cb(skb)->chan = chan;
2962
2963 return skb;
2964}
2965
2966static const struct l2cap_ops smp_chan_ops = {
2967 .name = "Security Manager",
2968 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002969 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002970 .alloc_skb = smp_alloc_skb_cb,
2971 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002972 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002973
2974 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002975 .state_change = l2cap_chan_no_state_change,
2976 .close = l2cap_chan_no_close,
2977 .defer = l2cap_chan_no_defer,
2978 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002979 .set_shutdown = l2cap_chan_no_set_shutdown,
2980 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03002981};
2982
2983static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
2984{
2985 struct l2cap_chan *chan;
2986
2987 BT_DBG("pchan %p", pchan);
2988
2989 chan = l2cap_chan_create();
2990 if (!chan)
2991 return NULL;
2992
2993 chan->chan_type = pchan->chan_type;
2994 chan->ops = &smp_chan_ops;
2995 chan->scid = pchan->scid;
2996 chan->dcid = chan->scid;
2997 chan->imtu = pchan->imtu;
2998 chan->omtu = pchan->omtu;
2999 chan->mode = pchan->mode;
3000
Johan Hedbergabe84902014-11-12 22:22:21 +02003001 /* Other L2CAP channels may request SMP routines in order to
3002 * change the security level. This means that the SMP channel
3003 * lock must be considered in its own category to avoid lockdep
3004 * warnings.
3005 */
3006 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
3007
Johan Hedberg70db83c2014-08-08 09:37:16 +03003008 BT_DBG("created chan %p", chan);
3009
3010 return chan;
3011}
3012
3013static const struct l2cap_ops smp_root_chan_ops = {
3014 .name = "Security Manager Root",
3015 .new_connection = smp_new_conn_cb,
3016
3017 /* None of these are implemented for the root channel */
3018 .close = l2cap_chan_no_close,
3019 .alloc_skb = l2cap_chan_no_alloc_skb,
3020 .recv = l2cap_chan_no_recv,
3021 .state_change = l2cap_chan_no_state_change,
3022 .teardown = l2cap_chan_no_teardown,
3023 .ready = l2cap_chan_no_ready,
3024 .defer = l2cap_chan_no_defer,
3025 .suspend = l2cap_chan_no_suspend,
3026 .resume = l2cap_chan_no_resume,
3027 .set_shutdown = l2cap_chan_no_set_shutdown,
3028 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003029};
3030
Johan Hedbergef8efe42014-08-13 15:12:32 +03003031static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003032{
Johan Hedberg70db83c2014-08-08 09:37:16 +03003033 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003034 struct smp_dev *smp;
3035 struct crypto_blkcipher *tfm_aes;
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003036 struct crypto_hash *tfm_cmac;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003037
Johan Hedbergef8efe42014-08-13 15:12:32 +03003038 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003039 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03003040 goto create_chan;
3041 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03003042
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003043 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3044 if (!smp)
3045 return ERR_PTR(-ENOMEM);
3046
3047 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003048 if (IS_ERR(tfm_aes)) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003049 BT_ERR("Unable to create ECB crypto context");
3050 kzfree(smp);
Fengguang Wufe700772014-12-08 03:04:38 +08003051 return ERR_CAST(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003052 }
3053
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003054 tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
3055 if (IS_ERR(tfm_cmac)) {
3056 BT_ERR("Unable to create CMAC crypto context");
3057 crypto_free_blkcipher(tfm_aes);
3058 kzfree(smp);
3059 return ERR_CAST(tfm_cmac);
3060 }
3061
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003062 smp->tfm_aes = tfm_aes;
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003063 smp->tfm_cmac = tfm_cmac;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003064
Johan Hedbergef8efe42014-08-13 15:12:32 +03003065create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003066 chan = l2cap_chan_create();
3067 if (!chan) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003068 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003069 crypto_free_hash(smp->tfm_cmac);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003070 kzfree(smp);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003071 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003072 }
3073
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003074 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003075
Johan Hedbergef8efe42014-08-13 15:12:32 +03003076 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003077
3078 l2cap_chan_set_defaults(chan);
3079
Marcel Holtmann157029b2015-01-14 15:43:09 -08003080 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003081 u8 bdaddr_type;
3082
3083 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3084
3085 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003086 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003087 else
3088 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003089 } else {
3090 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003091 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003092 }
3093
Johan Hedberg70db83c2014-08-08 09:37:16 +03003094 chan->state = BT_LISTEN;
3095 chan->mode = L2CAP_MODE_BASIC;
3096 chan->imtu = L2CAP_DEFAULT_MTU;
3097 chan->ops = &smp_root_chan_ops;
3098
Johan Hedbergabe84902014-11-12 22:22:21 +02003099 /* Set correct nesting level for a parent/listening channel */
3100 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3101
Johan Hedbergef8efe42014-08-13 15:12:32 +03003102 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003103}
3104
Johan Hedbergef8efe42014-08-13 15:12:32 +03003105static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003106{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003107 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003108
Johan Hedbergef8efe42014-08-13 15:12:32 +03003109 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003110
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003111 smp = chan->data;
3112 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003113 chan->data = NULL;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003114 if (smp->tfm_aes)
3115 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003116 if (smp->tfm_cmac)
3117 crypto_free_hash(smp->tfm_cmac);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003118 kzfree(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003119 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003120
Johan Hedberg70db83c2014-08-08 09:37:16 +03003121 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003122}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003123
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003124static ssize_t force_bredr_smp_read(struct file *file,
3125 char __user *user_buf,
3126 size_t count, loff_t *ppos)
3127{
3128 struct hci_dev *hdev = file->private_data;
3129 char buf[3];
3130
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003131 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP) ? 'Y': 'N';
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003132 buf[1] = '\n';
3133 buf[2] = '\0';
3134 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3135}
3136
3137static ssize_t force_bredr_smp_write(struct file *file,
3138 const char __user *user_buf,
3139 size_t count, loff_t *ppos)
3140{
3141 struct hci_dev *hdev = file->private_data;
3142 char buf[32];
3143 size_t buf_size = min(count, (sizeof(buf)-1));
3144 bool enable;
3145
3146 if (copy_from_user(buf, user_buf, buf_size))
3147 return -EFAULT;
3148
3149 buf[buf_size] = '\0';
3150 if (strtobool(buf, &enable))
3151 return -EINVAL;
3152
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003153 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003154 return -EALREADY;
3155
3156 if (enable) {
3157 struct l2cap_chan *chan;
3158
3159 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3160 if (IS_ERR(chan))
3161 return PTR_ERR(chan);
3162
3163 hdev->smp_bredr_data = chan;
3164 } else {
3165 struct l2cap_chan *chan;
3166
3167 chan = hdev->smp_bredr_data;
3168 hdev->smp_bredr_data = NULL;
3169 smp_del_chan(chan);
3170 }
3171
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003172 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003173
3174 return count;
3175}
3176
3177static const struct file_operations force_bredr_smp_fops = {
3178 .open = simple_open,
3179 .read = force_bredr_smp_read,
3180 .write = force_bredr_smp_write,
3181 .llseek = default_llseek,
3182};
3183
Johan Hedbergef8efe42014-08-13 15:12:32 +03003184int smp_register(struct hci_dev *hdev)
3185{
3186 struct l2cap_chan *chan;
3187
3188 BT_DBG("%s", hdev->name);
3189
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003190 /* If the controller does not support Low Energy operation, then
3191 * there is also no need to register any SMP channel.
3192 */
3193 if (!lmp_le_capable(hdev))
3194 return 0;
3195
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003196 if (WARN_ON(hdev->smp_data)) {
3197 chan = hdev->smp_data;
3198 hdev->smp_data = NULL;
3199 smp_del_chan(chan);
3200 }
3201
Johan Hedbergef8efe42014-08-13 15:12:32 +03003202 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3203 if (IS_ERR(chan))
3204 return PTR_ERR(chan);
3205
3206 hdev->smp_data = chan;
3207
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003208 /* If the controller does not support BR/EDR Secure Connections
3209 * feature, then the BR/EDR SMP channel shall not be present.
3210 *
3211 * To test this with Bluetooth 4.0 controllers, create a debugfs
3212 * switch that allows forcing BR/EDR SMP support and accepting
3213 * cross-transport pairing on non-AES encrypted connections.
3214 */
3215 if (!lmp_sc_capable(hdev)) {
3216 debugfs_create_file("force_bredr_smp", 0644, hdev->debugfs,
3217 hdev, &force_bredr_smp_fops);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003218 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003219 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003220
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003221 if (WARN_ON(hdev->smp_bredr_data)) {
3222 chan = hdev->smp_bredr_data;
3223 hdev->smp_bredr_data = NULL;
3224 smp_del_chan(chan);
3225 }
3226
Johan Hedbergef8efe42014-08-13 15:12:32 +03003227 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3228 if (IS_ERR(chan)) {
3229 int err = PTR_ERR(chan);
3230 chan = hdev->smp_data;
3231 hdev->smp_data = NULL;
3232 smp_del_chan(chan);
3233 return err;
3234 }
3235
3236 hdev->smp_bredr_data = chan;
3237
3238 return 0;
3239}
3240
3241void smp_unregister(struct hci_dev *hdev)
3242{
3243 struct l2cap_chan *chan;
3244
3245 if (hdev->smp_bredr_data) {
3246 chan = hdev->smp_bredr_data;
3247 hdev->smp_bredr_data = NULL;
3248 smp_del_chan(chan);
3249 }
3250
3251 if (hdev->smp_data) {
3252 chan = hdev->smp_data;
3253 hdev->smp_data = NULL;
3254 smp_del_chan(chan);
3255 }
3256}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003257
3258#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3259
Johan Hedbergcfc41982014-12-30 09:50:40 +02003260static int __init test_ah(struct crypto_blkcipher *tfm_aes)
3261{
3262 const u8 irk[16] = {
3263 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3264 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3265 const u8 r[3] = { 0x94, 0x81, 0x70 };
3266 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3267 u8 res[3];
3268 int err;
3269
3270 err = smp_ah(tfm_aes, irk, r, res);
3271 if (err)
3272 return err;
3273
3274 if (memcmp(res, exp, 3))
3275 return -EINVAL;
3276
3277 return 0;
3278}
3279
3280static int __init test_c1(struct crypto_blkcipher *tfm_aes)
3281{
3282 const u8 k[16] = {
3283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3285 const u8 r[16] = {
3286 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3287 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3288 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3289 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3290 const u8 _iat = 0x01;
3291 const u8 _rat = 0x00;
3292 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3293 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3294 const u8 exp[16] = {
3295 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3296 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3297 u8 res[16];
3298 int err;
3299
3300 err = smp_c1(tfm_aes, k, r, preq, pres, _iat, &ia, _rat, &ra, res);
3301 if (err)
3302 return err;
3303
3304 if (memcmp(res, exp, 16))
3305 return -EINVAL;
3306
3307 return 0;
3308}
3309
3310static int __init test_s1(struct crypto_blkcipher *tfm_aes)
3311{
3312 const u8 k[16] = {
3313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3315 const u8 r1[16] = {
3316 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3317 const u8 r2[16] = {
3318 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3319 const u8 exp[16] = {
3320 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3321 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3322 u8 res[16];
3323 int err;
3324
3325 err = smp_s1(tfm_aes, k, r1, r2, res);
3326 if (err)
3327 return err;
3328
3329 if (memcmp(res, exp, 16))
3330 return -EINVAL;
3331
3332 return 0;
3333}
3334
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003335static int __init test_f4(struct crypto_hash *tfm_cmac)
3336{
3337 const u8 u[32] = {
3338 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3339 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3340 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3341 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3342 const u8 v[32] = {
3343 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3344 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3345 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3346 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3347 const u8 x[16] = {
3348 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3349 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3350 const u8 z = 0x00;
3351 const u8 exp[16] = {
3352 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3353 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3354 u8 res[16];
3355 int err;
3356
3357 err = smp_f4(tfm_cmac, u, v, x, z, res);
3358 if (err)
3359 return err;
3360
3361 if (memcmp(res, exp, 16))
3362 return -EINVAL;
3363
3364 return 0;
3365}
3366
3367static int __init test_f5(struct crypto_hash *tfm_cmac)
3368{
3369 const u8 w[32] = {
3370 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3371 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3372 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3373 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3374 const u8 n1[16] = {
3375 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3376 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3377 const u8 n2[16] = {
3378 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3379 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3380 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3381 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3382 const u8 exp_ltk[16] = {
3383 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3384 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3385 const u8 exp_mackey[16] = {
3386 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3387 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3388 u8 mackey[16], ltk[16];
3389 int err;
3390
3391 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3392 if (err)
3393 return err;
3394
3395 if (memcmp(mackey, exp_mackey, 16))
3396 return -EINVAL;
3397
3398 if (memcmp(ltk, exp_ltk, 16))
3399 return -EINVAL;
3400
3401 return 0;
3402}
3403
3404static int __init test_f6(struct crypto_hash *tfm_cmac)
3405{
3406 const u8 w[16] = {
3407 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3408 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3409 const u8 n1[16] = {
3410 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3411 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3412 const u8 n2[16] = {
3413 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3414 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3415 const u8 r[16] = {
3416 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3417 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3418 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3419 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3420 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3421 const u8 exp[16] = {
3422 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3423 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3424 u8 res[16];
3425 int err;
3426
3427 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3428 if (err)
3429 return err;
3430
3431 if (memcmp(res, exp, 16))
3432 return -EINVAL;
3433
3434 return 0;
3435}
3436
3437static int __init test_g2(struct crypto_hash *tfm_cmac)
3438{
3439 const u8 u[32] = {
3440 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3441 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3442 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3443 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3444 const u8 v[32] = {
3445 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3446 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3447 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3448 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3449 const u8 x[16] = {
3450 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3451 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3452 const u8 y[16] = {
3453 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3454 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3455 const u32 exp_val = 0x2f9ed5ba % 1000000;
3456 u32 val;
3457 int err;
3458
3459 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3460 if (err)
3461 return err;
3462
3463 if (val != exp_val)
3464 return -EINVAL;
3465
3466 return 0;
3467}
3468
3469static int __init test_h6(struct crypto_hash *tfm_cmac)
3470{
3471 const u8 w[16] = {
3472 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3473 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3474 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3475 const u8 exp[16] = {
3476 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3477 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3478 u8 res[16];
3479 int err;
3480
3481 err = smp_h6(tfm_cmac, w, key_id, res);
3482 if (err)
3483 return err;
3484
3485 if (memcmp(res, exp, 16))
3486 return -EINVAL;
3487
3488 return 0;
3489}
3490
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003491static int __init run_selftests(struct crypto_blkcipher *tfm_aes,
3492 struct crypto_hash *tfm_cmac)
3493{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003494 ktime_t calltime, delta, rettime;
3495 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003496 int err;
3497
Marcel Holtmann255047b2014-12-30 00:11:20 -08003498 calltime = ktime_get();
3499
Johan Hedbergcfc41982014-12-30 09:50:40 +02003500 err = test_ah(tfm_aes);
3501 if (err) {
3502 BT_ERR("smp_ah test failed");
3503 return err;
3504 }
3505
3506 err = test_c1(tfm_aes);
3507 if (err) {
3508 BT_ERR("smp_c1 test failed");
3509 return err;
3510 }
3511
3512 err = test_s1(tfm_aes);
3513 if (err) {
3514 BT_ERR("smp_s1 test failed");
3515 return err;
3516 }
3517
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003518 err = test_f4(tfm_cmac);
3519 if (err) {
3520 BT_ERR("smp_f4 test failed");
3521 return err;
3522 }
3523
3524 err = test_f5(tfm_cmac);
3525 if (err) {
3526 BT_ERR("smp_f5 test failed");
3527 return err;
3528 }
3529
3530 err = test_f6(tfm_cmac);
3531 if (err) {
3532 BT_ERR("smp_f6 test failed");
3533 return err;
3534 }
3535
3536 err = test_g2(tfm_cmac);
3537 if (err) {
3538 BT_ERR("smp_g2 test failed");
3539 return err;
3540 }
3541
3542 err = test_h6(tfm_cmac);
3543 if (err) {
3544 BT_ERR("smp_h6 test failed");
3545 return err;
3546 }
3547
Marcel Holtmann255047b2014-12-30 00:11:20 -08003548 rettime = ktime_get();
3549 delta = ktime_sub(rettime, calltime);
3550 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3551
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003552 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003553
3554 return 0;
3555}
3556
3557int __init bt_selftest_smp(void)
3558{
3559 struct crypto_blkcipher *tfm_aes;
3560 struct crypto_hash *tfm_cmac;
3561 int err;
3562
3563 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
3564 if (IS_ERR(tfm_aes)) {
3565 BT_ERR("Unable to create ECB crypto context");
3566 return PTR_ERR(tfm_aes);
3567 }
3568
3569 tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
3570 if (IS_ERR(tfm_cmac)) {
3571 BT_ERR("Unable to create CMAC crypto context");
3572 crypto_free_blkcipher(tfm_aes);
3573 return PTR_ERR(tfm_cmac);
3574 }
3575
3576 err = run_selftests(tfm_aes, tfm_cmac);
3577
3578 crypto_free_hash(tfm_cmac);
3579 crypto_free_blkcipher(tfm_aes);
3580
3581 return err;
3582}
3583
3584#endif