blob: d41449b9e9d6e296ca464c9f8a7aff6643be9b16 [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>
Andy Lutomirskia4770e12016-06-26 14:55:23 -070025#include <linux/crypto.h>
Jason A. Donenfeld329d8232017-06-10 04:59:11 +020026#include <crypto/algapi.h>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030027#include <crypto/b128ops.h>
Herbert Xu71af2f62016-01-24 21:18:30 +080028#include <crypto/hash.h>
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +030029#include <crypto/kpp.h>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030030
Anderson Brigliaeb492e02011-06-09 18:50:40 -030031#include <net/bluetooth/bluetooth.h>
32#include <net/bluetooth/hci_core.h>
33#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080034#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070035
Salvatore Benedetto58771c1c2017-04-24 13:13:20 +010036#include "ecdh_helper.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070037#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030038
Johan Hedberg2fd36552015-06-11 13:52:26 +030039#define SMP_DEV(hdev) \
40 ((struct smp_dev *)((struct l2cap_chan *)((hdev)->smp_data))->data)
41
Johan Hedbergc7a3d572014-12-01 22:03:16 +020042/* Low-level debug macros to be used for stuff that we don't want
43 * accidentially in dmesg, i.e. the values of the various crypto keys
44 * and the inputs & outputs of crypto functions.
45 */
46#ifdef DEBUG
47#define SMP_DBG(fmt, ...) printk(KERN_DEBUG "%s: " fmt, __func__, \
48 ##__VA_ARGS__)
49#else
50#define SMP_DBG(fmt, ...) no_printk(KERN_DEBUG "%s: " fmt, __func__, \
51 ##__VA_ARGS__)
52#endif
53
Johan Hedbergb28b4942014-09-05 22:19:55 +030054#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030055
Johan Hedberg3b191462014-06-06 10:50:15 +030056/* Keys which are not distributed with Secure Connections */
57#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
58
Marcel Holtmann17b02e62012-03-01 14:32:37 -080059#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030060
Marcel Holtmannd7a5a112015-03-13 02:11:00 -070061#define AUTH_REQ_MASK(dev) (hci_dev_test_flag(dev, HCI_SC_ENABLED) ? \
Johan Hedberga62da6f2016-12-08 08:32:54 +020062 0x3f : 0x07)
Johan Hedberg0edb14d2014-05-26 13:29:28 +030063#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020064
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030065/* Maximum message length that can be passed to aes_cmac */
66#define CMAC_MSG_MAX 80
67
Johan Hedberg533e35d2014-06-16 19:25:18 +030068enum {
69 SMP_FLAG_TK_VALID,
70 SMP_FLAG_CFM_PENDING,
71 SMP_FLAG_MITM_AUTH,
72 SMP_FLAG_COMPLETE,
73 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030074 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030075 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030076 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030077 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030078 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg1a8bab42015-03-16 11:45:44 +020079 SMP_FLAG_REMOTE_OOB,
80 SMP_FLAG_LOCAL_OOB,
Johan Hedberga62da6f2016-12-08 08:32:54 +020081 SMP_FLAG_CT2,
Johan Hedberg533e35d2014-06-16 19:25:18 +030082};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030083
Marcel Holtmann88a479d2015-03-16 01:10:19 -070084struct smp_dev {
Marcel Holtmann60a27d62015-03-16 01:10:22 -070085 /* Secure Connections OOB data */
86 u8 local_pk[64];
Marcel Holtmannfb334fe2015-03-16 12:34:57 -070087 u8 local_rand[16];
Marcel Holtmann60a27d62015-03-16 01:10:22 -070088 bool debug_key;
89
Johan Hedbergb1f663c2015-06-11 13:52:27 +030090 u8 min_key_size;
Johan Hedberg2fd36552015-06-11 13:52:26 +030091 u8 max_key_size;
92
Andy Lutomirskia4770e12016-06-26 14:55:23 -070093 struct crypto_cipher *tfm_aes;
Herbert Xu71af2f62016-01-24 21:18:30 +080094 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +030095 struct crypto_kpp *tfm_ecdh;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070096};
97
Johan Hedberg4bc58f52014-05-20 09:45:47 +030098struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030099 struct l2cap_conn *conn;
100 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +0300101 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +0300102
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300103 u8 preq[7]; /* SMP Pairing Request */
104 u8 prsp[7]; /* SMP Pairing Response */
105 u8 prnd[16]; /* SMP Pairing Random (local) */
106 u8 rrnd[16]; /* SMP Pairing Random (remote) */
107 u8 pcnf[16]; /* SMP Pairing Confirm */
108 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberg882fafa2015-03-16 11:45:43 +0200109 u8 rr[16]; /* Remote OOB ra/rb value */
110 u8 lr[16]; /* Local OOB ra/rb value */
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300111 u8 enc_key_size;
112 u8 remote_key_dist;
113 bdaddr_t id_addr;
114 u8 id_addr_type;
115 u8 irk[16];
116 struct smp_csrk *csrk;
117 struct smp_csrk *slave_csrk;
118 struct smp_ltk *ltk;
119 struct smp_ltk *slave_ltk;
120 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300121 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300122 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300123 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300124 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300125
Johan Hedberg3b191462014-06-06 10:50:15 +0300126 /* Secure Connections variables */
127 u8 local_pk[64];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300128 u8 remote_pk[64];
129 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300130 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300131
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700132 struct crypto_cipher *tfm_aes;
Herbert Xu71af2f62016-01-24 21:18:30 +0800133 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +0300134 struct crypto_kpp *tfm_ecdh;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300135};
136
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300137/* These debug key values are defined in the SMP section of the core
138 * specification. debug_pk is the public debug key and debug_sk the
139 * private debug key.
140 */
141static const u8 debug_pk[64] = {
142 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
143 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
144 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
145 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
146
147 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
148 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
149 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
150 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
151};
152
153static const u8 debug_sk[32] = {
154 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
155 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
156 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
157 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
158};
159
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300160static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300161{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300162 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300163
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300164 for (i = 0; i < len; i++)
165 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300166}
167
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200168/* The following functions map to the LE SC SMP crypto functions
169 * AES-CMAC, f4, f5, f6, g2 and h6.
170 */
171
Herbert Xu71af2f62016-01-24 21:18:30 +0800172static int aes_cmac(struct crypto_shash *tfm, const u8 k[16], const u8 *m,
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300173 size_t len, u8 mac[16])
174{
175 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
Herbert Xu71af2f62016-01-24 21:18:30 +0800176 SHASH_DESC_ON_STACK(desc, tfm);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300177 int err;
178
179 if (len > CMAC_MSG_MAX)
180 return -EFBIG;
181
182 if (!tfm) {
183 BT_ERR("tfm %p", tfm);
184 return -EINVAL;
185 }
186
Herbert Xu71af2f62016-01-24 21:18:30 +0800187 desc->tfm = tfm;
188 desc->flags = 0;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300189
190 /* Swap key and message from LSB to MSB */
191 swap_buf(k, tmp, 16);
192 swap_buf(m, msg_msb, len);
193
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200194 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
195 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300196
Herbert Xu71af2f62016-01-24 21:18:30 +0800197 err = crypto_shash_setkey(tfm, tmp, 16);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300198 if (err) {
199 BT_ERR("cipher setkey failed: %d", err);
200 return err;
201 }
202
Herbert Xu71af2f62016-01-24 21:18:30 +0800203 err = crypto_shash_digest(desc, msg_msb, len, mac_msb);
204 shash_desc_zero(desc);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300205 if (err) {
Herbert Xu71af2f62016-01-24 21:18:30 +0800206 BT_ERR("Hash computation error %d", err);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300207 return err;
208 }
209
210 swap_buf(mac_msb, mac, 16);
211
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200212 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300213
214 return 0;
215}
216
Herbert Xu71af2f62016-01-24 21:18:30 +0800217static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
218 const u8 v[32], const u8 x[16], u8 z, u8 res[16])
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300219{
220 u8 m[65];
221 int err;
222
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200223 SMP_DBG("u %32phN", u);
224 SMP_DBG("v %32phN", v);
225 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300226
227 m[0] = z;
228 memcpy(m + 1, v, 32);
229 memcpy(m + 33, u, 32);
230
231 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
232 if (err)
233 return err;
234
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200235 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300236
237 return err;
238}
239
Herbert Xu71af2f62016-01-24 21:18:30 +0800240static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200241 const u8 n1[16], const u8 n2[16], const u8 a1[7],
242 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300243{
244 /* The btle, salt and length "magic" values are as defined in
245 * the SMP section of the Bluetooth core specification. In ASCII
246 * the btle value ends up being 'btle'. The salt is just a
247 * random number whereas length is the value 256 in little
248 * endian format.
249 */
250 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
251 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
252 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
253 const u8 length[2] = { 0x00, 0x01 };
254 u8 m[53], t[16];
255 int err;
256
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200257 SMP_DBG("w %32phN", w);
258 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
259 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300260
261 err = aes_cmac(tfm_cmac, salt, w, 32, t);
262 if (err)
263 return err;
264
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200265 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300266
267 memcpy(m, length, 2);
268 memcpy(m + 2, a2, 7);
269 memcpy(m + 9, a1, 7);
270 memcpy(m + 16, n2, 16);
271 memcpy(m + 32, n1, 16);
272 memcpy(m + 48, btle, 4);
273
274 m[52] = 0; /* Counter */
275
276 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
277 if (err)
278 return err;
279
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200280 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300281
282 m[52] = 1; /* Counter */
283
284 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
285 if (err)
286 return err;
287
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200288 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300289
290 return 0;
291}
292
Herbert Xu71af2f62016-01-24 21:18:30 +0800293static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200294 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300295 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
296 u8 res[16])
297{
298 u8 m[65];
299 int err;
300
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200301 SMP_DBG("w %16phN", w);
302 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
303 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300304
305 memcpy(m, a2, 7);
306 memcpy(m + 7, a1, 7);
307 memcpy(m + 14, io_cap, 3);
308 memcpy(m + 17, r, 16);
309 memcpy(m + 33, n2, 16);
310 memcpy(m + 49, n1, 16);
311
312 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
313 if (err)
314 return err;
315
Marcel Holtmann203de212014-12-31 20:01:22 -0800316 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300317
318 return err;
319}
320
Herbert Xu71af2f62016-01-24 21:18:30 +0800321static int smp_g2(struct crypto_shash *tfm_cmac, const u8 u[32], const u8 v[32],
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300322 const u8 x[16], const u8 y[16], u32 *val)
323{
324 u8 m[80], tmp[16];
325 int err;
326
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200327 SMP_DBG("u %32phN", u);
328 SMP_DBG("v %32phN", v);
329 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300330
331 memcpy(m, y, 16);
332 memcpy(m + 16, v, 32);
333 memcpy(m + 48, u, 32);
334
335 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
336 if (err)
337 return err;
338
339 *val = get_unaligned_le32(tmp);
340 *val %= 1000000;
341
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200342 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300343
344 return 0;
345}
346
Herbert Xu71af2f62016-01-24 21:18:30 +0800347static int smp_h6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200348 const u8 key_id[4], u8 res[16])
349{
350 int err;
351
352 SMP_DBG("w %16phN key_id %4phN", w, key_id);
353
354 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
355 if (err)
356 return err;
357
358 SMP_DBG("res %16phN", res);
359
360 return err;
361}
362
Johan Hedberga62da6f2016-12-08 08:32:54 +0200363static int smp_h7(struct crypto_shash *tfm_cmac, const u8 w[16],
364 const u8 salt[16], u8 res[16])
365{
366 int err;
367
368 SMP_DBG("w %16phN salt %16phN", w, salt);
369
370 err = aes_cmac(tfm_cmac, salt, w, 16, res);
371 if (err)
372 return err;
373
374 SMP_DBG("res %16phN", res);
375
376 return err;
377}
378
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200379/* The following functions map to the legacy SMP crypto functions e, c1,
380 * s1 and ah.
381 */
382
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700383static int smp_e(struct crypto_cipher *tfm, const u8 *k, u8 *r)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300384{
Johan Hedberg943a7322014-03-18 12:58:24 +0200385 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200386 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300387
Johan Hedberg011c3912015-05-19 21:06:04 +0300388 SMP_DBG("k %16phN r %16phN", k, r);
389
Johan Hedberg7f376cd2014-12-03 16:07:13 +0200390 if (!tfm) {
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300391 BT_ERR("tfm %p", tfm);
392 return -EINVAL;
393 }
394
Johan Hedberg943a7322014-03-18 12:58:24 +0200395 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300396 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200397
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700398 err = crypto_cipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300399 if (err) {
400 BT_ERR("cipher setkey failed: %d", err);
401 return err;
402 }
403
Johan Hedberg943a7322014-03-18 12:58:24 +0200404 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300405 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200406
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700407 crypto_cipher_encrypt_one(tfm, data, data);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300408
Johan Hedberg943a7322014-03-18 12:58:24 +0200409 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300410 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200411
Johan Hedberg011c3912015-05-19 21:06:04 +0300412 SMP_DBG("r %16phN", r);
413
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300414 return err;
415}
416
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700417static int smp_c1(struct crypto_cipher *tfm_aes, const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200418 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
419 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
420{
421 u8 p1[16], p2[16];
422 int err;
423
Johan Hedberg011c3912015-05-19 21:06:04 +0300424 SMP_DBG("k %16phN r %16phN", k, r);
425 SMP_DBG("iat %u ia %6phN rat %u ra %6phN", _iat, ia, _rat, ra);
426 SMP_DBG("preq %7phN pres %7phN", preq, pres);
427
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200428 memset(p1, 0, 16);
429
430 /* p1 = pres || preq || _rat || _iat */
431 p1[0] = _iat;
432 p1[1] = _rat;
433 memcpy(p1 + 2, preq, 7);
434 memcpy(p1 + 9, pres, 7);
435
Johan Hedberg011c3912015-05-19 21:06:04 +0300436 SMP_DBG("p1 %16phN", p1);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200437
438 /* res = r XOR p1 */
439 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
440
441 /* res = e(k, res) */
442 err = smp_e(tfm_aes, k, res);
443 if (err) {
444 BT_ERR("Encrypt data error");
445 return err;
446 }
447
Johan Hedberg011c3912015-05-19 21:06:04 +0300448 /* p2 = padding || ia || ra */
449 memcpy(p2, ra, 6);
450 memcpy(p2 + 6, ia, 6);
451 memset(p2 + 12, 0, 4);
452
453 SMP_DBG("p2 %16phN", p2);
454
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200455 /* res = res XOR p2 */
456 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
457
458 /* res = e(k, res) */
459 err = smp_e(tfm_aes, k, res);
460 if (err)
461 BT_ERR("Encrypt data error");
462
463 return err;
464}
465
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700466static int smp_s1(struct crypto_cipher *tfm_aes, const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200467 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300468{
469 int err;
470
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200471 /* Just least significant octets from r1 and r2 are considered */
472 memcpy(_r, r2, 8);
473 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300474
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200475 err = smp_e(tfm_aes, k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300476 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200477 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300478
479 return err;
480}
481
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700482static int smp_ah(struct crypto_cipher *tfm, const u8 irk[16],
Johan Hedbergcd082792014-12-02 13:37:41 +0200483 const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200484{
Johan Hedberg943a7322014-03-18 12:58:24 +0200485 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200486 int err;
487
488 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200489 memcpy(_res, r, 3);
490 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200491
Johan Hedberg943a7322014-03-18 12:58:24 +0200492 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200493 if (err) {
494 BT_ERR("Encrypt error");
495 return err;
496 }
497
498 /* The output of the random address function ah is:
Marcel Holtmannc5080d42015-09-04 17:08:18 +0200499 * ah(k, r) = e(k, r') mod 2^24
Johan Hedberg60478052014-02-18 10:19:31 +0200500 * The output of the security function e is then truncated to 24 bits
501 * by taking the least significant 24 bits of the output of e as the
502 * result of ah.
503 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200504 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200505
506 return 0;
507}
508
Johan Hedbergcd082792014-12-02 13:37:41 +0200509bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
510 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200511{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300512 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700513 struct smp_dev *smp;
Johan Hedberg60478052014-02-18 10:19:31 +0200514 u8 hash[3];
515 int err;
516
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300517 if (!chan || !chan->data)
518 return false;
519
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700520 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300521
Johan Hedberg60478052014-02-18 10:19:31 +0200522 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
523
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700524 err = smp_ah(smp->tfm_aes, irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200525 if (err)
526 return false;
527
Jason A. Donenfeld329d8232017-06-10 04:59:11 +0200528 return !crypto_memneq(bdaddr->b, hash, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200529}
530
Johan Hedbergcd082792014-12-02 13:37:41 +0200531int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200532{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300533 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700534 struct smp_dev *smp;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200535 int err;
536
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300537 if (!chan || !chan->data)
538 return -EOPNOTSUPP;
539
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700540 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300541
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200542 get_random_bytes(&rpa->b[3], 3);
543
544 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
545 rpa->b[5] |= 0x40; /* Set second most significant bit */
546
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700547 err = smp_ah(smp->tfm_aes, irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200548 if (err < 0)
549 return err;
550
551 BT_DBG("RPA %pMR", rpa);
552
553 return 0;
554}
555
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700556int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
557{
558 struct l2cap_chan *chan = hdev->smp_data;
559 struct smp_dev *smp;
560 int err;
561
562 if (!chan || !chan->data)
563 return -EOPNOTSUPP;
564
565 smp = chan->data;
566
567 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
568 BT_DBG("Using debug keys");
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300569 err = set_ecdh_privkey(smp->tfm_ecdh, debug_sk);
570 if (err)
571 return err;
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700572 memcpy(smp->local_pk, debug_pk, 64);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700573 smp->debug_key = true;
574 } else {
575 while (true) {
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300576 /* Generate key pair for Secure Connections */
577 err = generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk);
Tudor Ambarusa2976412017-09-28 17:14:52 +0300578 if (err)
579 return err;
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700580
581 /* This is unlikely, but we need to check that
582 * we didn't accidentially generate a debug key.
583 */
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300584 if (crypto_memneq(smp->local_pk, debug_pk, 64))
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700585 break;
586 }
587 smp->debug_key = false;
588 }
589
590 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
591 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700592
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700593 get_random_bytes(smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700594
595 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700596 smp->local_rand, 0, hash);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700597 if (err < 0)
598 return err;
599
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700600 memcpy(rand, smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700601
602 return 0;
603}
604
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300605static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
606{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300607 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300608 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300609 struct kvec iv[2];
610 struct msghdr msg;
611
612 if (!chan)
613 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300614
615 BT_DBG("code 0x%2.2x", code);
616
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300617 iv[0].iov_base = &code;
618 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300619
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300620 iv[1].iov_base = data;
621 iv[1].iov_len = len;
622
623 memset(&msg, 0, sizeof(msg));
624
Al Viro17836392014-11-24 17:07:38 -0500625 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300626
627 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300628
Johan Hedbergb68fda62014-08-11 22:06:40 +0300629 if (!chan->data)
630 return;
631
632 smp = chan->data;
633
634 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300635 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300636}
637
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300638static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800639{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300640 if (authreq & SMP_AUTH_MITM) {
641 if (authreq & SMP_AUTH_SC)
642 return BT_SECURITY_FIPS;
643 else
644 return BT_SECURITY_HIGH;
645 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800646 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300647 }
Brian Gix2b64d152011-12-21 16:12:12 -0800648}
649
650static __u8 seclevel_to_authreq(__u8 sec_level)
651{
652 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300653 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800654 case BT_SECURITY_HIGH:
655 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
656 case BT_SECURITY_MEDIUM:
657 return SMP_AUTH_BONDING;
658 default:
659 return SMP_AUTH_NONE;
660 }
661}
662
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300663static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700664 struct smp_cmd_pairing *req,
665 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300666{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300667 struct l2cap_chan *chan = conn->smp;
668 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200669 struct hci_conn *hcon = conn->hcon;
670 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100671 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300672
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700673 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700674 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
675 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300676 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800677 } else {
678 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300679 }
680
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700681 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200682 remote_dist |= SMP_DIST_ID_KEY;
683
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700684 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200685 local_dist |= SMP_DIST_ID_KEY;
686
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700687 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100688 (authreq & SMP_AUTH_SC)) {
689 struct oob_data *oob_data;
690 u8 bdaddr_type;
691
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700692 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300693 local_dist |= SMP_DIST_LINK_KEY;
694 remote_dist |= SMP_DIST_LINK_KEY;
695 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100696
697 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
698 bdaddr_type = BDADDR_LE_PUBLIC;
699 else
700 bdaddr_type = BDADDR_LE_RANDOM;
701
702 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
703 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800704 if (oob_data && oob_data->present) {
Johan Hedberg1a8bab42015-03-16 11:45:44 +0200705 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100706 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100707 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100708 memcpy(smp->pcnf, oob_data->hash256, 16);
Marcel Holtmannbc07cd62015-03-16 12:34:56 -0700709 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf);
710 SMP_DBG("OOB Remote Random: %16phN", smp->rr);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100711 }
712
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300713 } else {
714 authreq &= ~SMP_AUTH_SC;
715 }
716
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300717 if (rsp == NULL) {
718 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100719 req->oob_flag = oob_flag;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300720 req->max_key_size = SMP_DEV(hdev)->max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200721 req->init_key_dist = local_dist;
722 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300723 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200724
725 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300726 return;
727 }
728
729 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100730 rsp->oob_flag = oob_flag;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300731 rsp->max_key_size = SMP_DEV(hdev)->max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200732 rsp->init_key_dist = req->init_key_dist & remote_dist;
733 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300734 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200735
736 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300737}
738
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300739static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
740{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300741 struct l2cap_chan *chan = conn->smp;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300742 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300743 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300744
Johan Hedberg2fd36552015-06-11 13:52:26 +0300745 if (max_key_size > SMP_DEV(hdev)->max_key_size ||
746 max_key_size < SMP_MIN_ENC_KEY_SIZE)
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300747 return SMP_ENC_KEY_SIZE;
748
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300749 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300750
751 return 0;
752}
753
Johan Hedberg6f48e262014-08-11 22:06:44 +0300754static void smp_chan_destroy(struct l2cap_conn *conn)
755{
756 struct l2cap_chan *chan = conn->smp;
757 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200758 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300759 bool complete;
760
761 BUG_ON(!smp);
762
763 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300764
Johan Hedberg6f48e262014-08-11 22:06:44 +0300765 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200766 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300767
Marcel Holtmann276812e2015-03-16 01:10:18 -0700768 kzfree(smp->csrk);
769 kzfree(smp->slave_csrk);
770 kzfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300771
Andy Lutomirskia4770e12016-06-26 14:55:23 -0700772 crypto_free_cipher(smp->tfm_aes);
Herbert Xu71af2f62016-01-24 21:18:30 +0800773 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +0300774 crypto_free_kpp(smp->tfm_ecdh);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300775
Johan Hedberg923e2412014-12-03 12:43:39 +0200776 /* Ensure that we don't leave any debug key around if debug key
777 * support hasn't been explicitly enabled.
778 */
779 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700780 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200781 list_del_rcu(&smp->ltk->list);
782 kfree_rcu(smp->ltk, rcu);
783 smp->ltk = NULL;
784 }
785
Johan Hedberg6f48e262014-08-11 22:06:44 +0300786 /* If pairing failed clean up any keys we might have */
787 if (!complete) {
788 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200789 list_del_rcu(&smp->ltk->list);
790 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300791 }
792
793 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200794 list_del_rcu(&smp->slave_ltk->list);
795 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300796 }
797
798 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200799 list_del_rcu(&smp->remote_irk->list);
800 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300801 }
802 }
803
804 chan->data = NULL;
Marcel Holtmann276812e2015-03-16 01:10:18 -0700805 kzfree(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200806 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300807}
808
Johan Hedberg84794e12013-11-06 11:24:57 +0200809static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800810{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200811 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300812 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200813
Johan Hedberg84794e12013-11-06 11:24:57 +0200814 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800815 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700816 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800817
Johan Hedberge1e930f2014-09-08 17:09:49 -0700818 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300819
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300820 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300821 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800822}
823
Brian Gix2b64d152011-12-21 16:12:12 -0800824#define JUST_WORKS 0x00
825#define JUST_CFM 0x01
826#define REQ_PASSKEY 0x02
827#define CFM_PASSKEY 0x03
828#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300829#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800830#define OVERLAP 0xFF
831
832static const u8 gen_method[5][5] = {
833 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
834 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
835 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
836 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
837 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
838};
839
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300840static const u8 sc_method[5][5] = {
841 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
842 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
843 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
844 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
845 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
846};
847
Johan Hedberg581370c2014-06-17 13:07:38 +0300848static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
849{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300850 /* If either side has unknown io_caps, use JUST_CFM (which gets
851 * converted later to JUST_WORKS if we're initiators.
852 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300853 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
854 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300855 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300856
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300857 if (test_bit(SMP_FLAG_SC, &smp->flags))
858 return sc_method[remote_io][local_io];
859
Johan Hedberg581370c2014-06-17 13:07:38 +0300860 return gen_method[remote_io][local_io];
861}
862
Brian Gix2b64d152011-12-21 16:12:12 -0800863static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
864 u8 local_io, u8 remote_io)
865{
866 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300867 struct l2cap_chan *chan = conn->smp;
868 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800869 u32 passkey = 0;
870 int ret = 0;
871
872 /* Initialize key for JUST WORKS */
873 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300874 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800875
876 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
877
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300878 /* If neither side wants MITM, either "just" confirm an incoming
879 * request or use just-works for outgoing ones. The JUST_CFM
880 * will be converted to JUST_WORKS if necessary later in this
881 * function. If either side has MITM look up the method from the
882 * table.
883 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300884 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300885 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800886 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300887 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800888
Johan Hedberga82505c2014-03-24 14:39:07 +0200889 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300890 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
891 &smp->flags))
892 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200893
Johan Hedberg02f3e252014-07-16 15:09:13 +0300894 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300895 if (smp->method == JUST_CFM &&
896 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
897 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300898
Brian Gix2b64d152011-12-21 16:12:12 -0800899 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300900 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300901 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800902 return 0;
903 }
904
Johan Hedberg19c5ce92015-03-15 19:34:04 +0200905 /* If this function is used for SC -> legacy fallback we
906 * can only recover the just-works case.
907 */
908 if (test_bit(SMP_FLAG_SC, &smp->flags))
909 return -EINVAL;
910
Brian Gix2b64d152011-12-21 16:12:12 -0800911 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300912 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300913 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300914 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
915 hcon->pending_sec_level = BT_SECURITY_HIGH;
916 }
Brian Gix2b64d152011-12-21 16:12:12 -0800917
918 /* If both devices have Keyoard-Display I/O, the master
919 * Confirms and the slave Enters the passkey.
920 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300921 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300922 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300923 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800924 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300925 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800926 }
927
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200928 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300929 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200930 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800931 get_random_bytes(&passkey, sizeof(passkey));
932 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200933 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800934 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300935 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800936 }
937
Johan Hedberg783e0572014-05-31 18:48:26 +0300938 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700939 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200940 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300941 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200942 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
943 hcon->type, hcon->dst_type,
944 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800945 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200946 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200947 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200948 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800949
Brian Gix2b64d152011-12-21 16:12:12 -0800950 return ret;
951}
952
Johan Hedberg1cc61142014-05-20 09:45:52 +0300953static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300954{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300955 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300956 struct smp_cmd_pairing_confirm cp;
957 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300958
959 BT_DBG("conn %p", conn);
960
Johan Hedberge491eaf2014-10-25 21:15:37 +0200961 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200962 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200963 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
964 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300965 if (ret)
966 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300967
Johan Hedberg4a74d652014-05-20 09:45:50 +0300968 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800969
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300970 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
971
Johan Hedbergb28b4942014-09-05 22:19:55 +0300972 if (conn->hcon->out)
973 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
974 else
975 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
976
Johan Hedberg1cc61142014-05-20 09:45:52 +0300977 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300978}
979
Johan Hedberg861580a2014-05-20 09:45:51 +0300980static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300981{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300982 struct l2cap_conn *conn = smp->conn;
983 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300984 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300985 int ret;
986
Johan Hedbergec70f362014-06-27 14:23:04 +0300987 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300988 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300989
990 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
991
Johan Hedberge491eaf2014-10-25 21:15:37 +0200992 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200993 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200994 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300995 if (ret)
996 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300997
Jason A. Donenfeld329d8232017-06-10 04:59:11 +0200998 if (crypto_memneq(smp->pcnf, confirm, sizeof(smp->pcnf))) {
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300999 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +03001000 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001001 }
1002
1003 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001004 u8 stk[16];
1005 __le64 rand = 0;
1006 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001007
Johan Hedberge491eaf2014-10-25 21:15:37 +02001008 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001009
Johan Hedberg861580a2014-05-20 09:45:51 +03001010 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
1011 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001012
Johan Hedberg8b76ce32015-06-08 18:14:39 +03001013 hci_le_start_enc(hcon, ediv, rand, stk, smp->enc_key_size);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -03001014 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +03001015 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001016 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +03001017 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001018 __le64 rand = 0;
1019 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001020
Johan Hedberg943a7322014-03-18 12:58:24 +02001021 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1022 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001023
Johan Hedberge491eaf2014-10-25 21:15:37 +02001024 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001025
Johan Hedbergfff34902014-06-10 15:19:50 +03001026 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1027 auth = 1;
1028 else
1029 auth = 0;
1030
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001031 /* Even though there's no _SLAVE suffix this is the
1032 * slave STK we're adding for later lookup (the master
1033 * STK never needs to be stored).
1034 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001035 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001036 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001037 }
1038
Johan Hedberg861580a2014-05-20 09:45:51 +03001039 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001040}
1041
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001042static void smp_notify_keys(struct l2cap_conn *conn)
1043{
1044 struct l2cap_chan *chan = conn->smp;
1045 struct smp_chan *smp = chan->data;
1046 struct hci_conn *hcon = conn->hcon;
1047 struct hci_dev *hdev = hcon->hdev;
1048 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1049 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1050 bool persistent;
1051
Johan Hedbergcad20c22015-10-12 13:36:19 +02001052 if (hcon->type == ACL_LINK) {
1053 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1054 persistent = false;
1055 else
1056 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1057 &hcon->flags);
1058 } else {
1059 /* The LTKs, IRKs and CSRKs should be persistent only if
1060 * both sides had the bonding bit set in their
1061 * authentication requests.
1062 */
1063 persistent = !!((req->auth_req & rsp->auth_req) &
1064 SMP_AUTH_BONDING);
1065 }
1066
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001067 if (smp->remote_irk) {
Johan Hedbergcad20c22015-10-12 13:36:19 +02001068 mgmt_new_irk(hdev, smp->remote_irk, persistent);
1069
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001070 /* Now that user space can be considered to know the
1071 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001072 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001073 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001074 if (hcon->type == LE_LINK) {
1075 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1076 hcon->dst_type = smp->remote_irk->addr_type;
1077 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1078 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001079 }
1080
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001081 if (smp->csrk) {
1082 smp->csrk->bdaddr_type = hcon->dst_type;
1083 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1084 mgmt_new_csrk(hdev, smp->csrk, persistent);
1085 }
1086
1087 if (smp->slave_csrk) {
1088 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1089 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1090 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1091 }
1092
1093 if (smp->ltk) {
1094 smp->ltk->bdaddr_type = hcon->dst_type;
1095 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1096 mgmt_new_ltk(hdev, smp->ltk, persistent);
1097 }
1098
1099 if (smp->slave_ltk) {
1100 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1101 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1102 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1103 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001104
1105 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001106 struct link_key *key;
1107 u8 type;
1108
1109 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1110 type = HCI_LK_DEBUG_COMBINATION;
1111 else if (hcon->sec_level == BT_SECURITY_FIPS)
1112 type = HCI_LK_AUTH_COMBINATION_P256;
1113 else
1114 type = HCI_LK_UNAUTH_COMBINATION_P256;
1115
1116 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1117 smp->link_key, type, 0, &persistent);
1118 if (key) {
1119 mgmt_new_link_key(hdev, key, persistent);
1120
1121 /* Don't keep debug keys around if the relevant
1122 * flag is not set.
1123 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001124 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001125 key->type == HCI_LK_DEBUG_COMBINATION) {
1126 list_del_rcu(&key->list);
1127 kfree_rcu(key, rcu);
1128 }
1129 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001130 }
1131}
1132
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001133static void sc_add_ltk(struct smp_chan *smp)
1134{
1135 struct hci_conn *hcon = smp->conn->hcon;
1136 u8 key_type, auth;
1137
1138 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1139 key_type = SMP_LTK_P256_DEBUG;
1140 else
1141 key_type = SMP_LTK_P256;
1142
1143 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1144 auth = 1;
1145 else
1146 auth = 0;
1147
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001148 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1149 key_type, auth, smp->tk, smp->enc_key_size,
1150 0, 0);
1151}
1152
Johan Hedberg6a770832014-06-06 11:54:04 +03001153static void sc_generate_link_key(struct smp_chan *smp)
1154{
Johan Hedberga62da6f2016-12-08 08:32:54 +02001155 /* From core spec. Spells out in ASCII as 'lebr'. */
Johan Hedberg6a770832014-06-06 11:54:04 +03001156 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1157
1158 smp->link_key = kzalloc(16, GFP_KERNEL);
1159 if (!smp->link_key)
1160 return;
1161
Johan Hedberga62da6f2016-12-08 08:32:54 +02001162 if (test_bit(SMP_FLAG_CT2, &smp->flags)) {
1163 /* SALT = 0x00000000000000000000000000000000746D7031 */
1164 const u8 salt[16] = { 0x31, 0x70, 0x6d, 0x74 };
1165
1166 if (smp_h7(smp->tfm_cmac, smp->tk, salt, smp->link_key)) {
1167 kzfree(smp->link_key);
1168 smp->link_key = NULL;
1169 return;
1170 }
1171 } else {
1172 /* From core spec. Spells out in ASCII as 'tmp1'. */
1173 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1174
1175 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
1176 kzfree(smp->link_key);
1177 smp->link_key = NULL;
1178 return;
1179 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001180 }
1181
1182 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001183 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001184 smp->link_key = NULL;
1185 return;
1186 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001187}
1188
Johan Hedbergb28b4942014-09-05 22:19:55 +03001189static void smp_allow_key_dist(struct smp_chan *smp)
1190{
1191 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1192 * will be allowed in each PDU handler to ensure we receive
1193 * them in the correct order.
1194 */
1195 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1196 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1197 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1198 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1199 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1200 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1201}
1202
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001203static void sc_generate_ltk(struct smp_chan *smp)
1204{
Johan Hedberga62da6f2016-12-08 08:32:54 +02001205 /* From core spec. Spells out in ASCII as 'brle'. */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001206 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1207 struct hci_conn *hcon = smp->conn->hcon;
1208 struct hci_dev *hdev = hcon->hdev;
1209 struct link_key *key;
1210
1211 key = hci_find_link_key(hdev, &hcon->dst);
1212 if (!key) {
1213 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1214 return;
1215 }
1216
1217 if (key->type == HCI_LK_DEBUG_COMBINATION)
1218 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1219
Johan Hedberga62da6f2016-12-08 08:32:54 +02001220 if (test_bit(SMP_FLAG_CT2, &smp->flags)) {
1221 /* SALT = 0x00000000000000000000000000000000746D7032 */
1222 const u8 salt[16] = { 0x32, 0x70, 0x6d, 0x74 };
1223
1224 if (smp_h7(smp->tfm_cmac, key->val, salt, smp->tk))
1225 return;
1226 } else {
1227 /* From core spec. Spells out in ASCII as 'tmp2'. */
1228 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1229
1230 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1231 return;
1232 }
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001233
1234 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1235 return;
1236
1237 sc_add_ltk(smp);
1238}
1239
Johan Hedbergd6268e82014-09-05 22:19:51 +03001240static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001241{
1242 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001243 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001244 struct hci_conn *hcon = conn->hcon;
1245 struct hci_dev *hdev = hcon->hdev;
1246 __u8 *keydist;
1247
1248 BT_DBG("conn %p", conn);
1249
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001250 rsp = (void *) &smp->prsp[1];
1251
1252 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001253 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1254 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001255 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001256 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001257
1258 req = (void *) &smp->preq[1];
1259
1260 if (hcon->out) {
1261 keydist = &rsp->init_key_dist;
1262 *keydist &= req->init_key_dist;
1263 } else {
1264 keydist = &rsp->resp_key_dist;
1265 *keydist &= req->resp_key_dist;
1266 }
1267
Johan Hedberg6a770832014-06-06 11:54:04 +03001268 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001269 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001270 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001271 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1272 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001273
1274 /* Clear the keys which are generated but not distributed */
1275 *keydist &= ~SMP_SC_NO_DIST;
1276 }
1277
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001278 BT_DBG("keydist 0x%x", *keydist);
1279
1280 if (*keydist & SMP_DIST_ENC_KEY) {
1281 struct smp_cmd_encrypt_info enc;
1282 struct smp_cmd_master_ident ident;
1283 struct smp_ltk *ltk;
1284 u8 authenticated;
1285 __le16 ediv;
1286 __le64 rand;
1287
Johan Hedberg1fc62c52015-06-10 11:11:20 +03001288 /* Make sure we generate only the significant amount of
1289 * bytes based on the encryption key size, and set the rest
1290 * of the value to zeroes.
1291 */
1292 get_random_bytes(enc.ltk, smp->enc_key_size);
1293 memset(enc.ltk + smp->enc_key_size, 0,
1294 sizeof(enc.ltk) - smp->enc_key_size);
1295
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001296 get_random_bytes(&ediv, sizeof(ediv));
1297 get_random_bytes(&rand, sizeof(rand));
1298
1299 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1300
1301 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1302 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1303 SMP_LTK_SLAVE, authenticated, enc.ltk,
1304 smp->enc_key_size, ediv, rand);
1305 smp->slave_ltk = ltk;
1306
1307 ident.ediv = ediv;
1308 ident.rand = rand;
1309
1310 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1311
1312 *keydist &= ~SMP_DIST_ENC_KEY;
1313 }
1314
1315 if (*keydist & SMP_DIST_ID_KEY) {
1316 struct smp_cmd_ident_addr_info addrinfo;
1317 struct smp_cmd_ident_info idinfo;
1318
1319 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1320
1321 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1322
1323 /* The hci_conn contains the local identity address
1324 * after the connection has been established.
1325 *
1326 * This is true even when the connection has been
1327 * established using a resolvable random address.
1328 */
1329 bacpy(&addrinfo.bdaddr, &hcon->src);
1330 addrinfo.addr_type = hcon->src_type;
1331
1332 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1333 &addrinfo);
1334
1335 *keydist &= ~SMP_DIST_ID_KEY;
1336 }
1337
1338 if (*keydist & SMP_DIST_SIGN) {
1339 struct smp_cmd_sign_info sign;
1340 struct smp_csrk *csrk;
1341
1342 /* Generate a new random key */
1343 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1344
1345 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1346 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001347 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1348 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1349 else
1350 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001351 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1352 }
1353 smp->slave_csrk = csrk;
1354
1355 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1356
1357 *keydist &= ~SMP_DIST_SIGN;
1358 }
1359
1360 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001361 if (smp->remote_key_dist & KEY_DIST_MASK) {
1362 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001363 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001364 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001365
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001366 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1367 smp_notify_keys(conn);
1368
1369 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001370}
1371
Johan Hedbergb68fda62014-08-11 22:06:40 +03001372static void smp_timeout(struct work_struct *work)
1373{
1374 struct smp_chan *smp = container_of(work, struct smp_chan,
1375 security_timer.work);
1376 struct l2cap_conn *conn = smp->conn;
1377
1378 BT_DBG("conn %p", conn);
1379
Johan Hedberg1e91c292014-08-18 20:33:29 +03001380 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001381}
1382
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001383static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1384{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001385 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001386 struct smp_chan *smp;
1387
Marcel Holtmannf1560462013-10-13 05:43:25 -07001388 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001389 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001390 return NULL;
1391
Andy Lutomirskia4770e12016-06-26 14:55:23 -07001392 smp->tfm_aes = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001393 if (IS_ERR(smp->tfm_aes)) {
Andy Lutomirskia4770e12016-06-26 14:55:23 -07001394 BT_ERR("Unable to create AES crypto context");
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001395 goto zfree_smp;
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001396 }
1397
Herbert Xu71af2f62016-01-24 21:18:30 +08001398 smp->tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Johan Hedberg407cecf2014-05-02 14:19:47 +03001399 if (IS_ERR(smp->tfm_cmac)) {
1400 BT_ERR("Unable to create CMAC crypto context");
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001401 goto free_cipher;
1402 }
1403
1404 smp->tfm_ecdh = crypto_alloc_kpp("ecdh", CRYPTO_ALG_INTERNAL, 0);
1405 if (IS_ERR(smp->tfm_ecdh)) {
1406 BT_ERR("Unable to create ECDH crypto context");
1407 goto free_shash;
Johan Hedberg407cecf2014-05-02 14:19:47 +03001408 }
1409
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001410 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001411 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001412
Johan Hedbergb28b4942014-09-05 22:19:55 +03001413 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1414
Johan Hedbergb68fda62014-08-11 22:06:40 +03001415 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1416
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001417 hci_conn_hold(conn->hcon);
1418
1419 return smp;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001420
1421free_shash:
1422 crypto_free_shash(smp->tfm_cmac);
1423free_cipher:
1424 crypto_free_cipher(smp->tfm_aes);
1425zfree_smp:
1426 kzfree(smp);
1427 return NULL;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001428}
1429
Johan Hedberg760b0182014-06-06 11:44:05 +03001430static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1431{
1432 struct hci_conn *hcon = smp->conn->hcon;
1433 u8 *na, *nb, a[7], b[7];
1434
1435 if (hcon->out) {
1436 na = smp->prnd;
1437 nb = smp->rrnd;
1438 } else {
1439 na = smp->rrnd;
1440 nb = smp->prnd;
1441 }
1442
1443 memcpy(a, &hcon->init_addr, 6);
1444 memcpy(b, &hcon->resp_addr, 6);
1445 a[6] = hcon->init_addr_type;
1446 b[6] = hcon->resp_addr_type;
1447
1448 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1449}
1450
Johan Hedberg38606f12014-06-25 11:10:28 +03001451static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001452{
1453 struct hci_conn *hcon = smp->conn->hcon;
1454 struct smp_cmd_dhkey_check check;
1455 u8 a[7], b[7], *local_addr, *remote_addr;
1456 u8 io_cap[3], r[16];
1457
Johan Hedberg760b0182014-06-06 11:44:05 +03001458 memcpy(a, &hcon->init_addr, 6);
1459 memcpy(b, &hcon->resp_addr, 6);
1460 a[6] = hcon->init_addr_type;
1461 b[6] = hcon->resp_addr_type;
1462
1463 if (hcon->out) {
1464 local_addr = a;
1465 remote_addr = b;
1466 memcpy(io_cap, &smp->preq[1], 3);
1467 } else {
1468 local_addr = b;
1469 remote_addr = a;
1470 memcpy(io_cap, &smp->prsp[1], 3);
1471 }
1472
Johan Hedbergdddd3052014-06-01 15:38:09 +03001473 memset(r, 0, sizeof(r));
1474
1475 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001476 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001477
Johan Hedberga29b0732014-10-28 15:17:05 +01001478 if (smp->method == REQ_OOB)
1479 memcpy(r, smp->rr, 16);
1480
Johan Hedberg760b0182014-06-06 11:44:05 +03001481 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1482 local_addr, remote_addr, check.e);
1483
1484 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001485}
1486
Johan Hedberg38606f12014-06-25 11:10:28 +03001487static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1488{
1489 struct l2cap_conn *conn = smp->conn;
1490 struct hci_conn *hcon = conn->hcon;
1491 struct smp_cmd_pairing_confirm cfm;
1492 u8 r;
1493
1494 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1495 r |= 0x80;
1496
1497 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1498
1499 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1500 cfm.confirm_val))
1501 return SMP_UNSPECIFIED;
1502
1503 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1504
1505 return 0;
1506}
1507
1508static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1509{
1510 struct l2cap_conn *conn = smp->conn;
1511 struct hci_conn *hcon = conn->hcon;
1512 struct hci_dev *hdev = hcon->hdev;
1513 u8 cfm[16], r;
1514
1515 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1516 if (smp->passkey_round >= 20)
1517 return 0;
1518
1519 switch (smp_op) {
1520 case SMP_CMD_PAIRING_RANDOM:
1521 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1522 r |= 0x80;
1523
1524 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1525 smp->rrnd, r, cfm))
1526 return SMP_UNSPECIFIED;
1527
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02001528 if (crypto_memneq(smp->pcnf, cfm, 16))
Johan Hedberg38606f12014-06-25 11:10:28 +03001529 return SMP_CONFIRM_FAILED;
1530
1531 smp->passkey_round++;
1532
1533 if (smp->passkey_round == 20) {
1534 /* Generate MacKey and LTK */
1535 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1536 return SMP_UNSPECIFIED;
1537 }
1538
1539 /* The round is only complete when the initiator
1540 * receives pairing random.
1541 */
1542 if (!hcon->out) {
1543 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1544 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001545 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001546 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001547 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001548 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001549 return 0;
1550 }
1551
1552 /* Start the next round */
1553 if (smp->passkey_round != 20)
1554 return sc_passkey_round(smp, 0);
1555
1556 /* Passkey rounds are complete - start DHKey Check */
1557 sc_dhkey_check(smp);
1558 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1559
1560 break;
1561
1562 case SMP_CMD_PAIRING_CONFIRM:
1563 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1564 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1565 return 0;
1566 }
1567
1568 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1569
1570 if (hcon->out) {
1571 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1572 sizeof(smp->prnd), smp->prnd);
1573 return 0;
1574 }
1575
1576 return sc_passkey_send_confirm(smp);
1577
1578 case SMP_CMD_PUBLIC_KEY:
1579 default:
1580 /* Initiating device starts the round */
1581 if (!hcon->out)
1582 return 0;
1583
1584 BT_DBG("%s Starting passkey round %u", hdev->name,
1585 smp->passkey_round + 1);
1586
1587 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1588
1589 return sc_passkey_send_confirm(smp);
1590 }
1591
1592 return 0;
1593}
1594
Johan Hedbergdddd3052014-06-01 15:38:09 +03001595static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1596{
Johan Hedberg38606f12014-06-25 11:10:28 +03001597 struct l2cap_conn *conn = smp->conn;
1598 struct hci_conn *hcon = conn->hcon;
1599 u8 smp_op;
1600
1601 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1602
Johan Hedbergdddd3052014-06-01 15:38:09 +03001603 switch (mgmt_op) {
1604 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1605 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1606 return 0;
1607 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1608 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1609 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001610 case MGMT_OP_USER_PASSKEY_REPLY:
1611 hcon->passkey_notify = le32_to_cpu(passkey);
1612 smp->passkey_round = 0;
1613
1614 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1615 smp_op = SMP_CMD_PAIRING_CONFIRM;
1616 else
1617 smp_op = 0;
1618
1619 if (sc_passkey_round(smp, smp_op))
1620 return -EIO;
1621
1622 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001623 }
1624
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001625 /* Initiator sends DHKey check first */
1626 if (hcon->out) {
1627 sc_dhkey_check(smp);
1628 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1629 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1630 sc_dhkey_check(smp);
1631 sc_add_ltk(smp);
1632 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001633
1634 return 0;
1635}
1636
Brian Gix2b64d152011-12-21 16:12:12 -08001637int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1638{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001639 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001640 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001641 struct smp_chan *smp;
1642 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001643 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001644
1645 BT_DBG("");
1646
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001647 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001648 return -ENOTCONN;
1649
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001650 chan = conn->smp;
1651 if (!chan)
1652 return -ENOTCONN;
1653
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001654 l2cap_chan_lock(chan);
1655 if (!chan->data) {
1656 err = -ENOTCONN;
1657 goto unlock;
1658 }
1659
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001660 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001661
Johan Hedberg760b0182014-06-06 11:44:05 +03001662 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1663 err = sc_user_reply(smp, mgmt_op, passkey);
1664 goto unlock;
1665 }
1666
Brian Gix2b64d152011-12-21 16:12:12 -08001667 switch (mgmt_op) {
1668 case MGMT_OP_USER_PASSKEY_REPLY:
1669 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001670 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001671 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001672 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001673 /* Fall Through */
1674 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001675 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001676 break;
1677 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1678 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001679 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001680 err = 0;
1681 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001682 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001683 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001684 err = -EOPNOTSUPP;
1685 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001686 }
1687
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001688 err = 0;
1689
Brian Gix2b64d152011-12-21 16:12:12 -08001690 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001691 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1692 u8 rsp = smp_confirm(smp);
1693 if (rsp)
1694 smp_failure(conn, rsp);
1695 }
Brian Gix2b64d152011-12-21 16:12:12 -08001696
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001697unlock:
1698 l2cap_chan_unlock(chan);
1699 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001700}
1701
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001702static void build_bredr_pairing_cmd(struct smp_chan *smp,
1703 struct smp_cmd_pairing *req,
1704 struct smp_cmd_pairing *rsp)
1705{
1706 struct l2cap_conn *conn = smp->conn;
1707 struct hci_dev *hdev = conn->hcon->hdev;
1708 u8 local_dist = 0, remote_dist = 0;
1709
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001710 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001711 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1712 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1713 }
1714
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001715 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001716 remote_dist |= SMP_DIST_ID_KEY;
1717
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001718 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001719 local_dist |= SMP_DIST_ID_KEY;
1720
1721 if (!rsp) {
1722 memset(req, 0, sizeof(*req));
1723
Johan Hedberga62da6f2016-12-08 08:32:54 +02001724 req->auth_req = SMP_AUTH_CT2;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001725 req->init_key_dist = local_dist;
1726 req->resp_key_dist = remote_dist;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001727 req->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001728
1729 smp->remote_key_dist = remote_dist;
1730
1731 return;
1732 }
1733
1734 memset(rsp, 0, sizeof(*rsp));
1735
Johan Hedberga62da6f2016-12-08 08:32:54 +02001736 rsp->auth_req = SMP_AUTH_CT2;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001737 rsp->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001738 rsp->init_key_dist = req->init_key_dist & remote_dist;
1739 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1740
1741 smp->remote_key_dist = rsp->init_key_dist;
1742}
1743
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001744static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001745{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001746 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001747 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001748 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001749 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001750 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001751 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001752
1753 BT_DBG("conn %p", conn);
1754
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001755 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001756 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001757
Johan Hedberg40bef302014-07-16 11:42:27 +03001758 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001759 return SMP_CMD_NOTSUPP;
1760
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001761 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001762 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001763 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001764 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001765
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001766 if (!smp)
1767 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001768
Johan Hedbergc05b9332014-09-10 17:37:42 -07001769 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001770 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001771
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001772 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001773 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001774 return SMP_PAIRING_NOTSUPP;
1775
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001776 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001777 return SMP_AUTH_REQUIREMENTS;
1778
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001779 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1780 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001781 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001782
Johan Hedbergcb06d362015-03-16 21:12:34 +02001783 /* If the remote side's OOB flag is set it means it has
1784 * successfully received our local OOB data - therefore set the
1785 * flag to indicate that local OOB is in use.
1786 */
Johan Hedberg58428562015-03-16 11:45:45 +02001787 if (req->oob_flag == SMP_OOB_PRESENT)
1788 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1789
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001790 /* SMP over BR/EDR requires special treatment */
1791 if (conn->hcon->type == ACL_LINK) {
1792 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001793 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001794 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001795 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1796
1797 set_bit(SMP_FLAG_SC, &smp->flags);
1798
1799 build_bredr_pairing_cmd(smp, req, &rsp);
1800
Johan Hedberga62da6f2016-12-08 08:32:54 +02001801 if (req->auth_req & SMP_AUTH_CT2)
1802 set_bit(SMP_FLAG_CT2, &smp->flags);
1803
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001804 key_size = min(req->max_key_size, rsp.max_key_size);
1805 if (check_enc_key_size(conn, key_size))
1806 return SMP_ENC_KEY_SIZE;
1807
1808 /* Clear bits which are generated but not distributed */
1809 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1810
1811 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1812 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1813 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1814
1815 smp_distribute_keys(smp);
1816 return 0;
1817 }
1818
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001819 build_pairing_cmd(conn, req, &rsp, auth);
1820
Johan Hedberga62da6f2016-12-08 08:32:54 +02001821 if (rsp.auth_req & SMP_AUTH_SC) {
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001822 set_bit(SMP_FLAG_SC, &smp->flags);
1823
Johan Hedberga62da6f2016-12-08 08:32:54 +02001824 if (rsp.auth_req & SMP_AUTH_CT2)
1825 set_bit(SMP_FLAG_CT2, &smp->flags);
1826 }
1827
Johan Hedberg5be5e272014-09-10 17:58:54 -07001828 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001829 sec_level = BT_SECURITY_MEDIUM;
1830 else
1831 sec_level = authreq_to_seclevel(auth);
1832
Johan Hedbergc7262e72014-06-17 13:07:37 +03001833 if (sec_level > conn->hcon->pending_sec_level)
1834 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001835
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001836 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001837 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1838 u8 method;
1839
1840 method = get_auth_method(smp, conn->hcon->io_capability,
1841 req->io_capability);
1842 if (method == JUST_WORKS || method == JUST_CFM)
1843 return SMP_AUTH_REQUIREMENTS;
1844 }
1845
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001846 key_size = min(req->max_key_size, rsp.max_key_size);
1847 if (check_enc_key_size(conn, key_size))
1848 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001849
Johan Hedberge84a6b12013-12-02 10:49:03 +02001850 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001851
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001852 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1853 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001854
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001855 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001856
1857 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1858
Johan Hedberg19c5ce92015-03-15 19:34:04 +02001859 /* Strictly speaking we shouldn't allow Pairing Confirm for the
1860 * SC case, however some implementations incorrectly copy RFU auth
1861 * req bits from our security request, which may create a false
1862 * positive SC enablement.
1863 */
1864 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1865
Johan Hedberg3b191462014-06-06 10:50:15 +03001866 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1867 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1868 /* Clear bits which are generated but not distributed */
1869 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1870 /* Wait for Public Key from Initiating Device */
1871 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001872 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001873
Brian Gix2b64d152011-12-21 16:12:12 -08001874 /* Request setup of TK */
1875 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1876 if (ret)
1877 return SMP_UNSPECIFIED;
1878
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001879 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001880}
1881
Johan Hedberg3b191462014-06-06 10:50:15 +03001882static u8 sc_send_public_key(struct smp_chan *smp)
1883{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001884 struct hci_dev *hdev = smp->conn->hcon->hdev;
1885
Johan Hedberg3b191462014-06-06 10:50:15 +03001886 BT_DBG("");
1887
Johan Hedberg1a8bab42015-03-16 11:45:44 +02001888 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001889 struct l2cap_chan *chan = hdev->smp_data;
1890 struct smp_dev *smp_dev;
1891
1892 if (!chan || !chan->data)
1893 return SMP_UNSPECIFIED;
1894
1895 smp_dev = chan->data;
1896
1897 memcpy(smp->local_pk, smp_dev->local_pk, 64);
Marcel Holtmannfb334fe2015-03-16 12:34:57 -07001898 memcpy(smp->lr, smp_dev->local_rand, 16);
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001899
1900 if (smp_dev->debug_key)
1901 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1902
1903 goto done;
1904 }
1905
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001906 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Johan Hedberg70157ef2014-06-24 15:22:59 +03001907 BT_DBG("Using debug keys");
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001908 if (set_ecdh_privkey(smp->tfm_ecdh, debug_sk))
1909 return SMP_UNSPECIFIED;
Johan Hedberg70157ef2014-06-24 15:22:59 +03001910 memcpy(smp->local_pk, debug_pk, 64);
Johan Hedberg70157ef2014-06-24 15:22:59 +03001911 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1912 } else {
1913 while (true) {
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001914 /* Generate key pair for Secure Connections */
1915 if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk))
Johan Hedberg70157ef2014-06-24 15:22:59 +03001916 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001917
Johan Hedberg70157ef2014-06-24 15:22:59 +03001918 /* This is unlikely, but we need to check that
1919 * we didn't accidentially generate a debug key.
1920 */
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001921 if (crypto_memneq(smp->local_pk, debug_pk, 64))
Johan Hedberg70157ef2014-06-24 15:22:59 +03001922 break;
1923 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001924 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001925
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001926done:
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001927 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
Marcel Holtmann8e4e2ee2015-03-16 01:10:25 -07001928 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32);
Johan Hedberg3b191462014-06-06 10:50:15 +03001929
1930 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1931
1932 return 0;
1933}
1934
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001935static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001936{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001937 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001938 struct l2cap_chan *chan = conn->smp;
1939 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001940 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001941 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001942 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001943
1944 BT_DBG("conn %p", conn);
1945
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001946 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001947 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001948
Johan Hedberg40bef302014-07-16 11:42:27 +03001949 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001950 return SMP_CMD_NOTSUPP;
1951
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001952 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001953
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001954 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001955
1956 key_size = min(req->max_key_size, rsp->max_key_size);
1957 if (check_enc_key_size(conn, key_size))
1958 return SMP_ENC_KEY_SIZE;
1959
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001960 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001961
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001962 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001963 return SMP_AUTH_REQUIREMENTS;
1964
Johan Hedbergcb06d362015-03-16 21:12:34 +02001965 /* If the remote side's OOB flag is set it means it has
1966 * successfully received our local OOB data - therefore set the
1967 * flag to indicate that local OOB is in use.
1968 */
Johan Hedberg58428562015-03-16 11:45:45 +02001969 if (rsp->oob_flag == SMP_OOB_PRESENT)
1970 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1971
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001972 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1973 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1974
1975 /* Update remote key distribution in case the remote cleared
1976 * some bits that we had enabled in our request.
1977 */
1978 smp->remote_key_dist &= rsp->resp_key_dist;
1979
Johan Hedberga62da6f2016-12-08 08:32:54 +02001980 if ((req->auth_req & SMP_AUTH_CT2) && (auth & SMP_AUTH_CT2))
1981 set_bit(SMP_FLAG_CT2, &smp->flags);
1982
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001983 /* For BR/EDR this means we're done and can start phase 3 */
1984 if (conn->hcon->type == ACL_LINK) {
1985 /* Clear bits which are generated but not distributed */
1986 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1987 smp_distribute_keys(smp);
1988 return 0;
1989 }
1990
Johan Hedberg65668772014-05-16 11:03:34 +03001991 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1992 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001993 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1994 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001995
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001996 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001997 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1998 u8 method;
1999
2000 method = get_auth_method(smp, req->io_capability,
2001 rsp->io_capability);
2002 if (method == JUST_WORKS || method == JUST_CFM)
2003 return SMP_AUTH_REQUIREMENTS;
2004 }
2005
Johan Hedberge84a6b12013-12-02 10:49:03 +02002006 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002007
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02002008 /* Update remote key distribution in case the remote cleared
2009 * some bits that we had enabled in our request.
2010 */
2011 smp->remote_key_dist &= rsp->resp_key_dist;
2012
Johan Hedberg3b191462014-06-06 10:50:15 +03002013 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2014 /* Clear bits which are generated but not distributed */
2015 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
2016 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
2017 return sc_send_public_key(smp);
2018 }
2019
Johan Hedbergc05b9332014-09-10 17:37:42 -07002020 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08002021
Johan Hedberg476585e2012-06-06 18:54:15 +08002022 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08002023 if (ret)
2024 return SMP_UNSPECIFIED;
2025
Johan Hedberg4a74d652014-05-20 09:45:50 +03002026 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08002027
2028 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03002029 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002030 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002031
2032 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002033}
2034
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002035static u8 sc_check_confirm(struct smp_chan *smp)
2036{
2037 struct l2cap_conn *conn = smp->conn;
2038
2039 BT_DBG("");
2040
Johan Hedberg38606f12014-06-25 11:10:28 +03002041 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2042 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
2043
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002044 if (conn->hcon->out) {
2045 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2046 smp->prnd);
2047 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2048 }
2049
2050 return 0;
2051}
2052
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002053/* Work-around for some implementations that incorrectly copy RFU bits
2054 * from our security request and thereby create the impression that
2055 * we're doing SC when in fact the remote doesn't support it.
2056 */
2057static int fixup_sc_false_positive(struct smp_chan *smp)
2058{
2059 struct l2cap_conn *conn = smp->conn;
2060 struct hci_conn *hcon = conn->hcon;
2061 struct hci_dev *hdev = hcon->hdev;
2062 struct smp_cmd_pairing *req, *rsp;
2063 u8 auth;
2064
2065 /* The issue is only observed when we're in slave role */
2066 if (hcon->out)
2067 return SMP_UNSPECIFIED;
2068
2069 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
2070 BT_ERR("Refusing SMP SC -> legacy fallback in SC-only mode");
2071 return SMP_UNSPECIFIED;
2072 }
2073
2074 BT_ERR("Trying to fall back to legacy SMP");
2075
2076 req = (void *) &smp->preq[1];
2077 rsp = (void *) &smp->prsp[1];
2078
2079 /* Rebuild key dist flags which may have been cleared for SC */
2080 smp->remote_key_dist = (req->init_key_dist & rsp->resp_key_dist);
2081
2082 auth = req->auth_req & AUTH_REQ_MASK(hdev);
2083
2084 if (tk_request(conn, 0, auth, rsp->io_capability, req->io_capability)) {
2085 BT_ERR("Failed to fall back to legacy SMP");
2086 return SMP_UNSPECIFIED;
2087 }
2088
2089 clear_bit(SMP_FLAG_SC, &smp->flags);
2090
2091 return 0;
2092}
2093
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002094static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002095{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002096 struct l2cap_chan *chan = conn->smp;
2097 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002098
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002099 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
2100
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002101 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002102 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002103
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002104 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
2105 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002106
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002107 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2108 int ret;
2109
2110 /* Public Key exchange must happen before any other steps */
2111 if (test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
2112 return sc_check_confirm(smp);
2113
2114 BT_ERR("Unexpected SMP Pairing Confirm");
2115
2116 ret = fixup_sc_false_positive(smp);
2117 if (ret)
2118 return ret;
2119 }
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002120
Johan Hedbergb28b4942014-09-05 22:19:55 +03002121 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02002122 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2123 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002124 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2125 return 0;
2126 }
2127
2128 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002129 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07002130
2131 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002132
2133 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002134}
2135
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002136static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002137{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002138 struct l2cap_chan *chan = conn->smp;
2139 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002140 struct hci_conn *hcon = conn->hcon;
2141 u8 *pkax, *pkbx, *na, *nb;
2142 u32 passkey;
2143 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002144
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002145 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002146
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002147 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002148 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002149
Johan Hedberg943a7322014-03-18 12:58:24 +02002150 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002151 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002152
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002153 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2154 return smp_random(smp);
2155
Johan Hedberg580039e2014-12-03 16:26:37 +02002156 if (hcon->out) {
2157 pkax = smp->local_pk;
2158 pkbx = smp->remote_pk;
2159 na = smp->prnd;
2160 nb = smp->rrnd;
2161 } else {
2162 pkax = smp->remote_pk;
2163 pkbx = smp->local_pk;
2164 na = smp->rrnd;
2165 nb = smp->prnd;
2166 }
2167
Johan Hedberga29b0732014-10-28 15:17:05 +01002168 if (smp->method == REQ_OOB) {
2169 if (!hcon->out)
2170 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2171 sizeof(smp->prnd), smp->prnd);
2172 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2173 goto mackey_and_ltk;
2174 }
2175
Johan Hedberg38606f12014-06-25 11:10:28 +03002176 /* Passkey entry has special treatment */
2177 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2178 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2179
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002180 if (hcon->out) {
2181 u8 cfm[16];
2182
2183 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2184 smp->rrnd, 0, cfm);
2185 if (err)
2186 return SMP_UNSPECIFIED;
2187
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002188 if (crypto_memneq(smp->pcnf, cfm, 16))
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002189 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002190 } else {
2191 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2192 smp->prnd);
2193 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002194 }
2195
Johan Hedberga29b0732014-10-28 15:17:05 +01002196mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002197 /* Generate MacKey and LTK */
2198 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2199 if (err)
2200 return SMP_UNSPECIFIED;
2201
Johan Hedberga29b0732014-10-28 15:17:05 +01002202 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002203 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002204 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002205 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2206 }
2207 return 0;
2208 }
2209
Johan Hedberg38606f12014-06-25 11:10:28 +03002210 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002211 if (err)
2212 return SMP_UNSPECIFIED;
2213
Johan Hedberg38606f12014-06-25 11:10:28 +03002214 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
2215 hcon->dst_type, passkey, 0);
2216 if (err)
2217 return SMP_UNSPECIFIED;
2218
2219 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2220
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002221 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002222}
2223
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002224static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002225{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002226 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002227 struct hci_conn *hcon = conn->hcon;
2228
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002229 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002230 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002231 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002232
Johan Hedberga6f78332014-09-10 17:37:45 -07002233 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002234 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002235
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002236 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002237 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002238
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002239 hci_le_start_enc(hcon, key->ediv, key->rand, key->val, key->enc_size);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002240 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002241
Johan Hedbergfe59a052014-07-01 19:14:12 +03002242 /* We never store STKs for master role, so clear this flag */
2243 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2244
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002245 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002246}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002247
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002248bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2249 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002250{
2251 if (sec_level == BT_SECURITY_LOW)
2252 return true;
2253
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002254 /* If we're encrypted with an STK but the caller prefers using
2255 * LTK claim insufficient security. This way we allow the
2256 * connection to be re-encrypted with an LTK, even if the LTK
2257 * provides the same level of security. Only exception is if we
2258 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002259 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002260 if (key_pref == SMP_USE_LTK &&
2261 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002262 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002263 return false;
2264
Johan Hedberg854f4722014-07-01 18:40:20 +03002265 if (hcon->sec_level >= sec_level)
2266 return true;
2267
2268 return false;
2269}
2270
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002271static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002272{
2273 struct smp_cmd_security_req *rp = (void *) skb->data;
2274 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002275 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002276 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002277 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002278 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002279
2280 BT_DBG("conn %p", conn);
2281
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002282 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002283 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002284
Johan Hedberg40bef302014-07-16 11:42:27 +03002285 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002286 return SMP_CMD_NOTSUPP;
2287
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002288 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002289
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002290 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002291 return SMP_AUTH_REQUIREMENTS;
2292
Johan Hedberg5be5e272014-09-10 17:58:54 -07002293 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002294 sec_level = BT_SECURITY_MEDIUM;
2295 else
2296 sec_level = authreq_to_seclevel(auth);
2297
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002298 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002299 return 0;
2300
Johan Hedbergc7262e72014-06-17 13:07:37 +03002301 if (sec_level > hcon->pending_sec_level)
2302 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002303
Johan Hedberg4dab7862012-06-07 14:58:37 +08002304 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002305 return 0;
2306
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002307 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002308 if (!smp)
2309 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002310
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002311 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002312 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002313 return SMP_PAIRING_NOTSUPP;
2314
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002315 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002316
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002317 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002318 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002319
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002320 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2321 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002322
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002323 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002324 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002325
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002326 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002327}
2328
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002329int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002330{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002331 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002332 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002333 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002334 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002335 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002336
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002337 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2338
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002339 /* This may be NULL if there's an unexpected disconnection */
2340 if (!conn)
2341 return 1;
2342
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002343 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002344 return 1;
2345
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002346 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002347 return 1;
2348
Johan Hedbergc7262e72014-06-17 13:07:37 +03002349 if (sec_level > hcon->pending_sec_level)
2350 hcon->pending_sec_level = sec_level;
2351
Johan Hedberg40bef302014-07-16 11:42:27 +03002352 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002353 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2354 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002355
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002356 chan = conn->smp;
2357 if (!chan) {
2358 BT_ERR("SMP security requested but not available");
2359 return 1;
2360 }
2361
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002362 l2cap_chan_lock(chan);
2363
2364 /* If SMP is already in progress ignore this request */
2365 if (chan->data) {
2366 ret = 0;
2367 goto unlock;
2368 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002369
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002370 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002371 if (!smp) {
2372 ret = 1;
2373 goto unlock;
2374 }
Brian Gix2b64d152011-12-21 16:12:12 -08002375
2376 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002377
Johan Hedberga62da6f2016-12-08 08:32:54 +02002378 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED)) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002379 authreq |= SMP_AUTH_SC;
Johan Hedberga62da6f2016-12-08 08:32:54 +02002380 if (hci_dev_test_flag(hcon->hdev, HCI_SSP_ENABLED))
2381 authreq |= SMP_AUTH_CT2;
2382 }
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002383
Johan Hedberg79897d22014-06-01 09:45:24 +03002384 /* Require MITM if IO Capability allows or the security level
2385 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002386 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002387 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002388 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002389 authreq |= SMP_AUTH_MITM;
2390
Johan Hedberg40bef302014-07-16 11:42:27 +03002391 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002392 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002393
Brian Gix2b64d152011-12-21 16:12:12 -08002394 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002395 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2396 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002397
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002398 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002399 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002400 } else {
2401 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002402 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002403 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002404 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002405 }
2406
Johan Hedberg4a74d652014-05-20 09:45:50 +03002407 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002408 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002409
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002410unlock:
2411 l2cap_chan_unlock(chan);
2412 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002413}
2414
Johan Hedbergc81d5552015-10-22 09:38:35 +03002415void smp_cancel_pairing(struct hci_conn *hcon)
2416{
2417 struct l2cap_conn *conn = hcon->l2cap_data;
2418 struct l2cap_chan *chan;
2419 struct smp_chan *smp;
2420
2421 if (!conn)
2422 return;
2423
2424 chan = conn->smp;
2425 if (!chan)
2426 return;
2427
2428 l2cap_chan_lock(chan);
2429
2430 smp = chan->data;
2431 if (smp) {
2432 if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
2433 smp_failure(conn, 0);
2434 else
2435 smp_failure(conn, SMP_UNSPECIFIED);
2436 }
2437
2438 l2cap_chan_unlock(chan);
2439}
2440
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002441static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2442{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002443 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002444 struct l2cap_chan *chan = conn->smp;
2445 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002446
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002447 BT_DBG("conn %p", conn);
2448
2449 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002450 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002451
Johan Hedbergb28b4942014-09-05 22:19:55 +03002452 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002453
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002454 skb_pull(skb, sizeof(*rp));
2455
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002456 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002457
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002458 return 0;
2459}
2460
2461static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2462{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002463 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002464 struct l2cap_chan *chan = conn->smp;
2465 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002466 struct hci_dev *hdev = conn->hcon->hdev;
2467 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002468 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002469 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002470
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002471 BT_DBG("conn %p", conn);
2472
2473 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002474 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002475
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002476 /* Mark the information as received */
2477 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2478
Johan Hedbergb28b4942014-09-05 22:19:55 +03002479 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2480 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002481 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2482 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002483
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002484 skb_pull(skb, sizeof(*rp));
2485
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002486 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002487 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002488 authenticated, smp->tk, smp->enc_key_size,
2489 rp->ediv, rp->rand);
2490 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002491 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002492 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002493
2494 return 0;
2495}
2496
Johan Hedbergfd349c02014-02-18 10:19:36 +02002497static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2498{
2499 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002500 struct l2cap_chan *chan = conn->smp;
2501 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002502
2503 BT_DBG("");
2504
2505 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002506 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002507
Johan Hedbergb28b4942014-09-05 22:19:55 +03002508 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002509
Johan Hedbergfd349c02014-02-18 10:19:36 +02002510 skb_pull(skb, sizeof(*info));
2511
2512 memcpy(smp->irk, info->irk, 16);
2513
2514 return 0;
2515}
2516
2517static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2518 struct sk_buff *skb)
2519{
2520 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002521 struct l2cap_chan *chan = conn->smp;
2522 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002523 struct hci_conn *hcon = conn->hcon;
2524 bdaddr_t rpa;
2525
2526 BT_DBG("");
2527
2528 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002529 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002530
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002531 /* Mark the information as received */
2532 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2533
Johan Hedbergb28b4942014-09-05 22:19:55 +03002534 if (smp->remote_key_dist & SMP_DIST_SIGN)
2535 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2536
Johan Hedbergfd349c02014-02-18 10:19:36 +02002537 skb_pull(skb, sizeof(*info));
2538
Johan Hedberga9a58f82014-02-25 22:24:37 +02002539 /* Strictly speaking the Core Specification (4.1) allows sending
2540 * an empty address which would force us to rely on just the IRK
2541 * as "identity information". However, since such
2542 * implementations are not known of and in order to not over
2543 * complicate our implementation, simply pretend that we never
2544 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002545 *
2546 * The Identity Address must also be a Static Random or Public
2547 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002548 */
Johan Hedberge12af482015-01-14 20:51:37 +02002549 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2550 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Johan Hedberga9a58f82014-02-25 22:24:37 +02002551 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002552 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002553 }
2554
Johan Hedbergfd349c02014-02-18 10:19:36 +02002555 bacpy(&smp->id_addr, &info->bdaddr);
2556 smp->id_addr_type = info->addr_type;
2557
2558 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2559 bacpy(&rpa, &hcon->dst);
2560 else
2561 bacpy(&rpa, BDADDR_ANY);
2562
Johan Hedberg23d0e122014-02-19 14:57:46 +02002563 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2564 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002565
Johan Hedberg31dd6242014-06-27 14:23:02 +03002566distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002567 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2568 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002569
2570 return 0;
2571}
2572
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002573static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2574{
2575 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002576 struct l2cap_chan *chan = conn->smp;
2577 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002578 struct smp_csrk *csrk;
2579
2580 BT_DBG("conn %p", conn);
2581
2582 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002583 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002584
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002585 /* Mark the information as received */
2586 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2587
2588 skb_pull(skb, sizeof(*rp));
2589
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002590 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2591 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002592 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2593 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2594 else
2595 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002596 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2597 }
2598 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002599 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002600
2601 return 0;
2602}
2603
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002604static u8 sc_select_method(struct smp_chan *smp)
2605{
2606 struct l2cap_conn *conn = smp->conn;
2607 struct hci_conn *hcon = conn->hcon;
2608 struct smp_cmd_pairing *local, *remote;
2609 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2610
Johan Hedberg1a8bab42015-03-16 11:45:44 +02002611 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) ||
2612 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags))
Johan Hedberga29b0732014-10-28 15:17:05 +01002613 return REQ_OOB;
2614
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002615 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2616 * which are needed as inputs to some crypto functions. To get
2617 * the "struct smp_cmd_pairing" from them we need to skip the
2618 * first byte which contains the opcode.
2619 */
2620 if (hcon->out) {
2621 local = (void *) &smp->preq[1];
2622 remote = (void *) &smp->prsp[1];
2623 } else {
2624 local = (void *) &smp->prsp[1];
2625 remote = (void *) &smp->preq[1];
2626 }
2627
2628 local_io = local->io_capability;
2629 remote_io = remote->io_capability;
2630
2631 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2632 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2633
2634 /* If either side wants MITM, look up the method from the table,
2635 * otherwise use JUST WORKS.
2636 */
2637 if (local_mitm || remote_mitm)
2638 method = get_auth_method(smp, local_io, remote_io);
2639 else
2640 method = JUST_WORKS;
2641
2642 /* Don't confirm locally initiated pairing attempts */
2643 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2644 method = JUST_WORKS;
2645
2646 return method;
2647}
2648
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002649static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2650{
2651 struct smp_cmd_public_key *key = (void *) skb->data;
2652 struct hci_conn *hcon = conn->hcon;
2653 struct l2cap_chan *chan = conn->smp;
2654 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002655 struct hci_dev *hdev = hcon->hdev;
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002656 struct crypto_kpp *tfm_ecdh;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002657 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002658 int err;
2659
2660 BT_DBG("conn %p", conn);
2661
2662 if (skb->len < sizeof(*key))
2663 return SMP_INVALID_PARAMS;
2664
2665 memcpy(smp->remote_pk, key, 64);
2666
Johan Hedberga8ca6172015-03-16 18:12:57 +02002667 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {
2668 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2669 smp->rr, 0, cfm.confirm_val);
2670 if (err)
2671 return SMP_UNSPECIFIED;
2672
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002673 if (crypto_memneq(cfm.confirm_val, smp->pcnf, 16))
Johan Hedberga8ca6172015-03-16 18:12:57 +02002674 return SMP_CONFIRM_FAILED;
2675 }
2676
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002677 /* Non-initiating device sends its public key after receiving
2678 * the key from the initiating device.
2679 */
2680 if (!hcon->out) {
2681 err = sc_send_public_key(smp);
2682 if (err)
2683 return err;
2684 }
2685
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002686 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
Marcel Holtmanne0915262015-03-16 12:34:55 -07002687 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002688
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002689 /* Compute the shared secret on the same crypto tfm on which the private
2690 * key was set/generated.
2691 */
2692 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
2693 struct smp_dev *smp_dev = chan->data;
2694
2695 tfm_ecdh = smp_dev->tfm_ecdh;
2696 } else {
2697 tfm_ecdh = smp->tfm_ecdh;
2698 }
2699
2700 if (compute_ecdh_secret(tfm_ecdh, smp->remote_pk, smp->dhkey))
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002701 return SMP_UNSPECIFIED;
2702
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002703 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002704
2705 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2706
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002707 smp->method = sc_select_method(smp);
2708
2709 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2710
2711 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2712 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2713 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2714 else
2715 hcon->pending_sec_level = BT_SECURITY_FIPS;
2716
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002717 if (!crypto_memneq(debug_pk, smp->remote_pk, 64))
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002718 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2719
Johan Hedberg38606f12014-06-25 11:10:28 +03002720 if (smp->method == DSP_PASSKEY) {
2721 get_random_bytes(&hcon->passkey_notify,
2722 sizeof(hcon->passkey_notify));
2723 hcon->passkey_notify %= 1000000;
2724 hcon->passkey_entered = 0;
2725 smp->passkey_round = 0;
2726 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2727 hcon->dst_type,
2728 hcon->passkey_notify,
2729 hcon->passkey_entered))
2730 return SMP_UNSPECIFIED;
2731 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2732 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2733 }
2734
Johan Hedberg94ea7252015-03-16 11:45:46 +02002735 if (smp->method == REQ_OOB) {
Johan Hedberga29b0732014-10-28 15:17:05 +01002736 if (hcon->out)
2737 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2738 sizeof(smp->prnd), smp->prnd);
2739
2740 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2741
2742 return 0;
2743 }
2744
Johan Hedberg38606f12014-06-25 11:10:28 +03002745 if (hcon->out)
2746 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2747
2748 if (smp->method == REQ_PASSKEY) {
2749 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2750 hcon->dst_type))
2751 return SMP_UNSPECIFIED;
2752 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2753 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2754 return 0;
2755 }
2756
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002757 /* The Initiating device waits for the non-initiating device to
2758 * send the confirm value.
2759 */
2760 if (conn->hcon->out)
2761 return 0;
2762
2763 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2764 0, cfm.confirm_val);
2765 if (err)
2766 return SMP_UNSPECIFIED;
2767
2768 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2769 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2770
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002771 return 0;
2772}
2773
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002774static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2775{
2776 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2777 struct l2cap_chan *chan = conn->smp;
2778 struct hci_conn *hcon = conn->hcon;
2779 struct smp_chan *smp = chan->data;
2780 u8 a[7], b[7], *local_addr, *remote_addr;
2781 u8 io_cap[3], r[16], e[16];
2782 int err;
2783
2784 BT_DBG("conn %p", conn);
2785
2786 if (skb->len < sizeof(*check))
2787 return SMP_INVALID_PARAMS;
2788
2789 memcpy(a, &hcon->init_addr, 6);
2790 memcpy(b, &hcon->resp_addr, 6);
2791 a[6] = hcon->init_addr_type;
2792 b[6] = hcon->resp_addr_type;
2793
2794 if (hcon->out) {
2795 local_addr = a;
2796 remote_addr = b;
2797 memcpy(io_cap, &smp->prsp[1], 3);
2798 } else {
2799 local_addr = b;
2800 remote_addr = a;
2801 memcpy(io_cap, &smp->preq[1], 3);
2802 }
2803
2804 memset(r, 0, sizeof(r));
2805
Johan Hedberg38606f12014-06-25 11:10:28 +03002806 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2807 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg882fafa2015-03-16 11:45:43 +02002808 else if (smp->method == REQ_OOB)
2809 memcpy(r, smp->lr, 16);
Johan Hedberg38606f12014-06-25 11:10:28 +03002810
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002811 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2812 io_cap, remote_addr, local_addr, e);
2813 if (err)
2814 return SMP_UNSPECIFIED;
2815
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002816 if (crypto_memneq(check->e, e, 16))
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002817 return SMP_DHKEY_CHECK_FAILED;
2818
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002819 if (!hcon->out) {
2820 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2821 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2822 return 0;
2823 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002824
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002825 /* Slave sends DHKey check as response to master */
2826 sc_dhkey_check(smp);
2827 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002828
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002829 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002830
2831 if (hcon->out) {
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002832 hci_le_start_enc(hcon, 0, 0, smp->tk, smp->enc_key_size);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002833 hcon->enc_key_size = smp->enc_key_size;
2834 }
2835
2836 return 0;
2837}
2838
Johan Hedberg1408bb62014-06-04 22:45:57 +03002839static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2840 struct sk_buff *skb)
2841{
2842 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2843
2844 BT_DBG("value 0x%02x", kp->value);
2845
2846 return 0;
2847}
2848
Johan Hedberg4befb862014-08-11 22:06:38 +03002849static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002850{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002851 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002852 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002853 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002854 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002855 int err = 0;
2856
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002857 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002858 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002859
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002860 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002861 reason = SMP_PAIRING_NOTSUPP;
2862 goto done;
2863 }
2864
Marcel Holtmann92381f52013-10-03 01:23:08 -07002865 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002866 skb_pull(skb, sizeof(code));
2867
Johan Hedbergb28b4942014-09-05 22:19:55 +03002868 smp = chan->data;
2869
2870 if (code > SMP_CMD_MAX)
2871 goto drop;
2872
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002873 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002874 goto drop;
2875
2876 /* If we don't have a context the only allowed commands are
2877 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002878 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002879 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2880 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002881
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002882 switch (code) {
2883 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002884 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002885 break;
2886
2887 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002888 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002889 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002890 break;
2891
2892 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002893 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002894 break;
2895
2896 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002897 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002898 break;
2899
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002900 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002901 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002902 break;
2903
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002904 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002905 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002906 break;
2907
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002908 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002909 reason = smp_cmd_encrypt_info(conn, skb);
2910 break;
2911
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002912 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002913 reason = smp_cmd_master_ident(conn, skb);
2914 break;
2915
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002916 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002917 reason = smp_cmd_ident_info(conn, skb);
2918 break;
2919
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002920 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002921 reason = smp_cmd_ident_addr_info(conn, skb);
2922 break;
2923
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002924 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002925 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002926 break;
2927
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002928 case SMP_CMD_PUBLIC_KEY:
2929 reason = smp_cmd_public_key(conn, skb);
2930 break;
2931
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002932 case SMP_CMD_DHKEY_CHECK:
2933 reason = smp_cmd_dhkey_check(conn, skb);
2934 break;
2935
Johan Hedberg1408bb62014-06-04 22:45:57 +03002936 case SMP_CMD_KEYPRESS_NOTIFY:
2937 reason = smp_cmd_keypress_notify(conn, skb);
2938 break;
2939
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002940 default:
2941 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002942 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002943 goto done;
2944 }
2945
2946done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002947 if (!err) {
2948 if (reason)
2949 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002950 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002951 }
2952
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002953 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002954
2955drop:
2956 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2957 code, &hcon->dst);
2958 kfree_skb(skb);
2959 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002960}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002961
Johan Hedberg70db83c2014-08-08 09:37:16 +03002962static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2963{
2964 struct l2cap_conn *conn = chan->conn;
2965
2966 BT_DBG("chan %p", chan);
2967
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002968 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002969 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002970
Johan Hedberg70db83c2014-08-08 09:37:16 +03002971 conn->smp = NULL;
2972 l2cap_chan_put(chan);
2973}
2974
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002975static void bredr_pairing(struct l2cap_chan *chan)
2976{
2977 struct l2cap_conn *conn = chan->conn;
2978 struct hci_conn *hcon = conn->hcon;
2979 struct hci_dev *hdev = hcon->hdev;
2980 struct smp_cmd_pairing req;
2981 struct smp_chan *smp;
2982
2983 BT_DBG("chan %p", chan);
2984
2985 /* Only new pairings are interesting */
2986 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2987 return;
2988
2989 /* Don't bother if we're not encrypted */
2990 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2991 return;
2992
2993 /* Only master may initiate SMP over BR/EDR */
2994 if (hcon->role != HCI_ROLE_MASTER)
2995 return;
2996
2997 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002998 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002999 return;
3000
3001 /* BR/EDR must use Secure Connections for SMP */
3002 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003003 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003004 return;
3005
3006 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003007 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003008 return;
3009
3010 /* Don't bother if remote LE support is not enabled */
3011 if (!lmp_host_le_capable(hcon))
3012 return;
3013
3014 /* Remote must support SMP fixed chan for BR/EDR */
3015 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
3016 return;
3017
3018 /* Don't bother if SMP is already ongoing */
3019 if (chan->data)
3020 return;
3021
3022 smp = smp_chan_create(conn);
3023 if (!smp) {
3024 BT_ERR("%s unable to create SMP context for BR/EDR",
3025 hdev->name);
3026 return;
3027 }
3028
3029 set_bit(SMP_FLAG_SC, &smp->flags);
3030
3031 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
3032
3033 /* Prepare and send the BR/EDR SMP Pairing Request */
3034 build_bredr_pairing_cmd(smp, &req, NULL);
3035
3036 smp->preq[0] = SMP_CMD_PAIRING_REQ;
3037 memcpy(&smp->preq[1], &req, sizeof(req));
3038
3039 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
3040 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
3041}
3042
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003043static void smp_resume_cb(struct l2cap_chan *chan)
3044{
Johan Hedbergb68fda62014-08-11 22:06:40 +03003045 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003046 struct l2cap_conn *conn = chan->conn;
3047 struct hci_conn *hcon = conn->hcon;
3048
3049 BT_DBG("chan %p", chan);
3050
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003051 if (hcon->type == ACL_LINK) {
3052 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003053 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003054 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003055
Johan Hedberg86d14072014-08-11 22:06:43 +03003056 if (!smp)
3057 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03003058
Johan Hedberg84bc0db2014-09-05 22:19:49 +03003059 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3060 return;
3061
Johan Hedberg86d14072014-08-11 22:06:43 +03003062 cancel_delayed_work(&smp->security_timer);
3063
Johan Hedbergd6268e82014-09-05 22:19:51 +03003064 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003065}
3066
Johan Hedberg70db83c2014-08-08 09:37:16 +03003067static void smp_ready_cb(struct l2cap_chan *chan)
3068{
3069 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003070 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003071
3072 BT_DBG("chan %p", chan);
3073
Johan Hedberg78837462015-11-11 21:47:12 +02003074 /* No need to call l2cap_chan_hold() here since we already own
3075 * the reference taken in smp_new_conn_cb(). This is just the
3076 * first time that we tie it to a specific pointer. The code in
3077 * l2cap_core.c ensures that there's no risk this function wont
3078 * get called if smp_new_conn_cb was previously called.
3079 */
Johan Hedberg70db83c2014-08-08 09:37:16 +03003080 conn->smp = chan;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003081
3082 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3083 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003084}
3085
Johan Hedberg4befb862014-08-11 22:06:38 +03003086static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
3087{
3088 int err;
3089
3090 BT_DBG("chan %p", chan);
3091
3092 err = smp_sig_channel(chan, skb);
3093 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03003094 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03003095
Johan Hedbergb68fda62014-08-11 22:06:40 +03003096 if (smp)
3097 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03003098
Johan Hedberg1e91c292014-08-18 20:33:29 +03003099 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03003100 }
3101
3102 return err;
3103}
3104
Johan Hedberg70db83c2014-08-08 09:37:16 +03003105static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
3106 unsigned long hdr_len,
3107 unsigned long len, int nb)
3108{
3109 struct sk_buff *skb;
3110
3111 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
3112 if (!skb)
3113 return ERR_PTR(-ENOMEM);
3114
3115 skb->priority = HCI_PRIO_MAX;
Johan Hedberga4368ff2015-03-30 23:21:01 +03003116 bt_cb(skb)->l2cap.chan = chan;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003117
3118 return skb;
3119}
3120
3121static const struct l2cap_ops smp_chan_ops = {
3122 .name = "Security Manager",
3123 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003124 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003125 .alloc_skb = smp_alloc_skb_cb,
3126 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003127 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003128
3129 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003130 .state_change = l2cap_chan_no_state_change,
3131 .close = l2cap_chan_no_close,
3132 .defer = l2cap_chan_no_defer,
3133 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003134 .set_shutdown = l2cap_chan_no_set_shutdown,
3135 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003136};
3137
3138static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
3139{
3140 struct l2cap_chan *chan;
3141
3142 BT_DBG("pchan %p", pchan);
3143
3144 chan = l2cap_chan_create();
3145 if (!chan)
3146 return NULL;
3147
3148 chan->chan_type = pchan->chan_type;
3149 chan->ops = &smp_chan_ops;
3150 chan->scid = pchan->scid;
3151 chan->dcid = chan->scid;
3152 chan->imtu = pchan->imtu;
3153 chan->omtu = pchan->omtu;
3154 chan->mode = pchan->mode;
3155
Johan Hedbergabe84902014-11-12 22:22:21 +02003156 /* Other L2CAP channels may request SMP routines in order to
3157 * change the security level. This means that the SMP channel
3158 * lock must be considered in its own category to avoid lockdep
3159 * warnings.
3160 */
3161 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
3162
Johan Hedberg70db83c2014-08-08 09:37:16 +03003163 BT_DBG("created chan %p", chan);
3164
3165 return chan;
3166}
3167
3168static const struct l2cap_ops smp_root_chan_ops = {
3169 .name = "Security Manager Root",
3170 .new_connection = smp_new_conn_cb,
3171
3172 /* None of these are implemented for the root channel */
3173 .close = l2cap_chan_no_close,
3174 .alloc_skb = l2cap_chan_no_alloc_skb,
3175 .recv = l2cap_chan_no_recv,
3176 .state_change = l2cap_chan_no_state_change,
3177 .teardown = l2cap_chan_no_teardown,
3178 .ready = l2cap_chan_no_ready,
3179 .defer = l2cap_chan_no_defer,
3180 .suspend = l2cap_chan_no_suspend,
3181 .resume = l2cap_chan_no_resume,
3182 .set_shutdown = l2cap_chan_no_set_shutdown,
3183 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003184};
3185
Johan Hedbergef8efe42014-08-13 15:12:32 +03003186static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003187{
Johan Hedberg70db83c2014-08-08 09:37:16 +03003188 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003189 struct smp_dev *smp;
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003190 struct crypto_cipher *tfm_aes;
Herbert Xu71af2f62016-01-24 21:18:30 +08003191 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003192 struct crypto_kpp *tfm_ecdh;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003193
Johan Hedbergef8efe42014-08-13 15:12:32 +03003194 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003195 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03003196 goto create_chan;
3197 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03003198
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003199 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3200 if (!smp)
3201 return ERR_PTR(-ENOMEM);
3202
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003203 tfm_aes = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003204 if (IS_ERR(tfm_aes)) {
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003205 BT_ERR("Unable to create AES crypto context");
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003206 kzfree(smp);
Fengguang Wufe700772014-12-08 03:04:38 +08003207 return ERR_CAST(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003208 }
3209
Herbert Xu71af2f62016-01-24 21:18:30 +08003210 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003211 if (IS_ERR(tfm_cmac)) {
3212 BT_ERR("Unable to create CMAC crypto context");
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003213 crypto_free_cipher(tfm_aes);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003214 kzfree(smp);
3215 return ERR_CAST(tfm_cmac);
3216 }
3217
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003218 tfm_ecdh = crypto_alloc_kpp("ecdh", CRYPTO_ALG_INTERNAL, 0);
3219 if (IS_ERR(tfm_ecdh)) {
3220 BT_ERR("Unable to create ECDH crypto context");
3221 crypto_free_shash(tfm_cmac);
3222 crypto_free_cipher(tfm_aes);
3223 kzfree(smp);
3224 return ERR_CAST(tfm_ecdh);
3225 }
3226
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003227 smp->tfm_aes = tfm_aes;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003228 smp->tfm_cmac = tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003229 smp->tfm_ecdh = tfm_ecdh;
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003230 smp->min_key_size = SMP_MIN_ENC_KEY_SIZE;
Johan Hedberg2fd36552015-06-11 13:52:26 +03003231 smp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003232
Johan Hedbergef8efe42014-08-13 15:12:32 +03003233create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003234 chan = l2cap_chan_create();
3235 if (!chan) {
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003236 if (smp) {
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003237 crypto_free_cipher(smp->tfm_aes);
Herbert Xu71af2f62016-01-24 21:18:30 +08003238 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003239 crypto_free_kpp(smp->tfm_ecdh);
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003240 kzfree(smp);
3241 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003242 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003243 }
3244
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003245 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003246
Johan Hedbergef8efe42014-08-13 15:12:32 +03003247 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003248
3249 l2cap_chan_set_defaults(chan);
3250
Marcel Holtmann157029b2015-01-14 15:43:09 -08003251 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003252 u8 bdaddr_type;
3253
3254 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3255
3256 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003257 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003258 else
3259 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003260 } else {
3261 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003262 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003263 }
3264
Johan Hedberg70db83c2014-08-08 09:37:16 +03003265 chan->state = BT_LISTEN;
3266 chan->mode = L2CAP_MODE_BASIC;
3267 chan->imtu = L2CAP_DEFAULT_MTU;
3268 chan->ops = &smp_root_chan_ops;
3269
Johan Hedbergabe84902014-11-12 22:22:21 +02003270 /* Set correct nesting level for a parent/listening channel */
3271 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3272
Johan Hedbergef8efe42014-08-13 15:12:32 +03003273 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003274}
3275
Johan Hedbergef8efe42014-08-13 15:12:32 +03003276static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003277{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003278 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003279
Johan Hedbergef8efe42014-08-13 15:12:32 +03003280 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003281
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003282 smp = chan->data;
3283 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003284 chan->data = NULL;
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003285 crypto_free_cipher(smp->tfm_aes);
Herbert Xu71af2f62016-01-24 21:18:30 +08003286 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003287 crypto_free_kpp(smp->tfm_ecdh);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003288 kzfree(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003289 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003290
Johan Hedberg70db83c2014-08-08 09:37:16 +03003291 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003292}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003293
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003294static ssize_t force_bredr_smp_read(struct file *file,
3295 char __user *user_buf,
3296 size_t count, loff_t *ppos)
3297{
3298 struct hci_dev *hdev = file->private_data;
3299 char buf[3];
3300
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003301 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP) ? 'Y': 'N';
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003302 buf[1] = '\n';
3303 buf[2] = '\0';
3304 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3305}
3306
3307static ssize_t force_bredr_smp_write(struct file *file,
3308 const char __user *user_buf,
3309 size_t count, loff_t *ppos)
3310{
3311 struct hci_dev *hdev = file->private_data;
3312 char buf[32];
3313 size_t buf_size = min(count, (sizeof(buf)-1));
3314 bool enable;
3315
3316 if (copy_from_user(buf, user_buf, buf_size))
3317 return -EFAULT;
3318
3319 buf[buf_size] = '\0';
3320 if (strtobool(buf, &enable))
3321 return -EINVAL;
3322
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003323 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003324 return -EALREADY;
3325
3326 if (enable) {
3327 struct l2cap_chan *chan;
3328
3329 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3330 if (IS_ERR(chan))
3331 return PTR_ERR(chan);
3332
3333 hdev->smp_bredr_data = chan;
3334 } else {
3335 struct l2cap_chan *chan;
3336
3337 chan = hdev->smp_bredr_data;
3338 hdev->smp_bredr_data = NULL;
3339 smp_del_chan(chan);
3340 }
3341
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003342 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003343
3344 return count;
3345}
3346
3347static const struct file_operations force_bredr_smp_fops = {
3348 .open = simple_open,
3349 .read = force_bredr_smp_read,
3350 .write = force_bredr_smp_write,
3351 .llseek = default_llseek,
3352};
3353
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003354static ssize_t le_min_key_size_read(struct file *file,
3355 char __user *user_buf,
3356 size_t count, loff_t *ppos)
3357{
3358 struct hci_dev *hdev = file->private_data;
3359 char buf[4];
3360
3361 snprintf(buf, sizeof(buf), "%2u\n", SMP_DEV(hdev)->min_key_size);
3362
3363 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
3364}
3365
3366static ssize_t le_min_key_size_write(struct file *file,
3367 const char __user *user_buf,
3368 size_t count, loff_t *ppos)
3369{
3370 struct hci_dev *hdev = file->private_data;
3371 char buf[32];
3372 size_t buf_size = min(count, (sizeof(buf) - 1));
3373 u8 key_size;
3374
3375 if (copy_from_user(buf, user_buf, buf_size))
3376 return -EFAULT;
3377
3378 buf[buf_size] = '\0';
3379
3380 sscanf(buf, "%hhu", &key_size);
3381
3382 if (key_size > SMP_DEV(hdev)->max_key_size ||
3383 key_size < SMP_MIN_ENC_KEY_SIZE)
3384 return -EINVAL;
3385
3386 SMP_DEV(hdev)->min_key_size = key_size;
3387
3388 return count;
3389}
3390
3391static const struct file_operations le_min_key_size_fops = {
3392 .open = simple_open,
3393 .read = le_min_key_size_read,
3394 .write = le_min_key_size_write,
3395 .llseek = default_llseek,
3396};
3397
Johan Hedberg2fd36552015-06-11 13:52:26 +03003398static ssize_t le_max_key_size_read(struct file *file,
3399 char __user *user_buf,
3400 size_t count, loff_t *ppos)
3401{
3402 struct hci_dev *hdev = file->private_data;
3403 char buf[4];
3404
3405 snprintf(buf, sizeof(buf), "%2u\n", SMP_DEV(hdev)->max_key_size);
3406
3407 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
3408}
3409
3410static ssize_t le_max_key_size_write(struct file *file,
3411 const char __user *user_buf,
3412 size_t count, loff_t *ppos)
3413{
3414 struct hci_dev *hdev = file->private_data;
3415 char buf[32];
3416 size_t buf_size = min(count, (sizeof(buf) - 1));
3417 u8 key_size;
3418
3419 if (copy_from_user(buf, user_buf, buf_size))
3420 return -EFAULT;
3421
3422 buf[buf_size] = '\0';
3423
3424 sscanf(buf, "%hhu", &key_size);
3425
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003426 if (key_size > SMP_MAX_ENC_KEY_SIZE ||
3427 key_size < SMP_DEV(hdev)->min_key_size)
Johan Hedberg2fd36552015-06-11 13:52:26 +03003428 return -EINVAL;
3429
3430 SMP_DEV(hdev)->max_key_size = key_size;
3431
3432 return count;
3433}
3434
3435static const struct file_operations le_max_key_size_fops = {
3436 .open = simple_open,
3437 .read = le_max_key_size_read,
3438 .write = le_max_key_size_write,
3439 .llseek = default_llseek,
3440};
3441
Johan Hedbergef8efe42014-08-13 15:12:32 +03003442int smp_register(struct hci_dev *hdev)
3443{
3444 struct l2cap_chan *chan;
3445
3446 BT_DBG("%s", hdev->name);
3447
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003448 /* If the controller does not support Low Energy operation, then
3449 * there is also no need to register any SMP channel.
3450 */
3451 if (!lmp_le_capable(hdev))
3452 return 0;
3453
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003454 if (WARN_ON(hdev->smp_data)) {
3455 chan = hdev->smp_data;
3456 hdev->smp_data = NULL;
3457 smp_del_chan(chan);
3458 }
3459
Johan Hedbergef8efe42014-08-13 15:12:32 +03003460 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3461 if (IS_ERR(chan))
3462 return PTR_ERR(chan);
3463
3464 hdev->smp_data = chan;
3465
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003466 debugfs_create_file("le_min_key_size", 0644, hdev->debugfs, hdev,
3467 &le_min_key_size_fops);
Johan Hedberg2fd36552015-06-11 13:52:26 +03003468 debugfs_create_file("le_max_key_size", 0644, hdev->debugfs, hdev,
3469 &le_max_key_size_fops);
3470
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003471 /* If the controller does not support BR/EDR Secure Connections
3472 * feature, then the BR/EDR SMP channel shall not be present.
3473 *
3474 * To test this with Bluetooth 4.0 controllers, create a debugfs
3475 * switch that allows forcing BR/EDR SMP support and accepting
3476 * cross-transport pairing on non-AES encrypted connections.
3477 */
3478 if (!lmp_sc_capable(hdev)) {
3479 debugfs_create_file("force_bredr_smp", 0644, hdev->debugfs,
3480 hdev, &force_bredr_smp_fops);
Szymon Janc83ebb9e2016-09-09 20:24:40 +02003481
3482 /* Flag can be already set here (due to power toggle) */
3483 if (!hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
3484 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003485 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003486
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003487 if (WARN_ON(hdev->smp_bredr_data)) {
3488 chan = hdev->smp_bredr_data;
3489 hdev->smp_bredr_data = NULL;
3490 smp_del_chan(chan);
3491 }
3492
Johan Hedbergef8efe42014-08-13 15:12:32 +03003493 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3494 if (IS_ERR(chan)) {
3495 int err = PTR_ERR(chan);
3496 chan = hdev->smp_data;
3497 hdev->smp_data = NULL;
3498 smp_del_chan(chan);
3499 return err;
3500 }
3501
3502 hdev->smp_bredr_data = chan;
3503
3504 return 0;
3505}
3506
3507void smp_unregister(struct hci_dev *hdev)
3508{
3509 struct l2cap_chan *chan;
3510
3511 if (hdev->smp_bredr_data) {
3512 chan = hdev->smp_bredr_data;
3513 hdev->smp_bredr_data = NULL;
3514 smp_del_chan(chan);
3515 }
3516
3517 if (hdev->smp_data) {
3518 chan = hdev->smp_data;
3519 hdev->smp_data = NULL;
3520 smp_del_chan(chan);
3521 }
3522}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003523
3524#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3525
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003526static int __init test_debug_key(struct crypto_kpp *tfm_ecdh)
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003527{
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003528 u8 pk[64];
Tudor Ambarusa2976412017-09-28 17:14:52 +03003529 int err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003530
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003531 err = set_ecdh_privkey(tfm_ecdh, debug_sk);
Tudor Ambarusa2976412017-09-28 17:14:52 +03003532 if (err)
3533 return err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003534
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003535 err = generate_ecdh_public_key(tfm_ecdh, pk);
3536 if (err)
3537 return err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003538
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003539 if (crypto_memneq(pk, debug_pk, 64))
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003540 return -EINVAL;
3541
3542 return 0;
3543}
3544
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003545static int __init test_ah(struct crypto_cipher *tfm_aes)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003546{
3547 const u8 irk[16] = {
3548 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3549 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3550 const u8 r[3] = { 0x94, 0x81, 0x70 };
3551 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3552 u8 res[3];
3553 int err;
3554
3555 err = smp_ah(tfm_aes, irk, r, res);
3556 if (err)
3557 return err;
3558
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003559 if (crypto_memneq(res, exp, 3))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003560 return -EINVAL;
3561
3562 return 0;
3563}
3564
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003565static int __init test_c1(struct crypto_cipher *tfm_aes)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003566{
3567 const u8 k[16] = {
3568 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3569 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3570 const u8 r[16] = {
3571 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3572 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3573 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3574 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3575 const u8 _iat = 0x01;
3576 const u8 _rat = 0x00;
3577 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3578 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3579 const u8 exp[16] = {
3580 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3581 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3582 u8 res[16];
3583 int err;
3584
3585 err = smp_c1(tfm_aes, k, r, preq, pres, _iat, &ia, _rat, &ra, res);
3586 if (err)
3587 return err;
3588
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003589 if (crypto_memneq(res, exp, 16))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003590 return -EINVAL;
3591
3592 return 0;
3593}
3594
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003595static int __init test_s1(struct crypto_cipher *tfm_aes)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003596{
3597 const u8 k[16] = {
3598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3599 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3600 const u8 r1[16] = {
3601 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3602 const u8 r2[16] = {
3603 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3604 const u8 exp[16] = {
3605 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3606 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3607 u8 res[16];
3608 int err;
3609
3610 err = smp_s1(tfm_aes, k, r1, r2, res);
3611 if (err)
3612 return err;
3613
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003614 if (crypto_memneq(res, exp, 16))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003615 return -EINVAL;
3616
3617 return 0;
3618}
3619
Herbert Xu71af2f62016-01-24 21:18:30 +08003620static int __init test_f4(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003621{
3622 const u8 u[32] = {
3623 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3624 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3625 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3626 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3627 const u8 v[32] = {
3628 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3629 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3630 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3631 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3632 const u8 x[16] = {
3633 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3634 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3635 const u8 z = 0x00;
3636 const u8 exp[16] = {
3637 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3638 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3639 u8 res[16];
3640 int err;
3641
3642 err = smp_f4(tfm_cmac, u, v, x, z, res);
3643 if (err)
3644 return err;
3645
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003646 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003647 return -EINVAL;
3648
3649 return 0;
3650}
3651
Herbert Xu71af2f62016-01-24 21:18:30 +08003652static int __init test_f5(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003653{
3654 const u8 w[32] = {
3655 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3656 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3657 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3658 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3659 const u8 n1[16] = {
3660 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3661 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3662 const u8 n2[16] = {
3663 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3664 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3665 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3666 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3667 const u8 exp_ltk[16] = {
3668 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3669 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3670 const u8 exp_mackey[16] = {
3671 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3672 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3673 u8 mackey[16], ltk[16];
3674 int err;
3675
3676 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3677 if (err)
3678 return err;
3679
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003680 if (crypto_memneq(mackey, exp_mackey, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003681 return -EINVAL;
3682
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003683 if (crypto_memneq(ltk, exp_ltk, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003684 return -EINVAL;
3685
3686 return 0;
3687}
3688
Herbert Xu71af2f62016-01-24 21:18:30 +08003689static int __init test_f6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003690{
3691 const u8 w[16] = {
3692 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3693 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3694 const u8 n1[16] = {
3695 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3696 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3697 const u8 n2[16] = {
3698 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3699 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3700 const u8 r[16] = {
3701 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3702 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3703 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3704 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3705 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3706 const u8 exp[16] = {
3707 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3708 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3709 u8 res[16];
3710 int err;
3711
3712 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3713 if (err)
3714 return err;
3715
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003716 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003717 return -EINVAL;
3718
3719 return 0;
3720}
3721
Herbert Xu71af2f62016-01-24 21:18:30 +08003722static int __init test_g2(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003723{
3724 const u8 u[32] = {
3725 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3726 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3727 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3728 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3729 const u8 v[32] = {
3730 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3731 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3732 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3733 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3734 const u8 x[16] = {
3735 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3736 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3737 const u8 y[16] = {
3738 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3739 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3740 const u32 exp_val = 0x2f9ed5ba % 1000000;
3741 u32 val;
3742 int err;
3743
3744 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3745 if (err)
3746 return err;
3747
3748 if (val != exp_val)
3749 return -EINVAL;
3750
3751 return 0;
3752}
3753
Herbert Xu71af2f62016-01-24 21:18:30 +08003754static int __init test_h6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003755{
3756 const u8 w[16] = {
3757 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3758 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3759 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3760 const u8 exp[16] = {
3761 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3762 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3763 u8 res[16];
3764 int err;
3765
3766 err = smp_h6(tfm_cmac, w, key_id, res);
3767 if (err)
3768 return err;
3769
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003770 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003771 return -EINVAL;
3772
3773 return 0;
3774}
3775
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003776static char test_smp_buffer[32];
3777
3778static ssize_t test_smp_read(struct file *file, char __user *user_buf,
3779 size_t count, loff_t *ppos)
3780{
3781 return simple_read_from_buffer(user_buf, count, ppos, test_smp_buffer,
3782 strlen(test_smp_buffer));
3783}
3784
3785static const struct file_operations test_smp_fops = {
3786 .open = simple_open,
3787 .read = test_smp_read,
3788 .llseek = default_llseek,
3789};
3790
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003791static int __init run_selftests(struct crypto_cipher *tfm_aes,
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003792 struct crypto_shash *tfm_cmac,
3793 struct crypto_kpp *tfm_ecdh)
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003794{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003795 ktime_t calltime, delta, rettime;
3796 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003797 int err;
3798
Marcel Holtmann255047b2014-12-30 00:11:20 -08003799 calltime = ktime_get();
3800
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003801 err = test_debug_key(tfm_ecdh);
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003802 if (err) {
3803 BT_ERR("debug_key test failed");
3804 goto done;
3805 }
3806
Johan Hedbergcfc41982014-12-30 09:50:40 +02003807 err = test_ah(tfm_aes);
3808 if (err) {
3809 BT_ERR("smp_ah test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003810 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003811 }
3812
3813 err = test_c1(tfm_aes);
3814 if (err) {
3815 BT_ERR("smp_c1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003816 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003817 }
3818
3819 err = test_s1(tfm_aes);
3820 if (err) {
3821 BT_ERR("smp_s1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003822 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003823 }
3824
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003825 err = test_f4(tfm_cmac);
3826 if (err) {
3827 BT_ERR("smp_f4 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003828 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003829 }
3830
3831 err = test_f5(tfm_cmac);
3832 if (err) {
3833 BT_ERR("smp_f5 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003834 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003835 }
3836
3837 err = test_f6(tfm_cmac);
3838 if (err) {
3839 BT_ERR("smp_f6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003840 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003841 }
3842
3843 err = test_g2(tfm_cmac);
3844 if (err) {
3845 BT_ERR("smp_g2 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003846 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003847 }
3848
3849 err = test_h6(tfm_cmac);
3850 if (err) {
3851 BT_ERR("smp_h6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003852 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003853 }
3854
Marcel Holtmann255047b2014-12-30 00:11:20 -08003855 rettime = ktime_get();
3856 delta = ktime_sub(rettime, calltime);
3857 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3858
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003859 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003860
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003861done:
3862 if (!err)
3863 snprintf(test_smp_buffer, sizeof(test_smp_buffer),
3864 "PASS (%llu usecs)\n", duration);
3865 else
3866 snprintf(test_smp_buffer, sizeof(test_smp_buffer), "FAIL\n");
3867
3868 debugfs_create_file("selftest_smp", 0444, bt_debugfs, NULL,
3869 &test_smp_fops);
3870
3871 return err;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003872}
3873
3874int __init bt_selftest_smp(void)
3875{
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003876 struct crypto_cipher *tfm_aes;
Herbert Xu71af2f62016-01-24 21:18:30 +08003877 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003878 struct crypto_kpp *tfm_ecdh;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003879 int err;
3880
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003881 tfm_aes = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003882 if (IS_ERR(tfm_aes)) {
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003883 BT_ERR("Unable to create AES crypto context");
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003884 return PTR_ERR(tfm_aes);
3885 }
3886
Herbert Xu71af2f62016-01-24 21:18:30 +08003887 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003888 if (IS_ERR(tfm_cmac)) {
3889 BT_ERR("Unable to create CMAC crypto context");
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003890 crypto_free_cipher(tfm_aes);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003891 return PTR_ERR(tfm_cmac);
3892 }
3893
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003894 tfm_ecdh = crypto_alloc_kpp("ecdh", CRYPTO_ALG_INTERNAL, 0);
3895 if (IS_ERR(tfm_ecdh)) {
3896 BT_ERR("Unable to create ECDH crypto context");
3897 crypto_free_shash(tfm_cmac);
3898 crypto_free_cipher(tfm_aes);
3899 return PTR_ERR(tfm_ecdh);
3900 }
3901
3902 err = run_selftests(tfm_aes, tfm_cmac, tfm_ecdh);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003903
Herbert Xu71af2f62016-01-24 21:18:30 +08003904 crypto_free_shash(tfm_cmac);
Andy Lutomirskia4770e12016-06-26 14:55:23 -07003905 crypto_free_cipher(tfm_aes);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003906 crypto_free_kpp(tfm_ecdh);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003907
3908 return err;
3909}
3910
3911#endif