blob: 11f853d0500ff8c8c79a309a585d00e732b0e287 [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>
Ard Biesheuvel28a220a2019-07-02 21:41:41 +020026#include <crypto/aes.h>
Jason A. Donenfeld329d8232017-06-10 04:59:11 +020027#include <crypto/algapi.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
Zheng Yongjun91641b72021-06-02 14:54:58 +080043 * accidentally in dmesg, i.e. the values of the various crypto keys
Johan Hedbergc7a3d572014-12-01 22:03:16 +020044 * 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 */
Meng Yuc29fb5f2021-03-23 14:22:56 +080057#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY)
Johan Hedberg3b191462014-06-06 10:50:15 +030058
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 */
Johan Hedberg94f14e42018-09-11 14:10:12 +030086 bool local_oob;
Marcel Holtmann60a27d62015-03-16 01:10:22 -070087 u8 local_pk[64];
Marcel Holtmannfb334fe2015-03-16 12:34:57 -070088 u8 local_rand[16];
Marcel Holtmann60a27d62015-03-16 01:10:22 -070089 bool debug_key;
90
Herbert Xu71af2f62016-01-24 21:18:30 +080091 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +030092 struct crypto_kpp *tfm_ecdh;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070093};
94
Johan Hedberg4bc58f52014-05-20 09:45:47 +030095struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030096 struct l2cap_conn *conn;
97 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030098 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030099
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300100 u8 preq[7]; /* SMP Pairing Request */
101 u8 prsp[7]; /* SMP Pairing Response */
102 u8 prnd[16]; /* SMP Pairing Random (local) */
103 u8 rrnd[16]; /* SMP Pairing Random (remote) */
104 u8 pcnf[16]; /* SMP Pairing Confirm */
105 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberg882fafa2015-03-16 11:45:43 +0200106 u8 rr[16]; /* Remote OOB ra/rb value */
107 u8 lr[16]; /* Local OOB ra/rb value */
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300108 u8 enc_key_size;
109 u8 remote_key_dist;
110 bdaddr_t id_addr;
111 u8 id_addr_type;
112 u8 irk[16];
113 struct smp_csrk *csrk;
Archie Pusakafad646e2021-05-31 16:37:25 +0800114 struct smp_csrk *responder_csrk;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300115 struct smp_ltk *ltk;
Archie Pusakafad646e2021-05-31 16:37:25 +0800116 struct smp_ltk *responder_ltk;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300117 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300118 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300119 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300120 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300121 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300122
Johan Hedberg3b191462014-06-06 10:50:15 +0300123 /* Secure Connections variables */
124 u8 local_pk[64];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300125 u8 remote_pk[64];
126 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300127 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300128
Herbert Xu71af2f62016-01-24 21:18:30 +0800129 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +0300130 struct crypto_kpp *tfm_ecdh;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300131};
132
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300133/* These debug key values are defined in the SMP section of the core
134 * specification. debug_pk is the public debug key and debug_sk the
135 * private debug key.
136 */
137static const u8 debug_pk[64] = {
138 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
139 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
140 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
141 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
142
143 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
144 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
145 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
146 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
147};
148
149static const u8 debug_sk[32] = {
150 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
151 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
152 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
153 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
154};
155
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300156static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300157{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300158 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300159
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300160 for (i = 0; i < len; i++)
161 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300162}
163
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200164/* The following functions map to the LE SC SMP crypto functions
165 * AES-CMAC, f4, f5, f6, g2 and h6.
166 */
167
Herbert Xu71af2f62016-01-24 21:18:30 +0800168static int aes_cmac(struct crypto_shash *tfm, const u8 k[16], const u8 *m,
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300169 size_t len, u8 mac[16])
170{
171 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300172 int err;
173
174 if (len > CMAC_MSG_MAX)
175 return -EFBIG;
176
177 if (!tfm) {
178 BT_ERR("tfm %p", tfm);
179 return -EINVAL;
180 }
181
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300182 /* Swap key and message from LSB to MSB */
183 swap_buf(k, tmp, 16);
184 swap_buf(m, msg_msb, len);
185
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200186 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
187 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300188
Herbert Xu71af2f62016-01-24 21:18:30 +0800189 err = crypto_shash_setkey(tfm, tmp, 16);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300190 if (err) {
191 BT_ERR("cipher setkey failed: %d", err);
192 return err;
193 }
194
Eric Biggersec0bf6e2020-05-01 22:31:19 -0700195 err = crypto_shash_tfm_digest(tfm, msg_msb, len, mac_msb);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300196 if (err) {
Herbert Xu71af2f62016-01-24 21:18:30 +0800197 BT_ERR("Hash computation error %d", err);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300198 return err;
199 }
200
201 swap_buf(mac_msb, mac, 16);
202
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200203 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300204
205 return 0;
206}
207
Herbert Xu71af2f62016-01-24 21:18:30 +0800208static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
209 const u8 v[32], const u8 x[16], u8 z, u8 res[16])
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300210{
211 u8 m[65];
212 int err;
213
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200214 SMP_DBG("u %32phN", u);
215 SMP_DBG("v %32phN", v);
216 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300217
218 m[0] = z;
219 memcpy(m + 1, v, 32);
220 memcpy(m + 33, u, 32);
221
222 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
223 if (err)
224 return err;
225
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200226 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300227
228 return err;
229}
230
Herbert Xu71af2f62016-01-24 21:18:30 +0800231static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200232 const u8 n1[16], const u8 n2[16], const u8 a1[7],
233 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300234{
235 /* The btle, salt and length "magic" values are as defined in
236 * the SMP section of the Bluetooth core specification. In ASCII
237 * the btle value ends up being 'btle'. The salt is just a
238 * random number whereas length is the value 256 in little
239 * endian format.
240 */
241 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
242 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
243 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
244 const u8 length[2] = { 0x00, 0x01 };
245 u8 m[53], t[16];
246 int err;
247
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200248 SMP_DBG("w %32phN", w);
249 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
250 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300251
252 err = aes_cmac(tfm_cmac, salt, w, 32, t);
253 if (err)
254 return err;
255
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200256 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300257
258 memcpy(m, length, 2);
259 memcpy(m + 2, a2, 7);
260 memcpy(m + 9, a1, 7);
261 memcpy(m + 16, n2, 16);
262 memcpy(m + 32, n1, 16);
263 memcpy(m + 48, btle, 4);
264
265 m[52] = 0; /* Counter */
266
267 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
268 if (err)
269 return err;
270
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200271 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300272
273 m[52] = 1; /* Counter */
274
275 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
276 if (err)
277 return err;
278
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200279 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300280
281 return 0;
282}
283
Herbert Xu71af2f62016-01-24 21:18:30 +0800284static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200285 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300286 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
287 u8 res[16])
288{
289 u8 m[65];
290 int err;
291
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200292 SMP_DBG("w %16phN", w);
293 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
294 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300295
296 memcpy(m, a2, 7);
297 memcpy(m + 7, a1, 7);
298 memcpy(m + 14, io_cap, 3);
299 memcpy(m + 17, r, 16);
300 memcpy(m + 33, n2, 16);
301 memcpy(m + 49, n1, 16);
302
303 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
304 if (err)
305 return err;
306
Marcel Holtmann203de212014-12-31 20:01:22 -0800307 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300308
309 return err;
310}
311
Herbert Xu71af2f62016-01-24 21:18:30 +0800312static int smp_g2(struct crypto_shash *tfm_cmac, const u8 u[32], const u8 v[32],
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300313 const u8 x[16], const u8 y[16], u32 *val)
314{
315 u8 m[80], tmp[16];
316 int err;
317
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200318 SMP_DBG("u %32phN", u);
319 SMP_DBG("v %32phN", v);
320 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300321
322 memcpy(m, y, 16);
323 memcpy(m + 16, v, 32);
324 memcpy(m + 48, u, 32);
325
326 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
327 if (err)
328 return err;
329
330 *val = get_unaligned_le32(tmp);
331 *val %= 1000000;
332
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200333 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300334
335 return 0;
336}
337
Herbert Xu71af2f62016-01-24 21:18:30 +0800338static int smp_h6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200339 const u8 key_id[4], u8 res[16])
340{
341 int err;
342
343 SMP_DBG("w %16phN key_id %4phN", w, key_id);
344
345 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
346 if (err)
347 return err;
348
349 SMP_DBG("res %16phN", res);
350
351 return err;
352}
353
Johan Hedberga62da6f2016-12-08 08:32:54 +0200354static int smp_h7(struct crypto_shash *tfm_cmac, const u8 w[16],
355 const u8 salt[16], u8 res[16])
356{
357 int err;
358
359 SMP_DBG("w %16phN salt %16phN", w, salt);
360
361 err = aes_cmac(tfm_cmac, salt, w, 16, res);
362 if (err)
363 return err;
364
365 SMP_DBG("res %16phN", res);
366
367 return err;
368}
369
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200370/* The following functions map to the legacy SMP crypto functions e, c1,
371 * s1 and ah.
372 */
373
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200374static int smp_e(const u8 *k, u8 *r)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300375{
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200376 struct crypto_aes_ctx ctx;
Johan Hedberg943a7322014-03-18 12:58:24 +0200377 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200378 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300379
Johan Hedberg011c3912015-05-19 21:06:04 +0300380 SMP_DBG("k %16phN r %16phN", k, r);
381
Johan Hedberg943a7322014-03-18 12:58:24 +0200382 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300383 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200384
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200385 err = aes_expandkey(&ctx, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300386 if (err) {
387 BT_ERR("cipher setkey failed: %d", err);
388 return err;
389 }
390
Johan Hedberg943a7322014-03-18 12:58:24 +0200391 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300392 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200393
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200394 aes_encrypt(&ctx, data, data);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300395
Johan Hedberg943a7322014-03-18 12:58:24 +0200396 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300397 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200398
Johan Hedberg011c3912015-05-19 21:06:04 +0300399 SMP_DBG("r %16phN", r);
400
Meng Yuc29fb5f2021-03-23 14:22:56 +0800401 memzero_explicit(&ctx, sizeof(ctx));
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300402 return err;
403}
404
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200405static int smp_c1(const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200406 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
407 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
408{
409 u8 p1[16], p2[16];
410 int err;
411
Johan Hedberg011c3912015-05-19 21:06:04 +0300412 SMP_DBG("k %16phN r %16phN", k, r);
413 SMP_DBG("iat %u ia %6phN rat %u ra %6phN", _iat, ia, _rat, ra);
414 SMP_DBG("preq %7phN pres %7phN", preq, pres);
415
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200416 memset(p1, 0, 16);
417
418 /* p1 = pres || preq || _rat || _iat */
419 p1[0] = _iat;
420 p1[1] = _rat;
421 memcpy(p1 + 2, preq, 7);
422 memcpy(p1 + 9, pres, 7);
423
Johan Hedberg011c3912015-05-19 21:06:04 +0300424 SMP_DBG("p1 %16phN", p1);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200425
426 /* res = r XOR p1 */
Ard Biesheuvelef0bb5a2021-01-05 17:10:53 +0100427 crypto_xor_cpy(res, r, p1, sizeof(p1));
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200428
429 /* res = e(k, res) */
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200430 err = smp_e(k, res);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200431 if (err) {
432 BT_ERR("Encrypt data error");
433 return err;
434 }
435
Johan Hedberg011c3912015-05-19 21:06:04 +0300436 /* p2 = padding || ia || ra */
437 memcpy(p2, ra, 6);
438 memcpy(p2 + 6, ia, 6);
439 memset(p2 + 12, 0, 4);
440
441 SMP_DBG("p2 %16phN", p2);
442
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200443 /* res = res XOR p2 */
Ard Biesheuvelef0bb5a2021-01-05 17:10:53 +0100444 crypto_xor(res, p2, sizeof(p2));
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200445
446 /* res = e(k, res) */
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200447 err = smp_e(k, res);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200448 if (err)
449 BT_ERR("Encrypt data error");
450
451 return err;
452}
453
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200454static int smp_s1(const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200455 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300456{
457 int err;
458
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200459 /* Just least significant octets from r1 and r2 are considered */
460 memcpy(_r, r2, 8);
461 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300462
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200463 err = smp_e(k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300464 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200465 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300466
467 return err;
468}
469
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200470static int smp_ah(const u8 irk[16], const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200471{
Johan Hedberg943a7322014-03-18 12:58:24 +0200472 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200473 int err;
474
475 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200476 memcpy(_res, r, 3);
477 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200478
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200479 err = smp_e(irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200480 if (err) {
481 BT_ERR("Encrypt error");
482 return err;
483 }
484
485 /* The output of the random address function ah is:
Marcel Holtmannc5080d42015-09-04 17:08:18 +0200486 * ah(k, r) = e(k, r') mod 2^24
Johan Hedberg60478052014-02-18 10:19:31 +0200487 * The output of the security function e is then truncated to 24 bits
488 * by taking the least significant 24 bits of the output of e as the
489 * result of ah.
490 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200491 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200492
493 return 0;
494}
495
Johan Hedbergcd082792014-12-02 13:37:41 +0200496bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
497 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200498{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300499 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedberg60478052014-02-18 10:19:31 +0200500 u8 hash[3];
501 int err;
502
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300503 if (!chan || !chan->data)
504 return false;
505
Marcel Holtmann56860242020-05-06 09:57:50 +0200506 bt_dev_dbg(hdev, "RPA %pMR IRK %*phN", bdaddr, 16, irk);
Johan Hedberg60478052014-02-18 10:19:31 +0200507
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200508 err = smp_ah(irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200509 if (err)
510 return false;
511
Jason A. Donenfeld329d8232017-06-10 04:59:11 +0200512 return !crypto_memneq(bdaddr->b, hash, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200513}
514
Johan Hedbergcd082792014-12-02 13:37:41 +0200515int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200516{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300517 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200518 int err;
519
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300520 if (!chan || !chan->data)
521 return -EOPNOTSUPP;
522
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200523 get_random_bytes(&rpa->b[3], 3);
524
525 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
526 rpa->b[5] |= 0x40; /* Set second most significant bit */
527
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200528 err = smp_ah(irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200529 if (err < 0)
530 return err;
531
Marcel Holtmann56860242020-05-06 09:57:50 +0200532 bt_dev_dbg(hdev, "RPA %pMR", rpa);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200533
534 return 0;
535}
536
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700537int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
538{
539 struct l2cap_chan *chan = hdev->smp_data;
540 struct smp_dev *smp;
541 int err;
542
543 if (!chan || !chan->data)
544 return -EOPNOTSUPP;
545
546 smp = chan->data;
547
548 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Marcel Holtmann56860242020-05-06 09:57:50 +0200549 bt_dev_dbg(hdev, "Using debug keys");
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300550 err = set_ecdh_privkey(smp->tfm_ecdh, debug_sk);
551 if (err)
552 return err;
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700553 memcpy(smp->local_pk, debug_pk, 64);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700554 smp->debug_key = true;
555 } else {
556 while (true) {
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300557 /* Generate key pair for Secure Connections */
558 err = generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk);
Tudor Ambarusa2976412017-09-28 17:14:52 +0300559 if (err)
560 return err;
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700561
562 /* This is unlikely, but we need to check that
Zheng Yongjun91641b72021-06-02 14:54:58 +0800563 * we didn't accidentally generate a debug key.
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700564 */
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300565 if (crypto_memneq(smp->local_pk, debug_pk, 64))
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700566 break;
567 }
568 smp->debug_key = false;
569 }
570
571 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
572 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700573
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700574 get_random_bytes(smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700575
576 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700577 smp->local_rand, 0, hash);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700578 if (err < 0)
579 return err;
580
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700581 memcpy(rand, smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700582
Johan Hedberg94f14e42018-09-11 14:10:12 +0300583 smp->local_oob = true;
584
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700585 return 0;
586}
587
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300588static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
589{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300590 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300591 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300592 struct kvec iv[2];
593 struct msghdr msg;
594
595 if (!chan)
596 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300597
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -0700598 bt_dev_dbg(conn->hcon->hdev, "code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300599
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300600 iv[0].iov_base = &code;
601 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300602
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300603 iv[1].iov_base = data;
604 iv[1].iov_len = len;
605
606 memset(&msg, 0, sizeof(msg));
607
David Howellsaa563d72018-10-20 00:57:56 +0100608 iov_iter_kvec(&msg.msg_iter, WRITE, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300609
610 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300611
Johan Hedbergb68fda62014-08-11 22:06:40 +0300612 if (!chan->data)
613 return;
614
615 smp = chan->data;
616
617 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300618 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300619}
620
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300621static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800622{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300623 if (authreq & SMP_AUTH_MITM) {
624 if (authreq & SMP_AUTH_SC)
625 return BT_SECURITY_FIPS;
626 else
627 return BT_SECURITY_HIGH;
628 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800629 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300630 }
Brian Gix2b64d152011-12-21 16:12:12 -0800631}
632
633static __u8 seclevel_to_authreq(__u8 sec_level)
634{
635 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300636 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800637 case BT_SECURITY_HIGH:
638 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
639 case BT_SECURITY_MEDIUM:
640 return SMP_AUTH_BONDING;
641 default:
642 return SMP_AUTH_NONE;
643 }
644}
645
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300646static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700647 struct smp_cmd_pairing *req,
648 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300649{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300650 struct l2cap_chan *chan = conn->smp;
651 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200652 struct hci_conn *hcon = conn->hcon;
653 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100654 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300655
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700656 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700657 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
658 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300659 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800660 } else {
661 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300662 }
663
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700664 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200665 remote_dist |= SMP_DIST_ID_KEY;
666
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700667 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200668 local_dist |= SMP_DIST_ID_KEY;
669
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700670 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100671 (authreq & SMP_AUTH_SC)) {
672 struct oob_data *oob_data;
673 u8 bdaddr_type;
674
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700675 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300676 local_dist |= SMP_DIST_LINK_KEY;
677 remote_dist |= SMP_DIST_LINK_KEY;
678 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100679
680 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
681 bdaddr_type = BDADDR_LE_PUBLIC;
682 else
683 bdaddr_type = BDADDR_LE_RANDOM;
684
685 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
686 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800687 if (oob_data && oob_data->present) {
Johan Hedberg1a8bab42015-03-16 11:45:44 +0200688 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100689 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100690 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100691 memcpy(smp->pcnf, oob_data->hash256, 16);
Marcel Holtmannbc07cd62015-03-16 12:34:56 -0700692 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf);
693 SMP_DBG("OOB Remote Random: %16phN", smp->rr);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100694 }
695
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300696 } else {
697 authreq &= ~SMP_AUTH_SC;
698 }
699
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300700 if (rsp == NULL) {
701 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100702 req->oob_flag = oob_flag;
Matias Karhumaa30d65e02018-09-28 21:54:30 +0300703 req->max_key_size = hdev->le_max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200704 req->init_key_dist = local_dist;
705 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300706 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200707
708 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300709 return;
710 }
711
712 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100713 rsp->oob_flag = oob_flag;
Matias Karhumaa30d65e02018-09-28 21:54:30 +0300714 rsp->max_key_size = hdev->le_max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200715 rsp->init_key_dist = req->init_key_dist & remote_dist;
716 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300717 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200718
719 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300720}
721
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300722static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
723{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300724 struct l2cap_chan *chan = conn->smp;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300725 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300726 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300727
Łukasz Rymanowski49c06c92020-05-13 10:18:53 +0200728 if (conn->hcon->pending_sec_level == BT_SECURITY_FIPS &&
729 max_key_size != SMP_MAX_ENC_KEY_SIZE)
730 return SMP_ENC_KEY_SIZE;
731
Matias Karhumaa30d65e02018-09-28 21:54:30 +0300732 if (max_key_size > hdev->le_max_key_size ||
Johan Hedberg2fd36552015-06-11 13:52:26 +0300733 max_key_size < SMP_MIN_ENC_KEY_SIZE)
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300734 return SMP_ENC_KEY_SIZE;
735
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300736 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300737
738 return 0;
739}
740
Johan Hedberg6f48e262014-08-11 22:06:44 +0300741static void smp_chan_destroy(struct l2cap_conn *conn)
742{
743 struct l2cap_chan *chan = conn->smp;
744 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200745 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300746 bool complete;
747
748 BUG_ON(!smp);
749
750 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300751
Johan Hedberg6f48e262014-08-11 22:06:44 +0300752 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200753 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300754
Waiman Long453431a2020-08-06 23:18:13 -0700755 kfree_sensitive(smp->csrk);
Archie Pusakafad646e2021-05-31 16:37:25 +0800756 kfree_sensitive(smp->responder_csrk);
Waiman Long453431a2020-08-06 23:18:13 -0700757 kfree_sensitive(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300758
Herbert Xu71af2f62016-01-24 21:18:30 +0800759 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +0300760 crypto_free_kpp(smp->tfm_ecdh);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300761
Johan Hedberg923e2412014-12-03 12:43:39 +0200762 /* Ensure that we don't leave any debug key around if debug key
763 * support hasn't been explicitly enabled.
764 */
765 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700766 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200767 list_del_rcu(&smp->ltk->list);
768 kfree_rcu(smp->ltk, rcu);
769 smp->ltk = NULL;
770 }
771
Johan Hedberg6f48e262014-08-11 22:06:44 +0300772 /* If pairing failed clean up any keys we might have */
773 if (!complete) {
774 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200775 list_del_rcu(&smp->ltk->list);
776 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300777 }
778
Archie Pusakafad646e2021-05-31 16:37:25 +0800779 if (smp->responder_ltk) {
780 list_del_rcu(&smp->responder_ltk->list);
781 kfree_rcu(smp->responder_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300782 }
783
784 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200785 list_del_rcu(&smp->remote_irk->list);
786 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300787 }
788 }
789
790 chan->data = NULL;
Waiman Long453431a2020-08-06 23:18:13 -0700791 kfree_sensitive(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200792 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300793}
794
Johan Hedberg84794e12013-11-06 11:24:57 +0200795static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800796{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200797 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300798 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200799
Johan Hedberg84794e12013-11-06 11:24:57 +0200800 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800801 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700802 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800803
Johan Hedberge1e930f2014-09-08 17:09:49 -0700804 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300805
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300806 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300807 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800808}
809
Brian Gix2b64d152011-12-21 16:12:12 -0800810#define JUST_WORKS 0x00
811#define JUST_CFM 0x01
812#define REQ_PASSKEY 0x02
813#define CFM_PASSKEY 0x03
814#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300815#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800816#define OVERLAP 0xFF
817
818static const u8 gen_method[5][5] = {
819 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
820 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
821 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
822 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
823 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
824};
825
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300826static const u8 sc_method[5][5] = {
827 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
828 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
829 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
830 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
831 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
832};
833
Johan Hedberg581370c2014-06-17 13:07:38 +0300834static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
835{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300836 /* If either side has unknown io_caps, use JUST_CFM (which gets
837 * converted later to JUST_WORKS if we're initiators.
838 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300839 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
840 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300841 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300842
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300843 if (test_bit(SMP_FLAG_SC, &smp->flags))
844 return sc_method[remote_io][local_io];
845
Johan Hedberg581370c2014-06-17 13:07:38 +0300846 return gen_method[remote_io][local_io];
847}
848
Brian Gix2b64d152011-12-21 16:12:12 -0800849static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
850 u8 local_io, u8 remote_io)
851{
852 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300853 struct l2cap_chan *chan = conn->smp;
854 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800855 u32 passkey = 0;
Guenter Roeckd1d900f2020-04-06 11:54:38 -0700856 int ret;
Brian Gix2b64d152011-12-21 16:12:12 -0800857
858 /* Initialize key for JUST WORKS */
859 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300860 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800861
Kai Ye83b4b192021-06-03 15:41:05 +0800862 bt_dev_dbg(hcon->hdev, "auth:%u lcl:%u rem:%u", auth, local_io,
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -0700863 remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800864
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300865 /* If neither side wants MITM, either "just" confirm an incoming
866 * request or use just-works for outgoing ones. The JUST_CFM
867 * will be converted to JUST_WORKS if necessary later in this
868 * function. If either side has MITM look up the method from the
869 * table.
870 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300871 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300872 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800873 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300874 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800875
Johan Hedberga82505c2014-03-24 14:39:07 +0200876 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300877 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
878 &smp->flags))
879 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200880
Johan Hedberg02f3e252014-07-16 15:09:13 +0300881 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300882 if (smp->method == JUST_CFM &&
883 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
884 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300885
Sonny Sasaka92516cd2020-03-27 17:34:23 -0700886 /* If Just Works, Continue with Zero TK and ask user-space for
887 * confirmation */
Johan Hedberg783e0572014-05-31 18:48:26 +0300888 if (smp->method == JUST_WORKS) {
Guenter Roeckd1d900f2020-04-06 11:54:38 -0700889 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
Sonny Sasaka92516cd2020-03-27 17:34:23 -0700890 hcon->type,
891 hcon->dst_type,
892 passkey, 1);
Guenter Roeckd1d900f2020-04-06 11:54:38 -0700893 if (ret)
894 return ret;
Sonny Sasaka92516cd2020-03-27 17:34:23 -0700895 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800896 return 0;
897 }
898
Johan Hedberg19c5ce92015-03-15 19:34:04 +0200899 /* If this function is used for SC -> legacy fallback we
900 * can only recover the just-works case.
901 */
902 if (test_bit(SMP_FLAG_SC, &smp->flags))
903 return -EINVAL;
904
Brian Gix2b64d152011-12-21 16:12:12 -0800905 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300906 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300907 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300908 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
909 hcon->pending_sec_level = BT_SECURITY_HIGH;
910 }
Brian Gix2b64d152011-12-21 16:12:12 -0800911
Archie Pusaka74be5232021-06-04 16:26:25 +0800912 /* If both devices have Keyboard-Display I/O, the initiator
913 * Confirms and the responder Enters the passkey.
Brian Gix2b64d152011-12-21 16:12:12 -0800914 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300915 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300916 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300917 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800918 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300919 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800920 }
921
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200922 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300923 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200924 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800925 get_random_bytes(&passkey, sizeof(passkey));
926 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200927 put_unaligned_le32(passkey, smp->tk);
Kai Ye83b4b192021-06-03 15:41:05 +0800928 bt_dev_dbg(hcon->hdev, "PassKey: %u", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300929 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800930 }
931
Johan Hedberg783e0572014-05-31 18:48:26 +0300932 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700933 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200934 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300935 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200936 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
937 hcon->type, hcon->dst_type,
938 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800939 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200940 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200941 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200942 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800943
Brian Gix2b64d152011-12-21 16:12:12 -0800944 return ret;
945}
946
Johan Hedberg1cc61142014-05-20 09:45:52 +0300947static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300948{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300949 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300950 struct smp_cmd_pairing_confirm cp;
951 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300952
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -0700953 bt_dev_dbg(conn->hcon->hdev, "conn %p", conn);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300954
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200955 ret = smp_c1(smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200956 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200957 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
958 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300959 if (ret)
960 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300961
Johan Hedberg4a74d652014-05-20 09:45:50 +0300962 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800963
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300964 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
965
Johan Hedbergb28b4942014-09-05 22:19:55 +0300966 if (conn->hcon->out)
967 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
968 else
969 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
970
Johan Hedberg1cc61142014-05-20 09:45:52 +0300971 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300972}
973
Johan Hedberg861580a2014-05-20 09:45:51 +0300974static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300975{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300976 struct l2cap_conn *conn = smp->conn;
977 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300978 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300979 int ret;
980
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -0700981 bt_dev_dbg(conn->hcon->hdev, "conn %p %s", conn,
Archie Pusakafad646e2021-05-31 16:37:25 +0800982 conn->hcon->out ? "initiator" : "responder");
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300983
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200984 ret = smp_c1(smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200985 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200986 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300987 if (ret)
988 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300989
Jason A. Donenfeld329d8232017-06-10 04:59:11 +0200990 if (crypto_memneq(smp->pcnf, confirm, sizeof(smp->pcnf))) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100991 bt_dev_err(hcon->hdev, "pairing failed "
992 "(confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300993 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300994 }
995
996 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800997 u8 stk[16];
998 __le64 rand = 0;
999 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001000
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02001001 smp_s1(smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001002
Johan Hedberg861580a2014-05-20 09:45:51 +03001003 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
1004 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001005
Johan Hedberg8b76ce32015-06-08 18:14:39 +03001006 hci_le_start_enc(hcon, ediv, rand, stk, smp->enc_key_size);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -03001007 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +03001008 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001009 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +03001010 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001011 __le64 rand = 0;
1012 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001013
Johan Hedberg943a7322014-03-18 12:58:24 +02001014 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1015 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001016
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02001017 smp_s1(smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001018
Johan Hedbergfff34902014-06-10 15:19:50 +03001019 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1020 auth = 1;
1021 else
1022 auth = 0;
1023
Archie Pusakafad646e2021-05-31 16:37:25 +08001024 /* Even though there's no _RESPONDER suffix this is the
1025 * responder STK we're adding for later lookup (the initiator
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001026 * STK never needs to be stored).
1027 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001028 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001029 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001030 }
1031
Johan Hedberg861580a2014-05-20 09:45:51 +03001032 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001033}
1034
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001035static void smp_notify_keys(struct l2cap_conn *conn)
1036{
1037 struct l2cap_chan *chan = conn->smp;
1038 struct smp_chan *smp = chan->data;
1039 struct hci_conn *hcon = conn->hcon;
1040 struct hci_dev *hdev = hcon->hdev;
1041 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1042 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1043 bool persistent;
1044
Johan Hedbergcad20c22015-10-12 13:36:19 +02001045 if (hcon->type == ACL_LINK) {
1046 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1047 persistent = false;
1048 else
1049 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1050 &hcon->flags);
1051 } else {
1052 /* The LTKs, IRKs and CSRKs should be persistent only if
1053 * both sides had the bonding bit set in their
1054 * authentication requests.
1055 */
1056 persistent = !!((req->auth_req & rsp->auth_req) &
1057 SMP_AUTH_BONDING);
1058 }
1059
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001060 if (smp->remote_irk) {
Johan Hedbergcad20c22015-10-12 13:36:19 +02001061 mgmt_new_irk(hdev, smp->remote_irk, persistent);
1062
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001063 /* Now that user space can be considered to know the
1064 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001065 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001066 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001067 if (hcon->type == LE_LINK) {
1068 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1069 hcon->dst_type = smp->remote_irk->addr_type;
1070 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1071 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001072 }
1073
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001074 if (smp->csrk) {
1075 smp->csrk->bdaddr_type = hcon->dst_type;
1076 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1077 mgmt_new_csrk(hdev, smp->csrk, persistent);
1078 }
1079
Archie Pusakafad646e2021-05-31 16:37:25 +08001080 if (smp->responder_csrk) {
1081 smp->responder_csrk->bdaddr_type = hcon->dst_type;
1082 bacpy(&smp->responder_csrk->bdaddr, &hcon->dst);
1083 mgmt_new_csrk(hdev, smp->responder_csrk, persistent);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001084 }
1085
1086 if (smp->ltk) {
1087 smp->ltk->bdaddr_type = hcon->dst_type;
1088 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1089 mgmt_new_ltk(hdev, smp->ltk, persistent);
1090 }
1091
Archie Pusakafad646e2021-05-31 16:37:25 +08001092 if (smp->responder_ltk) {
1093 smp->responder_ltk->bdaddr_type = hcon->dst_type;
1094 bacpy(&smp->responder_ltk->bdaddr, &hcon->dst);
1095 mgmt_new_ltk(hdev, smp->responder_ltk, persistent);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001096 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001097
1098 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001099 struct link_key *key;
1100 u8 type;
1101
1102 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1103 type = HCI_LK_DEBUG_COMBINATION;
1104 else if (hcon->sec_level == BT_SECURITY_FIPS)
1105 type = HCI_LK_AUTH_COMBINATION_P256;
1106 else
1107 type = HCI_LK_UNAUTH_COMBINATION_P256;
1108
1109 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1110 smp->link_key, type, 0, &persistent);
1111 if (key) {
1112 mgmt_new_link_key(hdev, key, persistent);
1113
1114 /* Don't keep debug keys around if the relevant
1115 * flag is not set.
1116 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001117 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001118 key->type == HCI_LK_DEBUG_COMBINATION) {
1119 list_del_rcu(&key->list);
1120 kfree_rcu(key, rcu);
1121 }
1122 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001123 }
1124}
1125
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001126static void sc_add_ltk(struct smp_chan *smp)
1127{
1128 struct hci_conn *hcon = smp->conn->hcon;
1129 u8 key_type, auth;
1130
1131 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1132 key_type = SMP_LTK_P256_DEBUG;
1133 else
1134 key_type = SMP_LTK_P256;
1135
1136 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1137 auth = 1;
1138 else
1139 auth = 0;
1140
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001141 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1142 key_type, auth, smp->tk, smp->enc_key_size,
1143 0, 0);
1144}
1145
Johan Hedberg6a770832014-06-06 11:54:04 +03001146static void sc_generate_link_key(struct smp_chan *smp)
1147{
Johan Hedberga62da6f2016-12-08 08:32:54 +02001148 /* From core spec. Spells out in ASCII as 'lebr'. */
Johan Hedberg6a770832014-06-06 11:54:04 +03001149 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1150
1151 smp->link_key = kzalloc(16, GFP_KERNEL);
1152 if (!smp->link_key)
1153 return;
1154
Johan Hedberga62da6f2016-12-08 08:32:54 +02001155 if (test_bit(SMP_FLAG_CT2, &smp->flags)) {
Christophe JAILLET151129d2020-01-27 23:36:09 +01001156 /* SALT = 0x000000000000000000000000746D7031 */
Johan Hedberga62da6f2016-12-08 08:32:54 +02001157 const u8 salt[16] = { 0x31, 0x70, 0x6d, 0x74 };
1158
1159 if (smp_h7(smp->tfm_cmac, smp->tk, salt, smp->link_key)) {
Waiman Long453431a2020-08-06 23:18:13 -07001160 kfree_sensitive(smp->link_key);
Johan Hedberga62da6f2016-12-08 08:32:54 +02001161 smp->link_key = NULL;
1162 return;
1163 }
1164 } else {
1165 /* From core spec. Spells out in ASCII as 'tmp1'. */
1166 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1167
1168 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
Waiman Long453431a2020-08-06 23:18:13 -07001169 kfree_sensitive(smp->link_key);
Johan Hedberga62da6f2016-12-08 08:32:54 +02001170 smp->link_key = NULL;
1171 return;
1172 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001173 }
1174
1175 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Waiman Long453431a2020-08-06 23:18:13 -07001176 kfree_sensitive(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001177 smp->link_key = NULL;
1178 return;
1179 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001180}
1181
Johan Hedbergb28b4942014-09-05 22:19:55 +03001182static void smp_allow_key_dist(struct smp_chan *smp)
1183{
1184 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1185 * will be allowed in each PDU handler to ensure we receive
1186 * them in the correct order.
1187 */
1188 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1189 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1190 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1191 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1192 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1193 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1194}
1195
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001196static void sc_generate_ltk(struct smp_chan *smp)
1197{
Johan Hedberga62da6f2016-12-08 08:32:54 +02001198 /* From core spec. Spells out in ASCII as 'brle'. */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001199 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1200 struct hci_conn *hcon = smp->conn->hcon;
1201 struct hci_dev *hdev = hcon->hdev;
1202 struct link_key *key;
1203
1204 key = hci_find_link_key(hdev, &hcon->dst);
1205 if (!key) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001206 bt_dev_err(hdev, "no Link Key found to generate LTK");
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001207 return;
1208 }
1209
1210 if (key->type == HCI_LK_DEBUG_COMBINATION)
1211 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1212
Johan Hedberga62da6f2016-12-08 08:32:54 +02001213 if (test_bit(SMP_FLAG_CT2, &smp->flags)) {
Christophe JAILLET151129d2020-01-27 23:36:09 +01001214 /* SALT = 0x000000000000000000000000746D7032 */
Johan Hedberga62da6f2016-12-08 08:32:54 +02001215 const u8 salt[16] = { 0x32, 0x70, 0x6d, 0x74 };
1216
1217 if (smp_h7(smp->tfm_cmac, key->val, salt, smp->tk))
1218 return;
1219 } else {
1220 /* From core spec. Spells out in ASCII as 'tmp2'. */
1221 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1222
1223 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1224 return;
1225 }
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001226
1227 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1228 return;
1229
1230 sc_add_ltk(smp);
1231}
1232
Johan Hedbergd6268e82014-09-05 22:19:51 +03001233static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001234{
1235 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001236 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001237 struct hci_conn *hcon = conn->hcon;
1238 struct hci_dev *hdev = hcon->hdev;
1239 __u8 *keydist;
1240
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001241 bt_dev_dbg(hdev, "conn %p", conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001242
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001243 rsp = (void *) &smp->prsp[1];
1244
1245 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001246 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1247 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001248 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001249 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001250
1251 req = (void *) &smp->preq[1];
1252
1253 if (hcon->out) {
1254 keydist = &rsp->init_key_dist;
1255 *keydist &= req->init_key_dist;
1256 } else {
1257 keydist = &rsp->resp_key_dist;
1258 *keydist &= req->resp_key_dist;
1259 }
1260
Johan Hedberg6a770832014-06-06 11:54:04 +03001261 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001262 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001263 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001264 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1265 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001266
1267 /* Clear the keys which are generated but not distributed */
1268 *keydist &= ~SMP_SC_NO_DIST;
1269 }
1270
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001271 bt_dev_dbg(hdev, "keydist 0x%x", *keydist);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001272
1273 if (*keydist & SMP_DIST_ENC_KEY) {
1274 struct smp_cmd_encrypt_info enc;
Archie Pusakafad646e2021-05-31 16:37:25 +08001275 struct smp_cmd_initiator_ident ident;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001276 struct smp_ltk *ltk;
1277 u8 authenticated;
1278 __le16 ediv;
1279 __le64 rand;
1280
Johan Hedberg1fc62c52015-06-10 11:11:20 +03001281 /* Make sure we generate only the significant amount of
1282 * bytes based on the encryption key size, and set the rest
1283 * of the value to zeroes.
1284 */
1285 get_random_bytes(enc.ltk, smp->enc_key_size);
1286 memset(enc.ltk + smp->enc_key_size, 0,
1287 sizeof(enc.ltk) - smp->enc_key_size);
1288
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001289 get_random_bytes(&ediv, sizeof(ediv));
1290 get_random_bytes(&rand, sizeof(rand));
1291
1292 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1293
1294 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1295 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
Archie Pusakafad646e2021-05-31 16:37:25 +08001296 SMP_LTK_RESPONDER, authenticated, enc.ltk,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001297 smp->enc_key_size, ediv, rand);
Archie Pusakafad646e2021-05-31 16:37:25 +08001298 smp->responder_ltk = ltk;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001299
1300 ident.ediv = ediv;
1301 ident.rand = rand;
1302
Archie Pusakafad646e2021-05-31 16:37:25 +08001303 smp_send_cmd(conn, SMP_CMD_INITIATOR_IDENT, sizeof(ident),
1304 &ident);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001305
1306 *keydist &= ~SMP_DIST_ENC_KEY;
1307 }
1308
1309 if (*keydist & SMP_DIST_ID_KEY) {
1310 struct smp_cmd_ident_addr_info addrinfo;
1311 struct smp_cmd_ident_info idinfo;
1312
1313 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1314
1315 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1316
1317 /* The hci_conn contains the local identity address
1318 * after the connection has been established.
1319 *
1320 * This is true even when the connection has been
1321 * established using a resolvable random address.
1322 */
1323 bacpy(&addrinfo.bdaddr, &hcon->src);
1324 addrinfo.addr_type = hcon->src_type;
1325
1326 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1327 &addrinfo);
1328
1329 *keydist &= ~SMP_DIST_ID_KEY;
1330 }
1331
1332 if (*keydist & SMP_DIST_SIGN) {
1333 struct smp_cmd_sign_info sign;
1334 struct smp_csrk *csrk;
1335
1336 /* Generate a new random key */
1337 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1338
1339 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1340 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001341 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1342 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1343 else
1344 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001345 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1346 }
Archie Pusakafad646e2021-05-31 16:37:25 +08001347 smp->responder_csrk = csrk;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001348
1349 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1350
1351 *keydist &= ~SMP_DIST_SIGN;
1352 }
1353
1354 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001355 if (smp->remote_key_dist & KEY_DIST_MASK) {
1356 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001357 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001358 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001359
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001360 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1361 smp_notify_keys(conn);
1362
1363 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001364}
1365
Johan Hedbergb68fda62014-08-11 22:06:40 +03001366static void smp_timeout(struct work_struct *work)
1367{
1368 struct smp_chan *smp = container_of(work, struct smp_chan,
1369 security_timer.work);
1370 struct l2cap_conn *conn = smp->conn;
1371
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001372 bt_dev_dbg(conn->hcon->hdev, "conn %p", conn);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001373
Johan Hedberg1e91c292014-08-18 20:33:29 +03001374 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001375}
1376
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001377static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1378{
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001379 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001380 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001381 struct smp_chan *smp;
1382
Marcel Holtmannf1560462013-10-13 05:43:25 -07001383 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001384 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001385 return NULL;
1386
Herbert Xu71af2f62016-01-24 21:18:30 +08001387 smp->tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Johan Hedberg407cecf2014-05-02 14:19:47 +03001388 if (IS_ERR(smp->tfm_cmac)) {
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001389 bt_dev_err(hcon->hdev, "Unable to create CMAC crypto context");
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02001390 goto zfree_smp;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001391 }
1392
Meng Yu6763f5e2021-03-04 14:35:46 +08001393 smp->tfm_ecdh = crypto_alloc_kpp("ecdh-nist-p256", 0, 0);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001394 if (IS_ERR(smp->tfm_ecdh)) {
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001395 bt_dev_err(hcon->hdev, "Unable to create ECDH crypto context");
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001396 goto free_shash;
Johan Hedberg407cecf2014-05-02 14:19:47 +03001397 }
1398
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001399 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001400 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001401
Johan Hedbergb28b4942014-09-05 22:19:55 +03001402 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1403
Johan Hedbergb68fda62014-08-11 22:06:40 +03001404 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1405
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001406 hci_conn_hold(hcon);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001407
1408 return smp;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001409
1410free_shash:
1411 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001412zfree_smp:
Waiman Long453431a2020-08-06 23:18:13 -07001413 kfree_sensitive(smp);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001414 return NULL;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001415}
1416
Johan Hedberg760b0182014-06-06 11:44:05 +03001417static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1418{
1419 struct hci_conn *hcon = smp->conn->hcon;
1420 u8 *na, *nb, a[7], b[7];
1421
1422 if (hcon->out) {
1423 na = smp->prnd;
1424 nb = smp->rrnd;
1425 } else {
1426 na = smp->rrnd;
1427 nb = smp->prnd;
1428 }
1429
1430 memcpy(a, &hcon->init_addr, 6);
1431 memcpy(b, &hcon->resp_addr, 6);
1432 a[6] = hcon->init_addr_type;
1433 b[6] = hcon->resp_addr_type;
1434
1435 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1436}
1437
Johan Hedberg38606f12014-06-25 11:10:28 +03001438static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001439{
1440 struct hci_conn *hcon = smp->conn->hcon;
1441 struct smp_cmd_dhkey_check check;
1442 u8 a[7], b[7], *local_addr, *remote_addr;
1443 u8 io_cap[3], r[16];
1444
Johan Hedberg760b0182014-06-06 11:44:05 +03001445 memcpy(a, &hcon->init_addr, 6);
1446 memcpy(b, &hcon->resp_addr, 6);
1447 a[6] = hcon->init_addr_type;
1448 b[6] = hcon->resp_addr_type;
1449
1450 if (hcon->out) {
1451 local_addr = a;
1452 remote_addr = b;
1453 memcpy(io_cap, &smp->preq[1], 3);
1454 } else {
1455 local_addr = b;
1456 remote_addr = a;
1457 memcpy(io_cap, &smp->prsp[1], 3);
1458 }
1459
Johan Hedbergdddd3052014-06-01 15:38:09 +03001460 memset(r, 0, sizeof(r));
1461
1462 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001463 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001464
Johan Hedberga29b0732014-10-28 15:17:05 +01001465 if (smp->method == REQ_OOB)
1466 memcpy(r, smp->rr, 16);
1467
Johan Hedberg760b0182014-06-06 11:44:05 +03001468 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1469 local_addr, remote_addr, check.e);
1470
1471 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001472}
1473
Johan Hedberg38606f12014-06-25 11:10:28 +03001474static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1475{
1476 struct l2cap_conn *conn = smp->conn;
1477 struct hci_conn *hcon = conn->hcon;
1478 struct smp_cmd_pairing_confirm cfm;
1479 u8 r;
1480
1481 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1482 r |= 0x80;
1483
1484 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1485
1486 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1487 cfm.confirm_val))
1488 return SMP_UNSPECIFIED;
1489
1490 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1491
1492 return 0;
1493}
1494
1495static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1496{
1497 struct l2cap_conn *conn = smp->conn;
1498 struct hci_conn *hcon = conn->hcon;
1499 struct hci_dev *hdev = hcon->hdev;
1500 u8 cfm[16], r;
1501
1502 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1503 if (smp->passkey_round >= 20)
1504 return 0;
1505
1506 switch (smp_op) {
1507 case SMP_CMD_PAIRING_RANDOM:
1508 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1509 r |= 0x80;
1510
1511 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1512 smp->rrnd, r, cfm))
1513 return SMP_UNSPECIFIED;
1514
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02001515 if (crypto_memneq(smp->pcnf, cfm, 16))
Johan Hedberg38606f12014-06-25 11:10:28 +03001516 return SMP_CONFIRM_FAILED;
1517
1518 smp->passkey_round++;
1519
1520 if (smp->passkey_round == 20) {
1521 /* Generate MacKey and LTK */
1522 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1523 return SMP_UNSPECIFIED;
1524 }
1525
1526 /* The round is only complete when the initiator
1527 * receives pairing random.
1528 */
1529 if (!hcon->out) {
1530 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1531 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001532 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001533 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001534 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001535 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001536 return 0;
1537 }
1538
1539 /* Start the next round */
1540 if (smp->passkey_round != 20)
1541 return sc_passkey_round(smp, 0);
1542
1543 /* Passkey rounds are complete - start DHKey Check */
1544 sc_dhkey_check(smp);
1545 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1546
1547 break;
1548
1549 case SMP_CMD_PAIRING_CONFIRM:
1550 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1551 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1552 return 0;
1553 }
1554
1555 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1556
1557 if (hcon->out) {
1558 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1559 sizeof(smp->prnd), smp->prnd);
1560 return 0;
1561 }
1562
1563 return sc_passkey_send_confirm(smp);
1564
1565 case SMP_CMD_PUBLIC_KEY:
1566 default:
1567 /* Initiating device starts the round */
1568 if (!hcon->out)
1569 return 0;
1570
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001571 bt_dev_dbg(hdev, "Starting passkey round %u",
1572 smp->passkey_round + 1);
Johan Hedberg38606f12014-06-25 11:10:28 +03001573
1574 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1575
1576 return sc_passkey_send_confirm(smp);
1577 }
1578
1579 return 0;
1580}
1581
Johan Hedbergdddd3052014-06-01 15:38:09 +03001582static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1583{
Johan Hedberg38606f12014-06-25 11:10:28 +03001584 struct l2cap_conn *conn = smp->conn;
1585 struct hci_conn *hcon = conn->hcon;
1586 u8 smp_op;
1587
1588 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1589
Johan Hedbergdddd3052014-06-01 15:38:09 +03001590 switch (mgmt_op) {
1591 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1592 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1593 return 0;
1594 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1595 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1596 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001597 case MGMT_OP_USER_PASSKEY_REPLY:
1598 hcon->passkey_notify = le32_to_cpu(passkey);
1599 smp->passkey_round = 0;
1600
1601 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1602 smp_op = SMP_CMD_PAIRING_CONFIRM;
1603 else
1604 smp_op = 0;
1605
1606 if (sc_passkey_round(smp, smp_op))
1607 return -EIO;
1608
1609 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001610 }
1611
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001612 /* Initiator sends DHKey check first */
1613 if (hcon->out) {
1614 sc_dhkey_check(smp);
1615 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1616 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1617 sc_dhkey_check(smp);
1618 sc_add_ltk(smp);
1619 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001620
1621 return 0;
1622}
1623
Brian Gix2b64d152011-12-21 16:12:12 -08001624int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1625{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001626 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001627 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001628 struct smp_chan *smp;
1629 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001630 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001631
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001632 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001633 return -ENOTCONN;
1634
Luiz Augusto von Dentz0ae8ef62021-03-29 10:27:04 -07001635 bt_dev_dbg(conn->hcon->hdev, "");
1636
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001637 chan = conn->smp;
1638 if (!chan)
1639 return -ENOTCONN;
1640
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001641 l2cap_chan_lock(chan);
1642 if (!chan->data) {
1643 err = -ENOTCONN;
1644 goto unlock;
1645 }
1646
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001647 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001648
Johan Hedberg760b0182014-06-06 11:44:05 +03001649 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1650 err = sc_user_reply(smp, mgmt_op, passkey);
1651 goto unlock;
1652 }
1653
Brian Gix2b64d152011-12-21 16:12:12 -08001654 switch (mgmt_op) {
1655 case MGMT_OP_USER_PASSKEY_REPLY:
1656 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001657 memset(smp->tk, 0, sizeof(smp->tk));
Kai Ye83b4b192021-06-03 15:41:05 +08001658 bt_dev_dbg(conn->hcon->hdev, "PassKey: %u", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001659 put_unaligned_le32(value, smp->tk);
Gustavo A. R. Silva19186c72020-07-08 15:18:23 -05001660 fallthrough;
Brian Gix2b64d152011-12-21 16:12:12 -08001661 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001662 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001663 break;
1664 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1665 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001666 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001667 err = 0;
1668 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001669 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001670 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001671 err = -EOPNOTSUPP;
1672 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001673 }
1674
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001675 err = 0;
1676
Brian Gix2b64d152011-12-21 16:12:12 -08001677 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001678 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1679 u8 rsp = smp_confirm(smp);
1680 if (rsp)
1681 smp_failure(conn, rsp);
1682 }
Brian Gix2b64d152011-12-21 16:12:12 -08001683
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001684unlock:
1685 l2cap_chan_unlock(chan);
1686 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001687}
1688
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001689static void build_bredr_pairing_cmd(struct smp_chan *smp,
1690 struct smp_cmd_pairing *req,
1691 struct smp_cmd_pairing *rsp)
1692{
1693 struct l2cap_conn *conn = smp->conn;
1694 struct hci_dev *hdev = conn->hcon->hdev;
1695 u8 local_dist = 0, remote_dist = 0;
1696
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001697 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001698 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1699 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1700 }
1701
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001702 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001703 remote_dist |= SMP_DIST_ID_KEY;
1704
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001705 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001706 local_dist |= SMP_DIST_ID_KEY;
1707
1708 if (!rsp) {
1709 memset(req, 0, sizeof(*req));
1710
Johan Hedberga62da6f2016-12-08 08:32:54 +02001711 req->auth_req = SMP_AUTH_CT2;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001712 req->init_key_dist = local_dist;
1713 req->resp_key_dist = remote_dist;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001714 req->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001715
1716 smp->remote_key_dist = remote_dist;
1717
1718 return;
1719 }
1720
1721 memset(rsp, 0, sizeof(*rsp));
1722
Johan Hedberga62da6f2016-12-08 08:32:54 +02001723 rsp->auth_req = SMP_AUTH_CT2;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001724 rsp->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001725 rsp->init_key_dist = req->init_key_dist & remote_dist;
1726 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1727
1728 smp->remote_key_dist = rsp->init_key_dist;
1729}
1730
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001731static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001732{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001733 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001734 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001735 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001736 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001737 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001738 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001739
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001740 bt_dev_dbg(hdev, "conn %p", conn);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001741
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001742 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001743 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001744
Johan Hedberg40bef302014-07-16 11:42:27 +03001745 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001746 return SMP_CMD_NOTSUPP;
1747
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001748 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001749 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001750 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001751 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001752
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001753 if (!smp)
1754 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001755
Johan Hedbergc05b9332014-09-10 17:37:42 -07001756 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001757 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001758
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001759 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001760 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001761 return SMP_PAIRING_NOTSUPP;
1762
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001763 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001764 return SMP_AUTH_REQUIREMENTS;
1765
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001766 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1767 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001768 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001769
Johan Hedbergcb06d362015-03-16 21:12:34 +02001770 /* If the remote side's OOB flag is set it means it has
1771 * successfully received our local OOB data - therefore set the
1772 * flag to indicate that local OOB is in use.
1773 */
Johan Hedberg94f14e42018-09-11 14:10:12 +03001774 if (req->oob_flag == SMP_OOB_PRESENT && SMP_DEV(hdev)->local_oob)
Johan Hedberg58428562015-03-16 11:45:45 +02001775 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1776
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001777 /* SMP over BR/EDR requires special treatment */
1778 if (conn->hcon->type == ACL_LINK) {
1779 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001780 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001781 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001782 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1783
1784 set_bit(SMP_FLAG_SC, &smp->flags);
1785
1786 build_bredr_pairing_cmd(smp, req, &rsp);
1787
Johan Hedberga62da6f2016-12-08 08:32:54 +02001788 if (req->auth_req & SMP_AUTH_CT2)
1789 set_bit(SMP_FLAG_CT2, &smp->flags);
1790
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001791 key_size = min(req->max_key_size, rsp.max_key_size);
1792 if (check_enc_key_size(conn, key_size))
1793 return SMP_ENC_KEY_SIZE;
1794
1795 /* Clear bits which are generated but not distributed */
1796 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1797
1798 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1799 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1800 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1801
1802 smp_distribute_keys(smp);
1803 return 0;
1804 }
1805
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001806 build_pairing_cmd(conn, req, &rsp, auth);
1807
Johan Hedberga62da6f2016-12-08 08:32:54 +02001808 if (rsp.auth_req & SMP_AUTH_SC) {
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001809 set_bit(SMP_FLAG_SC, &smp->flags);
1810
Johan Hedberga62da6f2016-12-08 08:32:54 +02001811 if (rsp.auth_req & SMP_AUTH_CT2)
1812 set_bit(SMP_FLAG_CT2, &smp->flags);
1813 }
1814
Johan Hedberg5be5e272014-09-10 17:58:54 -07001815 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001816 sec_level = BT_SECURITY_MEDIUM;
1817 else
1818 sec_level = authreq_to_seclevel(auth);
1819
Johan Hedbergc7262e72014-06-17 13:07:37 +03001820 if (sec_level > conn->hcon->pending_sec_level)
1821 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001822
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001823 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001824 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1825 u8 method;
1826
1827 method = get_auth_method(smp, conn->hcon->io_capability,
1828 req->io_capability);
1829 if (method == JUST_WORKS || method == JUST_CFM)
1830 return SMP_AUTH_REQUIREMENTS;
1831 }
1832
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001833 key_size = min(req->max_key_size, rsp.max_key_size);
1834 if (check_enc_key_size(conn, key_size))
1835 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001836
Johan Hedberge84a6b12013-12-02 10:49:03 +02001837 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001838
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001839 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1840 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001841
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001842 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001843
1844 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1845
Johan Hedberg19c5ce92015-03-15 19:34:04 +02001846 /* Strictly speaking we shouldn't allow Pairing Confirm for the
1847 * SC case, however some implementations incorrectly copy RFU auth
1848 * req bits from our security request, which may create a false
1849 * positive SC enablement.
1850 */
1851 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1852
Johan Hedberg3b191462014-06-06 10:50:15 +03001853 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1854 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1855 /* Clear bits which are generated but not distributed */
1856 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1857 /* Wait for Public Key from Initiating Device */
1858 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001859 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001860
Brian Gix2b64d152011-12-21 16:12:12 -08001861 /* Request setup of TK */
1862 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1863 if (ret)
1864 return SMP_UNSPECIFIED;
1865
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001866 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001867}
1868
Johan Hedberg3b191462014-06-06 10:50:15 +03001869static u8 sc_send_public_key(struct smp_chan *smp)
1870{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001871 struct hci_dev *hdev = smp->conn->hcon->hdev;
1872
Marcel Holtmann56860242020-05-06 09:57:50 +02001873 bt_dev_dbg(hdev, "");
Johan Hedberg3b191462014-06-06 10:50:15 +03001874
Johan Hedberg1a8bab42015-03-16 11:45:44 +02001875 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001876 struct l2cap_chan *chan = hdev->smp_data;
1877 struct smp_dev *smp_dev;
1878
1879 if (!chan || !chan->data)
1880 return SMP_UNSPECIFIED;
1881
1882 smp_dev = chan->data;
1883
1884 memcpy(smp->local_pk, smp_dev->local_pk, 64);
Marcel Holtmannfb334fe2015-03-16 12:34:57 -07001885 memcpy(smp->lr, smp_dev->local_rand, 16);
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001886
1887 if (smp_dev->debug_key)
1888 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1889
1890 goto done;
1891 }
1892
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001893 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001894 bt_dev_dbg(hdev, "Using debug keys");
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001895 if (set_ecdh_privkey(smp->tfm_ecdh, debug_sk))
1896 return SMP_UNSPECIFIED;
Johan Hedberg70157ef2014-06-24 15:22:59 +03001897 memcpy(smp->local_pk, debug_pk, 64);
Johan Hedberg70157ef2014-06-24 15:22:59 +03001898 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1899 } else {
1900 while (true) {
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001901 /* Generate key pair for Secure Connections */
1902 if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk))
Johan Hedberg70157ef2014-06-24 15:22:59 +03001903 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001904
Johan Hedberg70157ef2014-06-24 15:22:59 +03001905 /* This is unlikely, but we need to check that
Zheng Yongjun91641b72021-06-02 14:54:58 +08001906 * we didn't accidentally generate a debug key.
Johan Hedberg70157ef2014-06-24 15:22:59 +03001907 */
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001908 if (crypto_memneq(smp->local_pk, debug_pk, 64))
Johan Hedberg70157ef2014-06-24 15:22:59 +03001909 break;
1910 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001911 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001912
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001913done:
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001914 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
Marcel Holtmann8e4e2ee2015-03-16 01:10:25 -07001915 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32);
Johan Hedberg3b191462014-06-06 10:50:15 +03001916
1917 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1918
1919 return 0;
1920}
1921
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001922static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001923{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001924 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001925 struct l2cap_chan *chan = conn->smp;
1926 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001927 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001928 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001929 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001930
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07001931 bt_dev_dbg(hdev, "conn %p", conn);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001932
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001933 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001934 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001935
Johan Hedberg40bef302014-07-16 11:42:27 +03001936 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001937 return SMP_CMD_NOTSUPP;
1938
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001939 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001940
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001941 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001942
1943 key_size = min(req->max_key_size, rsp->max_key_size);
1944 if (check_enc_key_size(conn, key_size))
1945 return SMP_ENC_KEY_SIZE;
1946
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001947 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001948
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001949 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001950 return SMP_AUTH_REQUIREMENTS;
1951
Johan Hedbergcb06d362015-03-16 21:12:34 +02001952 /* If the remote side's OOB flag is set it means it has
1953 * successfully received our local OOB data - therefore set the
1954 * flag to indicate that local OOB is in use.
1955 */
Johan Hedberg94f14e42018-09-11 14:10:12 +03001956 if (rsp->oob_flag == SMP_OOB_PRESENT && SMP_DEV(hdev)->local_oob)
Johan Hedberg58428562015-03-16 11:45:45 +02001957 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1958
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001959 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1960 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1961
1962 /* Update remote key distribution in case the remote cleared
1963 * some bits that we had enabled in our request.
1964 */
1965 smp->remote_key_dist &= rsp->resp_key_dist;
1966
Johan Hedberga62da6f2016-12-08 08:32:54 +02001967 if ((req->auth_req & SMP_AUTH_CT2) && (auth & SMP_AUTH_CT2))
1968 set_bit(SMP_FLAG_CT2, &smp->flags);
1969
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001970 /* For BR/EDR this means we're done and can start phase 3 */
1971 if (conn->hcon->type == ACL_LINK) {
1972 /* Clear bits which are generated but not distributed */
1973 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1974 smp_distribute_keys(smp);
1975 return 0;
1976 }
1977
Johan Hedberg65668772014-05-16 11:03:34 +03001978 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1979 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001980 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1981 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001982
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001983 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001984 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1985 u8 method;
1986
1987 method = get_auth_method(smp, req->io_capability,
1988 rsp->io_capability);
1989 if (method == JUST_WORKS || method == JUST_CFM)
1990 return SMP_AUTH_REQUIREMENTS;
1991 }
1992
Johan Hedberge84a6b12013-12-02 10:49:03 +02001993 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001994
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001995 /* Update remote key distribution in case the remote cleared
1996 * some bits that we had enabled in our request.
1997 */
1998 smp->remote_key_dist &= rsp->resp_key_dist;
1999
Johan Hedberg3b191462014-06-06 10:50:15 +03002000 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2001 /* Clear bits which are generated but not distributed */
2002 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
2003 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
2004 return sc_send_public_key(smp);
2005 }
2006
Johan Hedbergc05b9332014-09-10 17:37:42 -07002007 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08002008
Johan Hedberg476585e2012-06-06 18:54:15 +08002009 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08002010 if (ret)
2011 return SMP_UNSPECIFIED;
2012
Johan Hedberg4a74d652014-05-20 09:45:50 +03002013 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08002014
2015 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03002016 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002017 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002018
2019 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002020}
2021
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002022static u8 sc_check_confirm(struct smp_chan *smp)
2023{
2024 struct l2cap_conn *conn = smp->conn;
2025
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002026 bt_dev_dbg(conn->hcon->hdev, "");
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002027
Johan Hedberg38606f12014-06-25 11:10:28 +03002028 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2029 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
2030
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002031 if (conn->hcon->out) {
2032 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2033 smp->prnd);
2034 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2035 }
2036
2037 return 0;
2038}
2039
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002040/* Work-around for some implementations that incorrectly copy RFU bits
2041 * from our security request and thereby create the impression that
2042 * we're doing SC when in fact the remote doesn't support it.
2043 */
2044static int fixup_sc_false_positive(struct smp_chan *smp)
2045{
2046 struct l2cap_conn *conn = smp->conn;
2047 struct hci_conn *hcon = conn->hcon;
2048 struct hci_dev *hdev = hcon->hdev;
2049 struct smp_cmd_pairing *req, *rsp;
2050 u8 auth;
2051
Archie Pusakafad646e2021-05-31 16:37:25 +08002052 /* The issue is only observed when we're in responder role */
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002053 if (hcon->out)
2054 return SMP_UNSPECIFIED;
2055
2056 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002057 bt_dev_err(hdev, "refusing legacy fallback in SC-only mode");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002058 return SMP_UNSPECIFIED;
2059 }
2060
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002061 bt_dev_err(hdev, "trying to fall back to legacy SMP");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002062
2063 req = (void *) &smp->preq[1];
2064 rsp = (void *) &smp->prsp[1];
2065
2066 /* Rebuild key dist flags which may have been cleared for SC */
2067 smp->remote_key_dist = (req->init_key_dist & rsp->resp_key_dist);
2068
2069 auth = req->auth_req & AUTH_REQ_MASK(hdev);
2070
2071 if (tk_request(conn, 0, auth, rsp->io_capability, req->io_capability)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002072 bt_dev_err(hdev, "failed to fall back to legacy SMP");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002073 return SMP_UNSPECIFIED;
2074 }
2075
2076 clear_bit(SMP_FLAG_SC, &smp->flags);
2077
2078 return 0;
2079}
2080
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002081static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002082{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002083 struct l2cap_chan *chan = conn->smp;
2084 struct smp_chan *smp = chan->data;
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002085 struct hci_conn *hcon = conn->hcon;
2086 struct hci_dev *hdev = hcon->hdev;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002087
Archie Pusakafad646e2021-05-31 16:37:25 +08002088 bt_dev_dbg(hdev, "conn %p %s", conn,
2089 hcon->out ? "initiator" : "responder");
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002090
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002091 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002092 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002093
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002094 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
2095 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002096
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002097 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2098 int ret;
2099
2100 /* Public Key exchange must happen before any other steps */
2101 if (test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
2102 return sc_check_confirm(smp);
2103
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002104 bt_dev_err(hdev, "Unexpected SMP Pairing Confirm");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002105
2106 ret = fixup_sc_false_positive(smp);
2107 if (ret)
2108 return ret;
2109 }
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002110
Johan Hedbergb28b4942014-09-05 22:19:55 +03002111 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02002112 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2113 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002114 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2115 return 0;
2116 }
2117
2118 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002119 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07002120
2121 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002122
2123 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002124}
2125
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002126static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002127{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002128 struct l2cap_chan *chan = conn->smp;
2129 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002130 struct hci_conn *hcon = conn->hcon;
Howard Chungeed467b2020-02-20 11:17:29 +08002131 u8 *pkax, *pkbx, *na, *nb, confirm_hint;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002132 u32 passkey;
2133 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002134
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002135 bt_dev_dbg(hcon->hdev, "conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002136
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002137 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002138 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002139
Johan Hedberg943a7322014-03-18 12:58:24 +02002140 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002141 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002142
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002143 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2144 return smp_random(smp);
2145
Johan Hedberg580039e2014-12-03 16:26:37 +02002146 if (hcon->out) {
2147 pkax = smp->local_pk;
2148 pkbx = smp->remote_pk;
2149 na = smp->prnd;
2150 nb = smp->rrnd;
2151 } else {
2152 pkax = smp->remote_pk;
2153 pkbx = smp->local_pk;
2154 na = smp->rrnd;
2155 nb = smp->prnd;
2156 }
2157
Johan Hedberga29b0732014-10-28 15:17:05 +01002158 if (smp->method == REQ_OOB) {
2159 if (!hcon->out)
2160 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2161 sizeof(smp->prnd), smp->prnd);
2162 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2163 goto mackey_and_ltk;
2164 }
2165
Johan Hedberg38606f12014-06-25 11:10:28 +03002166 /* Passkey entry has special treatment */
2167 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2168 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2169
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002170 if (hcon->out) {
2171 u8 cfm[16];
2172
2173 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2174 smp->rrnd, 0, cfm);
2175 if (err)
2176 return SMP_UNSPECIFIED;
2177
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002178 if (crypto_memneq(smp->pcnf, cfm, 16))
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002179 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002180 } else {
2181 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2182 smp->prnd);
2183 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Howard Chungcee5f202020-02-14 19:16:41 +08002184
2185 /* Only Just-Works pairing requires extra checks */
2186 if (smp->method != JUST_WORKS)
2187 goto mackey_and_ltk;
2188
2189 /* If there already exists long term key in local host, leave
2190 * the decision to user space since the remote device could
2191 * be legitimate or malicious.
2192 */
2193 if (hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
2194 hcon->role)) {
Howard Chungeed467b2020-02-20 11:17:29 +08002195 /* Set passkey to 0. The value can be any number since
2196 * it'll be ignored anyway.
2197 */
2198 passkey = 0;
2199 confirm_hint = 1;
2200 goto confirm;
Howard Chungcee5f202020-02-14 19:16:41 +08002201 }
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002202 }
2203
Johan Hedberga29b0732014-10-28 15:17:05 +01002204mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002205 /* Generate MacKey and LTK */
2206 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2207 if (err)
2208 return SMP_UNSPECIFIED;
2209
Sonny Sasakaffee2022020-04-06 11:04:02 -07002210 if (smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002211 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002212 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002213 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2214 }
2215 return 0;
2216 }
2217
Johan Hedberg38606f12014-06-25 11:10:28 +03002218 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002219 if (err)
2220 return SMP_UNSPECIFIED;
2221
Howard Chungeed467b2020-02-20 11:17:29 +08002222 confirm_hint = 0;
2223
2224confirm:
Sonny Sasakaffee2022020-04-06 11:04:02 -07002225 if (smp->method == JUST_WORKS)
2226 confirm_hint = 1;
2227
Johan Hedberg38606f12014-06-25 11:10:28 +03002228 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
Howard Chungeed467b2020-02-20 11:17:29 +08002229 hcon->dst_type, passkey, confirm_hint);
Johan Hedberg38606f12014-06-25 11:10:28 +03002230 if (err)
2231 return SMP_UNSPECIFIED;
2232
2233 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2234
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002235 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002236}
2237
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002238static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002239{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002240 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002241 struct hci_conn *hcon = conn->hcon;
2242
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002243 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002244 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002245 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002246
Johan Hedberga6f78332014-09-10 17:37:45 -07002247 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002248 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002249
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002250 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002251 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002252
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002253 hci_le_start_enc(hcon, key->ediv, key->rand, key->val, key->enc_size);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002254 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002255
Archie Pusakafad646e2021-05-31 16:37:25 +08002256 /* We never store STKs for initiator role, so clear this flag */
Johan Hedbergfe59a052014-07-01 19:14:12 +03002257 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2258
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002259 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002260}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002261
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002262bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2263 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002264{
2265 if (sec_level == BT_SECURITY_LOW)
2266 return true;
2267
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002268 /* If we're encrypted with an STK but the caller prefers using
2269 * LTK claim insufficient security. This way we allow the
2270 * connection to be re-encrypted with an LTK, even if the LTK
2271 * provides the same level of security. Only exception is if we
2272 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002273 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002274 if (key_pref == SMP_USE_LTK &&
2275 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002276 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002277 return false;
2278
Johan Hedberg854f4722014-07-01 18:40:20 +03002279 if (hcon->sec_level >= sec_level)
2280 return true;
2281
2282 return false;
2283}
2284
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002285static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002286{
2287 struct smp_cmd_security_req *rp = (void *) skb->data;
2288 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002289 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002290 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002291 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002292 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002293
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002294 bt_dev_dbg(hdev, "conn %p", conn);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002295
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002296 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002297 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002298
Johan Hedberg40bef302014-07-16 11:42:27 +03002299 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002300 return SMP_CMD_NOTSUPP;
2301
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002302 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002303
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002304 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002305 return SMP_AUTH_REQUIREMENTS;
2306
Johan Hedberg5be5e272014-09-10 17:58:54 -07002307 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002308 sec_level = BT_SECURITY_MEDIUM;
2309 else
2310 sec_level = authreq_to_seclevel(auth);
2311
Szymon Janc64e759f2018-02-26 15:41:53 +01002312 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK)) {
2313 /* If link is already encrypted with sufficient security we
2314 * still need refresh encryption as per Core Spec 5.0 Vol 3,
2315 * Part H 2.4.6
2316 */
2317 smp_ltk_encrypt(conn, hcon->sec_level);
Johan Hedberg854f4722014-07-01 18:40:20 +03002318 return 0;
Szymon Janc64e759f2018-02-26 15:41:53 +01002319 }
Johan Hedberg854f4722014-07-01 18:40:20 +03002320
Johan Hedbergc7262e72014-06-17 13:07:37 +03002321 if (sec_level > hcon->pending_sec_level)
2322 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002323
Johan Hedberg4dab7862012-06-07 14:58:37 +08002324 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002325 return 0;
2326
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002327 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002328 if (!smp)
2329 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002330
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002331 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002332 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002333 return SMP_PAIRING_NOTSUPP;
2334
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002335 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002336
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002337 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002338 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002339
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002340 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2341 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002342
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002343 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002344 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002345
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002346 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002347}
2348
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002349int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002350{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002351 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002352 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002353 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002354 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002355 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002356
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002357 bt_dev_dbg(hcon->hdev, "conn %p hcon %p level 0x%2.2x", conn, hcon,
2358 sec_level);
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002359
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002360 /* This may be NULL if there's an unexpected disconnection */
2361 if (!conn)
2362 return 1;
2363
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002364 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002365 return 1;
2366
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002367 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002368 return 1;
2369
Johan Hedbergc7262e72014-06-17 13:07:37 +03002370 if (sec_level > hcon->pending_sec_level)
2371 hcon->pending_sec_level = sec_level;
2372
Johan Hedberg40bef302014-07-16 11:42:27 +03002373 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002374 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2375 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002376
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002377 chan = conn->smp;
2378 if (!chan) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002379 bt_dev_err(hcon->hdev, "security requested but not available");
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002380 return 1;
2381 }
2382
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002383 l2cap_chan_lock(chan);
2384
2385 /* If SMP is already in progress ignore this request */
2386 if (chan->data) {
2387 ret = 0;
2388 goto unlock;
2389 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002390
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002391 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002392 if (!smp) {
2393 ret = 1;
2394 goto unlock;
2395 }
Brian Gix2b64d152011-12-21 16:12:12 -08002396
2397 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002398
Johan Hedberga62da6f2016-12-08 08:32:54 +02002399 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED)) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002400 authreq |= SMP_AUTH_SC;
Johan Hedberga62da6f2016-12-08 08:32:54 +02002401 if (hci_dev_test_flag(hcon->hdev, HCI_SSP_ENABLED))
2402 authreq |= SMP_AUTH_CT2;
2403 }
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002404
Archie Pusakac2aa30d2020-04-07 12:26:27 +08002405 /* Don't attempt to set MITM if setting is overridden by debugfs
2406 * Needed to pass certification test SM/MAS/PKE/BV-01-C
Johan Hedberg2e233642014-03-18 15:42:30 +02002407 */
Archie Pusakac2aa30d2020-04-07 12:26:27 +08002408 if (!hci_dev_test_flag(hcon->hdev, HCI_FORCE_NO_MITM)) {
2409 /* Require MITM if IO Capability allows or the security level
2410 * requires it.
2411 */
2412 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
2413 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
2414 authreq |= SMP_AUTH_MITM;
2415 }
Johan Hedberg2e233642014-03-18 15:42:30 +02002416
Johan Hedberg40bef302014-07-16 11:42:27 +03002417 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002418 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002419
Brian Gix2b64d152011-12-21 16:12:12 -08002420 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002421 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2422 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002423
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002424 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002425 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002426 } else {
2427 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002428 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002429 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002430 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002431 }
2432
Johan Hedberg4a74d652014-05-20 09:45:50 +03002433 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002434 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002435
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002436unlock:
2437 l2cap_chan_unlock(chan);
2438 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002439}
2440
Matias Karhumaacb28c302018-09-26 09:13:46 +03002441int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
2442 u8 addr_type)
Johan Hedbergc81d5552015-10-22 09:38:35 +03002443{
Matias Karhumaacb28c302018-09-26 09:13:46 +03002444 struct hci_conn *hcon;
2445 struct l2cap_conn *conn;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002446 struct l2cap_chan *chan;
2447 struct smp_chan *smp;
Matias Karhumaacb28c302018-09-26 09:13:46 +03002448 int err;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002449
Matias Karhumaacb28c302018-09-26 09:13:46 +03002450 err = hci_remove_ltk(hdev, bdaddr, addr_type);
2451 hci_remove_irk(hdev, bdaddr, addr_type);
2452
2453 hcon = hci_conn_hash_lookup_le(hdev, bdaddr, addr_type);
2454 if (!hcon)
2455 goto done;
2456
2457 conn = hcon->l2cap_data;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002458 if (!conn)
Matias Karhumaacb28c302018-09-26 09:13:46 +03002459 goto done;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002460
2461 chan = conn->smp;
2462 if (!chan)
Matias Karhumaacb28c302018-09-26 09:13:46 +03002463 goto done;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002464
2465 l2cap_chan_lock(chan);
2466
2467 smp = chan->data;
2468 if (smp) {
Matias Karhumaacb28c302018-09-26 09:13:46 +03002469 /* Set keys to NULL to make sure smp_failure() does not try to
2470 * remove and free already invalidated rcu list entries. */
2471 smp->ltk = NULL;
Archie Pusakafad646e2021-05-31 16:37:25 +08002472 smp->responder_ltk = NULL;
Matias Karhumaacb28c302018-09-26 09:13:46 +03002473 smp->remote_irk = NULL;
2474
Johan Hedbergc81d5552015-10-22 09:38:35 +03002475 if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
2476 smp_failure(conn, 0);
2477 else
2478 smp_failure(conn, SMP_UNSPECIFIED);
Matias Karhumaacb28c302018-09-26 09:13:46 +03002479 err = 0;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002480 }
2481
2482 l2cap_chan_unlock(chan);
Matias Karhumaacb28c302018-09-26 09:13:46 +03002483
2484done:
2485 return err;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002486}
2487
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002488static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2489{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002490 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002491 struct l2cap_chan *chan = conn->smp;
2492 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002493
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002494 bt_dev_dbg(conn->hcon->hdev, "conn %p", conn);
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002495
2496 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002497 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002498
Alain Michaud600a8742020-01-07 00:43:17 +00002499 /* Pairing is aborted if any blocked keys are distributed */
2500 if (hci_is_blocked_key(conn->hcon->hdev, HCI_BLOCKED_KEY_TYPE_LTK,
2501 rp->ltk)) {
2502 bt_dev_warn_ratelimited(conn->hcon->hdev,
2503 "LTK blocked for %pMR",
2504 &conn->hcon->dst);
2505 return SMP_INVALID_PARAMS;
2506 }
2507
Archie Pusakafad646e2021-05-31 16:37:25 +08002508 SMP_ALLOW_CMD(smp, SMP_CMD_INITIATOR_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002509
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002510 skb_pull(skb, sizeof(*rp));
2511
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002512 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002513
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002514 return 0;
2515}
2516
Archie Pusakafad646e2021-05-31 16:37:25 +08002517static int smp_cmd_initiator_ident(struct l2cap_conn *conn, struct sk_buff *skb)
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002518{
Archie Pusakafad646e2021-05-31 16:37:25 +08002519 struct smp_cmd_initiator_ident *rp = (void *)skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002520 struct l2cap_chan *chan = conn->smp;
2521 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002522 struct hci_dev *hdev = conn->hcon->hdev;
2523 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002524 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002525 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002526
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002527 bt_dev_dbg(hdev, "conn %p", conn);
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002528
2529 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002530 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002531
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002532 /* Mark the information as received */
2533 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2534
Johan Hedbergb28b4942014-09-05 22:19:55 +03002535 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2536 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002537 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2538 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002539
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002540 skb_pull(skb, sizeof(*rp));
2541
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002542 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002543 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002544 authenticated, smp->tk, smp->enc_key_size,
2545 rp->ediv, rp->rand);
2546 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002547 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002548 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002549
2550 return 0;
2551}
2552
Johan Hedbergfd349c02014-02-18 10:19:36 +02002553static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2554{
2555 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002556 struct l2cap_chan *chan = conn->smp;
2557 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002558
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002559 bt_dev_dbg(conn->hcon->hdev, "");
Johan Hedbergfd349c02014-02-18 10:19:36 +02002560
2561 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002562 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002563
Alain Michaud600a8742020-01-07 00:43:17 +00002564 /* Pairing is aborted if any blocked keys are distributed */
2565 if (hci_is_blocked_key(conn->hcon->hdev, HCI_BLOCKED_KEY_TYPE_IRK,
2566 info->irk)) {
2567 bt_dev_warn_ratelimited(conn->hcon->hdev,
2568 "Identity key blocked for %pMR",
2569 &conn->hcon->dst);
2570 return SMP_INVALID_PARAMS;
2571 }
2572
Johan Hedbergb28b4942014-09-05 22:19:55 +03002573 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002574
Johan Hedbergfd349c02014-02-18 10:19:36 +02002575 skb_pull(skb, sizeof(*info));
2576
2577 memcpy(smp->irk, info->irk, 16);
2578
2579 return 0;
2580}
2581
2582static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2583 struct sk_buff *skb)
2584{
2585 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002586 struct l2cap_chan *chan = conn->smp;
2587 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002588 struct hci_conn *hcon = conn->hcon;
2589 bdaddr_t rpa;
2590
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002591 bt_dev_dbg(hcon->hdev, "");
Johan Hedbergfd349c02014-02-18 10:19:36 +02002592
2593 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002594 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002595
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002596 /* Mark the information as received */
2597 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2598
Johan Hedbergb28b4942014-09-05 22:19:55 +03002599 if (smp->remote_key_dist & SMP_DIST_SIGN)
2600 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2601
Johan Hedbergfd349c02014-02-18 10:19:36 +02002602 skb_pull(skb, sizeof(*info));
2603
Johan Hedberga9a58f82014-02-25 22:24:37 +02002604 /* Strictly speaking the Core Specification (4.1) allows sending
2605 * an empty address which would force us to rely on just the IRK
2606 * as "identity information". However, since such
2607 * implementations are not known of and in order to not over
2608 * complicate our implementation, simply pretend that we never
2609 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002610 *
2611 * The Identity Address must also be a Static Random or Public
2612 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002613 */
Johan Hedberge12af482015-01-14 20:51:37 +02002614 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2615 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002616 bt_dev_err(hcon->hdev, "ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002617 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002618 }
2619
Szymon Janc1d87b882019-06-19 00:47:47 +02002620 /* Drop IRK if peer is using identity address during pairing but is
2621 * providing different address as identity information.
2622 *
2623 * Microsoft Surface Precision Mouse is known to have this bug.
2624 */
2625 if (hci_is_identity_address(&hcon->dst, hcon->dst_type) &&
2626 (bacmp(&info->bdaddr, &hcon->dst) ||
2627 info->addr_type != hcon->dst_type)) {
2628 bt_dev_err(hcon->hdev,
2629 "ignoring IRK with invalid identity address");
2630 goto distribute;
2631 }
2632
Johan Hedbergfd349c02014-02-18 10:19:36 +02002633 bacpy(&smp->id_addr, &info->bdaddr);
2634 smp->id_addr_type = info->addr_type;
2635
2636 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2637 bacpy(&rpa, &hcon->dst);
2638 else
2639 bacpy(&rpa, BDADDR_ANY);
2640
Johan Hedberg23d0e122014-02-19 14:57:46 +02002641 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2642 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002643
Johan Hedberg31dd6242014-06-27 14:23:02 +03002644distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002645 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2646 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002647
2648 return 0;
2649}
2650
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002651static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2652{
2653 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002654 struct l2cap_chan *chan = conn->smp;
2655 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002656 struct smp_csrk *csrk;
2657
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002658 bt_dev_dbg(conn->hcon->hdev, "conn %p", conn);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002659
2660 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002661 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002662
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002663 /* Mark the information as received */
2664 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2665
2666 skb_pull(skb, sizeof(*rp));
2667
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002668 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2669 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002670 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2671 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2672 else
2673 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002674 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2675 }
2676 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002677 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002678
2679 return 0;
2680}
2681
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002682static u8 sc_select_method(struct smp_chan *smp)
2683{
2684 struct l2cap_conn *conn = smp->conn;
2685 struct hci_conn *hcon = conn->hcon;
2686 struct smp_cmd_pairing *local, *remote;
2687 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2688
Johan Hedberg1a8bab42015-03-16 11:45:44 +02002689 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) ||
2690 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags))
Johan Hedberga29b0732014-10-28 15:17:05 +01002691 return REQ_OOB;
2692
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002693 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2694 * which are needed as inputs to some crypto functions. To get
2695 * the "struct smp_cmd_pairing" from them we need to skip the
2696 * first byte which contains the opcode.
2697 */
2698 if (hcon->out) {
2699 local = (void *) &smp->preq[1];
2700 remote = (void *) &smp->prsp[1];
2701 } else {
2702 local = (void *) &smp->prsp[1];
2703 remote = (void *) &smp->preq[1];
2704 }
2705
2706 local_io = local->io_capability;
2707 remote_io = remote->io_capability;
2708
2709 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2710 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2711
2712 /* If either side wants MITM, look up the method from the table,
2713 * otherwise use JUST WORKS.
2714 */
2715 if (local_mitm || remote_mitm)
2716 method = get_auth_method(smp, local_io, remote_io);
2717 else
2718 method = JUST_WORKS;
2719
2720 /* Don't confirm locally initiated pairing attempts */
2721 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2722 method = JUST_WORKS;
2723
2724 return method;
2725}
2726
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002727static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2728{
2729 struct smp_cmd_public_key *key = (void *) skb->data;
2730 struct hci_conn *hcon = conn->hcon;
2731 struct l2cap_chan *chan = conn->smp;
2732 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002733 struct hci_dev *hdev = hcon->hdev;
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002734 struct crypto_kpp *tfm_ecdh;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002735 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002736 int err;
2737
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002738 bt_dev_dbg(hdev, "conn %p", conn);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002739
2740 if (skb->len < sizeof(*key))
2741 return SMP_INVALID_PARAMS;
2742
Luiz Augusto von Dentz6d19628f2021-03-10 14:13:08 -08002743 /* Check if remote and local public keys are the same and debug key is
2744 * not in use.
2745 */
2746 if (!test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags) &&
2747 !crypto_memneq(key, smp->local_pk, 64)) {
2748 bt_dev_err(hdev, "Remote and local public keys are identical");
2749 return SMP_UNSPECIFIED;
2750 }
2751
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002752 memcpy(smp->remote_pk, key, 64);
2753
Johan Hedberga8ca6172015-03-16 18:12:57 +02002754 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {
2755 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2756 smp->rr, 0, cfm.confirm_val);
2757 if (err)
2758 return SMP_UNSPECIFIED;
2759
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002760 if (crypto_memneq(cfm.confirm_val, smp->pcnf, 16))
Johan Hedberga8ca6172015-03-16 18:12:57 +02002761 return SMP_CONFIRM_FAILED;
2762 }
2763
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002764 /* Non-initiating device sends its public key after receiving
2765 * the key from the initiating device.
2766 */
2767 if (!hcon->out) {
2768 err = sc_send_public_key(smp);
2769 if (err)
2770 return err;
2771 }
2772
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002773 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
Marcel Holtmanne0915262015-03-16 12:34:55 -07002774 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002775
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002776 /* Compute the shared secret on the same crypto tfm on which the private
2777 * key was set/generated.
2778 */
2779 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Matias Karhumaa4ba51752018-09-11 14:10:13 +03002780 struct l2cap_chan *hchan = hdev->smp_data;
2781 struct smp_dev *smp_dev;
2782
2783 if (!hchan || !hchan->data)
2784 return SMP_UNSPECIFIED;
2785
2786 smp_dev = hchan->data;
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002787
2788 tfm_ecdh = smp_dev->tfm_ecdh;
2789 } else {
2790 tfm_ecdh = smp->tfm_ecdh;
2791 }
2792
2793 if (compute_ecdh_secret(tfm_ecdh, smp->remote_pk, smp->dhkey))
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002794 return SMP_UNSPECIFIED;
2795
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002796 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002797
2798 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2799
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002800 smp->method = sc_select_method(smp);
2801
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002802 bt_dev_dbg(hdev, "selected method 0x%02x", smp->method);
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002803
2804 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2805 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2806 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2807 else
2808 hcon->pending_sec_level = BT_SECURITY_FIPS;
2809
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002810 if (!crypto_memneq(debug_pk, smp->remote_pk, 64))
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002811 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2812
Johan Hedberg38606f12014-06-25 11:10:28 +03002813 if (smp->method == DSP_PASSKEY) {
2814 get_random_bytes(&hcon->passkey_notify,
2815 sizeof(hcon->passkey_notify));
2816 hcon->passkey_notify %= 1000000;
2817 hcon->passkey_entered = 0;
2818 smp->passkey_round = 0;
2819 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2820 hcon->dst_type,
2821 hcon->passkey_notify,
2822 hcon->passkey_entered))
2823 return SMP_UNSPECIFIED;
2824 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2825 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2826 }
2827
Johan Hedberg94ea7252015-03-16 11:45:46 +02002828 if (smp->method == REQ_OOB) {
Johan Hedberga29b0732014-10-28 15:17:05 +01002829 if (hcon->out)
2830 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2831 sizeof(smp->prnd), smp->prnd);
2832
2833 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2834
2835 return 0;
2836 }
2837
Johan Hedberg38606f12014-06-25 11:10:28 +03002838 if (hcon->out)
2839 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2840
2841 if (smp->method == REQ_PASSKEY) {
2842 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2843 hcon->dst_type))
2844 return SMP_UNSPECIFIED;
2845 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2846 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2847 return 0;
2848 }
2849
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002850 /* The Initiating device waits for the non-initiating device to
2851 * send the confirm value.
2852 */
2853 if (conn->hcon->out)
2854 return 0;
2855
2856 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2857 0, cfm.confirm_val);
2858 if (err)
2859 return SMP_UNSPECIFIED;
2860
2861 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2862 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2863
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002864 return 0;
2865}
2866
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002867static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2868{
2869 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2870 struct l2cap_chan *chan = conn->smp;
2871 struct hci_conn *hcon = conn->hcon;
2872 struct smp_chan *smp = chan->data;
2873 u8 a[7], b[7], *local_addr, *remote_addr;
2874 u8 io_cap[3], r[16], e[16];
2875 int err;
2876
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002877 bt_dev_dbg(hcon->hdev, "conn %p", conn);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002878
2879 if (skb->len < sizeof(*check))
2880 return SMP_INVALID_PARAMS;
2881
2882 memcpy(a, &hcon->init_addr, 6);
2883 memcpy(b, &hcon->resp_addr, 6);
2884 a[6] = hcon->init_addr_type;
2885 b[6] = hcon->resp_addr_type;
2886
2887 if (hcon->out) {
2888 local_addr = a;
2889 remote_addr = b;
2890 memcpy(io_cap, &smp->prsp[1], 3);
2891 } else {
2892 local_addr = b;
2893 remote_addr = a;
2894 memcpy(io_cap, &smp->preq[1], 3);
2895 }
2896
2897 memset(r, 0, sizeof(r));
2898
Johan Hedberg38606f12014-06-25 11:10:28 +03002899 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2900 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg882fafa2015-03-16 11:45:43 +02002901 else if (smp->method == REQ_OOB)
2902 memcpy(r, smp->lr, 16);
Johan Hedberg38606f12014-06-25 11:10:28 +03002903
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002904 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2905 io_cap, remote_addr, local_addr, e);
2906 if (err)
2907 return SMP_UNSPECIFIED;
2908
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002909 if (crypto_memneq(check->e, e, 16))
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002910 return SMP_DHKEY_CHECK_FAILED;
2911
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002912 if (!hcon->out) {
2913 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2914 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2915 return 0;
2916 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002917
Archie Pusakafad646e2021-05-31 16:37:25 +08002918 /* Responder sends DHKey check as response to initiator */
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002919 sc_dhkey_check(smp);
2920 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002921
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002922 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002923
2924 if (hcon->out) {
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002925 hci_le_start_enc(hcon, 0, 0, smp->tk, smp->enc_key_size);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002926 hcon->enc_key_size = smp->enc_key_size;
2927 }
2928
2929 return 0;
2930}
2931
Johan Hedberg1408bb62014-06-04 22:45:57 +03002932static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2933 struct sk_buff *skb)
2934{
2935 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2936
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07002937 bt_dev_dbg(conn->hcon->hdev, "value 0x%02x", kp->value);
Johan Hedberg1408bb62014-06-04 22:45:57 +03002938
2939 return 0;
2940}
2941
Johan Hedberg4befb862014-08-11 22:06:38 +03002942static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002943{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002944 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002945 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002946 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002947 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002948 int err = 0;
2949
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002950 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002951 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002952
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002953 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002954 reason = SMP_PAIRING_NOTSUPP;
2955 goto done;
2956 }
2957
Marcel Holtmann92381f52013-10-03 01:23:08 -07002958 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002959 skb_pull(skb, sizeof(code));
2960
Johan Hedbergb28b4942014-09-05 22:19:55 +03002961 smp = chan->data;
2962
2963 if (code > SMP_CMD_MAX)
2964 goto drop;
2965
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002966 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002967 goto drop;
2968
2969 /* If we don't have a context the only allowed commands are
2970 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002971 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002972 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2973 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002974
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002975 switch (code) {
2976 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002977 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002978 break;
2979
2980 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002981 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002982 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002983 break;
2984
2985 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002986 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002987 break;
2988
2989 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002990 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002991 break;
2992
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002993 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002994 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002995 break;
2996
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002997 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002998 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002999 break;
3000
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003001 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03003002 reason = smp_cmd_encrypt_info(conn, skb);
3003 break;
3004
Archie Pusakafad646e2021-05-31 16:37:25 +08003005 case SMP_CMD_INITIATOR_IDENT:
3006 reason = smp_cmd_initiator_ident(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03003007 break;
3008
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003009 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02003010 reason = smp_cmd_ident_info(conn, skb);
3011 break;
3012
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003013 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02003014 reason = smp_cmd_ident_addr_info(conn, skb);
3015 break;
3016
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003017 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07003018 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03003019 break;
3020
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03003021 case SMP_CMD_PUBLIC_KEY:
3022 reason = smp_cmd_public_key(conn, skb);
3023 break;
3024
Johan Hedberg6433a9a2014-06-06 11:47:30 +03003025 case SMP_CMD_DHKEY_CHECK:
3026 reason = smp_cmd_dhkey_check(conn, skb);
3027 break;
3028
Johan Hedberg1408bb62014-06-04 22:45:57 +03003029 case SMP_CMD_KEYPRESS_NOTIFY:
3030 reason = smp_cmd_keypress_notify(conn, skb);
3031 break;
3032
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003033 default:
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003034 bt_dev_dbg(hcon->hdev, "Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003035 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03003036 goto done;
3037 }
3038
3039done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03003040 if (!err) {
3041 if (reason)
3042 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03003043 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03003044 }
3045
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003046 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03003047
3048drop:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003049 bt_dev_err(hcon->hdev, "unexpected SMP command 0x%02x from %pMR",
3050 code, &hcon->dst);
Johan Hedbergb28b4942014-09-05 22:19:55 +03003051 kfree_skb(skb);
3052 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003053}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03003054
Johan Hedberg70db83c2014-08-08 09:37:16 +03003055static void smp_teardown_cb(struct l2cap_chan *chan, int err)
3056{
3057 struct l2cap_conn *conn = chan->conn;
3058
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003059 bt_dev_dbg(conn->hcon->hdev, "chan %p", chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003060
Johan Hedbergfc75cc82014-09-05 22:19:52 +03003061 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003062 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003063
Johan Hedberg70db83c2014-08-08 09:37:16 +03003064 conn->smp = NULL;
3065 l2cap_chan_put(chan);
3066}
3067
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003068static void bredr_pairing(struct l2cap_chan *chan)
3069{
3070 struct l2cap_conn *conn = chan->conn;
3071 struct hci_conn *hcon = conn->hcon;
3072 struct hci_dev *hdev = hcon->hdev;
3073 struct smp_cmd_pairing req;
3074 struct smp_chan *smp;
3075
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003076 bt_dev_dbg(hdev, "chan %p", chan);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003077
3078 /* Only new pairings are interesting */
3079 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
3080 return;
3081
3082 /* Don't bother if we're not encrypted */
3083 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3084 return;
3085
Archie Pusaka74be5232021-06-04 16:26:25 +08003086 /* Only initiator may initiate SMP over BR/EDR */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003087 if (hcon->role != HCI_ROLE_MASTER)
3088 return;
3089
3090 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003091 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003092 return;
3093
3094 /* BR/EDR must use Secure Connections for SMP */
3095 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003096 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003097 return;
3098
3099 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003100 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003101 return;
3102
3103 /* Don't bother if remote LE support is not enabled */
3104 if (!lmp_host_le_capable(hcon))
3105 return;
3106
3107 /* Remote must support SMP fixed chan for BR/EDR */
3108 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
3109 return;
3110
3111 /* Don't bother if SMP is already ongoing */
3112 if (chan->data)
3113 return;
3114
3115 smp = smp_chan_create(conn);
3116 if (!smp) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003117 bt_dev_err(hdev, "unable to create SMP context for BR/EDR");
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003118 return;
3119 }
3120
3121 set_bit(SMP_FLAG_SC, &smp->flags);
3122
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003123 bt_dev_dbg(hdev, "starting SMP over BR/EDR");
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003124
3125 /* Prepare and send the BR/EDR SMP Pairing Request */
3126 build_bredr_pairing_cmd(smp, &req, NULL);
3127
3128 smp->preq[0] = SMP_CMD_PAIRING_REQ;
3129 memcpy(&smp->preq[1], &req, sizeof(req));
3130
3131 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
3132 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
3133}
3134
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003135static void smp_resume_cb(struct l2cap_chan *chan)
3136{
Johan Hedbergb68fda62014-08-11 22:06:40 +03003137 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003138 struct l2cap_conn *conn = chan->conn;
3139 struct hci_conn *hcon = conn->hcon;
3140
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003141 bt_dev_dbg(hcon->hdev, "chan %p", chan);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003142
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003143 if (hcon->type == ACL_LINK) {
3144 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003145 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003146 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003147
Johan Hedberg86d14072014-08-11 22:06:43 +03003148 if (!smp)
3149 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03003150
Johan Hedberg84bc0db2014-09-05 22:19:49 +03003151 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3152 return;
3153
Johan Hedberg86d14072014-08-11 22:06:43 +03003154 cancel_delayed_work(&smp->security_timer);
3155
Johan Hedbergd6268e82014-09-05 22:19:51 +03003156 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003157}
3158
Johan Hedberg70db83c2014-08-08 09:37:16 +03003159static void smp_ready_cb(struct l2cap_chan *chan)
3160{
3161 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003162 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003163
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003164 bt_dev_dbg(hcon->hdev, "chan %p", chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003165
Johan Hedberg78837462015-11-11 21:47:12 +02003166 /* No need to call l2cap_chan_hold() here since we already own
3167 * the reference taken in smp_new_conn_cb(). This is just the
3168 * first time that we tie it to a specific pointer. The code in
3169 * l2cap_core.c ensures that there's no risk this function wont
3170 * get called if smp_new_conn_cb was previously called.
3171 */
Johan Hedberg70db83c2014-08-08 09:37:16 +03003172 conn->smp = chan;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003173
3174 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3175 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003176}
3177
Johan Hedberg4befb862014-08-11 22:06:38 +03003178static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
3179{
3180 int err;
3181
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003182 bt_dev_dbg(chan->conn->hcon->hdev, "chan %p", chan);
Johan Hedberg4befb862014-08-11 22:06:38 +03003183
3184 err = smp_sig_channel(chan, skb);
3185 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03003186 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03003187
Johan Hedbergb68fda62014-08-11 22:06:40 +03003188 if (smp)
3189 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03003190
Johan Hedberg1e91c292014-08-18 20:33:29 +03003191 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03003192 }
3193
3194 return err;
3195}
3196
Johan Hedberg70db83c2014-08-08 09:37:16 +03003197static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
3198 unsigned long hdr_len,
3199 unsigned long len, int nb)
3200{
3201 struct sk_buff *skb;
3202
3203 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
3204 if (!skb)
3205 return ERR_PTR(-ENOMEM);
3206
3207 skb->priority = HCI_PRIO_MAX;
Johan Hedberga4368ff2015-03-30 23:21:01 +03003208 bt_cb(skb)->l2cap.chan = chan;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003209
3210 return skb;
3211}
3212
3213static const struct l2cap_ops smp_chan_ops = {
3214 .name = "Security Manager",
3215 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003216 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003217 .alloc_skb = smp_alloc_skb_cb,
3218 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003219 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003220
3221 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003222 .state_change = l2cap_chan_no_state_change,
3223 .close = l2cap_chan_no_close,
3224 .defer = l2cap_chan_no_defer,
3225 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003226 .set_shutdown = l2cap_chan_no_set_shutdown,
3227 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003228};
3229
3230static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
3231{
3232 struct l2cap_chan *chan;
3233
Luiz Augusto von Dentz995fca12021-06-14 10:46:44 -07003234 BT_DBG("pchan %p", pchan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003235
3236 chan = l2cap_chan_create();
3237 if (!chan)
3238 return NULL;
3239
3240 chan->chan_type = pchan->chan_type;
3241 chan->ops = &smp_chan_ops;
3242 chan->scid = pchan->scid;
3243 chan->dcid = chan->scid;
3244 chan->imtu = pchan->imtu;
3245 chan->omtu = pchan->omtu;
3246 chan->mode = pchan->mode;
3247
Johan Hedbergabe84902014-11-12 22:22:21 +02003248 /* Other L2CAP channels may request SMP routines in order to
3249 * change the security level. This means that the SMP channel
3250 * lock must be considered in its own category to avoid lockdep
3251 * warnings.
3252 */
3253 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
3254
Luiz Augusto von Dentz995fca12021-06-14 10:46:44 -07003255 BT_DBG("created chan %p", chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003256
3257 return chan;
3258}
3259
3260static const struct l2cap_ops smp_root_chan_ops = {
3261 .name = "Security Manager Root",
3262 .new_connection = smp_new_conn_cb,
3263
3264 /* None of these are implemented for the root channel */
3265 .close = l2cap_chan_no_close,
3266 .alloc_skb = l2cap_chan_no_alloc_skb,
3267 .recv = l2cap_chan_no_recv,
3268 .state_change = l2cap_chan_no_state_change,
3269 .teardown = l2cap_chan_no_teardown,
3270 .ready = l2cap_chan_no_ready,
3271 .defer = l2cap_chan_no_defer,
3272 .suspend = l2cap_chan_no_suspend,
3273 .resume = l2cap_chan_no_resume,
3274 .set_shutdown = l2cap_chan_no_set_shutdown,
3275 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003276};
3277
Johan Hedbergef8efe42014-08-13 15:12:32 +03003278static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003279{
Johan Hedberg70db83c2014-08-08 09:37:16 +03003280 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003281 struct smp_dev *smp;
Herbert Xu71af2f62016-01-24 21:18:30 +08003282 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003283 struct crypto_kpp *tfm_ecdh;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003284
Johan Hedbergef8efe42014-08-13 15:12:32 +03003285 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003286 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03003287 goto create_chan;
3288 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03003289
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003290 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3291 if (!smp)
3292 return ERR_PTR(-ENOMEM);
3293
Herbert Xu71af2f62016-01-24 21:18:30 +08003294 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003295 if (IS_ERR(tfm_cmac)) {
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003296 bt_dev_err(hdev, "Unable to create CMAC crypto context");
Waiman Long453431a2020-08-06 23:18:13 -07003297 kfree_sensitive(smp);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003298 return ERR_CAST(tfm_cmac);
3299 }
3300
Meng Yu6763f5e2021-03-04 14:35:46 +08003301 tfm_ecdh = crypto_alloc_kpp("ecdh-nist-p256", 0, 0);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003302 if (IS_ERR(tfm_ecdh)) {
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003303 bt_dev_err(hdev, "Unable to create ECDH crypto context");
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003304 crypto_free_shash(tfm_cmac);
Waiman Long453431a2020-08-06 23:18:13 -07003305 kfree_sensitive(smp);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003306 return ERR_CAST(tfm_ecdh);
3307 }
3308
Johan Hedberg94f14e42018-09-11 14:10:12 +03003309 smp->local_oob = false;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003310 smp->tfm_cmac = tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003311 smp->tfm_ecdh = tfm_ecdh;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003312
Johan Hedbergef8efe42014-08-13 15:12:32 +03003313create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003314 chan = l2cap_chan_create();
3315 if (!chan) {
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003316 if (smp) {
Herbert Xu71af2f62016-01-24 21:18:30 +08003317 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003318 crypto_free_kpp(smp->tfm_ecdh);
Waiman Long453431a2020-08-06 23:18:13 -07003319 kfree_sensitive(smp);
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003320 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003321 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003322 }
3323
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003324 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003325
Johan Hedbergef8efe42014-08-13 15:12:32 +03003326 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003327
3328 l2cap_chan_set_defaults(chan);
3329
Marcel Holtmann157029b2015-01-14 15:43:09 -08003330 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003331 u8 bdaddr_type;
3332
3333 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3334
3335 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003336 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003337 else
3338 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003339 } else {
3340 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003341 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003342 }
3343
Johan Hedberg70db83c2014-08-08 09:37:16 +03003344 chan->state = BT_LISTEN;
3345 chan->mode = L2CAP_MODE_BASIC;
3346 chan->imtu = L2CAP_DEFAULT_MTU;
3347 chan->ops = &smp_root_chan_ops;
3348
Johan Hedbergabe84902014-11-12 22:22:21 +02003349 /* Set correct nesting level for a parent/listening channel */
3350 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3351
Johan Hedbergef8efe42014-08-13 15:12:32 +03003352 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003353}
3354
Johan Hedbergef8efe42014-08-13 15:12:32 +03003355static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003356{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003357 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003358
Luiz Augusto von Dentz995fca12021-06-14 10:46:44 -07003359 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003360
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003361 smp = chan->data;
3362 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003363 chan->data = NULL;
Herbert Xu71af2f62016-01-24 21:18:30 +08003364 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003365 crypto_free_kpp(smp->tfm_ecdh);
Waiman Long453431a2020-08-06 23:18:13 -07003366 kfree_sensitive(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003367 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003368
Johan Hedberg70db83c2014-08-08 09:37:16 +03003369 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003370}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003371
Claire Chang82493312020-09-29 16:03:24 +08003372int smp_force_bredr(struct hci_dev *hdev, bool enable)
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003373{
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003374 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003375 return -EALREADY;
3376
3377 if (enable) {
3378 struct l2cap_chan *chan;
3379
3380 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3381 if (IS_ERR(chan))
3382 return PTR_ERR(chan);
3383
3384 hdev->smp_bredr_data = chan;
3385 } else {
3386 struct l2cap_chan *chan;
3387
3388 chan = hdev->smp_bredr_data;
3389 hdev->smp_bredr_data = NULL;
3390 smp_del_chan(chan);
3391 }
3392
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003393 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003394
Claire Chang82493312020-09-29 16:03:24 +08003395 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003396}
3397
Johan Hedbergef8efe42014-08-13 15:12:32 +03003398int smp_register(struct hci_dev *hdev)
3399{
3400 struct l2cap_chan *chan;
3401
Luiz Augusto von Dentz2e1614f2021-03-15 14:39:29 -07003402 bt_dev_dbg(hdev, "");
Johan Hedbergef8efe42014-08-13 15:12:32 +03003403
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003404 /* If the controller does not support Low Energy operation, then
3405 * there is also no need to register any SMP channel.
3406 */
3407 if (!lmp_le_capable(hdev))
3408 return 0;
3409
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003410 if (WARN_ON(hdev->smp_data)) {
3411 chan = hdev->smp_data;
3412 hdev->smp_data = NULL;
3413 smp_del_chan(chan);
3414 }
3415
Johan Hedbergef8efe42014-08-13 15:12:32 +03003416 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3417 if (IS_ERR(chan))
3418 return PTR_ERR(chan);
3419
3420 hdev->smp_data = chan;
3421
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003422 if (!lmp_sc_capable(hdev)) {
Szymon Janc83ebb9e2016-09-09 20:24:40 +02003423 /* Flag can be already set here (due to power toggle) */
3424 if (!hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
3425 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003426 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003427
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003428 if (WARN_ON(hdev->smp_bredr_data)) {
3429 chan = hdev->smp_bredr_data;
3430 hdev->smp_bredr_data = NULL;
3431 smp_del_chan(chan);
3432 }
3433
Johan Hedbergef8efe42014-08-13 15:12:32 +03003434 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3435 if (IS_ERR(chan)) {
3436 int err = PTR_ERR(chan);
3437 chan = hdev->smp_data;
3438 hdev->smp_data = NULL;
3439 smp_del_chan(chan);
3440 return err;
3441 }
3442
3443 hdev->smp_bredr_data = chan;
3444
3445 return 0;
3446}
3447
3448void smp_unregister(struct hci_dev *hdev)
3449{
3450 struct l2cap_chan *chan;
3451
3452 if (hdev->smp_bredr_data) {
3453 chan = hdev->smp_bredr_data;
3454 hdev->smp_bredr_data = NULL;
3455 smp_del_chan(chan);
3456 }
3457
3458 if (hdev->smp_data) {
3459 chan = hdev->smp_data;
3460 hdev->smp_data = NULL;
3461 smp_del_chan(chan);
3462 }
3463}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003464
3465#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3466
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003467static int __init test_debug_key(struct crypto_kpp *tfm_ecdh)
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003468{
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003469 u8 pk[64];
Tudor Ambarusa2976412017-09-28 17:14:52 +03003470 int err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003471
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003472 err = set_ecdh_privkey(tfm_ecdh, debug_sk);
Tudor Ambarusa2976412017-09-28 17:14:52 +03003473 if (err)
3474 return err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003475
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003476 err = generate_ecdh_public_key(tfm_ecdh, pk);
3477 if (err)
3478 return err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003479
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003480 if (crypto_memneq(pk, debug_pk, 64))
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003481 return -EINVAL;
3482
3483 return 0;
3484}
3485
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003486static int __init test_ah(void)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003487{
3488 const u8 irk[16] = {
3489 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3490 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3491 const u8 r[3] = { 0x94, 0x81, 0x70 };
3492 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3493 u8 res[3];
3494 int err;
3495
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003496 err = smp_ah(irk, r, res);
Johan Hedbergcfc41982014-12-30 09:50:40 +02003497 if (err)
3498 return err;
3499
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003500 if (crypto_memneq(res, exp, 3))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003501 return -EINVAL;
3502
3503 return 0;
3504}
3505
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003506static int __init test_c1(void)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003507{
3508 const u8 k[16] = {
3509 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3510 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3511 const u8 r[16] = {
3512 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3513 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3514 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3515 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3516 const u8 _iat = 0x01;
3517 const u8 _rat = 0x00;
3518 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3519 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3520 const u8 exp[16] = {
3521 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3522 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3523 u8 res[16];
3524 int err;
3525
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003526 err = smp_c1(k, r, preq, pres, _iat, &ia, _rat, &ra, res);
Johan Hedbergcfc41982014-12-30 09:50:40 +02003527 if (err)
3528 return err;
3529
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003530 if (crypto_memneq(res, exp, 16))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003531 return -EINVAL;
3532
3533 return 0;
3534}
3535
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003536static int __init test_s1(void)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003537{
3538 const u8 k[16] = {
3539 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3540 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3541 const u8 r1[16] = {
3542 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3543 const u8 r2[16] = {
3544 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3545 const u8 exp[16] = {
3546 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3547 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3548 u8 res[16];
3549 int err;
3550
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003551 err = smp_s1(k, r1, r2, res);
Johan Hedbergcfc41982014-12-30 09:50:40 +02003552 if (err)
3553 return err;
3554
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003555 if (crypto_memneq(res, exp, 16))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003556 return -EINVAL;
3557
3558 return 0;
3559}
3560
Herbert Xu71af2f62016-01-24 21:18:30 +08003561static int __init test_f4(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003562{
3563 const u8 u[32] = {
3564 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3565 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3566 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3567 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3568 const u8 v[32] = {
3569 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3570 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3571 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3572 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3573 const u8 x[16] = {
3574 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3575 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3576 const u8 z = 0x00;
3577 const u8 exp[16] = {
3578 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3579 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3580 u8 res[16];
3581 int err;
3582
3583 err = smp_f4(tfm_cmac, u, v, x, z, res);
3584 if (err)
3585 return err;
3586
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003587 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003588 return -EINVAL;
3589
3590 return 0;
3591}
3592
Herbert Xu71af2f62016-01-24 21:18:30 +08003593static int __init test_f5(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003594{
3595 const u8 w[32] = {
3596 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3597 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3598 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3599 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3600 const u8 n1[16] = {
3601 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3602 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3603 const u8 n2[16] = {
3604 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3605 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3606 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3607 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3608 const u8 exp_ltk[16] = {
3609 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3610 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3611 const u8 exp_mackey[16] = {
3612 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3613 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3614 u8 mackey[16], ltk[16];
3615 int err;
3616
3617 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3618 if (err)
3619 return err;
3620
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003621 if (crypto_memneq(mackey, exp_mackey, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003622 return -EINVAL;
3623
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003624 if (crypto_memneq(ltk, exp_ltk, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003625 return -EINVAL;
3626
3627 return 0;
3628}
3629
Herbert Xu71af2f62016-01-24 21:18:30 +08003630static int __init test_f6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003631{
3632 const u8 w[16] = {
3633 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3634 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3635 const u8 n1[16] = {
3636 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3637 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3638 const u8 n2[16] = {
3639 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3640 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3641 const u8 r[16] = {
3642 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3643 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3644 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3645 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3646 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3647 const u8 exp[16] = {
3648 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3649 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3650 u8 res[16];
3651 int err;
3652
3653 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3654 if (err)
3655 return err;
3656
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003657 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003658 return -EINVAL;
3659
3660 return 0;
3661}
3662
Herbert Xu71af2f62016-01-24 21:18:30 +08003663static int __init test_g2(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003664{
3665 const u8 u[32] = {
3666 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3667 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3668 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3669 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3670 const u8 v[32] = {
3671 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3672 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3673 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3674 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3675 const u8 x[16] = {
3676 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3677 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3678 const u8 y[16] = {
3679 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3680 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3681 const u32 exp_val = 0x2f9ed5ba % 1000000;
3682 u32 val;
3683 int err;
3684
3685 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3686 if (err)
3687 return err;
3688
3689 if (val != exp_val)
3690 return -EINVAL;
3691
3692 return 0;
3693}
3694
Herbert Xu71af2f62016-01-24 21:18:30 +08003695static int __init test_h6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003696{
3697 const u8 w[16] = {
3698 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3699 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3700 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3701 const u8 exp[16] = {
3702 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3703 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3704 u8 res[16];
3705 int err;
3706
3707 err = smp_h6(tfm_cmac, w, key_id, res);
3708 if (err)
3709 return err;
3710
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003711 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003712 return -EINVAL;
3713
3714 return 0;
3715}
3716
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003717static char test_smp_buffer[32];
3718
3719static ssize_t test_smp_read(struct file *file, char __user *user_buf,
3720 size_t count, loff_t *ppos)
3721{
3722 return simple_read_from_buffer(user_buf, count, ppos, test_smp_buffer,
3723 strlen(test_smp_buffer));
3724}
3725
3726static const struct file_operations test_smp_fops = {
3727 .open = simple_open,
3728 .read = test_smp_read,
3729 .llseek = default_llseek,
3730};
3731
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003732static int __init run_selftests(struct crypto_shash *tfm_cmac,
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003733 struct crypto_kpp *tfm_ecdh)
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003734{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003735 ktime_t calltime, delta, rettime;
3736 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003737 int err;
3738
Marcel Holtmann255047b2014-12-30 00:11:20 -08003739 calltime = ktime_get();
3740
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003741 err = test_debug_key(tfm_ecdh);
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003742 if (err) {
3743 BT_ERR("debug_key test failed");
3744 goto done;
3745 }
3746
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003747 err = test_ah();
Johan Hedbergcfc41982014-12-30 09:50:40 +02003748 if (err) {
3749 BT_ERR("smp_ah test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003750 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003751 }
3752
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003753 err = test_c1();
Johan Hedbergcfc41982014-12-30 09:50:40 +02003754 if (err) {
3755 BT_ERR("smp_c1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003756 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003757 }
3758
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003759 err = test_s1();
Johan Hedbergcfc41982014-12-30 09:50:40 +02003760 if (err) {
3761 BT_ERR("smp_s1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003762 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003763 }
3764
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003765 err = test_f4(tfm_cmac);
3766 if (err) {
3767 BT_ERR("smp_f4 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003768 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003769 }
3770
3771 err = test_f5(tfm_cmac);
3772 if (err) {
3773 BT_ERR("smp_f5 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003774 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003775 }
3776
3777 err = test_f6(tfm_cmac);
3778 if (err) {
3779 BT_ERR("smp_f6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003780 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003781 }
3782
3783 err = test_g2(tfm_cmac);
3784 if (err) {
3785 BT_ERR("smp_g2 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003786 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003787 }
3788
3789 err = test_h6(tfm_cmac);
3790 if (err) {
3791 BT_ERR("smp_h6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003792 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003793 }
3794
Marcel Holtmann255047b2014-12-30 00:11:20 -08003795 rettime = ktime_get();
3796 delta = ktime_sub(rettime, calltime);
3797 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3798
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003799 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003800
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003801done:
3802 if (!err)
3803 snprintf(test_smp_buffer, sizeof(test_smp_buffer),
3804 "PASS (%llu usecs)\n", duration);
3805 else
3806 snprintf(test_smp_buffer, sizeof(test_smp_buffer), "FAIL\n");
3807
3808 debugfs_create_file("selftest_smp", 0444, bt_debugfs, NULL,
3809 &test_smp_fops);
3810
3811 return err;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003812}
3813
3814int __init bt_selftest_smp(void)
3815{
Herbert Xu71af2f62016-01-24 21:18:30 +08003816 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003817 struct crypto_kpp *tfm_ecdh;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003818 int err;
3819
Eric Biggers3d234b32018-11-14 12:21:11 -08003820 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003821 if (IS_ERR(tfm_cmac)) {
3822 BT_ERR("Unable to create CMAC crypto context");
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003823 return PTR_ERR(tfm_cmac);
3824 }
3825
Meng Yu6763f5e2021-03-04 14:35:46 +08003826 tfm_ecdh = crypto_alloc_kpp("ecdh-nist-p256", 0, 0);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003827 if (IS_ERR(tfm_ecdh)) {
3828 BT_ERR("Unable to create ECDH crypto context");
3829 crypto_free_shash(tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003830 return PTR_ERR(tfm_ecdh);
3831 }
3832
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003833 err = run_selftests(tfm_cmac, tfm_ecdh);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003834
Herbert Xu71af2f62016-01-24 21:18:30 +08003835 crypto_free_shash(tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003836 crypto_free_kpp(tfm_ecdh);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003837
3838 return err;
3839}
3840
3841#endif