blob: bf4bef13d9354bca4e6198ccce93ec9b08d4bec5 [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>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030028#include <crypto/b128ops.h>
Herbert Xu71af2f62016-01-24 21:18:30 +080029#include <crypto/hash.h>
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +030030#include <crypto/kpp.h>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030031
Anderson Brigliaeb492e02011-06-09 18:50:40 -030032#include <net/bluetooth/bluetooth.h>
33#include <net/bluetooth/hci_core.h>
34#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080035#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070036
Salvatore Benedetto58771c1c2017-04-24 13:13:20 +010037#include "ecdh_helper.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070038#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030039
Johan Hedberg2fd36552015-06-11 13:52:26 +030040#define SMP_DEV(hdev) \
41 ((struct smp_dev *)((struct l2cap_chan *)((hdev)->smp_data))->data)
42
Johan Hedbergc7a3d572014-12-01 22:03:16 +020043/* Low-level debug macros to be used for stuff that we don't want
44 * accidentially in dmesg, i.e. the values of the various crypto keys
45 * and the inputs & outputs of crypto functions.
46 */
47#ifdef DEBUG
48#define SMP_DBG(fmt, ...) printk(KERN_DEBUG "%s: " fmt, __func__, \
49 ##__VA_ARGS__)
50#else
51#define SMP_DBG(fmt, ...) no_printk(KERN_DEBUG "%s: " fmt, __func__, \
52 ##__VA_ARGS__)
53#endif
54
Johan Hedbergb28b4942014-09-05 22:19:55 +030055#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030056
Johan Hedberg3b191462014-06-06 10:50:15 +030057/* Keys which are not distributed with Secure Connections */
58#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
59
Marcel Holtmann17b02e62012-03-01 14:32:37 -080060#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030061
Marcel Holtmannd7a5a112015-03-13 02:11:00 -070062#define AUTH_REQ_MASK(dev) (hci_dev_test_flag(dev, HCI_SC_ENABLED) ? \
Johan Hedberga62da6f2016-12-08 08:32:54 +020063 0x3f : 0x07)
Johan Hedberg0edb14d2014-05-26 13:29:28 +030064#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020065
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030066/* Maximum message length that can be passed to aes_cmac */
67#define CMAC_MSG_MAX 80
68
Johan Hedberg533e35d2014-06-16 19:25:18 +030069enum {
70 SMP_FLAG_TK_VALID,
71 SMP_FLAG_CFM_PENDING,
72 SMP_FLAG_MITM_AUTH,
73 SMP_FLAG_COMPLETE,
74 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030075 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030076 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030077 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030078 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030079 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg1a8bab42015-03-16 11:45:44 +020080 SMP_FLAG_REMOTE_OOB,
81 SMP_FLAG_LOCAL_OOB,
Johan Hedberga62da6f2016-12-08 08:32:54 +020082 SMP_FLAG_CT2,
Johan Hedberg533e35d2014-06-16 19:25:18 +030083};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030084
Marcel Holtmann88a479d2015-03-16 01:10:19 -070085struct smp_dev {
Marcel Holtmann60a27d62015-03-16 01:10:22 -070086 /* Secure Connections OOB data */
Johan Hedberg94f14e42018-09-11 14:10:12 +030087 bool local_oob;
Marcel Holtmann60a27d62015-03-16 01:10:22 -070088 u8 local_pk[64];
Marcel Holtmannfb334fe2015-03-16 12:34:57 -070089 u8 local_rand[16];
Marcel Holtmann60a27d62015-03-16 01:10:22 -070090 bool debug_key;
91
Herbert Xu71af2f62016-01-24 21:18:30 +080092 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +030093 struct crypto_kpp *tfm_ecdh;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070094};
95
Johan Hedberg4bc58f52014-05-20 09:45:47 +030096struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030097 struct l2cap_conn *conn;
98 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030099 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +0300100
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300101 u8 preq[7]; /* SMP Pairing Request */
102 u8 prsp[7]; /* SMP Pairing Response */
103 u8 prnd[16]; /* SMP Pairing Random (local) */
104 u8 rrnd[16]; /* SMP Pairing Random (remote) */
105 u8 pcnf[16]; /* SMP Pairing Confirm */
106 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberg882fafa2015-03-16 11:45:43 +0200107 u8 rr[16]; /* Remote OOB ra/rb value */
108 u8 lr[16]; /* Local OOB ra/rb value */
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300109 u8 enc_key_size;
110 u8 remote_key_dist;
111 bdaddr_t id_addr;
112 u8 id_addr_type;
113 u8 irk[16];
114 struct smp_csrk *csrk;
115 struct smp_csrk *slave_csrk;
116 struct smp_ltk *ltk;
117 struct smp_ltk *slave_ltk;
118 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300119 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300120 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300121 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300122 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300123
Johan Hedberg3b191462014-06-06 10:50:15 +0300124 /* Secure Connections variables */
125 u8 local_pk[64];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300126 u8 remote_pk[64];
127 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300128 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300129
Herbert Xu71af2f62016-01-24 21:18:30 +0800130 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +0300131 struct crypto_kpp *tfm_ecdh;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300132};
133
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300134/* These debug key values are defined in the SMP section of the core
135 * specification. debug_pk is the public debug key and debug_sk the
136 * private debug key.
137 */
138static const u8 debug_pk[64] = {
139 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
140 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
141 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
142 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
143
144 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
145 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
146 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
147 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
148};
149
150static const u8 debug_sk[32] = {
151 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
152 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
153 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
154 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
155};
156
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300157static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300158{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300159 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300160
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300161 for (i = 0; i < len; i++)
162 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300163}
164
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200165/* The following functions map to the LE SC SMP crypto functions
166 * AES-CMAC, f4, f5, f6, g2 and h6.
167 */
168
Herbert Xu71af2f62016-01-24 21:18:30 +0800169static int aes_cmac(struct crypto_shash *tfm, const u8 k[16], const u8 *m,
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300170 size_t len, u8 mac[16])
171{
172 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300173 int err;
174
175 if (len > CMAC_MSG_MAX)
176 return -EFBIG;
177
178 if (!tfm) {
179 BT_ERR("tfm %p", tfm);
180 return -EINVAL;
181 }
182
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300183 /* Swap key and message from LSB to MSB */
184 swap_buf(k, tmp, 16);
185 swap_buf(m, msg_msb, len);
186
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200187 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
188 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300189
Herbert Xu71af2f62016-01-24 21:18:30 +0800190 err = crypto_shash_setkey(tfm, tmp, 16);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300191 if (err) {
192 BT_ERR("cipher setkey failed: %d", err);
193 return err;
194 }
195
Eric Biggersec0bf6e2020-05-01 22:31:19 -0700196 err = crypto_shash_tfm_digest(tfm, msg_msb, len, mac_msb);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300197 if (err) {
Herbert Xu71af2f62016-01-24 21:18:30 +0800198 BT_ERR("Hash computation error %d", err);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300199 return err;
200 }
201
202 swap_buf(mac_msb, mac, 16);
203
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200204 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300205
206 return 0;
207}
208
Herbert Xu71af2f62016-01-24 21:18:30 +0800209static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
210 const u8 v[32], const u8 x[16], u8 z, u8 res[16])
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300211{
212 u8 m[65];
213 int err;
214
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200215 SMP_DBG("u %32phN", u);
216 SMP_DBG("v %32phN", v);
217 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300218
219 m[0] = z;
220 memcpy(m + 1, v, 32);
221 memcpy(m + 33, u, 32);
222
223 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
224 if (err)
225 return err;
226
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200227 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300228
229 return err;
230}
231
Herbert Xu71af2f62016-01-24 21:18:30 +0800232static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200233 const u8 n1[16], const u8 n2[16], const u8 a1[7],
234 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300235{
236 /* The btle, salt and length "magic" values are as defined in
237 * the SMP section of the Bluetooth core specification. In ASCII
238 * the btle value ends up being 'btle'. The salt is just a
239 * random number whereas length is the value 256 in little
240 * endian format.
241 */
242 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
243 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
244 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
245 const u8 length[2] = { 0x00, 0x01 };
246 u8 m[53], t[16];
247 int err;
248
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200249 SMP_DBG("w %32phN", w);
250 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
251 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300252
253 err = aes_cmac(tfm_cmac, salt, w, 32, t);
254 if (err)
255 return err;
256
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200257 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300258
259 memcpy(m, length, 2);
260 memcpy(m + 2, a2, 7);
261 memcpy(m + 9, a1, 7);
262 memcpy(m + 16, n2, 16);
263 memcpy(m + 32, n1, 16);
264 memcpy(m + 48, btle, 4);
265
266 m[52] = 0; /* Counter */
267
268 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
269 if (err)
270 return err;
271
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200272 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300273
274 m[52] = 1; /* Counter */
275
276 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
277 if (err)
278 return err;
279
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200280 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300281
282 return 0;
283}
284
Herbert Xu71af2f62016-01-24 21:18:30 +0800285static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200286 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300287 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
288 u8 res[16])
289{
290 u8 m[65];
291 int err;
292
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200293 SMP_DBG("w %16phN", w);
294 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
295 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300296
297 memcpy(m, a2, 7);
298 memcpy(m + 7, a1, 7);
299 memcpy(m + 14, io_cap, 3);
300 memcpy(m + 17, r, 16);
301 memcpy(m + 33, n2, 16);
302 memcpy(m + 49, n1, 16);
303
304 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
305 if (err)
306 return err;
307
Marcel Holtmann203de212014-12-31 20:01:22 -0800308 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300309
310 return err;
311}
312
Herbert Xu71af2f62016-01-24 21:18:30 +0800313static int smp_g2(struct crypto_shash *tfm_cmac, const u8 u[32], const u8 v[32],
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300314 const u8 x[16], const u8 y[16], u32 *val)
315{
316 u8 m[80], tmp[16];
317 int err;
318
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200319 SMP_DBG("u %32phN", u);
320 SMP_DBG("v %32phN", v);
321 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300322
323 memcpy(m, y, 16);
324 memcpy(m + 16, v, 32);
325 memcpy(m + 48, u, 32);
326
327 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
328 if (err)
329 return err;
330
331 *val = get_unaligned_le32(tmp);
332 *val %= 1000000;
333
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200334 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +0300335
336 return 0;
337}
338
Herbert Xu71af2f62016-01-24 21:18:30 +0800339static int smp_h6(struct crypto_shash *tfm_cmac, const u8 w[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200340 const u8 key_id[4], u8 res[16])
341{
342 int err;
343
344 SMP_DBG("w %16phN key_id %4phN", w, key_id);
345
346 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
347 if (err)
348 return err;
349
350 SMP_DBG("res %16phN", res);
351
352 return err;
353}
354
Johan Hedberga62da6f2016-12-08 08:32:54 +0200355static int smp_h7(struct crypto_shash *tfm_cmac, const u8 w[16],
356 const u8 salt[16], u8 res[16])
357{
358 int err;
359
360 SMP_DBG("w %16phN salt %16phN", w, salt);
361
362 err = aes_cmac(tfm_cmac, salt, w, 16, res);
363 if (err)
364 return err;
365
366 SMP_DBG("res %16phN", res);
367
368 return err;
369}
370
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200371/* The following functions map to the legacy SMP crypto functions e, c1,
372 * s1 and ah.
373 */
374
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200375static int smp_e(const u8 *k, u8 *r)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300376{
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200377 struct crypto_aes_ctx ctx;
Johan Hedberg943a7322014-03-18 12:58:24 +0200378 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200379 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300380
Johan Hedberg011c3912015-05-19 21:06:04 +0300381 SMP_DBG("k %16phN r %16phN", k, r);
382
Johan Hedberg943a7322014-03-18 12:58:24 +0200383 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300384 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200385
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200386 err = aes_expandkey(&ctx, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300387 if (err) {
388 BT_ERR("cipher setkey failed: %d", err);
389 return err;
390 }
391
Johan Hedberg943a7322014-03-18 12:58:24 +0200392 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300393 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200394
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200395 aes_encrypt(&ctx, data, data);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300396
Johan Hedberg943a7322014-03-18 12:58:24 +0200397 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300398 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200399
Johan Hedberg011c3912015-05-19 21:06:04 +0300400 SMP_DBG("r %16phN", r);
401
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200402 memzero_explicit(&ctx, sizeof (ctx));
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300403 return err;
404}
405
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200406static int smp_c1(const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200407 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
408 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
409{
410 u8 p1[16], p2[16];
411 int err;
412
Johan Hedberg011c3912015-05-19 21:06:04 +0300413 SMP_DBG("k %16phN r %16phN", k, r);
414 SMP_DBG("iat %u ia %6phN rat %u ra %6phN", _iat, ia, _rat, ra);
415 SMP_DBG("preq %7phN pres %7phN", preq, pres);
416
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200417 memset(p1, 0, 16);
418
419 /* p1 = pres || preq || _rat || _iat */
420 p1[0] = _iat;
421 p1[1] = _rat;
422 memcpy(p1 + 2, preq, 7);
423 memcpy(p1 + 9, pres, 7);
424
Johan Hedberg011c3912015-05-19 21:06:04 +0300425 SMP_DBG("p1 %16phN", p1);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200426
427 /* res = r XOR p1 */
428 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
429
430 /* res = e(k, res) */
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200431 err = smp_e(k, res);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200432 if (err) {
433 BT_ERR("Encrypt data error");
434 return err;
435 }
436
Johan Hedberg011c3912015-05-19 21:06:04 +0300437 /* p2 = padding || ia || ra */
438 memcpy(p2, ra, 6);
439 memcpy(p2 + 6, ia, 6);
440 memset(p2 + 12, 0, 4);
441
442 SMP_DBG("p2 %16phN", p2);
443
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200444 /* res = res XOR p2 */
445 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
446
447 /* res = e(k, res) */
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200448 err = smp_e(k, res);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200449 if (err)
450 BT_ERR("Encrypt data error");
451
452 return err;
453}
454
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200455static int smp_s1(const u8 k[16],
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200456 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300457{
458 int err;
459
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200460 /* Just least significant octets from r1 and r2 are considered */
461 memcpy(_r, r2, 8);
462 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300463
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200464 err = smp_e(k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300465 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200466 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300467
468 return err;
469}
470
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200471static int smp_ah(const u8 irk[16], const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200472{
Johan Hedberg943a7322014-03-18 12:58:24 +0200473 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200474 int err;
475
476 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200477 memcpy(_res, r, 3);
478 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200479
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200480 err = smp_e(irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200481 if (err) {
482 BT_ERR("Encrypt error");
483 return err;
484 }
485
486 /* The output of the random address function ah is:
Marcel Holtmannc5080d42015-09-04 17:08:18 +0200487 * ah(k, r) = e(k, r') mod 2^24
Johan Hedberg60478052014-02-18 10:19:31 +0200488 * The output of the security function e is then truncated to 24 bits
489 * by taking the least significant 24 bits of the output of e as the
490 * result of ah.
491 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200492 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200493
494 return 0;
495}
496
Johan Hedbergcd082792014-12-02 13:37:41 +0200497bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
498 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200499{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300500 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedberg60478052014-02-18 10:19:31 +0200501 u8 hash[3];
502 int err;
503
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300504 if (!chan || !chan->data)
505 return false;
506
Marcel Holtmann56860242020-05-06 09:57:50 +0200507 bt_dev_dbg(hdev, "RPA %pMR IRK %*phN", bdaddr, 16, irk);
Johan Hedberg60478052014-02-18 10:19:31 +0200508
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200509 err = smp_ah(irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200510 if (err)
511 return false;
512
Jason A. Donenfeld329d8232017-06-10 04:59:11 +0200513 return !crypto_memneq(bdaddr->b, hash, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200514}
515
Johan Hedbergcd082792014-12-02 13:37:41 +0200516int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200517{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300518 struct l2cap_chan *chan = hdev->smp_data;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200519 int err;
520
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300521 if (!chan || !chan->data)
522 return -EOPNOTSUPP;
523
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200524 get_random_bytes(&rpa->b[3], 3);
525
526 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
527 rpa->b[5] |= 0x40; /* Set second most significant bit */
528
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200529 err = smp_ah(irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200530 if (err < 0)
531 return err;
532
Marcel Holtmann56860242020-05-06 09:57:50 +0200533 bt_dev_dbg(hdev, "RPA %pMR", rpa);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200534
535 return 0;
536}
537
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700538int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
539{
540 struct l2cap_chan *chan = hdev->smp_data;
541 struct smp_dev *smp;
542 int err;
543
544 if (!chan || !chan->data)
545 return -EOPNOTSUPP;
546
547 smp = chan->data;
548
549 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Marcel Holtmann56860242020-05-06 09:57:50 +0200550 bt_dev_dbg(hdev, "Using debug keys");
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300551 err = set_ecdh_privkey(smp->tfm_ecdh, debug_sk);
552 if (err)
553 return err;
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700554 memcpy(smp->local_pk, debug_pk, 64);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700555 smp->debug_key = true;
556 } else {
557 while (true) {
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300558 /* Generate key pair for Secure Connections */
559 err = generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk);
Tudor Ambarusa2976412017-09-28 17:14:52 +0300560 if (err)
561 return err;
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700562
563 /* This is unlikely, but we need to check that
564 * we didn't accidentially generate a debug key.
565 */
Tudor Ambarusc0153b02017-09-28 17:14:55 +0300566 if (crypto_memneq(smp->local_pk, debug_pk, 64))
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700567 break;
568 }
569 smp->debug_key = false;
570 }
571
572 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
573 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700574
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700575 get_random_bytes(smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700576
577 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700578 smp->local_rand, 0, hash);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700579 if (err < 0)
580 return err;
581
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700582 memcpy(rand, smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700583
Johan Hedberg94f14e42018-09-11 14:10:12 +0300584 smp->local_oob = true;
585
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700586 return 0;
587}
588
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300589static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
590{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300591 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300592 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300593 struct kvec iv[2];
594 struct msghdr msg;
595
596 if (!chan)
597 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300598
599 BT_DBG("code 0x%2.2x", code);
600
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300601 iv[0].iov_base = &code;
602 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300603
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300604 iv[1].iov_base = data;
605 iv[1].iov_len = len;
606
607 memset(&msg, 0, sizeof(msg));
608
David Howellsaa563d72018-10-20 00:57:56 +0100609 iov_iter_kvec(&msg.msg_iter, WRITE, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300610
611 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300612
Johan Hedbergb68fda62014-08-11 22:06:40 +0300613 if (!chan->data)
614 return;
615
616 smp = chan->data;
617
618 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300619 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300620}
621
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300622static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800623{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300624 if (authreq & SMP_AUTH_MITM) {
625 if (authreq & SMP_AUTH_SC)
626 return BT_SECURITY_FIPS;
627 else
628 return BT_SECURITY_HIGH;
629 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800630 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300631 }
Brian Gix2b64d152011-12-21 16:12:12 -0800632}
633
634static __u8 seclevel_to_authreq(__u8 sec_level)
635{
636 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300637 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800638 case BT_SECURITY_HIGH:
639 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
640 case BT_SECURITY_MEDIUM:
641 return SMP_AUTH_BONDING;
642 default:
643 return SMP_AUTH_NONE;
644 }
645}
646
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300647static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700648 struct smp_cmd_pairing *req,
649 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300650{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300651 struct l2cap_chan *chan = conn->smp;
652 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200653 struct hci_conn *hcon = conn->hcon;
654 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100655 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300656
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700657 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700658 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
659 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300660 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800661 } else {
662 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300663 }
664
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700665 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200666 remote_dist |= SMP_DIST_ID_KEY;
667
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700668 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200669 local_dist |= SMP_DIST_ID_KEY;
670
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700671 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100672 (authreq & SMP_AUTH_SC)) {
673 struct oob_data *oob_data;
674 u8 bdaddr_type;
675
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700676 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300677 local_dist |= SMP_DIST_LINK_KEY;
678 remote_dist |= SMP_DIST_LINK_KEY;
679 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100680
681 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
682 bdaddr_type = BDADDR_LE_PUBLIC;
683 else
684 bdaddr_type = BDADDR_LE_RANDOM;
685
686 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
687 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800688 if (oob_data && oob_data->present) {
Johan Hedberg1a8bab42015-03-16 11:45:44 +0200689 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100690 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100691 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100692 memcpy(smp->pcnf, oob_data->hash256, 16);
Marcel Holtmannbc07cd62015-03-16 12:34:56 -0700693 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf);
694 SMP_DBG("OOB Remote Random: %16phN", smp->rr);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100695 }
696
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300697 } else {
698 authreq &= ~SMP_AUTH_SC;
699 }
700
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300701 if (rsp == NULL) {
702 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100703 req->oob_flag = oob_flag;
Matias Karhumaa30d65e02018-09-28 21:54:30 +0300704 req->max_key_size = hdev->le_max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200705 req->init_key_dist = local_dist;
706 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300707 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200708
709 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300710 return;
711 }
712
713 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100714 rsp->oob_flag = oob_flag;
Matias Karhumaa30d65e02018-09-28 21:54:30 +0300715 rsp->max_key_size = hdev->le_max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200716 rsp->init_key_dist = req->init_key_dist & remote_dist;
717 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300718 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200719
720 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300721}
722
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300723static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
724{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300725 struct l2cap_chan *chan = conn->smp;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300726 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300727 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300728
Łukasz Rymanowski49c06c92020-05-13 10:18:53 +0200729 if (conn->hcon->pending_sec_level == BT_SECURITY_FIPS &&
730 max_key_size != SMP_MAX_ENC_KEY_SIZE)
731 return SMP_ENC_KEY_SIZE;
732
Matias Karhumaa30d65e02018-09-28 21:54:30 +0300733 if (max_key_size > hdev->le_max_key_size ||
Johan Hedberg2fd36552015-06-11 13:52:26 +0300734 max_key_size < SMP_MIN_ENC_KEY_SIZE)
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300735 return SMP_ENC_KEY_SIZE;
736
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300737 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300738
739 return 0;
740}
741
Johan Hedberg6f48e262014-08-11 22:06:44 +0300742static void smp_chan_destroy(struct l2cap_conn *conn)
743{
744 struct l2cap_chan *chan = conn->smp;
745 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200746 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300747 bool complete;
748
749 BUG_ON(!smp);
750
751 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300752
Johan Hedberg6f48e262014-08-11 22:06:44 +0300753 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200754 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300755
Waiman Long453431a2020-08-06 23:18:13 -0700756 kfree_sensitive(smp->csrk);
757 kfree_sensitive(smp->slave_csrk);
758 kfree_sensitive(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300759
Herbert Xu71af2f62016-01-24 21:18:30 +0800760 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +0300761 crypto_free_kpp(smp->tfm_ecdh);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300762
Johan Hedberg923e2412014-12-03 12:43:39 +0200763 /* Ensure that we don't leave any debug key around if debug key
764 * support hasn't been explicitly enabled.
765 */
766 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700767 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200768 list_del_rcu(&smp->ltk->list);
769 kfree_rcu(smp->ltk, rcu);
770 smp->ltk = NULL;
771 }
772
Johan Hedberg6f48e262014-08-11 22:06:44 +0300773 /* If pairing failed clean up any keys we might have */
774 if (!complete) {
775 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200776 list_del_rcu(&smp->ltk->list);
777 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300778 }
779
780 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200781 list_del_rcu(&smp->slave_ltk->list);
782 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300783 }
784
785 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200786 list_del_rcu(&smp->remote_irk->list);
787 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300788 }
789 }
790
791 chan->data = NULL;
Waiman Long453431a2020-08-06 23:18:13 -0700792 kfree_sensitive(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200793 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300794}
795
Johan Hedberg84794e12013-11-06 11:24:57 +0200796static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800797{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200798 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300799 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200800
Johan Hedberg84794e12013-11-06 11:24:57 +0200801 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800802 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700803 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800804
Johan Hedberge1e930f2014-09-08 17:09:49 -0700805 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300806
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300807 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300808 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800809}
810
Brian Gix2b64d152011-12-21 16:12:12 -0800811#define JUST_WORKS 0x00
812#define JUST_CFM 0x01
813#define REQ_PASSKEY 0x02
814#define CFM_PASSKEY 0x03
815#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300816#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800817#define OVERLAP 0xFF
818
819static const u8 gen_method[5][5] = {
820 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
821 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
822 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
823 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
824 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
825};
826
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300827static const u8 sc_method[5][5] = {
828 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
829 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
830 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
831 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
832 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
833};
834
Johan Hedberg581370c2014-06-17 13:07:38 +0300835static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
836{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300837 /* If either side has unknown io_caps, use JUST_CFM (which gets
838 * converted later to JUST_WORKS if we're initiators.
839 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300840 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
841 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300842 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300843
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300844 if (test_bit(SMP_FLAG_SC, &smp->flags))
845 return sc_method[remote_io][local_io];
846
Johan Hedberg581370c2014-06-17 13:07:38 +0300847 return gen_method[remote_io][local_io];
848}
849
Brian Gix2b64d152011-12-21 16:12:12 -0800850static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
851 u8 local_io, u8 remote_io)
852{
853 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300854 struct l2cap_chan *chan = conn->smp;
855 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800856 u32 passkey = 0;
Guenter Roeckd1d900f2020-04-06 11:54:38 -0700857 int ret;
Brian Gix2b64d152011-12-21 16:12:12 -0800858
859 /* Initialize key for JUST WORKS */
860 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300861 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800862
863 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
864
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
912 /* If both devices have Keyoard-Display I/O, the master
913 * Confirms and the slave Enters the passkey.
914 */
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);
Brian Gix2b64d152011-12-21 16:12:12 -0800928 BT_DBG("PassKey: %d", 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
953 BT_DBG("conn %p", conn);
954
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
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300981 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
982
Ard Biesheuvel28a220a2019-07-02 21:41:41 +0200983 ret = smp_c1(smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200984 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200985 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300986 if (ret)
987 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300988
Jason A. Donenfeld329d8232017-06-10 04:59:11 +0200989 if (crypto_memneq(smp->pcnf, confirm, sizeof(smp->pcnf))) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100990 bt_dev_err(hcon->hdev, "pairing failed "
991 "(confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300992 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300993 }
994
995 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -0800996 u8 stk[16];
997 __le64 rand = 0;
998 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300999
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02001000 smp_s1(smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001001
Johan Hedberg861580a2014-05-20 09:45:51 +03001002 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
1003 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001004
Johan Hedberg8b76ce32015-06-08 18:14:39 +03001005 hci_le_start_enc(hcon, ediv, rand, stk, smp->enc_key_size);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -03001006 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +03001007 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001008 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +03001009 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001010 __le64 rand = 0;
1011 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001012
Johan Hedberg943a7322014-03-18 12:58:24 +02001013 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1014 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001015
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02001016 smp_s1(smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001017
Johan Hedbergfff34902014-06-10 15:19:50 +03001018 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1019 auth = 1;
1020 else
1021 auth = 0;
1022
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001023 /* Even though there's no _SLAVE suffix this is the
1024 * slave STK we're adding for later lookup (the master
1025 * STK never needs to be stored).
1026 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001027 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001028 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001029 }
1030
Johan Hedberg861580a2014-05-20 09:45:51 +03001031 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001032}
1033
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001034static void smp_notify_keys(struct l2cap_conn *conn)
1035{
1036 struct l2cap_chan *chan = conn->smp;
1037 struct smp_chan *smp = chan->data;
1038 struct hci_conn *hcon = conn->hcon;
1039 struct hci_dev *hdev = hcon->hdev;
1040 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1041 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1042 bool persistent;
1043
Johan Hedbergcad20c22015-10-12 13:36:19 +02001044 if (hcon->type == ACL_LINK) {
1045 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1046 persistent = false;
1047 else
1048 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1049 &hcon->flags);
1050 } else {
1051 /* The LTKs, IRKs and CSRKs should be persistent only if
1052 * both sides had the bonding bit set in their
1053 * authentication requests.
1054 */
1055 persistent = !!((req->auth_req & rsp->auth_req) &
1056 SMP_AUTH_BONDING);
1057 }
1058
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001059 if (smp->remote_irk) {
Johan Hedbergcad20c22015-10-12 13:36:19 +02001060 mgmt_new_irk(hdev, smp->remote_irk, persistent);
1061
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001062 /* Now that user space can be considered to know the
1063 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001064 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001065 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001066 if (hcon->type == LE_LINK) {
1067 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1068 hcon->dst_type = smp->remote_irk->addr_type;
1069 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1070 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001071 }
1072
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001073 if (smp->csrk) {
1074 smp->csrk->bdaddr_type = hcon->dst_type;
1075 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1076 mgmt_new_csrk(hdev, smp->csrk, persistent);
1077 }
1078
1079 if (smp->slave_csrk) {
1080 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1081 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1082 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1083 }
1084
1085 if (smp->ltk) {
1086 smp->ltk->bdaddr_type = hcon->dst_type;
1087 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1088 mgmt_new_ltk(hdev, smp->ltk, persistent);
1089 }
1090
1091 if (smp->slave_ltk) {
1092 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1093 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1094 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1095 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001096
1097 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001098 struct link_key *key;
1099 u8 type;
1100
1101 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1102 type = HCI_LK_DEBUG_COMBINATION;
1103 else if (hcon->sec_level == BT_SECURITY_FIPS)
1104 type = HCI_LK_AUTH_COMBINATION_P256;
1105 else
1106 type = HCI_LK_UNAUTH_COMBINATION_P256;
1107
1108 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1109 smp->link_key, type, 0, &persistent);
1110 if (key) {
1111 mgmt_new_link_key(hdev, key, persistent);
1112
1113 /* Don't keep debug keys around if the relevant
1114 * flag is not set.
1115 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001116 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001117 key->type == HCI_LK_DEBUG_COMBINATION) {
1118 list_del_rcu(&key->list);
1119 kfree_rcu(key, rcu);
1120 }
1121 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001122 }
1123}
1124
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001125static void sc_add_ltk(struct smp_chan *smp)
1126{
1127 struct hci_conn *hcon = smp->conn->hcon;
1128 u8 key_type, auth;
1129
1130 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1131 key_type = SMP_LTK_P256_DEBUG;
1132 else
1133 key_type = SMP_LTK_P256;
1134
1135 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1136 auth = 1;
1137 else
1138 auth = 0;
1139
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001140 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1141 key_type, auth, smp->tk, smp->enc_key_size,
1142 0, 0);
1143}
1144
Johan Hedberg6a770832014-06-06 11:54:04 +03001145static void sc_generate_link_key(struct smp_chan *smp)
1146{
Johan Hedberga62da6f2016-12-08 08:32:54 +02001147 /* From core spec. Spells out in ASCII as 'lebr'. */
Johan Hedberg6a770832014-06-06 11:54:04 +03001148 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1149
1150 smp->link_key = kzalloc(16, GFP_KERNEL);
1151 if (!smp->link_key)
1152 return;
1153
Johan Hedberga62da6f2016-12-08 08:32:54 +02001154 if (test_bit(SMP_FLAG_CT2, &smp->flags)) {
Christophe JAILLET151129d2020-01-27 23:36:09 +01001155 /* SALT = 0x000000000000000000000000746D7031 */
Johan Hedberga62da6f2016-12-08 08:32:54 +02001156 const u8 salt[16] = { 0x31, 0x70, 0x6d, 0x74 };
1157
1158 if (smp_h7(smp->tfm_cmac, smp->tk, salt, smp->link_key)) {
Waiman Long453431a2020-08-06 23:18:13 -07001159 kfree_sensitive(smp->link_key);
Johan Hedberga62da6f2016-12-08 08:32:54 +02001160 smp->link_key = NULL;
1161 return;
1162 }
1163 } else {
1164 /* From core spec. Spells out in ASCII as 'tmp1'. */
1165 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1166
1167 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
Waiman Long453431a2020-08-06 23:18:13 -07001168 kfree_sensitive(smp->link_key);
Johan Hedberga62da6f2016-12-08 08:32:54 +02001169 smp->link_key = NULL;
1170 return;
1171 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001172 }
1173
1174 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Waiman Long453431a2020-08-06 23:18:13 -07001175 kfree_sensitive(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001176 smp->link_key = NULL;
1177 return;
1178 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001179}
1180
Johan Hedbergb28b4942014-09-05 22:19:55 +03001181static void smp_allow_key_dist(struct smp_chan *smp)
1182{
1183 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1184 * will be allowed in each PDU handler to ensure we receive
1185 * them in the correct order.
1186 */
1187 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1188 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1189 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1190 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1191 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1192 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1193}
1194
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001195static void sc_generate_ltk(struct smp_chan *smp)
1196{
Johan Hedberga62da6f2016-12-08 08:32:54 +02001197 /* From core spec. Spells out in ASCII as 'brle'. */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001198 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1199 struct hci_conn *hcon = smp->conn->hcon;
1200 struct hci_dev *hdev = hcon->hdev;
1201 struct link_key *key;
1202
1203 key = hci_find_link_key(hdev, &hcon->dst);
1204 if (!key) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001205 bt_dev_err(hdev, "no Link Key found to generate LTK");
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001206 return;
1207 }
1208
1209 if (key->type == HCI_LK_DEBUG_COMBINATION)
1210 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1211
Johan Hedberga62da6f2016-12-08 08:32:54 +02001212 if (test_bit(SMP_FLAG_CT2, &smp->flags)) {
Christophe JAILLET151129d2020-01-27 23:36:09 +01001213 /* SALT = 0x000000000000000000000000746D7032 */
Johan Hedberga62da6f2016-12-08 08:32:54 +02001214 const u8 salt[16] = { 0x32, 0x70, 0x6d, 0x74 };
1215
1216 if (smp_h7(smp->tfm_cmac, key->val, salt, smp->tk))
1217 return;
1218 } else {
1219 /* From core spec. Spells out in ASCII as 'tmp2'. */
1220 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1221
1222 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1223 return;
1224 }
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001225
1226 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1227 return;
1228
1229 sc_add_ltk(smp);
1230}
1231
Johan Hedbergd6268e82014-09-05 22:19:51 +03001232static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001233{
1234 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001235 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001236 struct hci_conn *hcon = conn->hcon;
1237 struct hci_dev *hdev = hcon->hdev;
1238 __u8 *keydist;
1239
1240 BT_DBG("conn %p", conn);
1241
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001242 rsp = (void *) &smp->prsp[1];
1243
1244 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001245 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1246 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001247 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001248 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001249
1250 req = (void *) &smp->preq[1];
1251
1252 if (hcon->out) {
1253 keydist = &rsp->init_key_dist;
1254 *keydist &= req->init_key_dist;
1255 } else {
1256 keydist = &rsp->resp_key_dist;
1257 *keydist &= req->resp_key_dist;
1258 }
1259
Johan Hedberg6a770832014-06-06 11:54:04 +03001260 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001261 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001262 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001263 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1264 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001265
1266 /* Clear the keys which are generated but not distributed */
1267 *keydist &= ~SMP_SC_NO_DIST;
1268 }
1269
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001270 BT_DBG("keydist 0x%x", *keydist);
1271
1272 if (*keydist & SMP_DIST_ENC_KEY) {
1273 struct smp_cmd_encrypt_info enc;
1274 struct smp_cmd_master_ident ident;
1275 struct smp_ltk *ltk;
1276 u8 authenticated;
1277 __le16 ediv;
1278 __le64 rand;
1279
Johan Hedberg1fc62c52015-06-10 11:11:20 +03001280 /* Make sure we generate only the significant amount of
1281 * bytes based on the encryption key size, and set the rest
1282 * of the value to zeroes.
1283 */
1284 get_random_bytes(enc.ltk, smp->enc_key_size);
1285 memset(enc.ltk + smp->enc_key_size, 0,
1286 sizeof(enc.ltk) - smp->enc_key_size);
1287
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001288 get_random_bytes(&ediv, sizeof(ediv));
1289 get_random_bytes(&rand, sizeof(rand));
1290
1291 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1292
1293 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1294 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1295 SMP_LTK_SLAVE, authenticated, enc.ltk,
1296 smp->enc_key_size, ediv, rand);
1297 smp->slave_ltk = ltk;
1298
1299 ident.ediv = ediv;
1300 ident.rand = rand;
1301
1302 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1303
1304 *keydist &= ~SMP_DIST_ENC_KEY;
1305 }
1306
1307 if (*keydist & SMP_DIST_ID_KEY) {
1308 struct smp_cmd_ident_addr_info addrinfo;
1309 struct smp_cmd_ident_info idinfo;
1310
1311 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1312
1313 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1314
1315 /* The hci_conn contains the local identity address
1316 * after the connection has been established.
1317 *
1318 * This is true even when the connection has been
1319 * established using a resolvable random address.
1320 */
1321 bacpy(&addrinfo.bdaddr, &hcon->src);
1322 addrinfo.addr_type = hcon->src_type;
1323
1324 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1325 &addrinfo);
1326
1327 *keydist &= ~SMP_DIST_ID_KEY;
1328 }
1329
1330 if (*keydist & SMP_DIST_SIGN) {
1331 struct smp_cmd_sign_info sign;
1332 struct smp_csrk *csrk;
1333
1334 /* Generate a new random key */
1335 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1336
1337 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1338 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001339 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1340 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1341 else
1342 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001343 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1344 }
1345 smp->slave_csrk = csrk;
1346
1347 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1348
1349 *keydist &= ~SMP_DIST_SIGN;
1350 }
1351
1352 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001353 if (smp->remote_key_dist & KEY_DIST_MASK) {
1354 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001355 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001356 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001357
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001358 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1359 smp_notify_keys(conn);
1360
1361 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001362}
1363
Johan Hedbergb68fda62014-08-11 22:06:40 +03001364static void smp_timeout(struct work_struct *work)
1365{
1366 struct smp_chan *smp = container_of(work, struct smp_chan,
1367 security_timer.work);
1368 struct l2cap_conn *conn = smp->conn;
1369
1370 BT_DBG("conn %p", conn);
1371
Johan Hedberg1e91c292014-08-18 20:33:29 +03001372 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001373}
1374
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001375static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1376{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001377 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001378 struct smp_chan *smp;
1379
Marcel Holtmannf1560462013-10-13 05:43:25 -07001380 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001381 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001382 return NULL;
1383
Herbert Xu71af2f62016-01-24 21:18:30 +08001384 smp->tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Johan Hedberg407cecf2014-05-02 14:19:47 +03001385 if (IS_ERR(smp->tfm_cmac)) {
1386 BT_ERR("Unable to create CMAC crypto context");
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02001387 goto zfree_smp;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001388 }
1389
Herbert Xu075f7732020-07-31 17:41:58 +10001390 smp->tfm_ecdh = crypto_alloc_kpp("ecdh", 0, 0);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001391 if (IS_ERR(smp->tfm_ecdh)) {
1392 BT_ERR("Unable to create ECDH crypto context");
1393 goto free_shash;
Johan Hedberg407cecf2014-05-02 14:19:47 +03001394 }
1395
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001396 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001397 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001398
Johan Hedbergb28b4942014-09-05 22:19:55 +03001399 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1400
Johan Hedbergb68fda62014-08-11 22:06:40 +03001401 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1402
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001403 hci_conn_hold(conn->hcon);
1404
1405 return smp;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001406
1407free_shash:
1408 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001409zfree_smp:
Waiman Long453431a2020-08-06 23:18:13 -07001410 kfree_sensitive(smp);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03001411 return NULL;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001412}
1413
Johan Hedberg760b0182014-06-06 11:44:05 +03001414static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1415{
1416 struct hci_conn *hcon = smp->conn->hcon;
1417 u8 *na, *nb, a[7], b[7];
1418
1419 if (hcon->out) {
1420 na = smp->prnd;
1421 nb = smp->rrnd;
1422 } else {
1423 na = smp->rrnd;
1424 nb = smp->prnd;
1425 }
1426
1427 memcpy(a, &hcon->init_addr, 6);
1428 memcpy(b, &hcon->resp_addr, 6);
1429 a[6] = hcon->init_addr_type;
1430 b[6] = hcon->resp_addr_type;
1431
1432 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1433}
1434
Johan Hedberg38606f12014-06-25 11:10:28 +03001435static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001436{
1437 struct hci_conn *hcon = smp->conn->hcon;
1438 struct smp_cmd_dhkey_check check;
1439 u8 a[7], b[7], *local_addr, *remote_addr;
1440 u8 io_cap[3], r[16];
1441
Johan Hedberg760b0182014-06-06 11:44:05 +03001442 memcpy(a, &hcon->init_addr, 6);
1443 memcpy(b, &hcon->resp_addr, 6);
1444 a[6] = hcon->init_addr_type;
1445 b[6] = hcon->resp_addr_type;
1446
1447 if (hcon->out) {
1448 local_addr = a;
1449 remote_addr = b;
1450 memcpy(io_cap, &smp->preq[1], 3);
1451 } else {
1452 local_addr = b;
1453 remote_addr = a;
1454 memcpy(io_cap, &smp->prsp[1], 3);
1455 }
1456
Johan Hedbergdddd3052014-06-01 15:38:09 +03001457 memset(r, 0, sizeof(r));
1458
1459 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001460 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001461
Johan Hedberga29b0732014-10-28 15:17:05 +01001462 if (smp->method == REQ_OOB)
1463 memcpy(r, smp->rr, 16);
1464
Johan Hedberg760b0182014-06-06 11:44:05 +03001465 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1466 local_addr, remote_addr, check.e);
1467
1468 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001469}
1470
Johan Hedberg38606f12014-06-25 11:10:28 +03001471static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1472{
1473 struct l2cap_conn *conn = smp->conn;
1474 struct hci_conn *hcon = conn->hcon;
1475 struct smp_cmd_pairing_confirm cfm;
1476 u8 r;
1477
1478 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1479 r |= 0x80;
1480
1481 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1482
1483 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1484 cfm.confirm_val))
1485 return SMP_UNSPECIFIED;
1486
1487 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1488
1489 return 0;
1490}
1491
1492static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1493{
1494 struct l2cap_conn *conn = smp->conn;
1495 struct hci_conn *hcon = conn->hcon;
1496 struct hci_dev *hdev = hcon->hdev;
1497 u8 cfm[16], r;
1498
1499 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1500 if (smp->passkey_round >= 20)
1501 return 0;
1502
1503 switch (smp_op) {
1504 case SMP_CMD_PAIRING_RANDOM:
1505 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1506 r |= 0x80;
1507
1508 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1509 smp->rrnd, r, cfm))
1510 return SMP_UNSPECIFIED;
1511
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02001512 if (crypto_memneq(smp->pcnf, cfm, 16))
Johan Hedberg38606f12014-06-25 11:10:28 +03001513 return SMP_CONFIRM_FAILED;
1514
1515 smp->passkey_round++;
1516
1517 if (smp->passkey_round == 20) {
1518 /* Generate MacKey and LTK */
1519 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1520 return SMP_UNSPECIFIED;
1521 }
1522
1523 /* The round is only complete when the initiator
1524 * receives pairing random.
1525 */
1526 if (!hcon->out) {
1527 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1528 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001529 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001530 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001531 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001532 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001533 return 0;
1534 }
1535
1536 /* Start the next round */
1537 if (smp->passkey_round != 20)
1538 return sc_passkey_round(smp, 0);
1539
1540 /* Passkey rounds are complete - start DHKey Check */
1541 sc_dhkey_check(smp);
1542 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1543
1544 break;
1545
1546 case SMP_CMD_PAIRING_CONFIRM:
1547 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1548 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1549 return 0;
1550 }
1551
1552 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1553
1554 if (hcon->out) {
1555 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1556 sizeof(smp->prnd), smp->prnd);
1557 return 0;
1558 }
1559
1560 return sc_passkey_send_confirm(smp);
1561
1562 case SMP_CMD_PUBLIC_KEY:
1563 default:
1564 /* Initiating device starts the round */
1565 if (!hcon->out)
1566 return 0;
1567
1568 BT_DBG("%s Starting passkey round %u", hdev->name,
1569 smp->passkey_round + 1);
1570
1571 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1572
1573 return sc_passkey_send_confirm(smp);
1574 }
1575
1576 return 0;
1577}
1578
Johan Hedbergdddd3052014-06-01 15:38:09 +03001579static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1580{
Johan Hedberg38606f12014-06-25 11:10:28 +03001581 struct l2cap_conn *conn = smp->conn;
1582 struct hci_conn *hcon = conn->hcon;
1583 u8 smp_op;
1584
1585 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1586
Johan Hedbergdddd3052014-06-01 15:38:09 +03001587 switch (mgmt_op) {
1588 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1589 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1590 return 0;
1591 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1592 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1593 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001594 case MGMT_OP_USER_PASSKEY_REPLY:
1595 hcon->passkey_notify = le32_to_cpu(passkey);
1596 smp->passkey_round = 0;
1597
1598 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1599 smp_op = SMP_CMD_PAIRING_CONFIRM;
1600 else
1601 smp_op = 0;
1602
1603 if (sc_passkey_round(smp, smp_op))
1604 return -EIO;
1605
1606 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001607 }
1608
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001609 /* Initiator sends DHKey check first */
1610 if (hcon->out) {
1611 sc_dhkey_check(smp);
1612 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1613 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1614 sc_dhkey_check(smp);
1615 sc_add_ltk(smp);
1616 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001617
1618 return 0;
1619}
1620
Brian Gix2b64d152011-12-21 16:12:12 -08001621int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1622{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001623 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001624 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001625 struct smp_chan *smp;
1626 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001627 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001628
1629 BT_DBG("");
1630
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001631 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001632 return -ENOTCONN;
1633
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001634 chan = conn->smp;
1635 if (!chan)
1636 return -ENOTCONN;
1637
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001638 l2cap_chan_lock(chan);
1639 if (!chan->data) {
1640 err = -ENOTCONN;
1641 goto unlock;
1642 }
1643
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001644 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001645
Johan Hedberg760b0182014-06-06 11:44:05 +03001646 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1647 err = sc_user_reply(smp, mgmt_op, passkey);
1648 goto unlock;
1649 }
1650
Brian Gix2b64d152011-12-21 16:12:12 -08001651 switch (mgmt_op) {
1652 case MGMT_OP_USER_PASSKEY_REPLY:
1653 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001654 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001655 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001656 put_unaligned_le32(value, smp->tk);
Gustavo A. R. Silva19186c72020-07-08 15:18:23 -05001657 fallthrough;
Brian Gix2b64d152011-12-21 16:12:12 -08001658 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001659 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001660 break;
1661 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1662 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001663 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001664 err = 0;
1665 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001666 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001667 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001668 err = -EOPNOTSUPP;
1669 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001670 }
1671
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001672 err = 0;
1673
Brian Gix2b64d152011-12-21 16:12:12 -08001674 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001675 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1676 u8 rsp = smp_confirm(smp);
1677 if (rsp)
1678 smp_failure(conn, rsp);
1679 }
Brian Gix2b64d152011-12-21 16:12:12 -08001680
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001681unlock:
1682 l2cap_chan_unlock(chan);
1683 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001684}
1685
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001686static void build_bredr_pairing_cmd(struct smp_chan *smp,
1687 struct smp_cmd_pairing *req,
1688 struct smp_cmd_pairing *rsp)
1689{
1690 struct l2cap_conn *conn = smp->conn;
1691 struct hci_dev *hdev = conn->hcon->hdev;
1692 u8 local_dist = 0, remote_dist = 0;
1693
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001694 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001695 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1696 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1697 }
1698
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001699 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001700 remote_dist |= SMP_DIST_ID_KEY;
1701
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001702 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001703 local_dist |= SMP_DIST_ID_KEY;
1704
1705 if (!rsp) {
1706 memset(req, 0, sizeof(*req));
1707
Johan Hedberga62da6f2016-12-08 08:32:54 +02001708 req->auth_req = SMP_AUTH_CT2;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001709 req->init_key_dist = local_dist;
1710 req->resp_key_dist = remote_dist;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001711 req->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001712
1713 smp->remote_key_dist = remote_dist;
1714
1715 return;
1716 }
1717
1718 memset(rsp, 0, sizeof(*rsp));
1719
Johan Hedberga62da6f2016-12-08 08:32:54 +02001720 rsp->auth_req = SMP_AUTH_CT2;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001721 rsp->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001722 rsp->init_key_dist = req->init_key_dist & remote_dist;
1723 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1724
1725 smp->remote_key_dist = rsp->init_key_dist;
1726}
1727
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001728static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001729{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001730 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001731 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001732 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001733 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001734 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001735 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001736
1737 BT_DBG("conn %p", conn);
1738
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001739 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001740 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001741
Johan Hedberg40bef302014-07-16 11:42:27 +03001742 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001743 return SMP_CMD_NOTSUPP;
1744
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001745 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001746 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001747 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001748 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001749
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001750 if (!smp)
1751 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001752
Johan Hedbergc05b9332014-09-10 17:37:42 -07001753 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001754 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001755
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001756 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001757 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001758 return SMP_PAIRING_NOTSUPP;
1759
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001760 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001761 return SMP_AUTH_REQUIREMENTS;
1762
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001763 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1764 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001765 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001766
Johan Hedbergcb06d362015-03-16 21:12:34 +02001767 /* If the remote side's OOB flag is set it means it has
1768 * successfully received our local OOB data - therefore set the
1769 * flag to indicate that local OOB is in use.
1770 */
Johan Hedberg94f14e42018-09-11 14:10:12 +03001771 if (req->oob_flag == SMP_OOB_PRESENT && SMP_DEV(hdev)->local_oob)
Johan Hedberg58428562015-03-16 11:45:45 +02001772 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1773
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001774 /* SMP over BR/EDR requires special treatment */
1775 if (conn->hcon->type == ACL_LINK) {
1776 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001777 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001778 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001779 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1780
1781 set_bit(SMP_FLAG_SC, &smp->flags);
1782
1783 build_bredr_pairing_cmd(smp, req, &rsp);
1784
Johan Hedberga62da6f2016-12-08 08:32:54 +02001785 if (req->auth_req & SMP_AUTH_CT2)
1786 set_bit(SMP_FLAG_CT2, &smp->flags);
1787
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001788 key_size = min(req->max_key_size, rsp.max_key_size);
1789 if (check_enc_key_size(conn, key_size))
1790 return SMP_ENC_KEY_SIZE;
1791
1792 /* Clear bits which are generated but not distributed */
1793 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1794
1795 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1796 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1797 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1798
1799 smp_distribute_keys(smp);
1800 return 0;
1801 }
1802
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001803 build_pairing_cmd(conn, req, &rsp, auth);
1804
Johan Hedberga62da6f2016-12-08 08:32:54 +02001805 if (rsp.auth_req & SMP_AUTH_SC) {
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001806 set_bit(SMP_FLAG_SC, &smp->flags);
1807
Johan Hedberga62da6f2016-12-08 08:32:54 +02001808 if (rsp.auth_req & SMP_AUTH_CT2)
1809 set_bit(SMP_FLAG_CT2, &smp->flags);
1810 }
1811
Johan Hedberg5be5e272014-09-10 17:58:54 -07001812 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001813 sec_level = BT_SECURITY_MEDIUM;
1814 else
1815 sec_level = authreq_to_seclevel(auth);
1816
Johan Hedbergc7262e72014-06-17 13:07:37 +03001817 if (sec_level > conn->hcon->pending_sec_level)
1818 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001819
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001820 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001821 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1822 u8 method;
1823
1824 method = get_auth_method(smp, conn->hcon->io_capability,
1825 req->io_capability);
1826 if (method == JUST_WORKS || method == JUST_CFM)
1827 return SMP_AUTH_REQUIREMENTS;
1828 }
1829
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001830 key_size = min(req->max_key_size, rsp.max_key_size);
1831 if (check_enc_key_size(conn, key_size))
1832 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001833
Johan Hedberge84a6b12013-12-02 10:49:03 +02001834 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001835
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001836 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1837 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001838
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001839 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001840
1841 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1842
Johan Hedberg19c5ce92015-03-15 19:34:04 +02001843 /* Strictly speaking we shouldn't allow Pairing Confirm for the
1844 * SC case, however some implementations incorrectly copy RFU auth
1845 * req bits from our security request, which may create a false
1846 * positive SC enablement.
1847 */
1848 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1849
Johan Hedberg3b191462014-06-06 10:50:15 +03001850 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1851 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1852 /* Clear bits which are generated but not distributed */
1853 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1854 /* Wait for Public Key from Initiating Device */
1855 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001856 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001857
Brian Gix2b64d152011-12-21 16:12:12 -08001858 /* Request setup of TK */
1859 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1860 if (ret)
1861 return SMP_UNSPECIFIED;
1862
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001863 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001864}
1865
Johan Hedberg3b191462014-06-06 10:50:15 +03001866static u8 sc_send_public_key(struct smp_chan *smp)
1867{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001868 struct hci_dev *hdev = smp->conn->hcon->hdev;
1869
Marcel Holtmann56860242020-05-06 09:57:50 +02001870 bt_dev_dbg(hdev, "");
Johan Hedberg3b191462014-06-06 10:50:15 +03001871
Johan Hedberg1a8bab42015-03-16 11:45:44 +02001872 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001873 struct l2cap_chan *chan = hdev->smp_data;
1874 struct smp_dev *smp_dev;
1875
1876 if (!chan || !chan->data)
1877 return SMP_UNSPECIFIED;
1878
1879 smp_dev = chan->data;
1880
1881 memcpy(smp->local_pk, smp_dev->local_pk, 64);
Marcel Holtmannfb334fe2015-03-16 12:34:57 -07001882 memcpy(smp->lr, smp_dev->local_rand, 16);
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001883
1884 if (smp_dev->debug_key)
1885 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1886
1887 goto done;
1888 }
1889
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001890 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Johan Hedberg70157ef2014-06-24 15:22:59 +03001891 BT_DBG("Using debug keys");
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001892 if (set_ecdh_privkey(smp->tfm_ecdh, debug_sk))
1893 return SMP_UNSPECIFIED;
Johan Hedberg70157ef2014-06-24 15:22:59 +03001894 memcpy(smp->local_pk, debug_pk, 64);
Johan Hedberg70157ef2014-06-24 15:22:59 +03001895 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1896 } else {
1897 while (true) {
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001898 /* Generate key pair for Secure Connections */
1899 if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk))
Johan Hedberg70157ef2014-06-24 15:22:59 +03001900 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001901
Johan Hedberg70157ef2014-06-24 15:22:59 +03001902 /* This is unlikely, but we need to check that
1903 * we didn't accidentially generate a debug key.
1904 */
Tudor Ambarusc0153b02017-09-28 17:14:55 +03001905 if (crypto_memneq(smp->local_pk, debug_pk, 64))
Johan Hedberg70157ef2014-06-24 15:22:59 +03001906 break;
1907 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001908 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001909
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001910done:
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001911 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
Marcel Holtmann8e4e2ee2015-03-16 01:10:25 -07001912 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32);
Johan Hedberg3b191462014-06-06 10:50:15 +03001913
1914 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1915
1916 return 0;
1917}
1918
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001919static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001920{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001921 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001922 struct l2cap_chan *chan = conn->smp;
1923 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001924 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001925 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001926 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001927
1928 BT_DBG("conn %p", conn);
1929
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001930 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001931 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001932
Johan Hedberg40bef302014-07-16 11:42:27 +03001933 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001934 return SMP_CMD_NOTSUPP;
1935
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001936 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001937
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001938 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001939
1940 key_size = min(req->max_key_size, rsp->max_key_size);
1941 if (check_enc_key_size(conn, key_size))
1942 return SMP_ENC_KEY_SIZE;
1943
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001944 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001945
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001946 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001947 return SMP_AUTH_REQUIREMENTS;
1948
Johan Hedbergcb06d362015-03-16 21:12:34 +02001949 /* If the remote side's OOB flag is set it means it has
1950 * successfully received our local OOB data - therefore set the
1951 * flag to indicate that local OOB is in use.
1952 */
Johan Hedberg94f14e42018-09-11 14:10:12 +03001953 if (rsp->oob_flag == SMP_OOB_PRESENT && SMP_DEV(hdev)->local_oob)
Johan Hedberg58428562015-03-16 11:45:45 +02001954 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1955
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001956 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1957 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1958
1959 /* Update remote key distribution in case the remote cleared
1960 * some bits that we had enabled in our request.
1961 */
1962 smp->remote_key_dist &= rsp->resp_key_dist;
1963
Johan Hedberga62da6f2016-12-08 08:32:54 +02001964 if ((req->auth_req & SMP_AUTH_CT2) && (auth & SMP_AUTH_CT2))
1965 set_bit(SMP_FLAG_CT2, &smp->flags);
1966
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001967 /* For BR/EDR this means we're done and can start phase 3 */
1968 if (conn->hcon->type == ACL_LINK) {
1969 /* Clear bits which are generated but not distributed */
1970 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1971 smp_distribute_keys(smp);
1972 return 0;
1973 }
1974
Johan Hedberg65668772014-05-16 11:03:34 +03001975 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1976 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001977 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1978 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001979
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001980 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001981 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1982 u8 method;
1983
1984 method = get_auth_method(smp, req->io_capability,
1985 rsp->io_capability);
1986 if (method == JUST_WORKS || method == JUST_CFM)
1987 return SMP_AUTH_REQUIREMENTS;
1988 }
1989
Johan Hedberge84a6b12013-12-02 10:49:03 +02001990 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001991
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001992 /* Update remote key distribution in case the remote cleared
1993 * some bits that we had enabled in our request.
1994 */
1995 smp->remote_key_dist &= rsp->resp_key_dist;
1996
Johan Hedberg3b191462014-06-06 10:50:15 +03001997 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1998 /* Clear bits which are generated but not distributed */
1999 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
2000 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
2001 return sc_send_public_key(smp);
2002 }
2003
Johan Hedbergc05b9332014-09-10 17:37:42 -07002004 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08002005
Johan Hedberg476585e2012-06-06 18:54:15 +08002006 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08002007 if (ret)
2008 return SMP_UNSPECIFIED;
2009
Johan Hedberg4a74d652014-05-20 09:45:50 +03002010 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08002011
2012 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03002013 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002014 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002015
2016 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002017}
2018
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002019static u8 sc_check_confirm(struct smp_chan *smp)
2020{
2021 struct l2cap_conn *conn = smp->conn;
2022
2023 BT_DBG("");
2024
Johan Hedberg38606f12014-06-25 11:10:28 +03002025 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2026 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
2027
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002028 if (conn->hcon->out) {
2029 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2030 smp->prnd);
2031 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2032 }
2033
2034 return 0;
2035}
2036
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002037/* Work-around for some implementations that incorrectly copy RFU bits
2038 * from our security request and thereby create the impression that
2039 * we're doing SC when in fact the remote doesn't support it.
2040 */
2041static int fixup_sc_false_positive(struct smp_chan *smp)
2042{
2043 struct l2cap_conn *conn = smp->conn;
2044 struct hci_conn *hcon = conn->hcon;
2045 struct hci_dev *hdev = hcon->hdev;
2046 struct smp_cmd_pairing *req, *rsp;
2047 u8 auth;
2048
2049 /* The issue is only observed when we're in slave role */
2050 if (hcon->out)
2051 return SMP_UNSPECIFIED;
2052
2053 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002054 bt_dev_err(hdev, "refusing legacy fallback in SC-only mode");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002055 return SMP_UNSPECIFIED;
2056 }
2057
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002058 bt_dev_err(hdev, "trying to fall back to legacy SMP");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002059
2060 req = (void *) &smp->preq[1];
2061 rsp = (void *) &smp->prsp[1];
2062
2063 /* Rebuild key dist flags which may have been cleared for SC */
2064 smp->remote_key_dist = (req->init_key_dist & rsp->resp_key_dist);
2065
2066 auth = req->auth_req & AUTH_REQ_MASK(hdev);
2067
2068 if (tk_request(conn, 0, auth, rsp->io_capability, req->io_capability)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002069 bt_dev_err(hdev, "failed to fall back to legacy SMP");
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002070 return SMP_UNSPECIFIED;
2071 }
2072
2073 clear_bit(SMP_FLAG_SC, &smp->flags);
2074
2075 return 0;
2076}
2077
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002078static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002079{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002080 struct l2cap_chan *chan = conn->smp;
2081 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002082
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002083 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
2084
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002085 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002086 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002087
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002088 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
2089 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002090
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002091 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2092 int ret;
2093
2094 /* Public Key exchange must happen before any other steps */
2095 if (test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
2096 return sc_check_confirm(smp);
2097
2098 BT_ERR("Unexpected SMP Pairing Confirm");
2099
2100 ret = fixup_sc_false_positive(smp);
2101 if (ret)
2102 return ret;
2103 }
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002104
Johan Hedbergb28b4942014-09-05 22:19:55 +03002105 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02002106 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2107 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002108 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2109 return 0;
2110 }
2111
2112 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002113 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07002114
2115 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002116
2117 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002118}
2119
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002120static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002121{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002122 struct l2cap_chan *chan = conn->smp;
2123 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002124 struct hci_conn *hcon = conn->hcon;
Howard Chungeed467b2020-02-20 11:17:29 +08002125 u8 *pkax, *pkbx, *na, *nb, confirm_hint;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002126 u32 passkey;
2127 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002128
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002129 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002130
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002131 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002132 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002133
Johan Hedberg943a7322014-03-18 12:58:24 +02002134 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002135 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002136
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002137 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2138 return smp_random(smp);
2139
Johan Hedberg580039e2014-12-03 16:26:37 +02002140 if (hcon->out) {
2141 pkax = smp->local_pk;
2142 pkbx = smp->remote_pk;
2143 na = smp->prnd;
2144 nb = smp->rrnd;
2145 } else {
2146 pkax = smp->remote_pk;
2147 pkbx = smp->local_pk;
2148 na = smp->rrnd;
2149 nb = smp->prnd;
2150 }
2151
Johan Hedberga29b0732014-10-28 15:17:05 +01002152 if (smp->method == REQ_OOB) {
2153 if (!hcon->out)
2154 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2155 sizeof(smp->prnd), smp->prnd);
2156 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2157 goto mackey_and_ltk;
2158 }
2159
Johan Hedberg38606f12014-06-25 11:10:28 +03002160 /* Passkey entry has special treatment */
2161 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2162 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2163
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002164 if (hcon->out) {
2165 u8 cfm[16];
2166
2167 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2168 smp->rrnd, 0, cfm);
2169 if (err)
2170 return SMP_UNSPECIFIED;
2171
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002172 if (crypto_memneq(smp->pcnf, cfm, 16))
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002173 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002174 } else {
2175 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2176 smp->prnd);
2177 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Howard Chungcee5f202020-02-14 19:16:41 +08002178
2179 /* Only Just-Works pairing requires extra checks */
2180 if (smp->method != JUST_WORKS)
2181 goto mackey_and_ltk;
2182
2183 /* If there already exists long term key in local host, leave
2184 * the decision to user space since the remote device could
2185 * be legitimate or malicious.
2186 */
2187 if (hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
2188 hcon->role)) {
Howard Chungeed467b2020-02-20 11:17:29 +08002189 /* Set passkey to 0. The value can be any number since
2190 * it'll be ignored anyway.
2191 */
2192 passkey = 0;
2193 confirm_hint = 1;
2194 goto confirm;
Howard Chungcee5f202020-02-14 19:16:41 +08002195 }
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002196 }
2197
Johan Hedberga29b0732014-10-28 15:17:05 +01002198mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002199 /* Generate MacKey and LTK */
2200 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2201 if (err)
2202 return SMP_UNSPECIFIED;
2203
Sonny Sasakaffee2022020-04-06 11:04:02 -07002204 if (smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002205 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002206 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002207 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2208 }
2209 return 0;
2210 }
2211
Johan Hedberg38606f12014-06-25 11:10:28 +03002212 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002213 if (err)
2214 return SMP_UNSPECIFIED;
2215
Howard Chungeed467b2020-02-20 11:17:29 +08002216 confirm_hint = 0;
2217
2218confirm:
Sonny Sasakaffee2022020-04-06 11:04:02 -07002219 if (smp->method == JUST_WORKS)
2220 confirm_hint = 1;
2221
Johan Hedberg38606f12014-06-25 11:10:28 +03002222 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
Howard Chungeed467b2020-02-20 11:17:29 +08002223 hcon->dst_type, passkey, confirm_hint);
Johan Hedberg38606f12014-06-25 11:10:28 +03002224 if (err)
2225 return SMP_UNSPECIFIED;
2226
2227 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2228
Johan Hedberg191dc7fe22014-06-06 11:39:49 +03002229 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002230}
2231
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002232static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002233{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002234 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002235 struct hci_conn *hcon = conn->hcon;
2236
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002237 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002238 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002239 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002240
Johan Hedberga6f78332014-09-10 17:37:45 -07002241 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002242 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002243
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002244 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002245 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002246
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002247 hci_le_start_enc(hcon, key->ediv, key->rand, key->val, key->enc_size);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002248 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002249
Johan Hedbergfe59a052014-07-01 19:14:12 +03002250 /* We never store STKs for master role, so clear this flag */
2251 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2252
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002253 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002254}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002255
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002256bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2257 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002258{
2259 if (sec_level == BT_SECURITY_LOW)
2260 return true;
2261
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002262 /* If we're encrypted with an STK but the caller prefers using
2263 * LTK claim insufficient security. This way we allow the
2264 * connection to be re-encrypted with an LTK, even if the LTK
2265 * provides the same level of security. Only exception is if we
2266 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002267 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002268 if (key_pref == SMP_USE_LTK &&
2269 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002270 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002271 return false;
2272
Johan Hedberg854f4722014-07-01 18:40:20 +03002273 if (hcon->sec_level >= sec_level)
2274 return true;
2275
2276 return false;
2277}
2278
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002279static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002280{
2281 struct smp_cmd_security_req *rp = (void *) skb->data;
2282 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002283 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002284 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002285 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002286 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002287
2288 BT_DBG("conn %p", conn);
2289
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002290 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002291 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002292
Johan Hedberg40bef302014-07-16 11:42:27 +03002293 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002294 return SMP_CMD_NOTSUPP;
2295
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002296 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002297
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002298 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002299 return SMP_AUTH_REQUIREMENTS;
2300
Johan Hedberg5be5e272014-09-10 17:58:54 -07002301 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002302 sec_level = BT_SECURITY_MEDIUM;
2303 else
2304 sec_level = authreq_to_seclevel(auth);
2305
Szymon Janc64e759f2018-02-26 15:41:53 +01002306 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK)) {
2307 /* If link is already encrypted with sufficient security we
2308 * still need refresh encryption as per Core Spec 5.0 Vol 3,
2309 * Part H 2.4.6
2310 */
2311 smp_ltk_encrypt(conn, hcon->sec_level);
Johan Hedberg854f4722014-07-01 18:40:20 +03002312 return 0;
Szymon Janc64e759f2018-02-26 15:41:53 +01002313 }
Johan Hedberg854f4722014-07-01 18:40:20 +03002314
Johan Hedbergc7262e72014-06-17 13:07:37 +03002315 if (sec_level > hcon->pending_sec_level)
2316 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002317
Johan Hedberg4dab7862012-06-07 14:58:37 +08002318 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002319 return 0;
2320
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002321 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002322 if (!smp)
2323 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002324
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002325 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002326 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002327 return SMP_PAIRING_NOTSUPP;
2328
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002329 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002330
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002331 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002332 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002333
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002334 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2335 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002336
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002337 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002338 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002339
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002340 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002341}
2342
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002343int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002344{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002345 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002346 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002347 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002348 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002349 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002350
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002351 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2352
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002353 /* This may be NULL if there's an unexpected disconnection */
2354 if (!conn)
2355 return 1;
2356
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002357 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002358 return 1;
2359
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002360 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002361 return 1;
2362
Johan Hedbergc7262e72014-06-17 13:07:37 +03002363 if (sec_level > hcon->pending_sec_level)
2364 hcon->pending_sec_level = sec_level;
2365
Johan Hedberg40bef302014-07-16 11:42:27 +03002366 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002367 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2368 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002369
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002370 chan = conn->smp;
2371 if (!chan) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002372 bt_dev_err(hcon->hdev, "security requested but not available");
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002373 return 1;
2374 }
2375
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002376 l2cap_chan_lock(chan);
2377
2378 /* If SMP is already in progress ignore this request */
2379 if (chan->data) {
2380 ret = 0;
2381 goto unlock;
2382 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002383
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002384 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002385 if (!smp) {
2386 ret = 1;
2387 goto unlock;
2388 }
Brian Gix2b64d152011-12-21 16:12:12 -08002389
2390 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002391
Johan Hedberga62da6f2016-12-08 08:32:54 +02002392 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED)) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002393 authreq |= SMP_AUTH_SC;
Johan Hedberga62da6f2016-12-08 08:32:54 +02002394 if (hci_dev_test_flag(hcon->hdev, HCI_SSP_ENABLED))
2395 authreq |= SMP_AUTH_CT2;
2396 }
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002397
Archie Pusakac2aa30d2020-04-07 12:26:27 +08002398 /* Don't attempt to set MITM if setting is overridden by debugfs
2399 * Needed to pass certification test SM/MAS/PKE/BV-01-C
Johan Hedberg2e233642014-03-18 15:42:30 +02002400 */
Archie Pusakac2aa30d2020-04-07 12:26:27 +08002401 if (!hci_dev_test_flag(hcon->hdev, HCI_FORCE_NO_MITM)) {
2402 /* Require MITM if IO Capability allows or the security level
2403 * requires it.
2404 */
2405 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
2406 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
2407 authreq |= SMP_AUTH_MITM;
2408 }
Johan Hedberg2e233642014-03-18 15:42:30 +02002409
Johan Hedberg40bef302014-07-16 11:42:27 +03002410 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002411 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002412
Brian Gix2b64d152011-12-21 16:12:12 -08002413 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002414 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2415 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002416
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002417 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002418 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002419 } else {
2420 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002421 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002422 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002423 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002424 }
2425
Johan Hedberg4a74d652014-05-20 09:45:50 +03002426 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002427 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002428
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002429unlock:
2430 l2cap_chan_unlock(chan);
2431 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002432}
2433
Matias Karhumaacb28c302018-09-26 09:13:46 +03002434int smp_cancel_and_remove_pairing(struct hci_dev *hdev, bdaddr_t *bdaddr,
2435 u8 addr_type)
Johan Hedbergc81d5552015-10-22 09:38:35 +03002436{
Matias Karhumaacb28c302018-09-26 09:13:46 +03002437 struct hci_conn *hcon;
2438 struct l2cap_conn *conn;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002439 struct l2cap_chan *chan;
2440 struct smp_chan *smp;
Matias Karhumaacb28c302018-09-26 09:13:46 +03002441 int err;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002442
Matias Karhumaacb28c302018-09-26 09:13:46 +03002443 err = hci_remove_ltk(hdev, bdaddr, addr_type);
2444 hci_remove_irk(hdev, bdaddr, addr_type);
2445
2446 hcon = hci_conn_hash_lookup_le(hdev, bdaddr, addr_type);
2447 if (!hcon)
2448 goto done;
2449
2450 conn = hcon->l2cap_data;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002451 if (!conn)
Matias Karhumaacb28c302018-09-26 09:13:46 +03002452 goto done;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002453
2454 chan = conn->smp;
2455 if (!chan)
Matias Karhumaacb28c302018-09-26 09:13:46 +03002456 goto done;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002457
2458 l2cap_chan_lock(chan);
2459
2460 smp = chan->data;
2461 if (smp) {
Matias Karhumaacb28c302018-09-26 09:13:46 +03002462 /* Set keys to NULL to make sure smp_failure() does not try to
2463 * remove and free already invalidated rcu list entries. */
2464 smp->ltk = NULL;
2465 smp->slave_ltk = NULL;
2466 smp->remote_irk = NULL;
2467
Johan Hedbergc81d5552015-10-22 09:38:35 +03002468 if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
2469 smp_failure(conn, 0);
2470 else
2471 smp_failure(conn, SMP_UNSPECIFIED);
Matias Karhumaacb28c302018-09-26 09:13:46 +03002472 err = 0;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002473 }
2474
2475 l2cap_chan_unlock(chan);
Matias Karhumaacb28c302018-09-26 09:13:46 +03002476
2477done:
2478 return err;
Johan Hedbergc81d5552015-10-22 09:38:35 +03002479}
2480
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002481static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2482{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002483 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002484 struct l2cap_chan *chan = conn->smp;
2485 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002486
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002487 BT_DBG("conn %p", conn);
2488
2489 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002490 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002491
Alain Michaud600a8742020-01-07 00:43:17 +00002492 /* Pairing is aborted if any blocked keys are distributed */
2493 if (hci_is_blocked_key(conn->hcon->hdev, HCI_BLOCKED_KEY_TYPE_LTK,
2494 rp->ltk)) {
2495 bt_dev_warn_ratelimited(conn->hcon->hdev,
2496 "LTK blocked for %pMR",
2497 &conn->hcon->dst);
2498 return SMP_INVALID_PARAMS;
2499 }
2500
Johan Hedbergb28b4942014-09-05 22:19:55 +03002501 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002502
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002503 skb_pull(skb, sizeof(*rp));
2504
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002505 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002506
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002507 return 0;
2508}
2509
2510static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2511{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002512 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002513 struct l2cap_chan *chan = conn->smp;
2514 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002515 struct hci_dev *hdev = conn->hcon->hdev;
2516 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002517 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002518 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002519
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002520 BT_DBG("conn %p", conn);
2521
2522 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002523 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002524
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002525 /* Mark the information as received */
2526 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2527
Johan Hedbergb28b4942014-09-05 22:19:55 +03002528 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2529 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002530 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2531 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002532
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002533 skb_pull(skb, sizeof(*rp));
2534
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002535 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002536 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002537 authenticated, smp->tk, smp->enc_key_size,
2538 rp->ediv, rp->rand);
2539 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002540 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002541 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002542
2543 return 0;
2544}
2545
Johan Hedbergfd349c02014-02-18 10:19:36 +02002546static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2547{
2548 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002549 struct l2cap_chan *chan = conn->smp;
2550 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002551
2552 BT_DBG("");
2553
2554 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002555 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002556
Alain Michaud600a8742020-01-07 00:43:17 +00002557 /* Pairing is aborted if any blocked keys are distributed */
2558 if (hci_is_blocked_key(conn->hcon->hdev, HCI_BLOCKED_KEY_TYPE_IRK,
2559 info->irk)) {
2560 bt_dev_warn_ratelimited(conn->hcon->hdev,
2561 "Identity key blocked for %pMR",
2562 &conn->hcon->dst);
2563 return SMP_INVALID_PARAMS;
2564 }
2565
Johan Hedbergb28b4942014-09-05 22:19:55 +03002566 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002567
Johan Hedbergfd349c02014-02-18 10:19:36 +02002568 skb_pull(skb, sizeof(*info));
2569
2570 memcpy(smp->irk, info->irk, 16);
2571
2572 return 0;
2573}
2574
2575static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2576 struct sk_buff *skb)
2577{
2578 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002579 struct l2cap_chan *chan = conn->smp;
2580 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002581 struct hci_conn *hcon = conn->hcon;
2582 bdaddr_t rpa;
2583
2584 BT_DBG("");
2585
2586 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002587 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002588
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002589 /* Mark the information as received */
2590 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2591
Johan Hedbergb28b4942014-09-05 22:19:55 +03002592 if (smp->remote_key_dist & SMP_DIST_SIGN)
2593 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2594
Johan Hedbergfd349c02014-02-18 10:19:36 +02002595 skb_pull(skb, sizeof(*info));
2596
Johan Hedberga9a58f82014-02-25 22:24:37 +02002597 /* Strictly speaking the Core Specification (4.1) allows sending
2598 * an empty address which would force us to rely on just the IRK
2599 * as "identity information". However, since such
2600 * implementations are not known of and in order to not over
2601 * complicate our implementation, simply pretend that we never
2602 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002603 *
2604 * The Identity Address must also be a Static Random or Public
2605 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002606 */
Johan Hedberge12af482015-01-14 20:51:37 +02002607 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2608 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002609 bt_dev_err(hcon->hdev, "ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002610 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002611 }
2612
Szymon Janc1d87b882019-06-19 00:47:47 +02002613 /* Drop IRK if peer is using identity address during pairing but is
2614 * providing different address as identity information.
2615 *
2616 * Microsoft Surface Precision Mouse is known to have this bug.
2617 */
2618 if (hci_is_identity_address(&hcon->dst, hcon->dst_type) &&
2619 (bacmp(&info->bdaddr, &hcon->dst) ||
2620 info->addr_type != hcon->dst_type)) {
2621 bt_dev_err(hcon->hdev,
2622 "ignoring IRK with invalid identity address");
2623 goto distribute;
2624 }
2625
Johan Hedbergfd349c02014-02-18 10:19:36 +02002626 bacpy(&smp->id_addr, &info->bdaddr);
2627 smp->id_addr_type = info->addr_type;
2628
2629 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2630 bacpy(&rpa, &hcon->dst);
2631 else
2632 bacpy(&rpa, BDADDR_ANY);
2633
Johan Hedberg23d0e122014-02-19 14:57:46 +02002634 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2635 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002636
Johan Hedberg31dd6242014-06-27 14:23:02 +03002637distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002638 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2639 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002640
2641 return 0;
2642}
2643
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002644static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2645{
2646 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002647 struct l2cap_chan *chan = conn->smp;
2648 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002649 struct smp_csrk *csrk;
2650
2651 BT_DBG("conn %p", conn);
2652
2653 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002654 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002655
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002656 /* Mark the information as received */
2657 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2658
2659 skb_pull(skb, sizeof(*rp));
2660
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002661 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2662 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002663 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2664 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2665 else
2666 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002667 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2668 }
2669 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002670 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002671
2672 return 0;
2673}
2674
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002675static u8 sc_select_method(struct smp_chan *smp)
2676{
2677 struct l2cap_conn *conn = smp->conn;
2678 struct hci_conn *hcon = conn->hcon;
2679 struct smp_cmd_pairing *local, *remote;
2680 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2681
Johan Hedberg1a8bab42015-03-16 11:45:44 +02002682 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) ||
2683 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags))
Johan Hedberga29b0732014-10-28 15:17:05 +01002684 return REQ_OOB;
2685
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002686 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2687 * which are needed as inputs to some crypto functions. To get
2688 * the "struct smp_cmd_pairing" from them we need to skip the
2689 * first byte which contains the opcode.
2690 */
2691 if (hcon->out) {
2692 local = (void *) &smp->preq[1];
2693 remote = (void *) &smp->prsp[1];
2694 } else {
2695 local = (void *) &smp->prsp[1];
2696 remote = (void *) &smp->preq[1];
2697 }
2698
2699 local_io = local->io_capability;
2700 remote_io = remote->io_capability;
2701
2702 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2703 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2704
2705 /* If either side wants MITM, look up the method from the table,
2706 * otherwise use JUST WORKS.
2707 */
2708 if (local_mitm || remote_mitm)
2709 method = get_auth_method(smp, local_io, remote_io);
2710 else
2711 method = JUST_WORKS;
2712
2713 /* Don't confirm locally initiated pairing attempts */
2714 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2715 method = JUST_WORKS;
2716
2717 return method;
2718}
2719
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002720static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2721{
2722 struct smp_cmd_public_key *key = (void *) skb->data;
2723 struct hci_conn *hcon = conn->hcon;
2724 struct l2cap_chan *chan = conn->smp;
2725 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002726 struct hci_dev *hdev = hcon->hdev;
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002727 struct crypto_kpp *tfm_ecdh;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002728 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002729 int err;
2730
2731 BT_DBG("conn %p", conn);
2732
2733 if (skb->len < sizeof(*key))
2734 return SMP_INVALID_PARAMS;
2735
2736 memcpy(smp->remote_pk, key, 64);
2737
Johan Hedberga8ca6172015-03-16 18:12:57 +02002738 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {
2739 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2740 smp->rr, 0, cfm.confirm_val);
2741 if (err)
2742 return SMP_UNSPECIFIED;
2743
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002744 if (crypto_memneq(cfm.confirm_val, smp->pcnf, 16))
Johan Hedberga8ca6172015-03-16 18:12:57 +02002745 return SMP_CONFIRM_FAILED;
2746 }
2747
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002748 /* Non-initiating device sends its public key after receiving
2749 * the key from the initiating device.
2750 */
2751 if (!hcon->out) {
2752 err = sc_send_public_key(smp);
2753 if (err)
2754 return err;
2755 }
2756
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002757 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
Marcel Holtmanne0915262015-03-16 12:34:55 -07002758 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002759
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002760 /* Compute the shared secret on the same crypto tfm on which the private
2761 * key was set/generated.
2762 */
2763 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Matias Karhumaa4ba51752018-09-11 14:10:13 +03002764 struct l2cap_chan *hchan = hdev->smp_data;
2765 struct smp_dev *smp_dev;
2766
2767 if (!hchan || !hchan->data)
2768 return SMP_UNSPECIFIED;
2769
2770 smp_dev = hchan->data;
Tudor Ambarusc0153b02017-09-28 17:14:55 +03002771
2772 tfm_ecdh = smp_dev->tfm_ecdh;
2773 } else {
2774 tfm_ecdh = smp->tfm_ecdh;
2775 }
2776
2777 if (compute_ecdh_secret(tfm_ecdh, smp->remote_pk, smp->dhkey))
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002778 return SMP_UNSPECIFIED;
2779
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002780 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002781
2782 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2783
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002784 smp->method = sc_select_method(smp);
2785
2786 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2787
2788 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2789 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2790 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2791 else
2792 hcon->pending_sec_level = BT_SECURITY_FIPS;
2793
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002794 if (!crypto_memneq(debug_pk, smp->remote_pk, 64))
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002795 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2796
Johan Hedberg38606f12014-06-25 11:10:28 +03002797 if (smp->method == DSP_PASSKEY) {
2798 get_random_bytes(&hcon->passkey_notify,
2799 sizeof(hcon->passkey_notify));
2800 hcon->passkey_notify %= 1000000;
2801 hcon->passkey_entered = 0;
2802 smp->passkey_round = 0;
2803 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2804 hcon->dst_type,
2805 hcon->passkey_notify,
2806 hcon->passkey_entered))
2807 return SMP_UNSPECIFIED;
2808 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2809 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2810 }
2811
Johan Hedberg94ea7252015-03-16 11:45:46 +02002812 if (smp->method == REQ_OOB) {
Johan Hedberga29b0732014-10-28 15:17:05 +01002813 if (hcon->out)
2814 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2815 sizeof(smp->prnd), smp->prnd);
2816
2817 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2818
2819 return 0;
2820 }
2821
Johan Hedberg38606f12014-06-25 11:10:28 +03002822 if (hcon->out)
2823 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2824
2825 if (smp->method == REQ_PASSKEY) {
2826 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2827 hcon->dst_type))
2828 return SMP_UNSPECIFIED;
2829 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2830 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2831 return 0;
2832 }
2833
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002834 /* The Initiating device waits for the non-initiating device to
2835 * send the confirm value.
2836 */
2837 if (conn->hcon->out)
2838 return 0;
2839
2840 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2841 0, cfm.confirm_val);
2842 if (err)
2843 return SMP_UNSPECIFIED;
2844
2845 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2846 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2847
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002848 return 0;
2849}
2850
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002851static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2852{
2853 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2854 struct l2cap_chan *chan = conn->smp;
2855 struct hci_conn *hcon = conn->hcon;
2856 struct smp_chan *smp = chan->data;
2857 u8 a[7], b[7], *local_addr, *remote_addr;
2858 u8 io_cap[3], r[16], e[16];
2859 int err;
2860
2861 BT_DBG("conn %p", conn);
2862
2863 if (skb->len < sizeof(*check))
2864 return SMP_INVALID_PARAMS;
2865
2866 memcpy(a, &hcon->init_addr, 6);
2867 memcpy(b, &hcon->resp_addr, 6);
2868 a[6] = hcon->init_addr_type;
2869 b[6] = hcon->resp_addr_type;
2870
2871 if (hcon->out) {
2872 local_addr = a;
2873 remote_addr = b;
2874 memcpy(io_cap, &smp->prsp[1], 3);
2875 } else {
2876 local_addr = b;
2877 remote_addr = a;
2878 memcpy(io_cap, &smp->preq[1], 3);
2879 }
2880
2881 memset(r, 0, sizeof(r));
2882
Johan Hedberg38606f12014-06-25 11:10:28 +03002883 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2884 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg882fafa2015-03-16 11:45:43 +02002885 else if (smp->method == REQ_OOB)
2886 memcpy(r, smp->lr, 16);
Johan Hedberg38606f12014-06-25 11:10:28 +03002887
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002888 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2889 io_cap, remote_addr, local_addr, e);
2890 if (err)
2891 return SMP_UNSPECIFIED;
2892
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02002893 if (crypto_memneq(check->e, e, 16))
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002894 return SMP_DHKEY_CHECK_FAILED;
2895
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002896 if (!hcon->out) {
2897 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2898 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2899 return 0;
2900 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002901
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002902 /* Slave sends DHKey check as response to master */
2903 sc_dhkey_check(smp);
2904 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002905
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002906 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002907
2908 if (hcon->out) {
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002909 hci_le_start_enc(hcon, 0, 0, smp->tk, smp->enc_key_size);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002910 hcon->enc_key_size = smp->enc_key_size;
2911 }
2912
2913 return 0;
2914}
2915
Johan Hedberg1408bb62014-06-04 22:45:57 +03002916static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2917 struct sk_buff *skb)
2918{
2919 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2920
2921 BT_DBG("value 0x%02x", kp->value);
2922
2923 return 0;
2924}
2925
Johan Hedberg4befb862014-08-11 22:06:38 +03002926static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002927{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002928 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002929 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002930 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002931 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002932 int err = 0;
2933
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002934 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002935 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002936
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002937 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002938 reason = SMP_PAIRING_NOTSUPP;
2939 goto done;
2940 }
2941
Marcel Holtmann92381f52013-10-03 01:23:08 -07002942 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002943 skb_pull(skb, sizeof(code));
2944
Johan Hedbergb28b4942014-09-05 22:19:55 +03002945 smp = chan->data;
2946
2947 if (code > SMP_CMD_MAX)
2948 goto drop;
2949
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002950 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002951 goto drop;
2952
2953 /* If we don't have a context the only allowed commands are
2954 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002955 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002956 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2957 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002958
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002959 switch (code) {
2960 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002961 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002962 break;
2963
2964 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002965 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002966 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002967 break;
2968
2969 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002970 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002971 break;
2972
2973 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002974 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002975 break;
2976
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002977 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002978 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002979 break;
2980
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002981 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002982 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002983 break;
2984
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002985 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002986 reason = smp_cmd_encrypt_info(conn, skb);
2987 break;
2988
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002989 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002990 reason = smp_cmd_master_ident(conn, skb);
2991 break;
2992
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002993 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002994 reason = smp_cmd_ident_info(conn, skb);
2995 break;
2996
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002997 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002998 reason = smp_cmd_ident_addr_info(conn, skb);
2999 break;
3000
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003001 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07003002 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03003003 break;
3004
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03003005 case SMP_CMD_PUBLIC_KEY:
3006 reason = smp_cmd_public_key(conn, skb);
3007 break;
3008
Johan Hedberg6433a9a2014-06-06 11:47:30 +03003009 case SMP_CMD_DHKEY_CHECK:
3010 reason = smp_cmd_dhkey_check(conn, skb);
3011 break;
3012
Johan Hedberg1408bb62014-06-04 22:45:57 +03003013 case SMP_CMD_KEYPRESS_NOTIFY:
3014 reason = smp_cmd_keypress_notify(conn, skb);
3015 break;
3016
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003017 default:
3018 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003019 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03003020 goto done;
3021 }
3022
3023done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03003024 if (!err) {
3025 if (reason)
3026 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03003027 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03003028 }
3029
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003030 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03003031
3032drop:
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003033 bt_dev_err(hcon->hdev, "unexpected SMP command 0x%02x from %pMR",
3034 code, &hcon->dst);
Johan Hedbergb28b4942014-09-05 22:19:55 +03003035 kfree_skb(skb);
3036 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03003037}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03003038
Johan Hedberg70db83c2014-08-08 09:37:16 +03003039static void smp_teardown_cb(struct l2cap_chan *chan, int err)
3040{
3041 struct l2cap_conn *conn = chan->conn;
3042
3043 BT_DBG("chan %p", chan);
3044
Johan Hedbergfc75cc82014-09-05 22:19:52 +03003045 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003046 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003047
Johan Hedberg70db83c2014-08-08 09:37:16 +03003048 conn->smp = NULL;
3049 l2cap_chan_put(chan);
3050}
3051
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003052static void bredr_pairing(struct l2cap_chan *chan)
3053{
3054 struct l2cap_conn *conn = chan->conn;
3055 struct hci_conn *hcon = conn->hcon;
3056 struct hci_dev *hdev = hcon->hdev;
3057 struct smp_cmd_pairing req;
3058 struct smp_chan *smp;
3059
3060 BT_DBG("chan %p", chan);
3061
3062 /* Only new pairings are interesting */
3063 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
3064 return;
3065
3066 /* Don't bother if we're not encrypted */
3067 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3068 return;
3069
3070 /* Only master may initiate SMP over BR/EDR */
3071 if (hcon->role != HCI_ROLE_MASTER)
3072 return;
3073
3074 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003075 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003076 return;
3077
3078 /* BR/EDR must use Secure Connections for SMP */
3079 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003080 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003081 return;
3082
3083 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07003084 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003085 return;
3086
3087 /* Don't bother if remote LE support is not enabled */
3088 if (!lmp_host_le_capable(hcon))
3089 return;
3090
3091 /* Remote must support SMP fixed chan for BR/EDR */
3092 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
3093 return;
3094
3095 /* Don't bother if SMP is already ongoing */
3096 if (chan->data)
3097 return;
3098
3099 smp = smp_chan_create(conn);
3100 if (!smp) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01003101 bt_dev_err(hdev, "unable to create SMP context for BR/EDR");
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003102 return;
3103 }
3104
3105 set_bit(SMP_FLAG_SC, &smp->flags);
3106
3107 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
3108
3109 /* Prepare and send the BR/EDR SMP Pairing Request */
3110 build_bredr_pairing_cmd(smp, &req, NULL);
3111
3112 smp->preq[0] = SMP_CMD_PAIRING_REQ;
3113 memcpy(&smp->preq[1], &req, sizeof(req));
3114
3115 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
3116 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
3117}
3118
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003119static void smp_resume_cb(struct l2cap_chan *chan)
3120{
Johan Hedbergb68fda62014-08-11 22:06:40 +03003121 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003122 struct l2cap_conn *conn = chan->conn;
3123 struct hci_conn *hcon = conn->hcon;
3124
3125 BT_DBG("chan %p", chan);
3126
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003127 if (hcon->type == ACL_LINK) {
3128 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003129 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003130 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003131
Johan Hedberg86d14072014-08-11 22:06:43 +03003132 if (!smp)
3133 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03003134
Johan Hedberg84bc0db2014-09-05 22:19:49 +03003135 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3136 return;
3137
Johan Hedberg86d14072014-08-11 22:06:43 +03003138 cancel_delayed_work(&smp->security_timer);
3139
Johan Hedbergd6268e82014-09-05 22:19:51 +03003140 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003141}
3142
Johan Hedberg70db83c2014-08-08 09:37:16 +03003143static void smp_ready_cb(struct l2cap_chan *chan)
3144{
3145 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003146 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003147
3148 BT_DBG("chan %p", chan);
3149
Johan Hedberg78837462015-11-11 21:47:12 +02003150 /* No need to call l2cap_chan_hold() here since we already own
3151 * the reference taken in smp_new_conn_cb(). This is just the
3152 * first time that we tie it to a specific pointer. The code in
3153 * l2cap_core.c ensures that there's no risk this function wont
3154 * get called if smp_new_conn_cb was previously called.
3155 */
Johan Hedberg70db83c2014-08-08 09:37:16 +03003156 conn->smp = chan;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003157
3158 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3159 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003160}
3161
Johan Hedberg4befb862014-08-11 22:06:38 +03003162static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
3163{
3164 int err;
3165
3166 BT_DBG("chan %p", chan);
3167
3168 err = smp_sig_channel(chan, skb);
3169 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03003170 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03003171
Johan Hedbergb68fda62014-08-11 22:06:40 +03003172 if (smp)
3173 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03003174
Johan Hedberg1e91c292014-08-18 20:33:29 +03003175 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03003176 }
3177
3178 return err;
3179}
3180
Johan Hedberg70db83c2014-08-08 09:37:16 +03003181static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
3182 unsigned long hdr_len,
3183 unsigned long len, int nb)
3184{
3185 struct sk_buff *skb;
3186
3187 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
3188 if (!skb)
3189 return ERR_PTR(-ENOMEM);
3190
3191 skb->priority = HCI_PRIO_MAX;
Johan Hedberga4368ff2015-03-30 23:21:01 +03003192 bt_cb(skb)->l2cap.chan = chan;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003193
3194 return skb;
3195}
3196
3197static const struct l2cap_ops smp_chan_ops = {
3198 .name = "Security Manager",
3199 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003200 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003201 .alloc_skb = smp_alloc_skb_cb,
3202 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003203 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003204
3205 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003206 .state_change = l2cap_chan_no_state_change,
3207 .close = l2cap_chan_no_close,
3208 .defer = l2cap_chan_no_defer,
3209 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003210 .set_shutdown = l2cap_chan_no_set_shutdown,
3211 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003212};
3213
3214static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
3215{
3216 struct l2cap_chan *chan;
3217
3218 BT_DBG("pchan %p", pchan);
3219
3220 chan = l2cap_chan_create();
3221 if (!chan)
3222 return NULL;
3223
3224 chan->chan_type = pchan->chan_type;
3225 chan->ops = &smp_chan_ops;
3226 chan->scid = pchan->scid;
3227 chan->dcid = chan->scid;
3228 chan->imtu = pchan->imtu;
3229 chan->omtu = pchan->omtu;
3230 chan->mode = pchan->mode;
3231
Johan Hedbergabe84902014-11-12 22:22:21 +02003232 /* Other L2CAP channels may request SMP routines in order to
3233 * change the security level. This means that the SMP channel
3234 * lock must be considered in its own category to avoid lockdep
3235 * warnings.
3236 */
3237 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
3238
Johan Hedberg70db83c2014-08-08 09:37:16 +03003239 BT_DBG("created chan %p", chan);
3240
3241 return chan;
3242}
3243
3244static const struct l2cap_ops smp_root_chan_ops = {
3245 .name = "Security Manager Root",
3246 .new_connection = smp_new_conn_cb,
3247
3248 /* None of these are implemented for the root channel */
3249 .close = l2cap_chan_no_close,
3250 .alloc_skb = l2cap_chan_no_alloc_skb,
3251 .recv = l2cap_chan_no_recv,
3252 .state_change = l2cap_chan_no_state_change,
3253 .teardown = l2cap_chan_no_teardown,
3254 .ready = l2cap_chan_no_ready,
3255 .defer = l2cap_chan_no_defer,
3256 .suspend = l2cap_chan_no_suspend,
3257 .resume = l2cap_chan_no_resume,
3258 .set_shutdown = l2cap_chan_no_set_shutdown,
3259 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003260};
3261
Johan Hedbergef8efe42014-08-13 15:12:32 +03003262static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003263{
Johan Hedberg70db83c2014-08-08 09:37:16 +03003264 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003265 struct smp_dev *smp;
Herbert Xu71af2f62016-01-24 21:18:30 +08003266 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003267 struct crypto_kpp *tfm_ecdh;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003268
Johan Hedbergef8efe42014-08-13 15:12:32 +03003269 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003270 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03003271 goto create_chan;
3272 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03003273
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003274 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3275 if (!smp)
3276 return ERR_PTR(-ENOMEM);
3277
Herbert Xu71af2f62016-01-24 21:18:30 +08003278 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003279 if (IS_ERR(tfm_cmac)) {
3280 BT_ERR("Unable to create CMAC crypto context");
Waiman Long453431a2020-08-06 23:18:13 -07003281 kfree_sensitive(smp);
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003282 return ERR_CAST(tfm_cmac);
3283 }
3284
Herbert Xu075f7732020-07-31 17:41:58 +10003285 tfm_ecdh = crypto_alloc_kpp("ecdh", 0, 0);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003286 if (IS_ERR(tfm_ecdh)) {
3287 BT_ERR("Unable to create ECDH crypto context");
3288 crypto_free_shash(tfm_cmac);
Waiman Long453431a2020-08-06 23:18:13 -07003289 kfree_sensitive(smp);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003290 return ERR_CAST(tfm_ecdh);
3291 }
3292
Johan Hedberg94f14e42018-09-11 14:10:12 +03003293 smp->local_oob = false;
Marcel Holtmann6e2dc6d12015-03-16 01:10:21 -07003294 smp->tfm_cmac = tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003295 smp->tfm_ecdh = tfm_ecdh;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003296
Johan Hedbergef8efe42014-08-13 15:12:32 +03003297create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003298 chan = l2cap_chan_create();
3299 if (!chan) {
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003300 if (smp) {
Herbert Xu71af2f62016-01-24 21:18:30 +08003301 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003302 crypto_free_kpp(smp->tfm_ecdh);
Waiman Long453431a2020-08-06 23:18:13 -07003303 kfree_sensitive(smp);
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003304 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003305 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003306 }
3307
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003308 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003309
Johan Hedbergef8efe42014-08-13 15:12:32 +03003310 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003311
3312 l2cap_chan_set_defaults(chan);
3313
Marcel Holtmann157029b2015-01-14 15:43:09 -08003314 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003315 u8 bdaddr_type;
3316
3317 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3318
3319 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003320 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003321 else
3322 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003323 } else {
3324 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003325 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003326 }
3327
Johan Hedberg70db83c2014-08-08 09:37:16 +03003328 chan->state = BT_LISTEN;
3329 chan->mode = L2CAP_MODE_BASIC;
3330 chan->imtu = L2CAP_DEFAULT_MTU;
3331 chan->ops = &smp_root_chan_ops;
3332
Johan Hedbergabe84902014-11-12 22:22:21 +02003333 /* Set correct nesting level for a parent/listening channel */
3334 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3335
Johan Hedbergef8efe42014-08-13 15:12:32 +03003336 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003337}
3338
Johan Hedbergef8efe42014-08-13 15:12:32 +03003339static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003340{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003341 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003342
Johan Hedbergef8efe42014-08-13 15:12:32 +03003343 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003344
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003345 smp = chan->data;
3346 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003347 chan->data = NULL;
Herbert Xu71af2f62016-01-24 21:18:30 +08003348 crypto_free_shash(smp->tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003349 crypto_free_kpp(smp->tfm_ecdh);
Waiman Long453431a2020-08-06 23:18:13 -07003350 kfree_sensitive(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003351 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003352
Johan Hedberg70db83c2014-08-08 09:37:16 +03003353 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003354}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003355
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003356static ssize_t force_bredr_smp_read(struct file *file,
3357 char __user *user_buf,
3358 size_t count, loff_t *ppos)
3359{
3360 struct hci_dev *hdev = file->private_data;
3361 char buf[3];
3362
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003363 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP) ? 'Y': 'N';
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003364 buf[1] = '\n';
3365 buf[2] = '\0';
3366 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3367}
3368
3369static ssize_t force_bredr_smp_write(struct file *file,
3370 const char __user *user_buf,
3371 size_t count, loff_t *ppos)
3372{
3373 struct hci_dev *hdev = file->private_data;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003374 bool enable;
Andy Shevchenko3bf5e972018-05-29 16:33:48 +03003375 int err;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003376
Andy Shevchenko3bf5e972018-05-29 16:33:48 +03003377 err = kstrtobool_from_user(user_buf, count, &enable);
3378 if (err)
3379 return err;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003380
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003381 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003382 return -EALREADY;
3383
3384 if (enable) {
3385 struct l2cap_chan *chan;
3386
3387 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3388 if (IS_ERR(chan))
3389 return PTR_ERR(chan);
3390
3391 hdev->smp_bredr_data = chan;
3392 } else {
3393 struct l2cap_chan *chan;
3394
3395 chan = hdev->smp_bredr_data;
3396 hdev->smp_bredr_data = NULL;
3397 smp_del_chan(chan);
3398 }
3399
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003400 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003401
3402 return count;
3403}
3404
3405static const struct file_operations force_bredr_smp_fops = {
3406 .open = simple_open,
3407 .read = force_bredr_smp_read,
3408 .write = force_bredr_smp_write,
3409 .llseek = default_llseek,
3410};
3411
Johan Hedbergef8efe42014-08-13 15:12:32 +03003412int smp_register(struct hci_dev *hdev)
3413{
3414 struct l2cap_chan *chan;
3415
3416 BT_DBG("%s", hdev->name);
3417
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003418 /* If the controller does not support Low Energy operation, then
3419 * there is also no need to register any SMP channel.
3420 */
3421 if (!lmp_le_capable(hdev))
3422 return 0;
3423
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003424 if (WARN_ON(hdev->smp_data)) {
3425 chan = hdev->smp_data;
3426 hdev->smp_data = NULL;
3427 smp_del_chan(chan);
3428 }
3429
Johan Hedbergef8efe42014-08-13 15:12:32 +03003430 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3431 if (IS_ERR(chan))
3432 return PTR_ERR(chan);
3433
3434 hdev->smp_data = chan;
3435
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003436 /* If the controller does not support BR/EDR Secure Connections
3437 * feature, then the BR/EDR SMP channel shall not be present.
3438 *
3439 * To test this with Bluetooth 4.0 controllers, create a debugfs
3440 * switch that allows forcing BR/EDR SMP support and accepting
3441 * cross-transport pairing on non-AES encrypted connections.
3442 */
3443 if (!lmp_sc_capable(hdev)) {
3444 debugfs_create_file("force_bredr_smp", 0644, hdev->debugfs,
3445 hdev, &force_bredr_smp_fops);
Szymon Janc83ebb9e2016-09-09 20:24:40 +02003446
3447 /* Flag can be already set here (due to power toggle) */
3448 if (!hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
3449 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003450 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003451
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003452 if (WARN_ON(hdev->smp_bredr_data)) {
3453 chan = hdev->smp_bredr_data;
3454 hdev->smp_bredr_data = NULL;
3455 smp_del_chan(chan);
3456 }
3457
Johan Hedbergef8efe42014-08-13 15:12:32 +03003458 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3459 if (IS_ERR(chan)) {
3460 int err = PTR_ERR(chan);
3461 chan = hdev->smp_data;
3462 hdev->smp_data = NULL;
3463 smp_del_chan(chan);
3464 return err;
3465 }
3466
3467 hdev->smp_bredr_data = chan;
3468
3469 return 0;
3470}
3471
3472void smp_unregister(struct hci_dev *hdev)
3473{
3474 struct l2cap_chan *chan;
3475
3476 if (hdev->smp_bredr_data) {
3477 chan = hdev->smp_bredr_data;
3478 hdev->smp_bredr_data = NULL;
3479 smp_del_chan(chan);
3480 }
3481
3482 if (hdev->smp_data) {
3483 chan = hdev->smp_data;
3484 hdev->smp_data = NULL;
3485 smp_del_chan(chan);
3486 }
3487}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003488
3489#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3490
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003491static int __init test_debug_key(struct crypto_kpp *tfm_ecdh)
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003492{
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003493 u8 pk[64];
Tudor Ambarusa2976412017-09-28 17:14:52 +03003494 int err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003495
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003496 err = set_ecdh_privkey(tfm_ecdh, debug_sk);
Tudor Ambarusa2976412017-09-28 17:14:52 +03003497 if (err)
3498 return err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003499
Tudor Ambarusc0153b02017-09-28 17:14:55 +03003500 err = generate_ecdh_public_key(tfm_ecdh, pk);
3501 if (err)
3502 return err;
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003503
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003504 if (crypto_memneq(pk, debug_pk, 64))
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003505 return -EINVAL;
3506
3507 return 0;
3508}
3509
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003510static int __init test_ah(void)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003511{
3512 const u8 irk[16] = {
3513 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3514 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3515 const u8 r[3] = { 0x94, 0x81, 0x70 };
3516 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3517 u8 res[3];
3518 int err;
3519
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003520 err = smp_ah(irk, r, res);
Johan Hedbergcfc41982014-12-30 09:50:40 +02003521 if (err)
3522 return err;
3523
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003524 if (crypto_memneq(res, exp, 3))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003525 return -EINVAL;
3526
3527 return 0;
3528}
3529
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003530static int __init test_c1(void)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003531{
3532 const u8 k[16] = {
3533 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3535 const u8 r[16] = {
3536 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3537 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3538 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3539 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3540 const u8 _iat = 0x01;
3541 const u8 _rat = 0x00;
3542 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3543 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3544 const u8 exp[16] = {
3545 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3546 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3547 u8 res[16];
3548 int err;
3549
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003550 err = smp_c1(k, r, preq, pres, _iat, &ia, _rat, &ra, res);
Johan Hedbergcfc41982014-12-30 09:50:40 +02003551 if (err)
3552 return err;
3553
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003554 if (crypto_memneq(res, exp, 16))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003555 return -EINVAL;
3556
3557 return 0;
3558}
3559
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003560static int __init test_s1(void)
Johan Hedbergcfc41982014-12-30 09:50:40 +02003561{
3562 const u8 k[16] = {
3563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3565 const u8 r1[16] = {
3566 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3567 const u8 r2[16] = {
3568 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3569 const u8 exp[16] = {
3570 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3571 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3572 u8 res[16];
3573 int err;
3574
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003575 err = smp_s1(k, r1, r2, res);
Johan Hedbergcfc41982014-12-30 09:50:40 +02003576 if (err)
3577 return err;
3578
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003579 if (crypto_memneq(res, exp, 16))
Johan Hedbergcfc41982014-12-30 09:50:40 +02003580 return -EINVAL;
3581
3582 return 0;
3583}
3584
Herbert Xu71af2f62016-01-24 21:18:30 +08003585static int __init test_f4(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003586{
3587 const u8 u[32] = {
3588 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3589 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3590 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3591 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3592 const u8 v[32] = {
3593 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3594 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3595 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3596 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3597 const u8 x[16] = {
3598 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3599 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3600 const u8 z = 0x00;
3601 const u8 exp[16] = {
3602 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3603 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3604 u8 res[16];
3605 int err;
3606
3607 err = smp_f4(tfm_cmac, u, v, x, z, res);
3608 if (err)
3609 return err;
3610
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003611 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003612 return -EINVAL;
3613
3614 return 0;
3615}
3616
Herbert Xu71af2f62016-01-24 21:18:30 +08003617static int __init test_f5(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003618{
3619 const u8 w[32] = {
3620 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3621 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3622 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3623 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3624 const u8 n1[16] = {
3625 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3626 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3627 const u8 n2[16] = {
3628 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3629 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3630 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3631 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3632 const u8 exp_ltk[16] = {
3633 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3634 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3635 const u8 exp_mackey[16] = {
3636 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3637 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3638 u8 mackey[16], ltk[16];
3639 int err;
3640
3641 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3642 if (err)
3643 return err;
3644
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003645 if (crypto_memneq(mackey, exp_mackey, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003646 return -EINVAL;
3647
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003648 if (crypto_memneq(ltk, exp_ltk, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003649 return -EINVAL;
3650
3651 return 0;
3652}
3653
Herbert Xu71af2f62016-01-24 21:18:30 +08003654static int __init test_f6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003655{
3656 const u8 w[16] = {
3657 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3658 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3659 const u8 n1[16] = {
3660 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3661 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3662 const u8 n2[16] = {
3663 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3664 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3665 const u8 r[16] = {
3666 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3667 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3668 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3669 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3670 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3671 const u8 exp[16] = {
3672 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3673 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3674 u8 res[16];
3675 int err;
3676
3677 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3678 if (err)
3679 return err;
3680
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003681 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003682 return -EINVAL;
3683
3684 return 0;
3685}
3686
Herbert Xu71af2f62016-01-24 21:18:30 +08003687static int __init test_g2(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003688{
3689 const u8 u[32] = {
3690 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3691 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3692 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3693 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3694 const u8 v[32] = {
3695 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3696 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3697 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3698 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3699 const u8 x[16] = {
3700 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3701 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3702 const u8 y[16] = {
3703 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3704 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3705 const u32 exp_val = 0x2f9ed5ba % 1000000;
3706 u32 val;
3707 int err;
3708
3709 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3710 if (err)
3711 return err;
3712
3713 if (val != exp_val)
3714 return -EINVAL;
3715
3716 return 0;
3717}
3718
Herbert Xu71af2f62016-01-24 21:18:30 +08003719static int __init test_h6(struct crypto_shash *tfm_cmac)
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003720{
3721 const u8 w[16] = {
3722 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3723 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3724 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3725 const u8 exp[16] = {
3726 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3727 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3728 u8 res[16];
3729 int err;
3730
3731 err = smp_h6(tfm_cmac, w, key_id, res);
3732 if (err)
3733 return err;
3734
Jason A. Donenfeld329d8232017-06-10 04:59:11 +02003735 if (crypto_memneq(res, exp, 16))
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003736 return -EINVAL;
3737
3738 return 0;
3739}
3740
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003741static char test_smp_buffer[32];
3742
3743static ssize_t test_smp_read(struct file *file, char __user *user_buf,
3744 size_t count, loff_t *ppos)
3745{
3746 return simple_read_from_buffer(user_buf, count, ppos, test_smp_buffer,
3747 strlen(test_smp_buffer));
3748}
3749
3750static const struct file_operations test_smp_fops = {
3751 .open = simple_open,
3752 .read = test_smp_read,
3753 .llseek = default_llseek,
3754};
3755
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003756static int __init run_selftests(struct crypto_shash *tfm_cmac,
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003757 struct crypto_kpp *tfm_ecdh)
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003758{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003759 ktime_t calltime, delta, rettime;
3760 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003761 int err;
3762
Marcel Holtmann255047b2014-12-30 00:11:20 -08003763 calltime = ktime_get();
3764
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003765 err = test_debug_key(tfm_ecdh);
Marcel Holtmann71653eb2017-04-30 06:51:41 -07003766 if (err) {
3767 BT_ERR("debug_key test failed");
3768 goto done;
3769 }
3770
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003771 err = test_ah();
Johan Hedbergcfc41982014-12-30 09:50:40 +02003772 if (err) {
3773 BT_ERR("smp_ah test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003774 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003775 }
3776
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003777 err = test_c1();
Johan Hedbergcfc41982014-12-30 09:50:40 +02003778 if (err) {
3779 BT_ERR("smp_c1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003780 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003781 }
3782
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003783 err = test_s1();
Johan Hedbergcfc41982014-12-30 09:50:40 +02003784 if (err) {
3785 BT_ERR("smp_s1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003786 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003787 }
3788
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003789 err = test_f4(tfm_cmac);
3790 if (err) {
3791 BT_ERR("smp_f4 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003792 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003793 }
3794
3795 err = test_f5(tfm_cmac);
3796 if (err) {
3797 BT_ERR("smp_f5 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003798 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003799 }
3800
3801 err = test_f6(tfm_cmac);
3802 if (err) {
3803 BT_ERR("smp_f6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003804 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003805 }
3806
3807 err = test_g2(tfm_cmac);
3808 if (err) {
3809 BT_ERR("smp_g2 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003810 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003811 }
3812
3813 err = test_h6(tfm_cmac);
3814 if (err) {
3815 BT_ERR("smp_h6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003816 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003817 }
3818
Marcel Holtmann255047b2014-12-30 00:11:20 -08003819 rettime = ktime_get();
3820 delta = ktime_sub(rettime, calltime);
3821 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3822
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003823 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003824
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003825done:
3826 if (!err)
3827 snprintf(test_smp_buffer, sizeof(test_smp_buffer),
3828 "PASS (%llu usecs)\n", duration);
3829 else
3830 snprintf(test_smp_buffer, sizeof(test_smp_buffer), "FAIL\n");
3831
3832 debugfs_create_file("selftest_smp", 0444, bt_debugfs, NULL,
3833 &test_smp_fops);
3834
3835 return err;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003836}
3837
3838int __init bt_selftest_smp(void)
3839{
Herbert Xu71af2f62016-01-24 21:18:30 +08003840 struct crypto_shash *tfm_cmac;
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003841 struct crypto_kpp *tfm_ecdh;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003842 int err;
3843
Eric Biggers3d234b32018-11-14 12:21:11 -08003844 tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003845 if (IS_ERR(tfm_cmac)) {
3846 BT_ERR("Unable to create CMAC crypto context");
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003847 return PTR_ERR(tfm_cmac);
3848 }
3849
Herbert Xu075f7732020-07-31 17:41:58 +10003850 tfm_ecdh = crypto_alloc_kpp("ecdh", 0, 0);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003851 if (IS_ERR(tfm_ecdh)) {
3852 BT_ERR("Unable to create ECDH crypto context");
3853 crypto_free_shash(tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003854 return PTR_ERR(tfm_ecdh);
3855 }
3856
Ard Biesheuvel28a220a2019-07-02 21:41:41 +02003857 err = run_selftests(tfm_cmac, tfm_ecdh);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003858
Herbert Xu71af2f62016-01-24 21:18:30 +08003859 crypto_free_shash(tfm_cmac);
Tudor Ambarus47eb2ac2017-09-28 17:14:51 +03003860 crypto_free_kpp(tfm_ecdh);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003861
3862 return err;
3863}
3864
3865#endif