blob: 78ad7d691fbee5b59860d0700be87ad3631360d3 [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/scatterlist.h>
25#include <crypto/b128ops.h>
Herbert Xu71af2f62016-01-24 21:18:30 +080026#include <crypto/hash.h>
27#include <crypto/skcipher.h>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030028
Anderson Brigliaeb492e02011-06-09 18:50:40 -030029#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
31#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080032#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070033
Johan Hedberg3b191462014-06-06 10:50:15 +030034#include "ecc.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070035#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030036
Johan Hedberg2fd36552015-06-11 13:52:26 +030037#define SMP_DEV(hdev) \
38 ((struct smp_dev *)((struct l2cap_chan *)((hdev)->smp_data))->data)
39
Johan Hedbergc7a3d572014-12-01 22:03:16 +020040/* Low-level debug macros to be used for stuff that we don't want
41 * accidentially in dmesg, i.e. the values of the various crypto keys
42 * and the inputs & outputs of crypto functions.
43 */
44#ifdef DEBUG
45#define SMP_DBG(fmt, ...) printk(KERN_DEBUG "%s: " fmt, __func__, \
46 ##__VA_ARGS__)
47#else
48#define SMP_DBG(fmt, ...) no_printk(KERN_DEBUG "%s: " fmt, __func__, \
49 ##__VA_ARGS__)
50#endif
51
Johan Hedbergb28b4942014-09-05 22:19:55 +030052#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030053
Johan Hedberg3b191462014-06-06 10:50:15 +030054/* Keys which are not distributed with Secure Connections */
55#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
56
Marcel Holtmann17b02e62012-03-01 14:32:37 -080057#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030058
Marcel Holtmannd7a5a112015-03-13 02:11:00 -070059#define AUTH_REQ_MASK(dev) (hci_dev_test_flag(dev, HCI_SC_ENABLED) ? \
Johan Hedberg0edb14d2014-05-26 13:29:28 +030060 0x1f : 0x07)
61#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020062
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030063/* Maximum message length that can be passed to aes_cmac */
64#define CMAC_MSG_MAX 80
65
Johan Hedberg533e35d2014-06-16 19:25:18 +030066enum {
67 SMP_FLAG_TK_VALID,
68 SMP_FLAG_CFM_PENDING,
69 SMP_FLAG_MITM_AUTH,
70 SMP_FLAG_COMPLETE,
71 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030072 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030073 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030074 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030075 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030076 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg1a8bab42015-03-16 11:45:44 +020077 SMP_FLAG_REMOTE_OOB,
78 SMP_FLAG_LOCAL_OOB,
Johan Hedberg533e35d2014-06-16 19:25:18 +030079};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030080
Marcel Holtmann88a479d2015-03-16 01:10:19 -070081struct smp_dev {
Marcel Holtmann60a27d62015-03-16 01:10:22 -070082 /* Secure Connections OOB data */
83 u8 local_pk[64];
84 u8 local_sk[32];
Marcel Holtmannfb334fe2015-03-16 12:34:57 -070085 u8 local_rand[16];
Marcel Holtmann60a27d62015-03-16 01:10:22 -070086 bool debug_key;
87
Johan Hedbergb1f663c2015-06-11 13:52:27 +030088 u8 min_key_size;
Johan Hedberg2fd36552015-06-11 13:52:26 +030089 u8 max_key_size;
90
Herbert Xu71af2f62016-01-24 21:18:30 +080091 struct crypto_skcipher *tfm_aes;
92 struct crypto_shash *tfm_cmac;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070093};
94
Johan Hedberg4bc58f52014-05-20 09:45:47 +030095struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030096 struct l2cap_conn *conn;
97 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030098 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030099
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300100 u8 preq[7]; /* SMP Pairing Request */
101 u8 prsp[7]; /* SMP Pairing Response */
102 u8 prnd[16]; /* SMP Pairing Random (local) */
103 u8 rrnd[16]; /* SMP Pairing Random (remote) */
104 u8 pcnf[16]; /* SMP Pairing Confirm */
105 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberg882fafa2015-03-16 11:45:43 +0200106 u8 rr[16]; /* Remote OOB ra/rb value */
107 u8 lr[16]; /* Local OOB ra/rb value */
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300108 u8 enc_key_size;
109 u8 remote_key_dist;
110 bdaddr_t id_addr;
111 u8 id_addr_type;
112 u8 irk[16];
113 struct smp_csrk *csrk;
114 struct smp_csrk *slave_csrk;
115 struct smp_ltk *ltk;
116 struct smp_ltk *slave_ltk;
117 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300118 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300119 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300120 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300121 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300122
Johan Hedberg3b191462014-06-06 10:50:15 +0300123 /* Secure Connections variables */
124 u8 local_pk[64];
125 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300126 u8 remote_pk[64];
127 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300128 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300129
Herbert Xu71af2f62016-01-24 21:18:30 +0800130 struct crypto_skcipher *tfm_aes;
131 struct crypto_shash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300132};
133
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300134/* These debug key values are defined in the SMP section of the core
135 * specification. debug_pk is the public debug key and debug_sk the
136 * private debug key.
137 */
138static const u8 debug_pk[64] = {
139 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
140 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
141 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
142 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
143
144 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
145 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
146 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
147 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
148};
149
150static const u8 debug_sk[32] = {
151 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
152 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
153 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
154 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
155};
156
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300157static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300158{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300159 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300160
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300161 for (i = 0; i < len; i++)
162 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300163}
164
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200165/* The following functions map to the LE SC SMP crypto functions
166 * AES-CMAC, f4, f5, f6, g2 and h6.
167 */
168
Herbert Xu71af2f62016-01-24 21:18:30 +0800169static int aes_cmac(struct crypto_shash *tfm, const u8 k[16], const u8 *m,
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300170 size_t len, u8 mac[16])
171{
172 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
Herbert Xu71af2f62016-01-24 21:18:30 +0800173 SHASH_DESC_ON_STACK(desc, tfm);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300174 int err;
175
176 if (len > CMAC_MSG_MAX)
177 return -EFBIG;
178
179 if (!tfm) {
180 BT_ERR("tfm %p", tfm);
181 return -EINVAL;
182 }
183
Herbert Xu71af2f62016-01-24 21:18:30 +0800184 desc->tfm = tfm;
185 desc->flags = 0;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300186
187 /* Swap key and message from LSB to MSB */
188 swap_buf(k, tmp, 16);
189 swap_buf(m, msg_msb, len);
190
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200191 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
192 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300193
Herbert Xu71af2f62016-01-24 21:18:30 +0800194 err = crypto_shash_setkey(tfm, tmp, 16);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300195 if (err) {
196 BT_ERR("cipher setkey failed: %d", err);
197 return err;
198 }
199
Herbert Xu71af2f62016-01-24 21:18:30 +0800200 err = crypto_shash_digest(desc, msg_msb, len, mac_msb);
201 shash_desc_zero(desc);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300202 if (err) {
Herbert Xu71af2f62016-01-24 21:18:30 +0800203 BT_ERR("Hash computation error %d", err);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300204 return err;
205 }
206
207 swap_buf(mac_msb, mac, 16);
208
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200209 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300210
211 return 0;
212}
213
Herbert Xu71af2f62016-01-24 21:18:30 +0800214static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
215 const u8 v[32], const u8 x[16], u8 z, u8 res[16])
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300216{
217 u8 m[65];
218 int err;
219
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200220 SMP_DBG("u %32phN", u);
221 SMP_DBG("v %32phN", v);
222 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300223
224 m[0] = z;
225 memcpy(m + 1, v, 32);
226 memcpy(m + 33, u, 32);
227
228 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
229 if (err)
230 return err;
231
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200232 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300233
234 return err;
235}
236
Herbert Xu71af2f62016-01-24 21:18:30 +0800237static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200238 const u8 n1[16], const u8 n2[16], const u8 a1[7],
239 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300240{
241 /* The btle, salt and length "magic" values are as defined in
242 * the SMP section of the Bluetooth core specification. In ASCII
243 * the btle value ends up being 'btle'. The salt is just a
244 * random number whereas length is the value 256 in little
245 * endian format.
246 */
247 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
248 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
249 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
250 const u8 length[2] = { 0x00, 0x01 };
251 u8 m[53], t[16];
252 int err;
253
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200254 SMP_DBG("w %32phN", w);
255 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
256 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300257
258 err = aes_cmac(tfm_cmac, salt, w, 32, t);
259 if (err)
260 return err;
261
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200262 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300263
264 memcpy(m, length, 2);
265 memcpy(m + 2, a2, 7);
266 memcpy(m + 9, a1, 7);
267 memcpy(m + 16, n2, 16);
268 memcpy(m + 32, n1, 16);
269 memcpy(m + 48, btle, 4);
270
271 m[52] = 0; /* Counter */
272
273 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
274 if (err)
275 return err;
276
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200277 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300278
279 m[52] = 1; /* Counter */
280
281 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
282 if (err)
283 return err;
284
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200285 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300286
287 return 0;
288}
289
Herbert Xu71af2f62016-01-24 21:18:30 +0800290static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200291 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300292 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
293 u8 res[16])
294{
295 u8 m[65];
296 int err;
297
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200298 SMP_DBG("w %16phN", w);
299 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
300 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300301
302 memcpy(m, a2, 7);
303 memcpy(m + 7, a1, 7);
304 memcpy(m + 14, io_cap, 3);
305 memcpy(m + 17, r, 16);
306 memcpy(m + 33, n2, 16);
307 memcpy(m + 49, n1, 16);
308
309 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
310 if (err)
311 return err;
312
Marcel Holtmann203de212014-12-31 20:01:22 -0800313 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300314
315 return err;
316}
317
Herbert Xu71af2f62016-01-24 21:18:30 +0800318static int smp_g2(struct crypto_shash *tfm_cmac, const u8 u[32], const u8 v[32],
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300319 const u8 x[16], const u8 y[16], u32 *val)
320{
321 u8 m[80], tmp[16];
322 int err;
323
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200324 SMP_DBG("u %32phN", u);
325 SMP_DBG("v %32phN", v);
326 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300327
328 memcpy(m, y, 16);
329 memcpy(m + 16, v, 32);
330 memcpy(m + 48, u, 32);
331
332 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
333 if (err)
334 return err;
335
336 *val = get_unaligned_le32(tmp);
337 *val %= 1000000;
338
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200339 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300340
341 return 0;
342}
343
Herbert Xu71af2f62016-01-24 21:18:30 +0800344static int smp_h6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200345 const u8 key_id[4], u8 res[16])
346{
347 int err;
348
349 SMP_DBG("w %16phN key_id %4phN", w, key_id);
350
351 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
352 if (err)
353 return err;
354
355 SMP_DBG("res %16phN", res);
356
357 return err;
358}
359
360/* The following functions map to the legacy SMP crypto functions e, c1,
361 * s1 and ah.
362 */
363
Herbert Xu71af2f62016-01-24 21:18:30 +0800364static int smp_e(struct crypto_skcipher *tfm, const u8 *k, u8 *r)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300365{
Herbert Xu71af2f62016-01-24 21:18:30 +0800366 SKCIPHER_REQUEST_ON_STACK(req, tfm);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300367 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200368 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200369 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300370
Johan Hedberg011c3912015-05-19 21:06:04 +0300371 SMP_DBG("k %16phN r %16phN", k, r);
372
Johan Hedberg7f376cd2014-12-03 16:07:13 +0200373 if (!tfm) {
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300374 BT_ERR("tfm %p", tfm);
375 return -EINVAL;
376 }
377
Johan Hedberg943a7322014-03-18 12:58:24 +0200378 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300379 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200380
Herbert Xu71af2f62016-01-24 21:18:30 +0800381 err = crypto_skcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300382 if (err) {
383 BT_ERR("cipher setkey failed: %d", err);
384 return err;
385 }
386
Johan Hedberg943a7322014-03-18 12:58:24 +0200387 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300388 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200389
390 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300391
Herbert Xu71af2f62016-01-24 21:18:30 +0800392 skcipher_request_set_tfm(req, tfm);
393 skcipher_request_set_callback(req, 0, NULL, NULL);
394 skcipher_request_set_crypt(req, &sg, &sg, 16, NULL);
395
396 err = crypto_skcipher_encrypt(req);
397 skcipher_request_zero(req);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300398 if (err)
399 BT_ERR("Encrypt data error %d", err);
400
Johan Hedberg943a7322014-03-18 12:58:24 +0200401 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300402 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200403
Johan Hedberg011c3912015-05-19 21:06:04 +0300404 SMP_DBG("r %16phN", r);
405
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300406 return err;
407}
408
Herbert Xu71af2f62016-01-24 21:18:30 +0800409static int smp_c1(struct crypto_skcipher *tfm_aes, const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200410 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
411 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
412{
413 u8 p1[16], p2[16];
414 int err;
415
Johan Hedberg011c3912015-05-19 21:06:04 +0300416 SMP_DBG("k %16phN r %16phN", k, r);
417 SMP_DBG("iat %u ia %6phN rat %u ra %6phN", _iat, ia, _rat, ra);
418 SMP_DBG("preq %7phN pres %7phN", preq, pres);
419
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200420 memset(p1, 0, 16);
421
422 /* p1 = pres || preq || _rat || _iat */
423 p1[0] = _iat;
424 p1[1] = _rat;
425 memcpy(p1 + 2, preq, 7);
426 memcpy(p1 + 9, pres, 7);
427
Johan Hedberg011c3912015-05-19 21:06:04 +0300428 SMP_DBG("p1 %16phN", p1);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200429
430 /* res = r XOR p1 */
431 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
432
433 /* res = e(k, res) */
434 err = smp_e(tfm_aes, k, res);
435 if (err) {
436 BT_ERR("Encrypt data error");
437 return err;
438 }
439
Johan Hedberg011c3912015-05-19 21:06:04 +0300440 /* p2 = padding || ia || ra */
441 memcpy(p2, ra, 6);
442 memcpy(p2 + 6, ia, 6);
443 memset(p2 + 12, 0, 4);
444
445 SMP_DBG("p2 %16phN", p2);
446
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200447 /* res = res XOR p2 */
448 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
449
450 /* res = e(k, res) */
451 err = smp_e(tfm_aes, k, res);
452 if (err)
453 BT_ERR("Encrypt data error");
454
455 return err;
456}
457
Herbert Xu71af2f62016-01-24 21:18:30 +0800458static int smp_s1(struct crypto_skcipher *tfm_aes, const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200459 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300460{
461 int err;
462
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200463 /* Just least significant octets from r1 and r2 are considered */
464 memcpy(_r, r2, 8);
465 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300466
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200467 err = smp_e(tfm_aes, k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300468 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200469 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300470
471 return err;
472}
473
Herbert Xu71af2f62016-01-24 21:18:30 +0800474static int smp_ah(struct crypto_skcipher *tfm, const u8 irk[16],
Johan Hedbergcd082792014-12-02 13:37:41 +0200475 const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200476{
Johan Hedberg943a7322014-03-18 12:58:24 +0200477 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200478 int err;
479
480 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200481 memcpy(_res, r, 3);
482 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200483
Johan Hedberg943a7322014-03-18 12:58:24 +0200484 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200485 if (err) {
486 BT_ERR("Encrypt error");
487 return err;
488 }
489
490 /* The output of the random address function ah is:
Marcel Holtmannc5080d42015-09-04 17:08:18 +0200491 * ah(k, r) = e(k, r') mod 2^24
Johan Hedberg60478052014-02-18 10:19:31 +0200492 * The output of the security function e is then truncated to 24 bits
493 * by taking the least significant 24 bits of the output of e as the
494 * result of ah.
495 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200496 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200497
498 return 0;
499}
500
Johan Hedbergcd082792014-12-02 13:37:41 +0200501bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
502 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200503{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300504 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700505 struct smp_dev *smp;
Johan Hedberg60478052014-02-18 10:19:31 +0200506 u8 hash[3];
507 int err;
508
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300509 if (!chan || !chan->data)
510 return false;
511
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700512 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300513
Johan Hedberg60478052014-02-18 10:19:31 +0200514 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
515
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700516 err = smp_ah(smp->tfm_aes, irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200517 if (err)
518 return false;
519
520 return !memcmp(bdaddr->b, hash, 3);
521}
522
Johan Hedbergcd082792014-12-02 13:37:41 +0200523int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200524{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300525 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700526 struct smp_dev *smp;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200527 int err;
528
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300529 if (!chan || !chan->data)
530 return -EOPNOTSUPP;
531
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700532 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300533
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200534 get_random_bytes(&rpa->b[3], 3);
535
536 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
537 rpa->b[5] |= 0x40; /* Set second most significant bit */
538
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700539 err = smp_ah(smp->tfm_aes, irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200540 if (err < 0)
541 return err;
542
543 BT_DBG("RPA %pMR", rpa);
544
545 return 0;
546}
547
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700548int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
549{
550 struct l2cap_chan *chan = hdev->smp_data;
551 struct smp_dev *smp;
552 int err;
553
554 if (!chan || !chan->data)
555 return -EOPNOTSUPP;
556
557 smp = chan->data;
558
559 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
560 BT_DBG("Using debug keys");
561 memcpy(smp->local_pk, debug_pk, 64);
562 memcpy(smp->local_sk, debug_sk, 32);
563 smp->debug_key = true;
564 } else {
565 while (true) {
566 /* Generate local key pair for Secure Connections */
567 if (!ecc_make_key(smp->local_pk, smp->local_sk))
568 return -EIO;
569
570 /* This is unlikely, but we need to check that
571 * we didn't accidentially generate a debug key.
572 */
573 if (memcmp(smp->local_sk, debug_sk, 32))
574 break;
575 }
576 smp->debug_key = false;
577 }
578
579 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
580 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
581 SMP_DBG("OOB Private Key: %32phN", smp->local_sk);
582
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700583 get_random_bytes(smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700584
585 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700586 smp->local_rand, 0, hash);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700587 if (err < 0)
588 return err;
589
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700590 memcpy(rand, smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700591
592 return 0;
593}
594
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300595static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
596{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300597 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300598 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300599 struct kvec iv[2];
600 struct msghdr msg;
601
602 if (!chan)
603 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300604
605 BT_DBG("code 0x%2.2x", code);
606
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300607 iv[0].iov_base = &code;
608 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300609
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300610 iv[1].iov_base = data;
611 iv[1].iov_len = len;
612
613 memset(&msg, 0, sizeof(msg));
614
Al Viro17836392014-11-24 17:07:38 -0500615 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300616
617 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300618
Johan Hedbergb68fda62014-08-11 22:06:40 +0300619 if (!chan->data)
620 return;
621
622 smp = chan->data;
623
624 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300625 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300626}
627
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300628static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800629{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300630 if (authreq & SMP_AUTH_MITM) {
631 if (authreq & SMP_AUTH_SC)
632 return BT_SECURITY_FIPS;
633 else
634 return BT_SECURITY_HIGH;
635 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800636 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300637 }
Brian Gix2b64d152011-12-21 16:12:12 -0800638}
639
640static __u8 seclevel_to_authreq(__u8 sec_level)
641{
642 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300643 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800644 case BT_SECURITY_HIGH:
645 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
646 case BT_SECURITY_MEDIUM:
647 return SMP_AUTH_BONDING;
648 default:
649 return SMP_AUTH_NONE;
650 }
651}
652
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300653static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700654 struct smp_cmd_pairing *req,
655 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300656{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300657 struct l2cap_chan *chan = conn->smp;
658 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200659 struct hci_conn *hcon = conn->hcon;
660 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100661 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300662
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700663 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700664 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
665 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300666 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800667 } else {
668 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300669 }
670
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700671 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200672 remote_dist |= SMP_DIST_ID_KEY;
673
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700674 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200675 local_dist |= SMP_DIST_ID_KEY;
676
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700677 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100678 (authreq & SMP_AUTH_SC)) {
679 struct oob_data *oob_data;
680 u8 bdaddr_type;
681
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700682 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300683 local_dist |= SMP_DIST_LINK_KEY;
684 remote_dist |= SMP_DIST_LINK_KEY;
685 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100686
687 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
688 bdaddr_type = BDADDR_LE_PUBLIC;
689 else
690 bdaddr_type = BDADDR_LE_RANDOM;
691
692 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
693 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800694 if (oob_data && oob_data->present) {
Johan Hedberg1a8bab42015-03-16 11:45:44 +0200695 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100696 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100697 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100698 memcpy(smp->pcnf, oob_data->hash256, 16);
Marcel Holtmannbc07cd62015-03-16 12:34:56 -0700699 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf);
700 SMP_DBG("OOB Remote Random: %16phN", smp->rr);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100701 }
702
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300703 } else {
704 authreq &= ~SMP_AUTH_SC;
705 }
706
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300707 if (rsp == NULL) {
708 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100709 req->oob_flag = oob_flag;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300710 req->max_key_size = SMP_DEV(hdev)->max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200711 req->init_key_dist = local_dist;
712 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300713 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200714
715 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300716 return;
717 }
718
719 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100720 rsp->oob_flag = oob_flag;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300721 rsp->max_key_size = SMP_DEV(hdev)->max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200722 rsp->init_key_dist = req->init_key_dist & remote_dist;
723 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300724 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200725
726 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300727}
728
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300729static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
730{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300731 struct l2cap_chan *chan = conn->smp;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300732 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300733 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300734
Johan Hedberg2fd36552015-06-11 13:52:26 +0300735 if (max_key_size > SMP_DEV(hdev)->max_key_size ||
736 max_key_size < SMP_MIN_ENC_KEY_SIZE)
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300737 return SMP_ENC_KEY_SIZE;
738
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300739 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300740
741 return 0;
742}
743
Johan Hedberg6f48e262014-08-11 22:06:44 +0300744static void smp_chan_destroy(struct l2cap_conn *conn)
745{
746 struct l2cap_chan *chan = conn->smp;
747 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200748 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300749 bool complete;
750
751 BUG_ON(!smp);
752
753 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300754
Johan Hedberg6f48e262014-08-11 22:06:44 +0300755 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200756 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300757
Marcel Holtmann276812e2015-03-16 01:10:18 -0700758 kzfree(smp->csrk);
759 kzfree(smp->slave_csrk);
760 kzfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300761
Herbert Xu71af2f62016-01-24 21:18:30 +0800762 crypto_free_skcipher(smp->tfm_aes);
763 crypto_free_shash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300764
Johan Hedberg923e2412014-12-03 12:43:39 +0200765 /* Ensure that we don't leave any debug key around if debug key
766 * support hasn't been explicitly enabled.
767 */
768 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700769 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200770 list_del_rcu(&smp->ltk->list);
771 kfree_rcu(smp->ltk, rcu);
772 smp->ltk = NULL;
773 }
774
Johan Hedberg6f48e262014-08-11 22:06:44 +0300775 /* If pairing failed clean up any keys we might have */
776 if (!complete) {
777 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200778 list_del_rcu(&smp->ltk->list);
779 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300780 }
781
782 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200783 list_del_rcu(&smp->slave_ltk->list);
784 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300785 }
786
787 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200788 list_del_rcu(&smp->remote_irk->list);
789 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300790 }
791 }
792
793 chan->data = NULL;
Marcel Holtmann276812e2015-03-16 01:10:18 -0700794 kzfree(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200795 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300796}
797
Johan Hedberg84794e12013-11-06 11:24:57 +0200798static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800799{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200800 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300801 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200802
Johan Hedberg84794e12013-11-06 11:24:57 +0200803 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800804 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700805 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800806
Johan Hedberge1e930f2014-09-08 17:09:49 -0700807 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300808
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300809 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300810 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800811}
812
Brian Gix2b64d152011-12-21 16:12:12 -0800813#define JUST_WORKS 0x00
814#define JUST_CFM 0x01
815#define REQ_PASSKEY 0x02
816#define CFM_PASSKEY 0x03
817#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300818#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800819#define OVERLAP 0xFF
820
821static const u8 gen_method[5][5] = {
822 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
823 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
824 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
825 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
826 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
827};
828
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300829static const u8 sc_method[5][5] = {
830 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
831 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
832 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
833 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
834 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
835};
836
Johan Hedberg581370c2014-06-17 13:07:38 +0300837static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
838{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300839 /* If either side has unknown io_caps, use JUST_CFM (which gets
840 * converted later to JUST_WORKS if we're initiators.
841 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300842 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
843 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300844 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300845
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300846 if (test_bit(SMP_FLAG_SC, &smp->flags))
847 return sc_method[remote_io][local_io];
848
Johan Hedberg581370c2014-06-17 13:07:38 +0300849 return gen_method[remote_io][local_io];
850}
851
Brian Gix2b64d152011-12-21 16:12:12 -0800852static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
853 u8 local_io, u8 remote_io)
854{
855 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300856 struct l2cap_chan *chan = conn->smp;
857 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800858 u32 passkey = 0;
859 int ret = 0;
860
861 /* Initialize key for JUST WORKS */
862 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300863 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800864
865 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
866
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300867 /* If neither side wants MITM, either "just" confirm an incoming
868 * request or use just-works for outgoing ones. The JUST_CFM
869 * will be converted to JUST_WORKS if necessary later in this
870 * function. If either side has MITM look up the method from the
871 * table.
872 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300873 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300874 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800875 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300876 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800877
Johan Hedberga82505c2014-03-24 14:39:07 +0200878 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300879 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
880 &smp->flags))
881 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200882
Johan Hedberg02f3e252014-07-16 15:09:13 +0300883 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300884 if (smp->method == JUST_CFM &&
885 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
886 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300887
Brian Gix2b64d152011-12-21 16:12:12 -0800888 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300889 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300890 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800891 return 0;
892 }
893
Johan Hedberg19c5ce92015-03-15 19:34:04 +0200894 /* If this function is used for SC -> legacy fallback we
895 * can only recover the just-works case.
896 */
897 if (test_bit(SMP_FLAG_SC, &smp->flags))
898 return -EINVAL;
899
Brian Gix2b64d152011-12-21 16:12:12 -0800900 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300901 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300902 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300903 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
904 hcon->pending_sec_level = BT_SECURITY_HIGH;
905 }
Brian Gix2b64d152011-12-21 16:12:12 -0800906
907 /* If both devices have Keyoard-Display I/O, the master
908 * Confirms and the slave Enters the passkey.
909 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300910 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300911 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300912 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800913 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300914 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800915 }
916
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200917 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300918 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200919 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800920 get_random_bytes(&passkey, sizeof(passkey));
921 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200922 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800923 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300924 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800925 }
926
Johan Hedberg783e0572014-05-31 18:48:26 +0300927 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700928 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200929 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300930 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200931 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
932 hcon->type, hcon->dst_type,
933 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800934 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200935 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200936 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200937 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800938
Brian Gix2b64d152011-12-21 16:12:12 -0800939 return ret;
940}
941
Johan Hedberg1cc61142014-05-20 09:45:52 +0300942static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300943{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300944 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300945 struct smp_cmd_pairing_confirm cp;
946 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300947
948 BT_DBG("conn %p", conn);
949
Johan Hedberge491eaf2014-10-25 21:15:37 +0200950 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200951 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200952 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
953 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300954 if (ret)
955 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300956
Johan Hedberg4a74d652014-05-20 09:45:50 +0300957 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800958
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300959 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
960
Johan Hedbergb28b4942014-09-05 22:19:55 +0300961 if (conn->hcon->out)
962 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
963 else
964 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
965
Johan Hedberg1cc61142014-05-20 09:45:52 +0300966 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300967}
968
Johan Hedberg861580a2014-05-20 09:45:51 +0300969static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300970{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300971 struct l2cap_conn *conn = smp->conn;
972 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300973 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300974 int ret;
975
Johan Hedbergec70f362014-06-27 14:23:04 +0300976 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300977 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300978
979 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
980
Johan Hedberge491eaf2014-10-25 21:15:37 +0200981 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200982 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200983 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300984 if (ret)
985 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300986
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300987 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
988 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300989 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300990 }
991
992 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800993 u8 stk[16];
994 __le64 rand = 0;
995 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300996
Johan Hedberge491eaf2014-10-25 21:15:37 +0200997 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300998
Johan Hedberg861580a2014-05-20 09:45:51 +0300999 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
1000 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001001
Johan Hedberg8b76ce32015-06-08 18:14:39 +03001002 hci_le_start_enc(hcon, ediv, rand, stk, smp->enc_key_size);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -03001003 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +03001004 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001005 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +03001006 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001007 __le64 rand = 0;
1008 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001009
Johan Hedberg943a7322014-03-18 12:58:24 +02001010 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1011 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001012
Johan Hedberge491eaf2014-10-25 21:15:37 +02001013 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001014
Johan Hedbergfff34902014-06-10 15:19:50 +03001015 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1016 auth = 1;
1017 else
1018 auth = 0;
1019
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001020 /* Even though there's no _SLAVE suffix this is the
1021 * slave STK we're adding for later lookup (the master
1022 * STK never needs to be stored).
1023 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001024 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001025 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001026 }
1027
Johan Hedberg861580a2014-05-20 09:45:51 +03001028 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001029}
1030
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001031static void smp_notify_keys(struct l2cap_conn *conn)
1032{
1033 struct l2cap_chan *chan = conn->smp;
1034 struct smp_chan *smp = chan->data;
1035 struct hci_conn *hcon = conn->hcon;
1036 struct hci_dev *hdev = hcon->hdev;
1037 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1038 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1039 bool persistent;
1040
Johan Hedbergcad20c22015-10-12 13:36:19 +02001041 if (hcon->type == ACL_LINK) {
1042 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1043 persistent = false;
1044 else
1045 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1046 &hcon->flags);
1047 } else {
1048 /* The LTKs, IRKs and CSRKs should be persistent only if
1049 * both sides had the bonding bit set in their
1050 * authentication requests.
1051 */
1052 persistent = !!((req->auth_req & rsp->auth_req) &
1053 SMP_AUTH_BONDING);
1054 }
1055
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001056 if (smp->remote_irk) {
Johan Hedbergcad20c22015-10-12 13:36:19 +02001057 mgmt_new_irk(hdev, smp->remote_irk, persistent);
1058
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001059 /* Now that user space can be considered to know the
1060 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001061 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001062 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001063 if (hcon->type == LE_LINK) {
1064 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1065 hcon->dst_type = smp->remote_irk->addr_type;
1066 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1067 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001068
1069 /* When receiving an indentity resolving key for
1070 * a remote device that does not use a resolvable
1071 * private address, just remove the key so that
1072 * it is possible to use the controller white
1073 * list for scanning.
1074 *
1075 * Userspace will have been told to not store
1076 * this key at this point. So it is safe to
1077 * just remove it.
1078 */
1079 if (!bacmp(&smp->remote_irk->rpa, BDADDR_ANY)) {
Johan Hedbergadae20c2014-11-13 14:37:48 +02001080 list_del_rcu(&smp->remote_irk->list);
1081 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001082 smp->remote_irk = NULL;
1083 }
1084 }
1085
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001086 if (smp->csrk) {
1087 smp->csrk->bdaddr_type = hcon->dst_type;
1088 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1089 mgmt_new_csrk(hdev, smp->csrk, persistent);
1090 }
1091
1092 if (smp->slave_csrk) {
1093 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1094 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1095 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1096 }
1097
1098 if (smp->ltk) {
1099 smp->ltk->bdaddr_type = hcon->dst_type;
1100 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1101 mgmt_new_ltk(hdev, smp->ltk, persistent);
1102 }
1103
1104 if (smp->slave_ltk) {
1105 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1106 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1107 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1108 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001109
1110 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001111 struct link_key *key;
1112 u8 type;
1113
1114 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1115 type = HCI_LK_DEBUG_COMBINATION;
1116 else if (hcon->sec_level == BT_SECURITY_FIPS)
1117 type = HCI_LK_AUTH_COMBINATION_P256;
1118 else
1119 type = HCI_LK_UNAUTH_COMBINATION_P256;
1120
1121 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1122 smp->link_key, type, 0, &persistent);
1123 if (key) {
1124 mgmt_new_link_key(hdev, key, persistent);
1125
1126 /* Don't keep debug keys around if the relevant
1127 * flag is not set.
1128 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001129 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001130 key->type == HCI_LK_DEBUG_COMBINATION) {
1131 list_del_rcu(&key->list);
1132 kfree_rcu(key, rcu);
1133 }
1134 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001135 }
1136}
1137
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001138static void sc_add_ltk(struct smp_chan *smp)
1139{
1140 struct hci_conn *hcon = smp->conn->hcon;
1141 u8 key_type, auth;
1142
1143 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1144 key_type = SMP_LTK_P256_DEBUG;
1145 else
1146 key_type = SMP_LTK_P256;
1147
1148 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1149 auth = 1;
1150 else
1151 auth = 0;
1152
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001153 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1154 key_type, auth, smp->tk, smp->enc_key_size,
1155 0, 0);
1156}
1157
Johan Hedberg6a770832014-06-06 11:54:04 +03001158static void sc_generate_link_key(struct smp_chan *smp)
1159{
1160 /* These constants are as specified in the core specification.
1161 * In ASCII they spell out to 'tmp1' and 'lebr'.
1162 */
1163 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1164 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1165
1166 smp->link_key = kzalloc(16, GFP_KERNEL);
1167 if (!smp->link_key)
1168 return;
1169
1170 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001171 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001172 smp->link_key = NULL;
1173 return;
1174 }
1175
1176 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001177 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001178 smp->link_key = NULL;
1179 return;
1180 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001181}
1182
Johan Hedbergb28b4942014-09-05 22:19:55 +03001183static void smp_allow_key_dist(struct smp_chan *smp)
1184{
1185 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1186 * will be allowed in each PDU handler to ensure we receive
1187 * them in the correct order.
1188 */
1189 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1190 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1191 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1192 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1193 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1194 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1195}
1196
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001197static void sc_generate_ltk(struct smp_chan *smp)
1198{
1199 /* These constants are as specified in the core specification.
1200 * In ASCII they spell out to 'tmp2' and 'brle'.
1201 */
1202 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1203 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1204 struct hci_conn *hcon = smp->conn->hcon;
1205 struct hci_dev *hdev = hcon->hdev;
1206 struct link_key *key;
1207
1208 key = hci_find_link_key(hdev, &hcon->dst);
1209 if (!key) {
1210 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1211 return;
1212 }
1213
1214 if (key->type == HCI_LK_DEBUG_COMBINATION)
1215 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1216
1217 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1218 return;
1219
1220 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1221 return;
1222
1223 sc_add_ltk(smp);
1224}
1225
Johan Hedbergd6268e82014-09-05 22:19:51 +03001226static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001227{
1228 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001229 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001230 struct hci_conn *hcon = conn->hcon;
1231 struct hci_dev *hdev = hcon->hdev;
1232 __u8 *keydist;
1233
1234 BT_DBG("conn %p", conn);
1235
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001236 rsp = (void *) &smp->prsp[1];
1237
1238 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001239 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1240 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001241 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001242 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001243
1244 req = (void *) &smp->preq[1];
1245
1246 if (hcon->out) {
1247 keydist = &rsp->init_key_dist;
1248 *keydist &= req->init_key_dist;
1249 } else {
1250 keydist = &rsp->resp_key_dist;
1251 *keydist &= req->resp_key_dist;
1252 }
1253
Johan Hedberg6a770832014-06-06 11:54:04 +03001254 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001255 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001256 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001257 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1258 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001259
1260 /* Clear the keys which are generated but not distributed */
1261 *keydist &= ~SMP_SC_NO_DIST;
1262 }
1263
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001264 BT_DBG("keydist 0x%x", *keydist);
1265
1266 if (*keydist & SMP_DIST_ENC_KEY) {
1267 struct smp_cmd_encrypt_info enc;
1268 struct smp_cmd_master_ident ident;
1269 struct smp_ltk *ltk;
1270 u8 authenticated;
1271 __le16 ediv;
1272 __le64 rand;
1273
Johan Hedberg1fc62c52015-06-10 11:11:20 +03001274 /* Make sure we generate only the significant amount of
1275 * bytes based on the encryption key size, and set the rest
1276 * of the value to zeroes.
1277 */
1278 get_random_bytes(enc.ltk, smp->enc_key_size);
1279 memset(enc.ltk + smp->enc_key_size, 0,
1280 sizeof(enc.ltk) - smp->enc_key_size);
1281
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001282 get_random_bytes(&ediv, sizeof(ediv));
1283 get_random_bytes(&rand, sizeof(rand));
1284
1285 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1286
1287 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1288 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1289 SMP_LTK_SLAVE, authenticated, enc.ltk,
1290 smp->enc_key_size, ediv, rand);
1291 smp->slave_ltk = ltk;
1292
1293 ident.ediv = ediv;
1294 ident.rand = rand;
1295
1296 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1297
1298 *keydist &= ~SMP_DIST_ENC_KEY;
1299 }
1300
1301 if (*keydist & SMP_DIST_ID_KEY) {
1302 struct smp_cmd_ident_addr_info addrinfo;
1303 struct smp_cmd_ident_info idinfo;
1304
1305 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1306
1307 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1308
1309 /* The hci_conn contains the local identity address
1310 * after the connection has been established.
1311 *
1312 * This is true even when the connection has been
1313 * established using a resolvable random address.
1314 */
1315 bacpy(&addrinfo.bdaddr, &hcon->src);
1316 addrinfo.addr_type = hcon->src_type;
1317
1318 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1319 &addrinfo);
1320
1321 *keydist &= ~SMP_DIST_ID_KEY;
1322 }
1323
1324 if (*keydist & SMP_DIST_SIGN) {
1325 struct smp_cmd_sign_info sign;
1326 struct smp_csrk *csrk;
1327
1328 /* Generate a new random key */
1329 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1330
1331 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1332 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001333 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1334 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1335 else
1336 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001337 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1338 }
1339 smp->slave_csrk = csrk;
1340
1341 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1342
1343 *keydist &= ~SMP_DIST_SIGN;
1344 }
1345
1346 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001347 if (smp->remote_key_dist & KEY_DIST_MASK) {
1348 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001349 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001350 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001351
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001352 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1353 smp_notify_keys(conn);
1354
1355 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001356}
1357
Johan Hedbergb68fda62014-08-11 22:06:40 +03001358static void smp_timeout(struct work_struct *work)
1359{
1360 struct smp_chan *smp = container_of(work, struct smp_chan,
1361 security_timer.work);
1362 struct l2cap_conn *conn = smp->conn;
1363
1364 BT_DBG("conn %p", conn);
1365
Johan Hedberg1e91c292014-08-18 20:33:29 +03001366 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001367}
1368
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001369static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1370{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001371 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001372 struct smp_chan *smp;
1373
Marcel Holtmannf1560462013-10-13 05:43:25 -07001374 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001375 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001376 return NULL;
1377
Herbert Xu71af2f62016-01-24 21:18:30 +08001378 smp->tfm_aes = crypto_alloc_skcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001379 if (IS_ERR(smp->tfm_aes)) {
1380 BT_ERR("Unable to create ECB crypto context");
Marcel Holtmann276812e2015-03-16 01:10:18 -07001381 kzfree(smp);
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001382 return NULL;
1383 }
1384
Herbert Xu71af2f62016-01-24 21:18:30 +08001385 smp->tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Johan Hedberg407cecf62014-05-02 14:19:47 +03001386 if (IS_ERR(smp->tfm_cmac)) {
1387 BT_ERR("Unable to create CMAC crypto context");
Herbert Xu71af2f62016-01-24 21:18:30 +08001388 crypto_free_skcipher(smp->tfm_aes);
Marcel Holtmann276812e2015-03-16 01:10:18 -07001389 kzfree(smp);
Johan Hedberg407cecf62014-05-02 14:19:47 +03001390 return NULL;
1391 }
1392
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001393 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001394 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001395
Johan Hedbergb28b4942014-09-05 22:19:55 +03001396 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1397
Johan Hedbergb68fda62014-08-11 22:06:40 +03001398 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1399
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001400 hci_conn_hold(conn->hcon);
1401
1402 return smp;
1403}
1404
Johan Hedberg760b0182014-06-06 11:44:05 +03001405static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1406{
1407 struct hci_conn *hcon = smp->conn->hcon;
1408 u8 *na, *nb, a[7], b[7];
1409
1410 if (hcon->out) {
1411 na = smp->prnd;
1412 nb = smp->rrnd;
1413 } else {
1414 na = smp->rrnd;
1415 nb = smp->prnd;
1416 }
1417
1418 memcpy(a, &hcon->init_addr, 6);
1419 memcpy(b, &hcon->resp_addr, 6);
1420 a[6] = hcon->init_addr_type;
1421 b[6] = hcon->resp_addr_type;
1422
1423 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1424}
1425
Johan Hedberg38606f12014-06-25 11:10:28 +03001426static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001427{
1428 struct hci_conn *hcon = smp->conn->hcon;
1429 struct smp_cmd_dhkey_check check;
1430 u8 a[7], b[7], *local_addr, *remote_addr;
1431 u8 io_cap[3], r[16];
1432
Johan Hedberg760b0182014-06-06 11:44:05 +03001433 memcpy(a, &hcon->init_addr, 6);
1434 memcpy(b, &hcon->resp_addr, 6);
1435 a[6] = hcon->init_addr_type;
1436 b[6] = hcon->resp_addr_type;
1437
1438 if (hcon->out) {
1439 local_addr = a;
1440 remote_addr = b;
1441 memcpy(io_cap, &smp->preq[1], 3);
1442 } else {
1443 local_addr = b;
1444 remote_addr = a;
1445 memcpy(io_cap, &smp->prsp[1], 3);
1446 }
1447
Johan Hedbergdddd3052014-06-01 15:38:09 +03001448 memset(r, 0, sizeof(r));
1449
1450 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001451 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001452
Johan Hedberga29b0732014-10-28 15:17:05 +01001453 if (smp->method == REQ_OOB)
1454 memcpy(r, smp->rr, 16);
1455
Johan Hedberg760b0182014-06-06 11:44:05 +03001456 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1457 local_addr, remote_addr, check.e);
1458
1459 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001460}
1461
Johan Hedberg38606f12014-06-25 11:10:28 +03001462static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1463{
1464 struct l2cap_conn *conn = smp->conn;
1465 struct hci_conn *hcon = conn->hcon;
1466 struct smp_cmd_pairing_confirm cfm;
1467 u8 r;
1468
1469 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1470 r |= 0x80;
1471
1472 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1473
1474 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1475 cfm.confirm_val))
1476 return SMP_UNSPECIFIED;
1477
1478 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1479
1480 return 0;
1481}
1482
1483static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1484{
1485 struct l2cap_conn *conn = smp->conn;
1486 struct hci_conn *hcon = conn->hcon;
1487 struct hci_dev *hdev = hcon->hdev;
1488 u8 cfm[16], r;
1489
1490 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1491 if (smp->passkey_round >= 20)
1492 return 0;
1493
1494 switch (smp_op) {
1495 case SMP_CMD_PAIRING_RANDOM:
1496 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1497 r |= 0x80;
1498
1499 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1500 smp->rrnd, r, cfm))
1501 return SMP_UNSPECIFIED;
1502
1503 if (memcmp(smp->pcnf, cfm, 16))
1504 return SMP_CONFIRM_FAILED;
1505
1506 smp->passkey_round++;
1507
1508 if (smp->passkey_round == 20) {
1509 /* Generate MacKey and LTK */
1510 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1511 return SMP_UNSPECIFIED;
1512 }
1513
1514 /* The round is only complete when the initiator
1515 * receives pairing random.
1516 */
1517 if (!hcon->out) {
1518 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1519 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001520 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001521 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001522 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001523 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001524 return 0;
1525 }
1526
1527 /* Start the next round */
1528 if (smp->passkey_round != 20)
1529 return sc_passkey_round(smp, 0);
1530
1531 /* Passkey rounds are complete - start DHKey Check */
1532 sc_dhkey_check(smp);
1533 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1534
1535 break;
1536
1537 case SMP_CMD_PAIRING_CONFIRM:
1538 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1539 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1540 return 0;
1541 }
1542
1543 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1544
1545 if (hcon->out) {
1546 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1547 sizeof(smp->prnd), smp->prnd);
1548 return 0;
1549 }
1550
1551 return sc_passkey_send_confirm(smp);
1552
1553 case SMP_CMD_PUBLIC_KEY:
1554 default:
1555 /* Initiating device starts the round */
1556 if (!hcon->out)
1557 return 0;
1558
1559 BT_DBG("%s Starting passkey round %u", hdev->name,
1560 smp->passkey_round + 1);
1561
1562 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1563
1564 return sc_passkey_send_confirm(smp);
1565 }
1566
1567 return 0;
1568}
1569
Johan Hedbergdddd3052014-06-01 15:38:09 +03001570static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1571{
Johan Hedberg38606f12014-06-25 11:10:28 +03001572 struct l2cap_conn *conn = smp->conn;
1573 struct hci_conn *hcon = conn->hcon;
1574 u8 smp_op;
1575
1576 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1577
Johan Hedbergdddd3052014-06-01 15:38:09 +03001578 switch (mgmt_op) {
1579 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1580 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1581 return 0;
1582 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1583 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1584 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001585 case MGMT_OP_USER_PASSKEY_REPLY:
1586 hcon->passkey_notify = le32_to_cpu(passkey);
1587 smp->passkey_round = 0;
1588
1589 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1590 smp_op = SMP_CMD_PAIRING_CONFIRM;
1591 else
1592 smp_op = 0;
1593
1594 if (sc_passkey_round(smp, smp_op))
1595 return -EIO;
1596
1597 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001598 }
1599
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001600 /* Initiator sends DHKey check first */
1601 if (hcon->out) {
1602 sc_dhkey_check(smp);
1603 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1604 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1605 sc_dhkey_check(smp);
1606 sc_add_ltk(smp);
1607 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001608
1609 return 0;
1610}
1611
Brian Gix2b64d152011-12-21 16:12:12 -08001612int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1613{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001614 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001615 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001616 struct smp_chan *smp;
1617 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001618 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001619
1620 BT_DBG("");
1621
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001622 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001623 return -ENOTCONN;
1624
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001625 chan = conn->smp;
1626 if (!chan)
1627 return -ENOTCONN;
1628
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001629 l2cap_chan_lock(chan);
1630 if (!chan->data) {
1631 err = -ENOTCONN;
1632 goto unlock;
1633 }
1634
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001635 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001636
Johan Hedberg760b0182014-06-06 11:44:05 +03001637 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1638 err = sc_user_reply(smp, mgmt_op, passkey);
1639 goto unlock;
1640 }
1641
Brian Gix2b64d152011-12-21 16:12:12 -08001642 switch (mgmt_op) {
1643 case MGMT_OP_USER_PASSKEY_REPLY:
1644 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001645 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001646 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001647 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001648 /* Fall Through */
1649 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001650 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001651 break;
1652 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1653 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001654 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001655 err = 0;
1656 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001657 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001658 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001659 err = -EOPNOTSUPP;
1660 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001661 }
1662
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001663 err = 0;
1664
Brian Gix2b64d152011-12-21 16:12:12 -08001665 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001666 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1667 u8 rsp = smp_confirm(smp);
1668 if (rsp)
1669 smp_failure(conn, rsp);
1670 }
Brian Gix2b64d152011-12-21 16:12:12 -08001671
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001672unlock:
1673 l2cap_chan_unlock(chan);
1674 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001675}
1676
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001677static void build_bredr_pairing_cmd(struct smp_chan *smp,
1678 struct smp_cmd_pairing *req,
1679 struct smp_cmd_pairing *rsp)
1680{
1681 struct l2cap_conn *conn = smp->conn;
1682 struct hci_dev *hdev = conn->hcon->hdev;
1683 u8 local_dist = 0, remote_dist = 0;
1684
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001685 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001686 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1687 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1688 }
1689
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001690 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001691 remote_dist |= SMP_DIST_ID_KEY;
1692
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001693 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001694 local_dist |= SMP_DIST_ID_KEY;
1695
1696 if (!rsp) {
1697 memset(req, 0, sizeof(*req));
1698
1699 req->init_key_dist = local_dist;
1700 req->resp_key_dist = remote_dist;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001701 req->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001702
1703 smp->remote_key_dist = remote_dist;
1704
1705 return;
1706 }
1707
1708 memset(rsp, 0, sizeof(*rsp));
1709
Johan Hedberge3f6a252015-06-11 13:52:30 +03001710 rsp->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001711 rsp->init_key_dist = req->init_key_dist & remote_dist;
1712 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1713
1714 smp->remote_key_dist = rsp->init_key_dist;
1715}
1716
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001717static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001718{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001719 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001720 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001721 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001722 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001723 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001724 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001725
1726 BT_DBG("conn %p", conn);
1727
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001728 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001729 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001730
Johan Hedberg40bef302014-07-16 11:42:27 +03001731 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001732 return SMP_CMD_NOTSUPP;
1733
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001734 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001735 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001736 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001737 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001738
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001739 if (!smp)
1740 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001741
Johan Hedbergc05b9332014-09-10 17:37:42 -07001742 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001743 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001744
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001745 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001746 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001747 return SMP_PAIRING_NOTSUPP;
1748
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001749 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001750 return SMP_AUTH_REQUIREMENTS;
1751
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001752 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1753 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001754 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001755
Johan Hedbergcb06d362015-03-16 21:12:34 +02001756 /* If the remote side's OOB flag is set it means it has
1757 * successfully received our local OOB data - therefore set the
1758 * flag to indicate that local OOB is in use.
1759 */
Johan Hedberg58428562015-03-16 11:45:45 +02001760 if (req->oob_flag == SMP_OOB_PRESENT)
1761 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1762
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001763 /* SMP over BR/EDR requires special treatment */
1764 if (conn->hcon->type == ACL_LINK) {
1765 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001766 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001767 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001768 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1769
1770 set_bit(SMP_FLAG_SC, &smp->flags);
1771
1772 build_bredr_pairing_cmd(smp, req, &rsp);
1773
1774 key_size = min(req->max_key_size, rsp.max_key_size);
1775 if (check_enc_key_size(conn, key_size))
1776 return SMP_ENC_KEY_SIZE;
1777
1778 /* Clear bits which are generated but not distributed */
1779 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1780
1781 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1782 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1783 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1784
1785 smp_distribute_keys(smp);
1786 return 0;
1787 }
1788
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001789 build_pairing_cmd(conn, req, &rsp, auth);
1790
1791 if (rsp.auth_req & SMP_AUTH_SC)
1792 set_bit(SMP_FLAG_SC, &smp->flags);
1793
Johan Hedberg5be5e272014-09-10 17:58:54 -07001794 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001795 sec_level = BT_SECURITY_MEDIUM;
1796 else
1797 sec_level = authreq_to_seclevel(auth);
1798
Johan Hedbergc7262e72014-06-17 13:07:37 +03001799 if (sec_level > conn->hcon->pending_sec_level)
1800 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001801
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001802 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001803 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1804 u8 method;
1805
1806 method = get_auth_method(smp, conn->hcon->io_capability,
1807 req->io_capability);
1808 if (method == JUST_WORKS || method == JUST_CFM)
1809 return SMP_AUTH_REQUIREMENTS;
1810 }
1811
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001812 key_size = min(req->max_key_size, rsp.max_key_size);
1813 if (check_enc_key_size(conn, key_size))
1814 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001815
Johan Hedberge84a6b12013-12-02 10:49:03 +02001816 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001817
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001818 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1819 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001820
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001821 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001822
1823 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1824
Johan Hedberg19c5ce92015-03-15 19:34:04 +02001825 /* Strictly speaking we shouldn't allow Pairing Confirm for the
1826 * SC case, however some implementations incorrectly copy RFU auth
1827 * req bits from our security request, which may create a false
1828 * positive SC enablement.
1829 */
1830 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1831
Johan Hedberg3b191462014-06-06 10:50:15 +03001832 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1833 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1834 /* Clear bits which are generated but not distributed */
1835 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1836 /* Wait for Public Key from Initiating Device */
1837 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001838 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001839
Brian Gix2b64d152011-12-21 16:12:12 -08001840 /* Request setup of TK */
1841 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1842 if (ret)
1843 return SMP_UNSPECIFIED;
1844
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001845 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001846}
1847
Johan Hedberg3b191462014-06-06 10:50:15 +03001848static u8 sc_send_public_key(struct smp_chan *smp)
1849{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001850 struct hci_dev *hdev = smp->conn->hcon->hdev;
1851
Johan Hedberg3b191462014-06-06 10:50:15 +03001852 BT_DBG("");
1853
Johan Hedberg1a8bab42015-03-16 11:45:44 +02001854 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001855 struct l2cap_chan *chan = hdev->smp_data;
1856 struct smp_dev *smp_dev;
1857
1858 if (!chan || !chan->data)
1859 return SMP_UNSPECIFIED;
1860
1861 smp_dev = chan->data;
1862
1863 memcpy(smp->local_pk, smp_dev->local_pk, 64);
1864 memcpy(smp->local_sk, smp_dev->local_sk, 32);
Marcel Holtmannfb334fe2015-03-16 12:34:57 -07001865 memcpy(smp->lr, smp_dev->local_rand, 16);
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001866
1867 if (smp_dev->debug_key)
1868 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1869
1870 goto done;
1871 }
1872
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001873 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Johan Hedberg70157ef2014-06-24 15:22:59 +03001874 BT_DBG("Using debug keys");
1875 memcpy(smp->local_pk, debug_pk, 64);
1876 memcpy(smp->local_sk, debug_sk, 32);
1877 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1878 } else {
1879 while (true) {
1880 /* Generate local key pair for Secure Connections */
1881 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1882 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001883
Johan Hedberg70157ef2014-06-24 15:22:59 +03001884 /* This is unlikely, but we need to check that
1885 * we didn't accidentially generate a debug key.
1886 */
1887 if (memcmp(smp->local_sk, debug_sk, 32))
1888 break;
1889 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001890 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001891
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001892done:
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001893 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
Marcel Holtmann8e4e2ee2015-03-16 01:10:25 -07001894 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32);
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001895 SMP_DBG("Local Private Key: %32phN", smp->local_sk);
Johan Hedberg3b191462014-06-06 10:50:15 +03001896
1897 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1898
1899 return 0;
1900}
1901
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001902static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001903{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001904 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001905 struct l2cap_chan *chan = conn->smp;
1906 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001907 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001908 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001909 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001910
1911 BT_DBG("conn %p", conn);
1912
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001913 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001914 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001915
Johan Hedberg40bef302014-07-16 11:42:27 +03001916 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001917 return SMP_CMD_NOTSUPP;
1918
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001919 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001920
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001921 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001922
1923 key_size = min(req->max_key_size, rsp->max_key_size);
1924 if (check_enc_key_size(conn, key_size))
1925 return SMP_ENC_KEY_SIZE;
1926
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001927 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001928
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001929 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001930 return SMP_AUTH_REQUIREMENTS;
1931
Johan Hedbergcb06d362015-03-16 21:12:34 +02001932 /* If the remote side's OOB flag is set it means it has
1933 * successfully received our local OOB data - therefore set the
1934 * flag to indicate that local OOB is in use.
1935 */
Johan Hedberg58428562015-03-16 11:45:45 +02001936 if (rsp->oob_flag == SMP_OOB_PRESENT)
1937 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1938
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001939 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1940 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1941
1942 /* Update remote key distribution in case the remote cleared
1943 * some bits that we had enabled in our request.
1944 */
1945 smp->remote_key_dist &= rsp->resp_key_dist;
1946
1947 /* For BR/EDR this means we're done and can start phase 3 */
1948 if (conn->hcon->type == ACL_LINK) {
1949 /* Clear bits which are generated but not distributed */
1950 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1951 smp_distribute_keys(smp);
1952 return 0;
1953 }
1954
Johan Hedberg65668772014-05-16 11:03:34 +03001955 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1956 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001957 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1958 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001959
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001960 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001961 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1962 u8 method;
1963
1964 method = get_auth_method(smp, req->io_capability,
1965 rsp->io_capability);
1966 if (method == JUST_WORKS || method == JUST_CFM)
1967 return SMP_AUTH_REQUIREMENTS;
1968 }
1969
Johan Hedberge84a6b12013-12-02 10:49:03 +02001970 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001971
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001972 /* Update remote key distribution in case the remote cleared
1973 * some bits that we had enabled in our request.
1974 */
1975 smp->remote_key_dist &= rsp->resp_key_dist;
1976
Johan Hedberg3b191462014-06-06 10:50:15 +03001977 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1978 /* Clear bits which are generated but not distributed */
1979 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1980 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1981 return sc_send_public_key(smp);
1982 }
1983
Johan Hedbergc05b9332014-09-10 17:37:42 -07001984 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001985
Johan Hedberg476585e2012-06-06 18:54:15 +08001986 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001987 if (ret)
1988 return SMP_UNSPECIFIED;
1989
Johan Hedberg4a74d652014-05-20 09:45:50 +03001990 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001991
1992 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001993 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001994 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001995
1996 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001997}
1998
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001999static u8 sc_check_confirm(struct smp_chan *smp)
2000{
2001 struct l2cap_conn *conn = smp->conn;
2002
2003 BT_DBG("");
2004
Johan Hedberg38606f12014-06-25 11:10:28 +03002005 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2006 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
2007
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002008 if (conn->hcon->out) {
2009 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2010 smp->prnd);
2011 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2012 }
2013
2014 return 0;
2015}
2016
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002017/* Work-around for some implementations that incorrectly copy RFU bits
2018 * from our security request and thereby create the impression that
2019 * we're doing SC when in fact the remote doesn't support it.
2020 */
2021static int fixup_sc_false_positive(struct smp_chan *smp)
2022{
2023 struct l2cap_conn *conn = smp->conn;
2024 struct hci_conn *hcon = conn->hcon;
2025 struct hci_dev *hdev = hcon->hdev;
2026 struct smp_cmd_pairing *req, *rsp;
2027 u8 auth;
2028
2029 /* The issue is only observed when we're in slave role */
2030 if (hcon->out)
2031 return SMP_UNSPECIFIED;
2032
2033 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
2034 BT_ERR("Refusing SMP SC -> legacy fallback in SC-only mode");
2035 return SMP_UNSPECIFIED;
2036 }
2037
2038 BT_ERR("Trying to fall back to legacy SMP");
2039
2040 req = (void *) &smp->preq[1];
2041 rsp = (void *) &smp->prsp[1];
2042
2043 /* Rebuild key dist flags which may have been cleared for SC */
2044 smp->remote_key_dist = (req->init_key_dist & rsp->resp_key_dist);
2045
2046 auth = req->auth_req & AUTH_REQ_MASK(hdev);
2047
2048 if (tk_request(conn, 0, auth, rsp->io_capability, req->io_capability)) {
2049 BT_ERR("Failed to fall back to legacy SMP");
2050 return SMP_UNSPECIFIED;
2051 }
2052
2053 clear_bit(SMP_FLAG_SC, &smp->flags);
2054
2055 return 0;
2056}
2057
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002058static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002059{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002060 struct l2cap_chan *chan = conn->smp;
2061 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002062
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002063 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
2064
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002065 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002066 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002067
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002068 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
2069 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002070
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002071 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2072 int ret;
2073
2074 /* Public Key exchange must happen before any other steps */
2075 if (test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
2076 return sc_check_confirm(smp);
2077
2078 BT_ERR("Unexpected SMP Pairing Confirm");
2079
2080 ret = fixup_sc_false_positive(smp);
2081 if (ret)
2082 return ret;
2083 }
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002084
Johan Hedbergb28b4942014-09-05 22:19:55 +03002085 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02002086 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2087 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002088 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2089 return 0;
2090 }
2091
2092 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002093 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07002094
2095 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002096
2097 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002098}
2099
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002100static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002101{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002102 struct l2cap_chan *chan = conn->smp;
2103 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002104 struct hci_conn *hcon = conn->hcon;
2105 u8 *pkax, *pkbx, *na, *nb;
2106 u32 passkey;
2107 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002108
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002109 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002110
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002111 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002112 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002113
Johan Hedberg943a7322014-03-18 12:58:24 +02002114 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002115 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002116
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002117 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2118 return smp_random(smp);
2119
Johan Hedberg580039e2014-12-03 16:26:37 +02002120 if (hcon->out) {
2121 pkax = smp->local_pk;
2122 pkbx = smp->remote_pk;
2123 na = smp->prnd;
2124 nb = smp->rrnd;
2125 } else {
2126 pkax = smp->remote_pk;
2127 pkbx = smp->local_pk;
2128 na = smp->rrnd;
2129 nb = smp->prnd;
2130 }
2131
Johan Hedberga29b0732014-10-28 15:17:05 +01002132 if (smp->method == REQ_OOB) {
2133 if (!hcon->out)
2134 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2135 sizeof(smp->prnd), smp->prnd);
2136 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2137 goto mackey_and_ltk;
2138 }
2139
Johan Hedberg38606f12014-06-25 11:10:28 +03002140 /* Passkey entry has special treatment */
2141 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2142 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2143
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002144 if (hcon->out) {
2145 u8 cfm[16];
2146
2147 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2148 smp->rrnd, 0, cfm);
2149 if (err)
2150 return SMP_UNSPECIFIED;
2151
2152 if (memcmp(smp->pcnf, cfm, 16))
2153 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002154 } else {
2155 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2156 smp->prnd);
2157 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002158 }
2159
Johan Hedberga29b0732014-10-28 15:17:05 +01002160mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002161 /* Generate MacKey and LTK */
2162 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2163 if (err)
2164 return SMP_UNSPECIFIED;
2165
Johan Hedberga29b0732014-10-28 15:17:05 +01002166 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002167 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002168 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002169 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2170 }
2171 return 0;
2172 }
2173
Johan Hedberg38606f12014-06-25 11:10:28 +03002174 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002175 if (err)
2176 return SMP_UNSPECIFIED;
2177
Johan Hedberg38606f12014-06-25 11:10:28 +03002178 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
2179 hcon->dst_type, passkey, 0);
2180 if (err)
2181 return SMP_UNSPECIFIED;
2182
2183 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2184
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002185 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002186}
2187
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002188static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002189{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002190 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002191 struct hci_conn *hcon = conn->hcon;
2192
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002193 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002194 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002195 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002196
Johan Hedberga6f78332014-09-10 17:37:45 -07002197 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002198 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002199
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002200 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002201 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002202
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002203 hci_le_start_enc(hcon, key->ediv, key->rand, key->val, key->enc_size);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002204 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002205
Johan Hedbergfe59a052014-07-01 19:14:12 +03002206 /* We never store STKs for master role, so clear this flag */
2207 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2208
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002209 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002210}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002211
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002212bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2213 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002214{
2215 if (sec_level == BT_SECURITY_LOW)
2216 return true;
2217
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002218 /* If we're encrypted with an STK but the caller prefers using
2219 * LTK claim insufficient security. This way we allow the
2220 * connection to be re-encrypted with an LTK, even if the LTK
2221 * provides the same level of security. Only exception is if we
2222 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002223 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002224 if (key_pref == SMP_USE_LTK &&
2225 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002226 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002227 return false;
2228
Johan Hedberg854f4722014-07-01 18:40:20 +03002229 if (hcon->sec_level >= sec_level)
2230 return true;
2231
2232 return false;
2233}
2234
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002235static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002236{
2237 struct smp_cmd_security_req *rp = (void *) skb->data;
2238 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002239 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002240 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002241 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002242 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002243
2244 BT_DBG("conn %p", conn);
2245
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002246 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002247 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002248
Johan Hedberg40bef302014-07-16 11:42:27 +03002249 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002250 return SMP_CMD_NOTSUPP;
2251
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002252 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002253
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002254 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002255 return SMP_AUTH_REQUIREMENTS;
2256
Johan Hedberg5be5e272014-09-10 17:58:54 -07002257 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002258 sec_level = BT_SECURITY_MEDIUM;
2259 else
2260 sec_level = authreq_to_seclevel(auth);
2261
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002262 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002263 return 0;
2264
Johan Hedbergc7262e72014-06-17 13:07:37 +03002265 if (sec_level > hcon->pending_sec_level)
2266 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002267
Johan Hedberg4dab7862012-06-07 14:58:37 +08002268 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002269 return 0;
2270
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002271 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002272 if (!smp)
2273 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002274
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002275 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002276 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002277 return SMP_PAIRING_NOTSUPP;
2278
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002279 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002280
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002281 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002282 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002283
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002284 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2285 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002286
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002287 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002288 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002289
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002290 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002291}
2292
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002293int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002294{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002295 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002296 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002297 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002298 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002299 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002300
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002301 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2302
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002303 /* This may be NULL if there's an unexpected disconnection */
2304 if (!conn)
2305 return 1;
2306
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002307 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002308 return 1;
2309
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002310 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002311 return 1;
2312
Johan Hedbergc7262e72014-06-17 13:07:37 +03002313 if (sec_level > hcon->pending_sec_level)
2314 hcon->pending_sec_level = sec_level;
2315
Johan Hedberg40bef302014-07-16 11:42:27 +03002316 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002317 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2318 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002319
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002320 chan = conn->smp;
2321 if (!chan) {
2322 BT_ERR("SMP security requested but not available");
2323 return 1;
2324 }
2325
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002326 l2cap_chan_lock(chan);
2327
2328 /* If SMP is already in progress ignore this request */
2329 if (chan->data) {
2330 ret = 0;
2331 goto unlock;
2332 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002333
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002334 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002335 if (!smp) {
2336 ret = 1;
2337 goto unlock;
2338 }
Brian Gix2b64d152011-12-21 16:12:12 -08002339
2340 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002341
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002342 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED))
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002343 authreq |= SMP_AUTH_SC;
2344
Johan Hedberg79897d22014-06-01 09:45:24 +03002345 /* Require MITM if IO Capability allows or the security level
2346 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002347 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002348 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002349 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002350 authreq |= SMP_AUTH_MITM;
2351
Johan Hedberg40bef302014-07-16 11:42:27 +03002352 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002353 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002354
Brian Gix2b64d152011-12-21 16:12:12 -08002355 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002356 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2357 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002358
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002359 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002360 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002361 } else {
2362 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002363 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002364 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002365 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002366 }
2367
Johan Hedberg4a74d652014-05-20 09:45:50 +03002368 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002369 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002370
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002371unlock:
2372 l2cap_chan_unlock(chan);
2373 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002374}
2375
Johan Hedbergc81d5552015-10-22 09:38:35 +03002376void smp_cancel_pairing(struct hci_conn *hcon)
2377{
2378 struct l2cap_conn *conn = hcon->l2cap_data;
2379 struct l2cap_chan *chan;
2380 struct smp_chan *smp;
2381
2382 if (!conn)
2383 return;
2384
2385 chan = conn->smp;
2386 if (!chan)
2387 return;
2388
2389 l2cap_chan_lock(chan);
2390
2391 smp = chan->data;
2392 if (smp) {
2393 if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
2394 smp_failure(conn, 0);
2395 else
2396 smp_failure(conn, SMP_UNSPECIFIED);
2397 }
2398
2399 l2cap_chan_unlock(chan);
2400}
2401
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002402static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2403{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002404 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002405 struct l2cap_chan *chan = conn->smp;
2406 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002407
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002408 BT_DBG("conn %p", conn);
2409
2410 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002411 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002412
Johan Hedbergb28b4942014-09-05 22:19:55 +03002413 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002414
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002415 skb_pull(skb, sizeof(*rp));
2416
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002417 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002418
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002419 return 0;
2420}
2421
2422static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2423{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002424 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002425 struct l2cap_chan *chan = conn->smp;
2426 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002427 struct hci_dev *hdev = conn->hcon->hdev;
2428 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002429 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002430 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002431
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002432 BT_DBG("conn %p", conn);
2433
2434 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002435 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002436
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002437 /* Mark the information as received */
2438 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2439
Johan Hedbergb28b4942014-09-05 22:19:55 +03002440 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2441 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002442 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2443 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002444
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002445 skb_pull(skb, sizeof(*rp));
2446
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002447 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002448 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002449 authenticated, smp->tk, smp->enc_key_size,
2450 rp->ediv, rp->rand);
2451 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002452 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002453 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002454
2455 return 0;
2456}
2457
Johan Hedbergfd349c02014-02-18 10:19:36 +02002458static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2459{
2460 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002461 struct l2cap_chan *chan = conn->smp;
2462 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002463
2464 BT_DBG("");
2465
2466 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002467 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002468
Johan Hedbergb28b4942014-09-05 22:19:55 +03002469 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002470
Johan Hedbergfd349c02014-02-18 10:19:36 +02002471 skb_pull(skb, sizeof(*info));
2472
2473 memcpy(smp->irk, info->irk, 16);
2474
2475 return 0;
2476}
2477
2478static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2479 struct sk_buff *skb)
2480{
2481 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002482 struct l2cap_chan *chan = conn->smp;
2483 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002484 struct hci_conn *hcon = conn->hcon;
2485 bdaddr_t rpa;
2486
2487 BT_DBG("");
2488
2489 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002490 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002491
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002492 /* Mark the information as received */
2493 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2494
Johan Hedbergb28b4942014-09-05 22:19:55 +03002495 if (smp->remote_key_dist & SMP_DIST_SIGN)
2496 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2497
Johan Hedbergfd349c02014-02-18 10:19:36 +02002498 skb_pull(skb, sizeof(*info));
2499
Johan Hedberga9a58f82014-02-25 22:24:37 +02002500 /* Strictly speaking the Core Specification (4.1) allows sending
2501 * an empty address which would force us to rely on just the IRK
2502 * as "identity information". However, since such
2503 * implementations are not known of and in order to not over
2504 * complicate our implementation, simply pretend that we never
2505 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002506 *
2507 * The Identity Address must also be a Static Random or Public
2508 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002509 */
Johan Hedberge12af482015-01-14 20:51:37 +02002510 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2511 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Johan Hedberga9a58f82014-02-25 22:24:37 +02002512 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002513 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002514 }
2515
Johan Hedbergfd349c02014-02-18 10:19:36 +02002516 bacpy(&smp->id_addr, &info->bdaddr);
2517 smp->id_addr_type = info->addr_type;
2518
2519 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2520 bacpy(&rpa, &hcon->dst);
2521 else
2522 bacpy(&rpa, BDADDR_ANY);
2523
Johan Hedberg23d0e122014-02-19 14:57:46 +02002524 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2525 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002526
Johan Hedberg31dd6242014-06-27 14:23:02 +03002527distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002528 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2529 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002530
2531 return 0;
2532}
2533
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002534static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2535{
2536 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002537 struct l2cap_chan *chan = conn->smp;
2538 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002539 struct smp_csrk *csrk;
2540
2541 BT_DBG("conn %p", conn);
2542
2543 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002544 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002545
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002546 /* Mark the information as received */
2547 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2548
2549 skb_pull(skb, sizeof(*rp));
2550
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002551 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2552 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002553 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2554 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2555 else
2556 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002557 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2558 }
2559 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002560 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002561
2562 return 0;
2563}
2564
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002565static u8 sc_select_method(struct smp_chan *smp)
2566{
2567 struct l2cap_conn *conn = smp->conn;
2568 struct hci_conn *hcon = conn->hcon;
2569 struct smp_cmd_pairing *local, *remote;
2570 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2571
Johan Hedberg1a8bab42015-03-16 11:45:44 +02002572 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) ||
2573 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags))
Johan Hedberga29b0732014-10-28 15:17:05 +01002574 return REQ_OOB;
2575
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002576 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2577 * which are needed as inputs to some crypto functions. To get
2578 * the "struct smp_cmd_pairing" from them we need to skip the
2579 * first byte which contains the opcode.
2580 */
2581 if (hcon->out) {
2582 local = (void *) &smp->preq[1];
2583 remote = (void *) &smp->prsp[1];
2584 } else {
2585 local = (void *) &smp->prsp[1];
2586 remote = (void *) &smp->preq[1];
2587 }
2588
2589 local_io = local->io_capability;
2590 remote_io = remote->io_capability;
2591
2592 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2593 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2594
2595 /* If either side wants MITM, look up the method from the table,
2596 * otherwise use JUST WORKS.
2597 */
2598 if (local_mitm || remote_mitm)
2599 method = get_auth_method(smp, local_io, remote_io);
2600 else
2601 method = JUST_WORKS;
2602
2603 /* Don't confirm locally initiated pairing attempts */
2604 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2605 method = JUST_WORKS;
2606
2607 return method;
2608}
2609
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002610static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2611{
2612 struct smp_cmd_public_key *key = (void *) skb->data;
2613 struct hci_conn *hcon = conn->hcon;
2614 struct l2cap_chan *chan = conn->smp;
2615 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002616 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002617 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002618 int err;
2619
2620 BT_DBG("conn %p", conn);
2621
2622 if (skb->len < sizeof(*key))
2623 return SMP_INVALID_PARAMS;
2624
2625 memcpy(smp->remote_pk, key, 64);
2626
Johan Hedberga8ca6172015-03-16 18:12:57 +02002627 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {
2628 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2629 smp->rr, 0, cfm.confirm_val);
2630 if (err)
2631 return SMP_UNSPECIFIED;
2632
2633 if (memcmp(cfm.confirm_val, smp->pcnf, 16))
2634 return SMP_CONFIRM_FAILED;
2635 }
2636
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002637 /* Non-initiating device sends its public key after receiving
2638 * the key from the initiating device.
2639 */
2640 if (!hcon->out) {
2641 err = sc_send_public_key(smp);
2642 if (err)
2643 return err;
2644 }
2645
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002646 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
Marcel Holtmanne0915262015-03-16 12:34:55 -07002647 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002648
2649 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2650 return SMP_UNSPECIFIED;
2651
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002652 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002653
2654 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2655
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002656 smp->method = sc_select_method(smp);
2657
2658 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2659
2660 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2661 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2662 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2663 else
2664 hcon->pending_sec_level = BT_SECURITY_FIPS;
2665
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002666 if (!memcmp(debug_pk, smp->remote_pk, 64))
2667 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2668
Johan Hedberg38606f12014-06-25 11:10:28 +03002669 if (smp->method == DSP_PASSKEY) {
2670 get_random_bytes(&hcon->passkey_notify,
2671 sizeof(hcon->passkey_notify));
2672 hcon->passkey_notify %= 1000000;
2673 hcon->passkey_entered = 0;
2674 smp->passkey_round = 0;
2675 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2676 hcon->dst_type,
2677 hcon->passkey_notify,
2678 hcon->passkey_entered))
2679 return SMP_UNSPECIFIED;
2680 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2681 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2682 }
2683
Johan Hedberg94ea7252015-03-16 11:45:46 +02002684 if (smp->method == REQ_OOB) {
Johan Hedberga29b0732014-10-28 15:17:05 +01002685 if (hcon->out)
2686 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2687 sizeof(smp->prnd), smp->prnd);
2688
2689 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2690
2691 return 0;
2692 }
2693
Johan Hedberg38606f12014-06-25 11:10:28 +03002694 if (hcon->out)
2695 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2696
2697 if (smp->method == REQ_PASSKEY) {
2698 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2699 hcon->dst_type))
2700 return SMP_UNSPECIFIED;
2701 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2702 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2703 return 0;
2704 }
2705
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002706 /* The Initiating device waits for the non-initiating device to
2707 * send the confirm value.
2708 */
2709 if (conn->hcon->out)
2710 return 0;
2711
2712 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2713 0, cfm.confirm_val);
2714 if (err)
2715 return SMP_UNSPECIFIED;
2716
2717 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2718 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2719
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002720 return 0;
2721}
2722
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002723static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2724{
2725 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2726 struct l2cap_chan *chan = conn->smp;
2727 struct hci_conn *hcon = conn->hcon;
2728 struct smp_chan *smp = chan->data;
2729 u8 a[7], b[7], *local_addr, *remote_addr;
2730 u8 io_cap[3], r[16], e[16];
2731 int err;
2732
2733 BT_DBG("conn %p", conn);
2734
2735 if (skb->len < sizeof(*check))
2736 return SMP_INVALID_PARAMS;
2737
2738 memcpy(a, &hcon->init_addr, 6);
2739 memcpy(b, &hcon->resp_addr, 6);
2740 a[6] = hcon->init_addr_type;
2741 b[6] = hcon->resp_addr_type;
2742
2743 if (hcon->out) {
2744 local_addr = a;
2745 remote_addr = b;
2746 memcpy(io_cap, &smp->prsp[1], 3);
2747 } else {
2748 local_addr = b;
2749 remote_addr = a;
2750 memcpy(io_cap, &smp->preq[1], 3);
2751 }
2752
2753 memset(r, 0, sizeof(r));
2754
Johan Hedberg38606f12014-06-25 11:10:28 +03002755 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2756 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg882fafa2015-03-16 11:45:43 +02002757 else if (smp->method == REQ_OOB)
2758 memcpy(r, smp->lr, 16);
Johan Hedberg38606f12014-06-25 11:10:28 +03002759
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002760 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2761 io_cap, remote_addr, local_addr, e);
2762 if (err)
2763 return SMP_UNSPECIFIED;
2764
2765 if (memcmp(check->e, e, 16))
2766 return SMP_DHKEY_CHECK_FAILED;
2767
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002768 if (!hcon->out) {
2769 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2770 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2771 return 0;
2772 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002773
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002774 /* Slave sends DHKey check as response to master */
2775 sc_dhkey_check(smp);
2776 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002777
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002778 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002779
2780 if (hcon->out) {
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002781 hci_le_start_enc(hcon, 0, 0, smp->tk, smp->enc_key_size);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002782 hcon->enc_key_size = smp->enc_key_size;
2783 }
2784
2785 return 0;
2786}
2787
Johan Hedberg1408bb62014-06-04 22:45:57 +03002788static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2789 struct sk_buff *skb)
2790{
2791 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2792
2793 BT_DBG("value 0x%02x", kp->value);
2794
2795 return 0;
2796}
2797
Johan Hedberg4befb862014-08-11 22:06:38 +03002798static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002799{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002800 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002801 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002802 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002803 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002804 int err = 0;
2805
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002806 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002807 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002808
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002809 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002810 reason = SMP_PAIRING_NOTSUPP;
2811 goto done;
2812 }
2813
Marcel Holtmann92381f52013-10-03 01:23:08 -07002814 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002815 skb_pull(skb, sizeof(code));
2816
Johan Hedbergb28b4942014-09-05 22:19:55 +03002817 smp = chan->data;
2818
2819 if (code > SMP_CMD_MAX)
2820 goto drop;
2821
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002822 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002823 goto drop;
2824
2825 /* If we don't have a context the only allowed commands are
2826 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002827 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002828 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2829 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002830
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002831 switch (code) {
2832 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002833 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002834 break;
2835
2836 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002837 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002838 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002839 break;
2840
2841 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002842 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002843 break;
2844
2845 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002846 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002847 break;
2848
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002849 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002850 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002851 break;
2852
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002853 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002854 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002855 break;
2856
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002857 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002858 reason = smp_cmd_encrypt_info(conn, skb);
2859 break;
2860
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002861 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002862 reason = smp_cmd_master_ident(conn, skb);
2863 break;
2864
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002865 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002866 reason = smp_cmd_ident_info(conn, skb);
2867 break;
2868
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002869 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002870 reason = smp_cmd_ident_addr_info(conn, skb);
2871 break;
2872
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002873 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002874 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002875 break;
2876
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002877 case SMP_CMD_PUBLIC_KEY:
2878 reason = smp_cmd_public_key(conn, skb);
2879 break;
2880
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002881 case SMP_CMD_DHKEY_CHECK:
2882 reason = smp_cmd_dhkey_check(conn, skb);
2883 break;
2884
Johan Hedberg1408bb62014-06-04 22:45:57 +03002885 case SMP_CMD_KEYPRESS_NOTIFY:
2886 reason = smp_cmd_keypress_notify(conn, skb);
2887 break;
2888
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002889 default:
2890 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002891 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002892 goto done;
2893 }
2894
2895done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002896 if (!err) {
2897 if (reason)
2898 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002899 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002900 }
2901
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002902 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002903
2904drop:
2905 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2906 code, &hcon->dst);
2907 kfree_skb(skb);
2908 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002909}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002910
Johan Hedberg70db83c2014-08-08 09:37:16 +03002911static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2912{
2913 struct l2cap_conn *conn = chan->conn;
2914
2915 BT_DBG("chan %p", chan);
2916
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002917 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002918 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002919
Johan Hedberg70db83c2014-08-08 09:37:16 +03002920 conn->smp = NULL;
2921 l2cap_chan_put(chan);
2922}
2923
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002924static void bredr_pairing(struct l2cap_chan *chan)
2925{
2926 struct l2cap_conn *conn = chan->conn;
2927 struct hci_conn *hcon = conn->hcon;
2928 struct hci_dev *hdev = hcon->hdev;
2929 struct smp_cmd_pairing req;
2930 struct smp_chan *smp;
2931
2932 BT_DBG("chan %p", chan);
2933
2934 /* Only new pairings are interesting */
2935 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2936 return;
2937
2938 /* Don't bother if we're not encrypted */
2939 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2940 return;
2941
2942 /* Only master may initiate SMP over BR/EDR */
2943 if (hcon->role != HCI_ROLE_MASTER)
2944 return;
2945
2946 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002947 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002948 return;
2949
2950 /* BR/EDR must use Secure Connections for SMP */
2951 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07002952 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002953 return;
2954
2955 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002956 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002957 return;
2958
2959 /* Don't bother if remote LE support is not enabled */
2960 if (!lmp_host_le_capable(hcon))
2961 return;
2962
2963 /* Remote must support SMP fixed chan for BR/EDR */
2964 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2965 return;
2966
2967 /* Don't bother if SMP is already ongoing */
2968 if (chan->data)
2969 return;
2970
2971 smp = smp_chan_create(conn);
2972 if (!smp) {
2973 BT_ERR("%s unable to create SMP context for BR/EDR",
2974 hdev->name);
2975 return;
2976 }
2977
2978 set_bit(SMP_FLAG_SC, &smp->flags);
2979
2980 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2981
2982 /* Prepare and send the BR/EDR SMP Pairing Request */
2983 build_bredr_pairing_cmd(smp, &req, NULL);
2984
2985 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2986 memcpy(&smp->preq[1], &req, sizeof(req));
2987
2988 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2989 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2990}
2991
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002992static void smp_resume_cb(struct l2cap_chan *chan)
2993{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002994 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002995 struct l2cap_conn *conn = chan->conn;
2996 struct hci_conn *hcon = conn->hcon;
2997
2998 BT_DBG("chan %p", chan);
2999
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003000 if (hcon->type == ACL_LINK) {
3001 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003002 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003003 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003004
Johan Hedberg86d14072014-08-11 22:06:43 +03003005 if (!smp)
3006 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03003007
Johan Hedberg84bc0db2014-09-05 22:19:49 +03003008 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3009 return;
3010
Johan Hedberg86d14072014-08-11 22:06:43 +03003011 cancel_delayed_work(&smp->security_timer);
3012
Johan Hedbergd6268e82014-09-05 22:19:51 +03003013 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003014}
3015
Johan Hedberg70db83c2014-08-08 09:37:16 +03003016static void smp_ready_cb(struct l2cap_chan *chan)
3017{
3018 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003019 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003020
3021 BT_DBG("chan %p", chan);
3022
Johan Hedberg78837462015-11-11 21:47:12 +02003023 /* No need to call l2cap_chan_hold() here since we already own
3024 * the reference taken in smp_new_conn_cb(). This is just the
3025 * first time that we tie it to a specific pointer. The code in
3026 * l2cap_core.c ensures that there's no risk this function wont
3027 * get called if smp_new_conn_cb was previously called.
3028 */
Johan Hedberg70db83c2014-08-08 09:37:16 +03003029 conn->smp = chan;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003030
3031 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3032 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003033}
3034
Johan Hedberg4befb862014-08-11 22:06:38 +03003035static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
3036{
3037 int err;
3038
3039 BT_DBG("chan %p", chan);
3040
3041 err = smp_sig_channel(chan, skb);
3042 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03003043 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03003044
Johan Hedbergb68fda62014-08-11 22:06:40 +03003045 if (smp)
3046 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03003047
Johan Hedberg1e91c292014-08-18 20:33:29 +03003048 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03003049 }
3050
3051 return err;
3052}
3053
Johan Hedberg70db83c2014-08-08 09:37:16 +03003054static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
3055 unsigned long hdr_len,
3056 unsigned long len, int nb)
3057{
3058 struct sk_buff *skb;
3059
3060 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
3061 if (!skb)
3062 return ERR_PTR(-ENOMEM);
3063
3064 skb->priority = HCI_PRIO_MAX;
Johan Hedberga4368ff2015-03-30 23:21:01 +03003065 bt_cb(skb)->l2cap.chan = chan;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003066
3067 return skb;
3068}
3069
3070static const struct l2cap_ops smp_chan_ops = {
3071 .name = "Security Manager",
3072 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003073 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003074 .alloc_skb = smp_alloc_skb_cb,
3075 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003076 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003077
3078 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003079 .state_change = l2cap_chan_no_state_change,
3080 .close = l2cap_chan_no_close,
3081 .defer = l2cap_chan_no_defer,
3082 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003083 .set_shutdown = l2cap_chan_no_set_shutdown,
3084 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003085};
3086
3087static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
3088{
3089 struct l2cap_chan *chan;
3090
3091 BT_DBG("pchan %p", pchan);
3092
3093 chan = l2cap_chan_create();
3094 if (!chan)
3095 return NULL;
3096
3097 chan->chan_type = pchan->chan_type;
3098 chan->ops = &smp_chan_ops;
3099 chan->scid = pchan->scid;
3100 chan->dcid = chan->scid;
3101 chan->imtu = pchan->imtu;
3102 chan->omtu = pchan->omtu;
3103 chan->mode = pchan->mode;
3104
Johan Hedbergabe84902014-11-12 22:22:21 +02003105 /* Other L2CAP channels may request SMP routines in order to
3106 * change the security level. This means that the SMP channel
3107 * lock must be considered in its own category to avoid lockdep
3108 * warnings.
3109 */
3110 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
3111
Johan Hedberg70db83c2014-08-08 09:37:16 +03003112 BT_DBG("created chan %p", chan);
3113
3114 return chan;
3115}
3116
3117static const struct l2cap_ops smp_root_chan_ops = {
3118 .name = "Security Manager Root",
3119 .new_connection = smp_new_conn_cb,
3120
3121 /* None of these are implemented for the root channel */
3122 .close = l2cap_chan_no_close,
3123 .alloc_skb = l2cap_chan_no_alloc_skb,
3124 .recv = l2cap_chan_no_recv,
3125 .state_change = l2cap_chan_no_state_change,
3126 .teardown = l2cap_chan_no_teardown,
3127 .ready = l2cap_chan_no_ready,
3128 .defer = l2cap_chan_no_defer,
3129 .suspend = l2cap_chan_no_suspend,
3130 .resume = l2cap_chan_no_resume,
3131 .set_shutdown = l2cap_chan_no_set_shutdown,
3132 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003133};
3134
Johan Hedbergef8efe42014-08-13 15:12:32 +03003135static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003136{
Johan Hedberg70db83c2014-08-08 09:37:16 +03003137 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003138 struct smp_dev *smp;
Herbert Xu71af2f62016-01-24 21:18:30 +08003139 struct crypto_skcipher *tfm_aes;
3140 struct crypto_shash *tfm_cmac;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003141
Johan Hedbergef8efe42014-08-13 15:12:32 +03003142 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003143 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03003144 goto create_chan;
3145 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03003146
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003147 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3148 if (!smp)
3149 return ERR_PTR(-ENOMEM);
3150
Herbert Xu71af2f62016-01-24 21:18:30 +08003151 tfm_aes = crypto_alloc_skcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003152 if (IS_ERR(tfm_aes)) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003153 BT_ERR("Unable to create ECB crypto context");
3154 kzfree(smp);
Fengguang Wufe700772014-12-08 03:04:38 +08003155 return ERR_CAST(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003156 }
3157
Herbert Xu71af2f62016-01-24 21:18:30 +08003158 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003159 if (IS_ERR(tfm_cmac)) {
3160 BT_ERR("Unable to create CMAC crypto context");
Herbert Xu71af2f62016-01-24 21:18:30 +08003161 crypto_free_skcipher(tfm_aes);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003162 kzfree(smp);
3163 return ERR_CAST(tfm_cmac);
3164 }
3165
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003166 smp->tfm_aes = tfm_aes;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003167 smp->tfm_cmac = tfm_cmac;
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003168 smp->min_key_size = SMP_MIN_ENC_KEY_SIZE;
Johan Hedberg2fd36552015-06-11 13:52:26 +03003169 smp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003170
Johan Hedbergef8efe42014-08-13 15:12:32 +03003171create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003172 chan = l2cap_chan_create();
3173 if (!chan) {
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003174 if (smp) {
Herbert Xu71af2f62016-01-24 21:18:30 +08003175 crypto_free_skcipher(smp->tfm_aes);
3176 crypto_free_shash(smp->tfm_cmac);
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003177 kzfree(smp);
3178 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003179 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003180 }
3181
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003182 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003183
Johan Hedbergef8efe42014-08-13 15:12:32 +03003184 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003185
3186 l2cap_chan_set_defaults(chan);
3187
Marcel Holtmann157029b2015-01-14 15:43:09 -08003188 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003189 u8 bdaddr_type;
3190
3191 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3192
3193 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003194 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003195 else
3196 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003197 } else {
3198 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003199 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003200 }
3201
Johan Hedberg70db83c2014-08-08 09:37:16 +03003202 chan->state = BT_LISTEN;
3203 chan->mode = L2CAP_MODE_BASIC;
3204 chan->imtu = L2CAP_DEFAULT_MTU;
3205 chan->ops = &smp_root_chan_ops;
3206
Johan Hedbergabe84902014-11-12 22:22:21 +02003207 /* Set correct nesting level for a parent/listening channel */
3208 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3209
Johan Hedbergef8efe42014-08-13 15:12:32 +03003210 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003211}
3212
Johan Hedbergef8efe42014-08-13 15:12:32 +03003213static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003214{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003215 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003216
Johan Hedbergef8efe42014-08-13 15:12:32 +03003217 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003218
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003219 smp = chan->data;
3220 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003221 chan->data = NULL;
Herbert Xu71af2f62016-01-24 21:18:30 +08003222 crypto_free_skcipher(smp->tfm_aes);
3223 crypto_free_shash(smp->tfm_cmac);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003224 kzfree(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003225 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003226
Johan Hedberg70db83c2014-08-08 09:37:16 +03003227 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003228}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003229
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003230static ssize_t force_bredr_smp_read(struct file *file,
3231 char __user *user_buf,
3232 size_t count, loff_t *ppos)
3233{
3234 struct hci_dev *hdev = file->private_data;
3235 char buf[3];
3236
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003237 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP) ? 'Y': 'N';
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003238 buf[1] = '\n';
3239 buf[2] = '\0';
3240 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3241}
3242
3243static ssize_t force_bredr_smp_write(struct file *file,
3244 const char __user *user_buf,
3245 size_t count, loff_t *ppos)
3246{
3247 struct hci_dev *hdev = file->private_data;
3248 char buf[32];
3249 size_t buf_size = min(count, (sizeof(buf)-1));
3250 bool enable;
3251
3252 if (copy_from_user(buf, user_buf, buf_size))
3253 return -EFAULT;
3254
3255 buf[buf_size] = '\0';
3256 if (strtobool(buf, &enable))
3257 return -EINVAL;
3258
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003259 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003260 return -EALREADY;
3261
3262 if (enable) {
3263 struct l2cap_chan *chan;
3264
3265 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3266 if (IS_ERR(chan))
3267 return PTR_ERR(chan);
3268
3269 hdev->smp_bredr_data = chan;
3270 } else {
3271 struct l2cap_chan *chan;
3272
3273 chan = hdev->smp_bredr_data;
3274 hdev->smp_bredr_data = NULL;
3275 smp_del_chan(chan);
3276 }
3277
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003278 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003279
3280 return count;
3281}
3282
3283static const struct file_operations force_bredr_smp_fops = {
3284 .open = simple_open,
3285 .read = force_bredr_smp_read,
3286 .write = force_bredr_smp_write,
3287 .llseek = default_llseek,
3288};
3289
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003290static ssize_t le_min_key_size_read(struct file *file,
3291 char __user *user_buf,
3292 size_t count, loff_t *ppos)
3293{
3294 struct hci_dev *hdev = file->private_data;
3295 char buf[4];
3296
3297 snprintf(buf, sizeof(buf), "%2u\n", SMP_DEV(hdev)->min_key_size);
3298
3299 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
3300}
3301
3302static ssize_t le_min_key_size_write(struct file *file,
3303 const char __user *user_buf,
3304 size_t count, loff_t *ppos)
3305{
3306 struct hci_dev *hdev = file->private_data;
3307 char buf[32];
3308 size_t buf_size = min(count, (sizeof(buf) - 1));
3309 u8 key_size;
3310
3311 if (copy_from_user(buf, user_buf, buf_size))
3312 return -EFAULT;
3313
3314 buf[buf_size] = '\0';
3315
3316 sscanf(buf, "%hhu", &key_size);
3317
3318 if (key_size > SMP_DEV(hdev)->max_key_size ||
3319 key_size < SMP_MIN_ENC_KEY_SIZE)
3320 return -EINVAL;
3321
3322 SMP_DEV(hdev)->min_key_size = key_size;
3323
3324 return count;
3325}
3326
3327static const struct file_operations le_min_key_size_fops = {
3328 .open = simple_open,
3329 .read = le_min_key_size_read,
3330 .write = le_min_key_size_write,
3331 .llseek = default_llseek,
3332};
3333
Johan Hedberg2fd36552015-06-11 13:52:26 +03003334static ssize_t le_max_key_size_read(struct file *file,
3335 char __user *user_buf,
3336 size_t count, loff_t *ppos)
3337{
3338 struct hci_dev *hdev = file->private_data;
3339 char buf[4];
3340
3341 snprintf(buf, sizeof(buf), "%2u\n", SMP_DEV(hdev)->max_key_size);
3342
3343 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
3344}
3345
3346static ssize_t le_max_key_size_write(struct file *file,
3347 const char __user *user_buf,
3348 size_t count, loff_t *ppos)
3349{
3350 struct hci_dev *hdev = file->private_data;
3351 char buf[32];
3352 size_t buf_size = min(count, (sizeof(buf) - 1));
3353 u8 key_size;
3354
3355 if (copy_from_user(buf, user_buf, buf_size))
3356 return -EFAULT;
3357
3358 buf[buf_size] = '\0';
3359
3360 sscanf(buf, "%hhu", &key_size);
3361
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003362 if (key_size > SMP_MAX_ENC_KEY_SIZE ||
3363 key_size < SMP_DEV(hdev)->min_key_size)
Johan Hedberg2fd36552015-06-11 13:52:26 +03003364 return -EINVAL;
3365
3366 SMP_DEV(hdev)->max_key_size = key_size;
3367
3368 return count;
3369}
3370
3371static const struct file_operations le_max_key_size_fops = {
3372 .open = simple_open,
3373 .read = le_max_key_size_read,
3374 .write = le_max_key_size_write,
3375 .llseek = default_llseek,
3376};
3377
Johan Hedbergef8efe42014-08-13 15:12:32 +03003378int smp_register(struct hci_dev *hdev)
3379{
3380 struct l2cap_chan *chan;
3381
3382 BT_DBG("%s", hdev->name);
3383
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003384 /* If the controller does not support Low Energy operation, then
3385 * there is also no need to register any SMP channel.
3386 */
3387 if (!lmp_le_capable(hdev))
3388 return 0;
3389
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003390 if (WARN_ON(hdev->smp_data)) {
3391 chan = hdev->smp_data;
3392 hdev->smp_data = NULL;
3393 smp_del_chan(chan);
3394 }
3395
Johan Hedbergef8efe42014-08-13 15:12:32 +03003396 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3397 if (IS_ERR(chan))
3398 return PTR_ERR(chan);
3399
3400 hdev->smp_data = chan;
3401
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003402 debugfs_create_file("le_min_key_size", 0644, hdev->debugfs, hdev,
3403 &le_min_key_size_fops);
Johan Hedberg2fd36552015-06-11 13:52:26 +03003404 debugfs_create_file("le_max_key_size", 0644, hdev->debugfs, hdev,
3405 &le_max_key_size_fops);
3406
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003407 /* If the controller does not support BR/EDR Secure Connections
3408 * feature, then the BR/EDR SMP channel shall not be present.
3409 *
3410 * To test this with Bluetooth 4.0 controllers, create a debugfs
3411 * switch that allows forcing BR/EDR SMP support and accepting
3412 * cross-transport pairing on non-AES encrypted connections.
3413 */
3414 if (!lmp_sc_capable(hdev)) {
3415 debugfs_create_file("force_bredr_smp", 0644, hdev->debugfs,
3416 hdev, &force_bredr_smp_fops);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003417 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003418 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003419
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003420 if (WARN_ON(hdev->smp_bredr_data)) {
3421 chan = hdev->smp_bredr_data;
3422 hdev->smp_bredr_data = NULL;
3423 smp_del_chan(chan);
3424 }
3425
Johan Hedbergef8efe42014-08-13 15:12:32 +03003426 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3427 if (IS_ERR(chan)) {
3428 int err = PTR_ERR(chan);
3429 chan = hdev->smp_data;
3430 hdev->smp_data = NULL;
3431 smp_del_chan(chan);
3432 return err;
3433 }
3434
3435 hdev->smp_bredr_data = chan;
3436
3437 return 0;
3438}
3439
3440void smp_unregister(struct hci_dev *hdev)
3441{
3442 struct l2cap_chan *chan;
3443
3444 if (hdev->smp_bredr_data) {
3445 chan = hdev->smp_bredr_data;
3446 hdev->smp_bredr_data = NULL;
3447 smp_del_chan(chan);
3448 }
3449
3450 if (hdev->smp_data) {
3451 chan = hdev->smp_data;
3452 hdev->smp_data = NULL;
3453 smp_del_chan(chan);
3454 }
3455}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003456
3457#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3458
Herbert Xu71af2f62016-01-24 21:18:30 +08003459static int __init test_ah(struct crypto_skcipher *tfm_aes)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003460{
3461 const u8 irk[16] = {
3462 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3463 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3464 const u8 r[3] = { 0x94, 0x81, 0x70 };
3465 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3466 u8 res[3];
3467 int err;
3468
3469 err = smp_ah(tfm_aes, irk, r, res);
3470 if (err)
3471 return err;
3472
3473 if (memcmp(res, exp, 3))
3474 return -EINVAL;
3475
3476 return 0;
3477}
3478
Herbert Xu71af2f62016-01-24 21:18:30 +08003479static int __init test_c1(struct crypto_skcipher *tfm_aes)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003480{
3481 const u8 k[16] = {
3482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3484 const u8 r[16] = {
3485 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3486 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3487 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3488 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3489 const u8 _iat = 0x01;
3490 const u8 _rat = 0x00;
3491 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3492 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3493 const u8 exp[16] = {
3494 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3495 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3496 u8 res[16];
3497 int err;
3498
3499 err = smp_c1(tfm_aes, k, r, preq, pres, _iat, &ia, _rat, &ra, res);
3500 if (err)
3501 return err;
3502
3503 if (memcmp(res, exp, 16))
3504 return -EINVAL;
3505
3506 return 0;
3507}
3508
Herbert Xu71af2f62016-01-24 21:18:30 +08003509static int __init test_s1(struct crypto_skcipher *tfm_aes)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003510{
3511 const u8 k[16] = {
3512 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3513 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3514 const u8 r1[16] = {
3515 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3516 const u8 r2[16] = {
3517 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3518 const u8 exp[16] = {
3519 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3520 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3521 u8 res[16];
3522 int err;
3523
3524 err = smp_s1(tfm_aes, k, r1, r2, res);
3525 if (err)
3526 return err;
3527
3528 if (memcmp(res, exp, 16))
3529 return -EINVAL;
3530
3531 return 0;
3532}
3533
Herbert Xu71af2f62016-01-24 21:18:30 +08003534static int __init test_f4(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003535{
3536 const u8 u[32] = {
3537 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3538 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3539 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3540 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3541 const u8 v[32] = {
3542 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3543 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3544 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3545 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3546 const u8 x[16] = {
3547 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3548 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3549 const u8 z = 0x00;
3550 const u8 exp[16] = {
3551 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3552 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3553 u8 res[16];
3554 int err;
3555
3556 err = smp_f4(tfm_cmac, u, v, x, z, res);
3557 if (err)
3558 return err;
3559
3560 if (memcmp(res, exp, 16))
3561 return -EINVAL;
3562
3563 return 0;
3564}
3565
Herbert Xu71af2f62016-01-24 21:18:30 +08003566static int __init test_f5(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003567{
3568 const u8 w[32] = {
3569 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3570 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3571 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3572 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3573 const u8 n1[16] = {
3574 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3575 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3576 const u8 n2[16] = {
3577 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3578 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3579 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3580 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3581 const u8 exp_ltk[16] = {
3582 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3583 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3584 const u8 exp_mackey[16] = {
3585 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3586 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3587 u8 mackey[16], ltk[16];
3588 int err;
3589
3590 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3591 if (err)
3592 return err;
3593
3594 if (memcmp(mackey, exp_mackey, 16))
3595 return -EINVAL;
3596
3597 if (memcmp(ltk, exp_ltk, 16))
3598 return -EINVAL;
3599
3600 return 0;
3601}
3602
Herbert Xu71af2f62016-01-24 21:18:30 +08003603static int __init test_f6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003604{
3605 const u8 w[16] = {
3606 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3607 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3608 const u8 n1[16] = {
3609 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3610 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3611 const u8 n2[16] = {
3612 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3613 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3614 const u8 r[16] = {
3615 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3616 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3617 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3618 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3619 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3620 const u8 exp[16] = {
3621 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3622 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3623 u8 res[16];
3624 int err;
3625
3626 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3627 if (err)
3628 return err;
3629
3630 if (memcmp(res, exp, 16))
3631 return -EINVAL;
3632
3633 return 0;
3634}
3635
Herbert Xu71af2f62016-01-24 21:18:30 +08003636static int __init test_g2(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003637{
3638 const u8 u[32] = {
3639 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3640 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3641 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3642 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3643 const u8 v[32] = {
3644 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3645 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3646 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3647 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3648 const u8 x[16] = {
3649 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3650 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3651 const u8 y[16] = {
3652 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3653 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3654 const u32 exp_val = 0x2f9ed5ba % 1000000;
3655 u32 val;
3656 int err;
3657
3658 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3659 if (err)
3660 return err;
3661
3662 if (val != exp_val)
3663 return -EINVAL;
3664
3665 return 0;
3666}
3667
Herbert Xu71af2f62016-01-24 21:18:30 +08003668static int __init test_h6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003669{
3670 const u8 w[16] = {
3671 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3672 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3673 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3674 const u8 exp[16] = {
3675 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3676 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3677 u8 res[16];
3678 int err;
3679
3680 err = smp_h6(tfm_cmac, w, key_id, res);
3681 if (err)
3682 return err;
3683
3684 if (memcmp(res, exp, 16))
3685 return -EINVAL;
3686
3687 return 0;
3688}
3689
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003690static char test_smp_buffer[32];
3691
3692static ssize_t test_smp_read(struct file *file, char __user *user_buf,
3693 size_t count, loff_t *ppos)
3694{
3695 return simple_read_from_buffer(user_buf, count, ppos, test_smp_buffer,
3696 strlen(test_smp_buffer));
3697}
3698
3699static const struct file_operations test_smp_fops = {
3700 .open = simple_open,
3701 .read = test_smp_read,
3702 .llseek = default_llseek,
3703};
3704
Herbert Xu71af2f62016-01-24 21:18:30 +08003705static int __init run_selftests(struct crypto_skcipher *tfm_aes,
3706 struct crypto_shash *tfm_cmac)
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003707{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003708 ktime_t calltime, delta, rettime;
3709 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003710 int err;
3711
Marcel Holtmann255047b2014-12-30 00:11:20 -08003712 calltime = ktime_get();
3713
Johan Hedbergcfc41982014-12-30 09:50:40 +02003714 err = test_ah(tfm_aes);
3715 if (err) {
3716 BT_ERR("smp_ah test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003717 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003718 }
3719
3720 err = test_c1(tfm_aes);
3721 if (err) {
3722 BT_ERR("smp_c1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003723 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003724 }
3725
3726 err = test_s1(tfm_aes);
3727 if (err) {
3728 BT_ERR("smp_s1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003729 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003730 }
3731
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003732 err = test_f4(tfm_cmac);
3733 if (err) {
3734 BT_ERR("smp_f4 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003735 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003736 }
3737
3738 err = test_f5(tfm_cmac);
3739 if (err) {
3740 BT_ERR("smp_f5 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003741 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003742 }
3743
3744 err = test_f6(tfm_cmac);
3745 if (err) {
3746 BT_ERR("smp_f6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003747 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003748 }
3749
3750 err = test_g2(tfm_cmac);
3751 if (err) {
3752 BT_ERR("smp_g2 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003753 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003754 }
3755
3756 err = test_h6(tfm_cmac);
3757 if (err) {
3758 BT_ERR("smp_h6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003759 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003760 }
3761
Marcel Holtmann255047b2014-12-30 00:11:20 -08003762 rettime = ktime_get();
3763 delta = ktime_sub(rettime, calltime);
3764 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3765
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003766 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003767
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003768done:
3769 if (!err)
3770 snprintf(test_smp_buffer, sizeof(test_smp_buffer),
3771 "PASS (%llu usecs)\n", duration);
3772 else
3773 snprintf(test_smp_buffer, sizeof(test_smp_buffer), "FAIL\n");
3774
3775 debugfs_create_file("selftest_smp", 0444, bt_debugfs, NULL,
3776 &test_smp_fops);
3777
3778 return err;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003779}
3780
3781int __init bt_selftest_smp(void)
3782{
Herbert Xu71af2f62016-01-24 21:18:30 +08003783 struct crypto_skcipher *tfm_aes;
3784 struct crypto_shash *tfm_cmac;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003785 int err;
3786
Herbert Xu71af2f62016-01-24 21:18:30 +08003787 tfm_aes = crypto_alloc_skcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003788 if (IS_ERR(tfm_aes)) {
3789 BT_ERR("Unable to create ECB crypto context");
3790 return PTR_ERR(tfm_aes);
3791 }
3792
Herbert Xu71af2f62016-01-24 21:18:30 +08003793 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003794 if (IS_ERR(tfm_cmac)) {
3795 BT_ERR("Unable to create CMAC crypto context");
Herbert Xu71af2f62016-01-24 21:18:30 +08003796 crypto_free_skcipher(tfm_aes);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003797 return PTR_ERR(tfm_cmac);
3798 }
3799
3800 err = run_selftests(tfm_aes, tfm_cmac);
3801
Herbert Xu71af2f62016-01-24 21:18:30 +08003802 crypto_free_shash(tfm_cmac);
3803 crypto_free_skcipher(tfm_aes);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003804
3805 return err;
3806}
3807
3808#endif