blob: 4b175df35184b08b5695d966f66b129148c6c011 [file] [log] [blame]
Anderson Brigliaeb492e02011-06-09 18:50:40 -03001/*
2 BlueZ - Bluetooth protocol stack for Linux
3 Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation;
8
9 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
10 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
11 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
12 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
13 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
19 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
20 SOFTWARE IS DISCLAIMED.
21*/
22
Marcel Holtmann300acfde2014-12-31 14:43:16 -080023#include <linux/debugfs.h>
Gustavo Padovan8c520a52012-05-23 04:04:22 -030024#include <linux/crypto.h>
25#include <linux/scatterlist.h>
26#include <crypto/b128ops.h>
27
Anderson Brigliaeb492e02011-06-09 18:50:40 -030028#include <net/bluetooth/bluetooth.h>
29#include <net/bluetooth/hci_core.h>
30#include <net/bluetooth/l2cap.h>
Brian Gix2b64d152011-12-21 16:12:12 -080031#include <net/bluetooth/mgmt.h>
Marcel Holtmannac4b7232013-10-10 14:54:16 -070032
Johan Hedberg3b191462014-06-06 10:50:15 +030033#include "ecc.h"
Marcel Holtmannac4b7232013-10-10 14:54:16 -070034#include "smp.h"
Anderson Brigliad22ef0b2011-06-09 18:50:44 -030035
Johan Hedberg2fd36552015-06-11 13:52:26 +030036#define SMP_DEV(hdev) \
37 ((struct smp_dev *)((struct l2cap_chan *)((hdev)->smp_data))->data)
38
Johan Hedbergc7a3d572014-12-01 22:03:16 +020039/* Low-level debug macros to be used for stuff that we don't want
40 * accidentially in dmesg, i.e. the values of the various crypto keys
41 * and the inputs & outputs of crypto functions.
42 */
43#ifdef DEBUG
44#define SMP_DBG(fmt, ...) printk(KERN_DEBUG "%s: " fmt, __func__, \
45 ##__VA_ARGS__)
46#else
47#define SMP_DBG(fmt, ...) no_printk(KERN_DEBUG "%s: " fmt, __func__, \
48 ##__VA_ARGS__)
49#endif
50
Johan Hedbergb28b4942014-09-05 22:19:55 +030051#define SMP_ALLOW_CMD(smp, code) set_bit(code, &smp->allow_cmd)
Johan Hedbergb28b4942014-09-05 22:19:55 +030052
Johan Hedberg3b191462014-06-06 10:50:15 +030053/* Keys which are not distributed with Secure Connections */
54#define SMP_SC_NO_DIST (SMP_DIST_ENC_KEY | SMP_DIST_LINK_KEY);
55
Marcel Holtmann17b02e62012-03-01 14:32:37 -080056#define SMP_TIMEOUT msecs_to_jiffies(30000)
Vinicius Costa Gomes5d3de7d2011-06-14 13:37:41 -030057
Marcel Holtmannd7a5a112015-03-13 02:11:00 -070058#define AUTH_REQ_MASK(dev) (hci_dev_test_flag(dev, HCI_SC_ENABLED) ? \
Johan Hedberg0edb14d2014-05-26 13:29:28 +030059 0x1f : 0x07)
60#define KEY_DIST_MASK 0x07
Johan Hedberg065a13e2012-10-11 16:26:06 +020061
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +030062/* Maximum message length that can be passed to aes_cmac */
63#define CMAC_MSG_MAX 80
64
Johan Hedberg533e35d2014-06-16 19:25:18 +030065enum {
66 SMP_FLAG_TK_VALID,
67 SMP_FLAG_CFM_PENDING,
68 SMP_FLAG_MITM_AUTH,
69 SMP_FLAG_COMPLETE,
70 SMP_FLAG_INITIATOR,
Johan Hedberg65668772014-05-16 11:03:34 +030071 SMP_FLAG_SC,
Johan Hedbergd8f8edb2014-06-06 11:09:28 +030072 SMP_FLAG_REMOTE_PK,
Johan Hedbergaeb7d462014-05-31 18:52:28 +030073 SMP_FLAG_DEBUG_KEY,
Johan Hedberg38606f12014-06-25 11:10:28 +030074 SMP_FLAG_WAIT_USER,
Johan Hedbergd3e54a82014-06-04 11:07:40 +030075 SMP_FLAG_DHKEY_PENDING,
Johan Hedberg1a8bab42015-03-16 11:45:44 +020076 SMP_FLAG_REMOTE_OOB,
77 SMP_FLAG_LOCAL_OOB,
Johan Hedberg533e35d2014-06-16 19:25:18 +030078};
Johan Hedberg4bc58f52014-05-20 09:45:47 +030079
Marcel Holtmann88a479d2015-03-16 01:10:19 -070080struct smp_dev {
Marcel Holtmann60a27d62015-03-16 01:10:22 -070081 /* Secure Connections OOB data */
82 u8 local_pk[64];
83 u8 local_sk[32];
Marcel Holtmannfb334fe2015-03-16 12:34:57 -070084 u8 local_rand[16];
Marcel Holtmann60a27d62015-03-16 01:10:22 -070085 bool debug_key;
86
Johan Hedbergb1f663c2015-06-11 13:52:27 +030087 u8 min_key_size;
Johan Hedberg2fd36552015-06-11 13:52:26 +030088 u8 max_key_size;
89
Marcel Holtmann88a479d2015-03-16 01:10:19 -070090 struct crypto_blkcipher *tfm_aes;
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -070091 struct crypto_hash *tfm_cmac;
Marcel Holtmann88a479d2015-03-16 01:10:19 -070092};
93
Johan Hedberg4bc58f52014-05-20 09:45:47 +030094struct smp_chan {
Johan Hedbergb68fda62014-08-11 22:06:40 +030095 struct l2cap_conn *conn;
96 struct delayed_work security_timer;
Johan Hedbergb28b4942014-09-05 22:19:55 +030097 unsigned long allow_cmd; /* Bitmask of allowed commands */
Johan Hedbergb68fda62014-08-11 22:06:40 +030098
Johan Hedberg4bc58f52014-05-20 09:45:47 +030099 u8 preq[7]; /* SMP Pairing Request */
100 u8 prsp[7]; /* SMP Pairing Response */
101 u8 prnd[16]; /* SMP Pairing Random (local) */
102 u8 rrnd[16]; /* SMP Pairing Random (remote) */
103 u8 pcnf[16]; /* SMP Pairing Confirm */
104 u8 tk[16]; /* SMP Temporary Key */
Johan Hedberg882fafa2015-03-16 11:45:43 +0200105 u8 rr[16]; /* Remote OOB ra/rb value */
106 u8 lr[16]; /* Local OOB ra/rb value */
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300107 u8 enc_key_size;
108 u8 remote_key_dist;
109 bdaddr_t id_addr;
110 u8 id_addr_type;
111 u8 irk[16];
112 struct smp_csrk *csrk;
113 struct smp_csrk *slave_csrk;
114 struct smp_ltk *ltk;
115 struct smp_ltk *slave_ltk;
116 struct smp_irk *remote_irk;
Johan Hedberg6a770832014-06-06 11:54:04 +0300117 u8 *link_key;
Johan Hedberg4a74d652014-05-20 09:45:50 +0300118 unsigned long flags;
Johan Hedberg783e0572014-05-31 18:48:26 +0300119 u8 method;
Johan Hedberg38606f12014-06-25 11:10:28 +0300120 u8 passkey_round;
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300121
Johan Hedberg3b191462014-06-06 10:50:15 +0300122 /* Secure Connections variables */
123 u8 local_pk[64];
124 u8 local_sk[32];
Johan Hedbergd8f8edb2014-06-06 11:09:28 +0300125 u8 remote_pk[64];
126 u8 dhkey[32];
Johan Hedberg760b0182014-06-06 11:44:05 +0300127 u8 mackey[16];
Johan Hedberg3b191462014-06-06 10:50:15 +0300128
Johan Hedberg6a7bd102014-06-27 14:23:03 +0300129 struct crypto_blkcipher *tfm_aes;
Johan Hedberg407cecf2014-05-02 14:19:47 +0300130 struct crypto_hash *tfm_cmac;
Johan Hedberg4bc58f52014-05-20 09:45:47 +0300131};
132
Johan Hedbergaeb7d462014-05-31 18:52:28 +0300133/* These debug key values are defined in the SMP section of the core
134 * specification. debug_pk is the public debug key and debug_sk the
135 * private debug key.
136 */
137static const u8 debug_pk[64] = {
138 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
139 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
140 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
141 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20,
142
143 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74,
144 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76,
145 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63,
146 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc,
147};
148
149static const u8 debug_sk[32] = {
150 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58,
151 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a,
152 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74,
153 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f,
154};
155
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300156static inline void swap_buf(const u8 *src, u8 *dst, size_t len)
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300157{
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300158 size_t i;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300159
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300160 for (i = 0; i < len; i++)
161 dst[len - 1 - i] = src[i];
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300162}
163
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200164/* The following functions map to the LE SC SMP crypto functions
165 * AES-CMAC, f4, f5, f6, g2 and h6.
166 */
167
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300168static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
169 size_t len, u8 mac[16])
170{
171 uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
172 struct hash_desc desc;
173 struct scatterlist sg;
174 int err;
175
176 if (len > CMAC_MSG_MAX)
177 return -EFBIG;
178
179 if (!tfm) {
180 BT_ERR("tfm %p", tfm);
181 return -EINVAL;
182 }
183
184 desc.tfm = tfm;
185 desc.flags = 0;
186
187 crypto_hash_init(&desc);
188
189 /* Swap key and message from LSB to MSB */
190 swap_buf(k, tmp, 16);
191 swap_buf(m, msg_msb, len);
192
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200193 SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
194 SMP_DBG("key %16phN", k);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300195
196 err = crypto_hash_setkey(tfm, tmp, 16);
197 if (err) {
198 BT_ERR("cipher setkey failed: %d", err);
199 return err;
200 }
201
202 sg_init_one(&sg, msg_msb, len);
203
204 err = crypto_hash_update(&desc, &sg, len);
205 if (err) {
206 BT_ERR("Hash update error %d", err);
207 return err;
208 }
209
210 err = crypto_hash_final(&desc, mac_msb);
211 if (err) {
212 BT_ERR("Hash final error %d", err);
213 return err;
214 }
215
216 swap_buf(mac_msb, mac, 16);
217
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200218 SMP_DBG("mac %16phN", mac);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300219
220 return 0;
221}
222
223static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
224 const u8 x[16], u8 z, u8 res[16])
225{
226 u8 m[65];
227 int err;
228
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200229 SMP_DBG("u %32phN", u);
230 SMP_DBG("v %32phN", v);
231 SMP_DBG("x %16phN z %02x", x, z);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300232
233 m[0] = z;
234 memcpy(m + 1, v, 32);
235 memcpy(m + 33, u, 32);
236
237 err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
238 if (err)
239 return err;
240
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200241 SMP_DBG("res %16phN", res);
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +0300242
243 return err;
244}
245
Johan Hedberg4da50de2014-12-29 12:04:10 +0200246static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32],
247 const u8 n1[16], const u8 n2[16], const u8 a1[7],
248 const u8 a2[7], u8 mackey[16], u8 ltk[16])
Johan Hedberg760b0182014-06-06 11:44:05 +0300249{
250 /* The btle, salt and length "magic" values are as defined in
251 * the SMP section of the Bluetooth core specification. In ASCII
252 * the btle value ends up being 'btle'. The salt is just a
253 * random number whereas length is the value 256 in little
254 * endian format.
255 */
256 const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
257 const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 0x60,
258 0x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 0x6c };
259 const u8 length[2] = { 0x00, 0x01 };
260 u8 m[53], t[16];
261 int err;
262
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200263 SMP_DBG("w %32phN", w);
264 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
265 SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300266
267 err = aes_cmac(tfm_cmac, salt, w, 32, t);
268 if (err)
269 return err;
270
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200271 SMP_DBG("t %16phN", t);
Johan Hedberg760b0182014-06-06 11:44:05 +0300272
273 memcpy(m, length, 2);
274 memcpy(m + 2, a2, 7);
275 memcpy(m + 9, a1, 7);
276 memcpy(m + 16, n2, 16);
277 memcpy(m + 32, n1, 16);
278 memcpy(m + 48, btle, 4);
279
280 m[52] = 0; /* Counter */
281
282 err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
283 if (err)
284 return err;
285
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200286 SMP_DBG("mackey %16phN", mackey);
Johan Hedberg760b0182014-06-06 11:44:05 +0300287
288 m[52] = 1; /* Counter */
289
290 err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
291 if (err)
292 return err;
293
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200294 SMP_DBG("ltk %16phN", ltk);
Johan Hedberg760b0182014-06-06 11:44:05 +0300295
296 return 0;
297}
298
299static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
Johan Hedberg4da50de2014-12-29 12:04:10 +0200300 const u8 n1[16], const u8 n2[16], const u8 r[16],
Johan Hedberg760b0182014-06-06 11:44:05 +0300301 const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
302 u8 res[16])
303{
304 u8 m[65];
305 int err;
306
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200307 SMP_DBG("w %16phN", w);
308 SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
309 SMP_DBG("r %16phN io_cap %3phN a1 %7phN a2 %7phN", r, io_cap, a1, a2);
Johan Hedberg760b0182014-06-06 11:44:05 +0300310
311 memcpy(m, a2, 7);
312 memcpy(m + 7, a1, 7);
313 memcpy(m + 14, io_cap, 3);
314 memcpy(m + 17, r, 16);
315 memcpy(m + 33, n2, 16);
316 memcpy(m + 49, n1, 16);
317
318 err = aes_cmac(tfm_cmac, w, m, sizeof(m), res);
319 if (err)
320 return err;
321
Marcel Holtmann203de212014-12-31 20:01:22 -0800322 SMP_DBG("res %16phN", res);
Johan Hedberg760b0182014-06-06 11:44:05 +0300323
324 return err;
325}
326
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300327static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
328 const u8 x[16], const u8 y[16], u32 *val)
329{
330 u8 m[80], tmp[16];
331 int err;
332
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200333 SMP_DBG("u %32phN", u);
334 SMP_DBG("v %32phN", v);
335 SMP_DBG("x %16phN y %16phN", x, y);
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300336
337 memcpy(m, y, 16);
338 memcpy(m + 16, v, 32);
339 memcpy(m + 48, u, 32);
340
341 err = aes_cmac(tfm_cmac, x, m, sizeof(m), tmp);
342 if (err)
343 return err;
344
345 *val = get_unaligned_le32(tmp);
346 *val %= 1000000;
347
Johan Hedbergc7a3d572014-12-01 22:03:16 +0200348 SMP_DBG("val %06u", *val);
Johan Hedberg191dc7f2014-06-06 11:39:49 +0300349
350 return 0;
351}
352
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200353static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
354 const u8 key_id[4], u8 res[16])
355{
356 int err;
357
358 SMP_DBG("w %16phN key_id %4phN", w, key_id);
359
360 err = aes_cmac(tfm_cmac, w, key_id, 4, res);
361 if (err)
362 return err;
363
364 SMP_DBG("res %16phN", res);
365
366 return err;
367}
368
369/* The following functions map to the legacy SMP crypto functions e, c1,
370 * s1 and ah.
371 */
372
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300373static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
374{
375 struct blkcipher_desc desc;
376 struct scatterlist sg;
Johan Hedberg943a7322014-03-18 12:58:24 +0200377 uint8_t tmp[16], data[16];
Johan Hedberg201a5922013-12-02 10:49:04 +0200378 int err;
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300379
Johan Hedberg011c3912015-05-19 21:06:04 +0300380 SMP_DBG("k %16phN r %16phN", k, r);
381
Johan Hedberg7f376cd2014-12-03 16:07:13 +0200382 if (!tfm) {
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300383 BT_ERR("tfm %p", tfm);
384 return -EINVAL;
385 }
386
387 desc.tfm = tfm;
388 desc.flags = 0;
389
Johan Hedberg943a7322014-03-18 12:58:24 +0200390 /* The most significant octet of key corresponds to k[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300391 swap_buf(k, tmp, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200392
393 err = crypto_blkcipher_setkey(tfm, tmp, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300394 if (err) {
395 BT_ERR("cipher setkey failed: %d", err);
396 return err;
397 }
398
Johan Hedberg943a7322014-03-18 12:58:24 +0200399 /* Most significant octet of plaintextData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300400 swap_buf(r, data, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200401
402 sg_init_one(&sg, data, 16);
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300403
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300404 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
405 if (err)
406 BT_ERR("Encrypt data error %d", err);
407
Johan Hedberg943a7322014-03-18 12:58:24 +0200408 /* Most significant octet of encryptedData corresponds to data[0] */
Johan Hedberg8a2936f2014-06-16 19:25:19 +0300409 swap_buf(data, r, 16);
Johan Hedberg943a7322014-03-18 12:58:24 +0200410
Johan Hedberg011c3912015-05-19 21:06:04 +0300411 SMP_DBG("r %16phN", r);
412
Anderson Brigliad22ef0b2011-06-09 18:50:44 -0300413 return err;
414}
415
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200416static int smp_c1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
417 const u8 r[16], const u8 preq[7], const u8 pres[7], u8 _iat,
418 const bdaddr_t *ia, u8 _rat, const bdaddr_t *ra, u8 res[16])
419{
420 u8 p1[16], p2[16];
421 int err;
422
Johan Hedberg011c3912015-05-19 21:06:04 +0300423 SMP_DBG("k %16phN r %16phN", k, r);
424 SMP_DBG("iat %u ia %6phN rat %u ra %6phN", _iat, ia, _rat, ra);
425 SMP_DBG("preq %7phN pres %7phN", preq, pres);
426
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200427 memset(p1, 0, 16);
428
429 /* p1 = pres || preq || _rat || _iat */
430 p1[0] = _iat;
431 p1[1] = _rat;
432 memcpy(p1 + 2, preq, 7);
433 memcpy(p1 + 9, pres, 7);
434
Johan Hedberg011c3912015-05-19 21:06:04 +0300435 SMP_DBG("p1 %16phN", p1);
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200436
437 /* res = r XOR p1 */
438 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
439
440 /* res = e(k, res) */
441 err = smp_e(tfm_aes, k, res);
442 if (err) {
443 BT_ERR("Encrypt data error");
444 return err;
445 }
446
Johan Hedberg011c3912015-05-19 21:06:04 +0300447 /* p2 = padding || ia || ra */
448 memcpy(p2, ra, 6);
449 memcpy(p2 + 6, ia, 6);
450 memset(p2 + 12, 0, 4);
451
452 SMP_DBG("p2 %16phN", p2);
453
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200454 /* res = res XOR p2 */
455 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
456
457 /* res = e(k, res) */
458 err = smp_e(tfm_aes, k, res);
459 if (err)
460 BT_ERR("Encrypt data error");
461
462 return err;
463}
464
465static int smp_s1(struct crypto_blkcipher *tfm_aes, const u8 k[16],
466 const u8 r1[16], const u8 r2[16], u8 _r[16])
Johan Hedberg6a770832014-06-06 11:54:04 +0300467{
468 int err;
469
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200470 /* Just least significant octets from r1 and r2 are considered */
471 memcpy(_r, r2, 8);
472 memcpy(_r + 8, r1, 8);
Johan Hedberg6a770832014-06-06 11:54:04 +0300473
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200474 err = smp_e(tfm_aes, k, _r);
Johan Hedberg6a770832014-06-06 11:54:04 +0300475 if (err)
Johan Hedberg06edf8d2014-12-02 13:39:23 +0200476 BT_ERR("Encrypt data error");
Johan Hedberg6a770832014-06-06 11:54:04 +0300477
478 return err;
479}
480
Johan Hedbergcd082792014-12-02 13:37:41 +0200481static int smp_ah(struct crypto_blkcipher *tfm, const u8 irk[16],
482 const u8 r[3], u8 res[3])
Johan Hedberg60478052014-02-18 10:19:31 +0200483{
Johan Hedberg943a7322014-03-18 12:58:24 +0200484 u8 _res[16];
Johan Hedberg60478052014-02-18 10:19:31 +0200485 int err;
486
487 /* r' = padding || r */
Johan Hedberg943a7322014-03-18 12:58:24 +0200488 memcpy(_res, r, 3);
489 memset(_res + 3, 0, 13);
Johan Hedberg60478052014-02-18 10:19:31 +0200490
Johan Hedberg943a7322014-03-18 12:58:24 +0200491 err = smp_e(tfm, irk, _res);
Johan Hedberg60478052014-02-18 10:19:31 +0200492 if (err) {
493 BT_ERR("Encrypt error");
494 return err;
495 }
496
497 /* The output of the random address function ah is:
Marcel Holtmannc5080d42015-09-04 17:08:18 +0200498 * ah(k, r) = e(k, r') mod 2^24
Johan Hedberg60478052014-02-18 10:19:31 +0200499 * The output of the security function e is then truncated to 24 bits
500 * by taking the least significant 24 bits of the output of e as the
501 * result of ah.
502 */
Johan Hedberg943a7322014-03-18 12:58:24 +0200503 memcpy(res, _res, 3);
Johan Hedberg60478052014-02-18 10:19:31 +0200504
505 return 0;
506}
507
Johan Hedbergcd082792014-12-02 13:37:41 +0200508bool smp_irk_matches(struct hci_dev *hdev, const u8 irk[16],
509 const bdaddr_t *bdaddr)
Johan Hedberg60478052014-02-18 10:19:31 +0200510{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300511 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700512 struct smp_dev *smp;
Johan Hedberg60478052014-02-18 10:19:31 +0200513 u8 hash[3];
514 int err;
515
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300516 if (!chan || !chan->data)
517 return false;
518
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700519 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300520
Johan Hedberg60478052014-02-18 10:19:31 +0200521 BT_DBG("RPA %pMR IRK %*phN", bdaddr, 16, irk);
522
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700523 err = smp_ah(smp->tfm_aes, irk, &bdaddr->b[3], hash);
Johan Hedberg60478052014-02-18 10:19:31 +0200524 if (err)
525 return false;
526
527 return !memcmp(bdaddr->b, hash, 3);
528}
529
Johan Hedbergcd082792014-12-02 13:37:41 +0200530int smp_generate_rpa(struct hci_dev *hdev, const u8 irk[16], bdaddr_t *rpa)
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200531{
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300532 struct l2cap_chan *chan = hdev->smp_data;
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700533 struct smp_dev *smp;
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200534 int err;
535
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300536 if (!chan || !chan->data)
537 return -EOPNOTSUPP;
538
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700539 smp = chan->data;
Johan Hedbergdefce9e2014-08-08 09:37:17 +0300540
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200541 get_random_bytes(&rpa->b[3], 3);
542
543 rpa->b[5] &= 0x3f; /* Clear two most significant bits */
544 rpa->b[5] |= 0x40; /* Set second most significant bit */
545
Marcel Holtmann88a479d2015-03-16 01:10:19 -0700546 err = smp_ah(smp->tfm_aes, irk, &rpa->b[3], rpa->b);
Johan Hedbergb1e2b3a2014-02-23 19:42:19 +0200547 if (err < 0)
548 return err;
549
550 BT_DBG("RPA %pMR", rpa);
551
552 return 0;
553}
554
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700555int smp_generate_oob(struct hci_dev *hdev, u8 hash[16], u8 rand[16])
556{
557 struct l2cap_chan *chan = hdev->smp_data;
558 struct smp_dev *smp;
559 int err;
560
561 if (!chan || !chan->data)
562 return -EOPNOTSUPP;
563
564 smp = chan->data;
565
566 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
567 BT_DBG("Using debug keys");
568 memcpy(smp->local_pk, debug_pk, 64);
569 memcpy(smp->local_sk, debug_sk, 32);
570 smp->debug_key = true;
571 } else {
572 while (true) {
573 /* Generate local key pair for Secure Connections */
574 if (!ecc_make_key(smp->local_pk, smp->local_sk))
575 return -EIO;
576
577 /* This is unlikely, but we need to check that
578 * we didn't accidentially generate a debug key.
579 */
580 if (memcmp(smp->local_sk, debug_sk, 32))
581 break;
582 }
583 smp->debug_key = false;
584 }
585
586 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk);
587 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32);
588 SMP_DBG("OOB Private Key: %32phN", smp->local_sk);
589
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700590 get_random_bytes(smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700591
592 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk,
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700593 smp->local_rand, 0, hash);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700594 if (err < 0)
595 return err;
596
Marcel Holtmannfb334fe2015-03-16 12:34:57 -0700597 memcpy(rand, smp->local_rand, 16);
Marcel Holtmann60a27d62015-03-16 01:10:22 -0700598
599 return 0;
600}
601
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300602static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
603{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300604 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300605 struct smp_chan *smp;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300606 struct kvec iv[2];
607 struct msghdr msg;
608
609 if (!chan)
610 return;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300611
612 BT_DBG("code 0x%2.2x", code);
613
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300614 iv[0].iov_base = &code;
615 iv[0].iov_len = 1;
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300616
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300617 iv[1].iov_base = data;
618 iv[1].iov_len = len;
619
620 memset(&msg, 0, sizeof(msg));
621
Al Viro17836392014-11-24 17:07:38 -0500622 iov_iter_kvec(&msg.msg_iter, WRITE | ITER_KVEC, iv, 2, 1 + len);
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300623
624 l2cap_chan_send(chan, &msg, 1 + len);
Vinicius Costa Gomese2dcd112011-08-19 21:06:50 -0300625
Johan Hedbergb68fda62014-08-11 22:06:40 +0300626 if (!chan->data)
627 return;
628
629 smp = chan->data;
630
631 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg1b0921d2014-09-05 22:19:48 +0300632 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT);
Anderson Brigliaeb492e02011-06-09 18:50:40 -0300633}
634
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300635static u8 authreq_to_seclevel(u8 authreq)
Brian Gix2b64d152011-12-21 16:12:12 -0800636{
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300637 if (authreq & SMP_AUTH_MITM) {
638 if (authreq & SMP_AUTH_SC)
639 return BT_SECURITY_FIPS;
640 else
641 return BT_SECURITY_HIGH;
642 } else {
Brian Gix2b64d152011-12-21 16:12:12 -0800643 return BT_SECURITY_MEDIUM;
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300644 }
Brian Gix2b64d152011-12-21 16:12:12 -0800645}
646
647static __u8 seclevel_to_authreq(__u8 sec_level)
648{
649 switch (sec_level) {
Johan Hedbergd2eb9e12014-05-16 10:59:06 +0300650 case BT_SECURITY_FIPS:
Brian Gix2b64d152011-12-21 16:12:12 -0800651 case BT_SECURITY_HIGH:
652 return SMP_AUTH_MITM | SMP_AUTH_BONDING;
653 case BT_SECURITY_MEDIUM:
654 return SMP_AUTH_BONDING;
655 default:
656 return SMP_AUTH_NONE;
657 }
658}
659
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300660static void build_pairing_cmd(struct l2cap_conn *conn,
Marcel Holtmannf1560462013-10-13 05:43:25 -0700661 struct smp_cmd_pairing *req,
662 struct smp_cmd_pairing *rsp, __u8 authreq)
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300663{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300664 struct l2cap_chan *chan = conn->smp;
665 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200666 struct hci_conn *hcon = conn->hcon;
667 struct hci_dev *hdev = hcon->hdev;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100668 u8 local_dist = 0, remote_dist = 0, oob_flag = SMP_OOB_NOT_PRESENT;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300669
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700670 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -0700671 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
672 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300673 authreq |= SMP_AUTH_BONDING;
Brian Gix2b64d152011-12-21 16:12:12 -0800674 } else {
675 authreq &= ~SMP_AUTH_BONDING;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300676 }
677
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700678 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergfd349c02014-02-18 10:19:36 +0200679 remote_dist |= SMP_DIST_ID_KEY;
680
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700681 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedberg863efaf2014-02-22 19:06:32 +0200682 local_dist |= SMP_DIST_ID_KEY;
683
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700684 if (hci_dev_test_flag(hdev, HCI_SC_ENABLED) &&
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100685 (authreq & SMP_AUTH_SC)) {
686 struct oob_data *oob_data;
687 u8 bdaddr_type;
688
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700689 if (hci_dev_test_flag(hdev, HCI_SSP_ENABLED)) {
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300690 local_dist |= SMP_DIST_LINK_KEY;
691 remote_dist |= SMP_DIST_LINK_KEY;
692 }
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100693
694 if (hcon->dst_type == ADDR_LE_DEV_PUBLIC)
695 bdaddr_type = BDADDR_LE_PUBLIC;
696 else
697 bdaddr_type = BDADDR_LE_RANDOM;
698
699 oob_data = hci_find_remote_oob_data(hdev, &hcon->dst,
700 bdaddr_type);
Marcel Holtmann4775a4e2015-01-31 00:15:52 -0800701 if (oob_data && oob_data->present) {
Johan Hedberg1a8bab42015-03-16 11:45:44 +0200702 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100703 oob_flag = SMP_OOB_PRESENT;
Johan Hedberga29b0732014-10-28 15:17:05 +0100704 memcpy(smp->rr, oob_data->rand256, 16);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100705 memcpy(smp->pcnf, oob_data->hash256, 16);
Marcel Holtmannbc07cd62015-03-16 12:34:56 -0700706 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf);
707 SMP_DBG("OOB Remote Random: %16phN", smp->rr);
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100708 }
709
Johan Hedbergdf8e1a42014-06-06 10:39:56 +0300710 } else {
711 authreq &= ~SMP_AUTH_SC;
712 }
713
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300714 if (rsp == NULL) {
715 req->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100716 req->oob_flag = oob_flag;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300717 req->max_key_size = SMP_DEV(hdev)->max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200718 req->init_key_dist = local_dist;
719 req->resp_key_dist = remote_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300720 req->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200721
722 smp->remote_key_dist = remote_dist;
Vinicius Costa Gomes54790f72011-07-07 18:59:38 -0300723 return;
724 }
725
726 rsp->io_capability = conn->hcon->io_capability;
Johan Hedberg02b05bd2014-10-26 21:19:10 +0100727 rsp->oob_flag = oob_flag;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300728 rsp->max_key_size = SMP_DEV(hdev)->max_key_size;
Johan Hedbergfd349c02014-02-18 10:19:36 +0200729 rsp->init_key_dist = req->init_key_dist & remote_dist;
730 rsp->resp_key_dist = req->resp_key_dist & local_dist;
Johan Hedberg0edb14d2014-05-26 13:29:28 +0300731 rsp->auth_req = (authreq & AUTH_REQ_MASK(hdev));
Johan Hedbergfd349c02014-02-18 10:19:36 +0200732
733 smp->remote_key_dist = rsp->init_key_dist;
Vinicius Costa Gomesb8e66ea2011-06-09 18:50:52 -0300734}
735
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300736static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
737{
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300738 struct l2cap_chan *chan = conn->smp;
Johan Hedberg2fd36552015-06-11 13:52:26 +0300739 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300740 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -0300741
Johan Hedberg2fd36552015-06-11 13:52:26 +0300742 if (max_key_size > SMP_DEV(hdev)->max_key_size ||
743 max_key_size < SMP_MIN_ENC_KEY_SIZE)
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300744 return SMP_ENC_KEY_SIZE;
745
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -0300746 smp->enc_key_size = max_key_size;
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -0300747
748 return 0;
749}
750
Johan Hedberg6f48e262014-08-11 22:06:44 +0300751static void smp_chan_destroy(struct l2cap_conn *conn)
752{
753 struct l2cap_chan *chan = conn->smp;
754 struct smp_chan *smp = chan->data;
Johan Hedberg923e2412014-12-03 12:43:39 +0200755 struct hci_conn *hcon = conn->hcon;
Johan Hedberg6f48e262014-08-11 22:06:44 +0300756 bool complete;
757
758 BUG_ON(!smp);
759
760 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300761
Johan Hedberg6f48e262014-08-11 22:06:44 +0300762 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags);
Johan Hedberg923e2412014-12-03 12:43:39 +0200763 mgmt_smp_complete(hcon, complete);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300764
Marcel Holtmann276812e2015-03-16 01:10:18 -0700765 kzfree(smp->csrk);
766 kzfree(smp->slave_csrk);
767 kzfree(smp->link_key);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300768
769 crypto_free_blkcipher(smp->tfm_aes);
Johan Hedberg407cecf2014-05-02 14:19:47 +0300770 crypto_free_hash(smp->tfm_cmac);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300771
Johan Hedberg923e2412014-12-03 12:43:39 +0200772 /* Ensure that we don't leave any debug key around if debug key
773 * support hasn't been explicitly enabled.
774 */
775 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG &&
Marcel Holtmannd7a5a112015-03-13 02:11:00 -0700776 !hci_dev_test_flag(hcon->hdev, HCI_KEEP_DEBUG_KEYS)) {
Johan Hedberg923e2412014-12-03 12:43:39 +0200777 list_del_rcu(&smp->ltk->list);
778 kfree_rcu(smp->ltk, rcu);
779 smp->ltk = NULL;
780 }
781
Johan Hedberg6f48e262014-08-11 22:06:44 +0300782 /* If pairing failed clean up any keys we might have */
783 if (!complete) {
784 if (smp->ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200785 list_del_rcu(&smp->ltk->list);
786 kfree_rcu(smp->ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300787 }
788
789 if (smp->slave_ltk) {
Johan Hedberg970d0f12014-11-13 14:37:47 +0200790 list_del_rcu(&smp->slave_ltk->list);
791 kfree_rcu(smp->slave_ltk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300792 }
793
794 if (smp->remote_irk) {
Johan Hedbergadae20c2014-11-13 14:37:48 +0200795 list_del_rcu(&smp->remote_irk->list);
796 kfree_rcu(smp->remote_irk, rcu);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300797 }
798 }
799
800 chan->data = NULL;
Marcel Holtmann276812e2015-03-16 01:10:18 -0700801 kzfree(smp);
Johan Hedberg923e2412014-12-03 12:43:39 +0200802 hci_conn_drop(hcon);
Johan Hedberg6f48e262014-08-11 22:06:44 +0300803}
804
Johan Hedberg84794e12013-11-06 11:24:57 +0200805static void smp_failure(struct l2cap_conn *conn, u8 reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800806{
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200807 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb68fda62014-08-11 22:06:40 +0300808 struct l2cap_chan *chan = conn->smp;
Johan Hedbergbab73cb2012-02-09 16:07:29 +0200809
Johan Hedberg84794e12013-11-06 11:24:57 +0200810 if (reason)
Brian Gix4f957a72011-11-23 08:28:36 -0800811 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
Marcel Holtmannf1560462013-10-13 05:43:25 -0700812 &reason);
Brian Gix4f957a72011-11-23 08:28:36 -0800813
Johan Hedberge1e930f2014-09-08 17:09:49 -0700814 mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300815
Johan Hedbergfc75cc82014-09-05 22:19:52 +0300816 if (chan->data)
Vinicius Costa Gomesf1c09c02012-02-01 18:27:56 -0300817 smp_chan_destroy(conn);
Brian Gix4f957a72011-11-23 08:28:36 -0800818}
819
Brian Gix2b64d152011-12-21 16:12:12 -0800820#define JUST_WORKS 0x00
821#define JUST_CFM 0x01
822#define REQ_PASSKEY 0x02
823#define CFM_PASSKEY 0x03
824#define REQ_OOB 0x04
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300825#define DSP_PASSKEY 0x05
Brian Gix2b64d152011-12-21 16:12:12 -0800826#define OVERLAP 0xFF
827
828static const u8 gen_method[5][5] = {
829 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
830 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
831 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
832 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
833 { CFM_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, OVERLAP },
834};
835
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300836static const u8 sc_method[5][5] = {
837 { JUST_WORKS, JUST_CFM, REQ_PASSKEY, JUST_WORKS, REQ_PASSKEY },
838 { JUST_WORKS, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
839 { DSP_PASSKEY, DSP_PASSKEY, REQ_PASSKEY, JUST_WORKS, DSP_PASSKEY },
840 { JUST_WORKS, JUST_CFM, JUST_WORKS, JUST_WORKS, JUST_CFM },
841 { DSP_PASSKEY, CFM_PASSKEY, REQ_PASSKEY, JUST_WORKS, CFM_PASSKEY },
842};
843
Johan Hedberg581370c2014-06-17 13:07:38 +0300844static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io)
845{
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300846 /* If either side has unknown io_caps, use JUST_CFM (which gets
847 * converted later to JUST_WORKS if we're initiators.
848 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300849 if (local_io > SMP_IO_KEYBOARD_DISPLAY ||
850 remote_io > SMP_IO_KEYBOARD_DISPLAY)
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300851 return JUST_CFM;
Johan Hedberg581370c2014-06-17 13:07:38 +0300852
Johan Hedberg5e3d3d92014-05-31 18:51:02 +0300853 if (test_bit(SMP_FLAG_SC, &smp->flags))
854 return sc_method[remote_io][local_io];
855
Johan Hedberg581370c2014-06-17 13:07:38 +0300856 return gen_method[remote_io][local_io];
857}
858
Brian Gix2b64d152011-12-21 16:12:12 -0800859static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
860 u8 local_io, u8 remote_io)
861{
862 struct hci_conn *hcon = conn->hcon;
Johan Hedberg5d88cc72014-08-08 09:37:18 +0300863 struct l2cap_chan *chan = conn->smp;
864 struct smp_chan *smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -0800865 u32 passkey = 0;
866 int ret = 0;
867
868 /* Initialize key for JUST WORKS */
869 memset(smp->tk, 0, sizeof(smp->tk));
Johan Hedberg4a74d652014-05-20 09:45:50 +0300870 clear_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800871
872 BT_DBG("tk_request: auth:%d lcl:%d rem:%d", auth, local_io, remote_io);
873
Johan Hedberg2bcd4002014-07-09 19:18:09 +0300874 /* If neither side wants MITM, either "just" confirm an incoming
875 * request or use just-works for outgoing ones. The JUST_CFM
876 * will be converted to JUST_WORKS if necessary later in this
877 * function. If either side has MITM look up the method from the
878 * table.
879 */
Johan Hedberg581370c2014-06-17 13:07:38 +0300880 if (!(auth & SMP_AUTH_MITM))
Johan Hedberg783e0572014-05-31 18:48:26 +0300881 smp->method = JUST_CFM;
Brian Gix2b64d152011-12-21 16:12:12 -0800882 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300883 smp->method = get_auth_method(smp, local_io, remote_io);
Brian Gix2b64d152011-12-21 16:12:12 -0800884
Johan Hedberga82505c2014-03-24 14:39:07 +0200885 /* Don't confirm locally initiated pairing attempts */
Johan Hedberg783e0572014-05-31 18:48:26 +0300886 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
887 &smp->flags))
888 smp->method = JUST_WORKS;
Johan Hedberga82505c2014-03-24 14:39:07 +0200889
Johan Hedberg02f3e252014-07-16 15:09:13 +0300890 /* Don't bother user space with no IO capabilities */
Johan Hedberg783e0572014-05-31 18:48:26 +0300891 if (smp->method == JUST_CFM &&
892 hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
893 smp->method = JUST_WORKS;
Johan Hedberg02f3e252014-07-16 15:09:13 +0300894
Brian Gix2b64d152011-12-21 16:12:12 -0800895 /* If Just Works, Continue with Zero TK */
Johan Hedberg783e0572014-05-31 18:48:26 +0300896 if (smp->method == JUST_WORKS) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300897 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800898 return 0;
899 }
900
Johan Hedberg19c5ce92015-03-15 19:34:04 +0200901 /* If this function is used for SC -> legacy fallback we
902 * can only recover the just-works case.
903 */
904 if (test_bit(SMP_FLAG_SC, &smp->flags))
905 return -EINVAL;
906
Brian Gix2b64d152011-12-21 16:12:12 -0800907 /* Not Just Works/Confirm results in MITM Authentication */
Johan Hedberg783e0572014-05-31 18:48:26 +0300908 if (smp->method != JUST_CFM) {
Johan Hedberg4a74d652014-05-20 09:45:50 +0300909 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
Johan Hedberg5eb596f2014-09-18 11:26:32 +0300910 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
911 hcon->pending_sec_level = BT_SECURITY_HIGH;
912 }
Brian Gix2b64d152011-12-21 16:12:12 -0800913
914 /* If both devices have Keyoard-Display I/O, the master
915 * Confirms and the slave Enters the passkey.
916 */
Johan Hedberg783e0572014-05-31 18:48:26 +0300917 if (smp->method == OVERLAP) {
Johan Hedberg40bef302014-07-16 11:42:27 +0300918 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedberg783e0572014-05-31 18:48:26 +0300919 smp->method = CFM_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800920 else
Johan Hedberg783e0572014-05-31 18:48:26 +0300921 smp->method = REQ_PASSKEY;
Brian Gix2b64d152011-12-21 16:12:12 -0800922 }
923
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200924 /* Generate random passkey. */
Johan Hedberg783e0572014-05-31 18:48:26 +0300925 if (smp->method == CFM_PASSKEY) {
Johan Hedberg943a7322014-03-18 12:58:24 +0200926 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -0800927 get_random_bytes(&passkey, sizeof(passkey));
928 passkey %= 1000000;
Johan Hedberg943a7322014-03-18 12:58:24 +0200929 put_unaligned_le32(passkey, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -0800930 BT_DBG("PassKey: %d", passkey);
Johan Hedberg4a74d652014-05-20 09:45:50 +0300931 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800932 }
933
Johan Hedberg783e0572014-05-31 18:48:26 +0300934 if (smp->method == REQ_PASSKEY)
Marcel Holtmannce39fb42013-10-13 02:23:39 -0700935 ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200936 hcon->type, hcon->dst_type);
Johan Hedberg783e0572014-05-31 18:48:26 +0300937 else if (smp->method == JUST_CFM)
Johan Hedberg4eb65e62014-03-24 14:39:05 +0200938 ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
939 hcon->type, hcon->dst_type,
940 passkey, 1);
Brian Gix2b64d152011-12-21 16:12:12 -0800941 else
Johan Hedberg01ad34d2014-03-19 14:14:53 +0200942 ret = mgmt_user_passkey_notify(hcon->hdev, &hcon->dst,
Johan Hedberg272d90d2012-02-09 15:26:12 +0200943 hcon->type, hcon->dst_type,
Johan Hedberg39adbff2014-03-20 08:18:14 +0200944 passkey, 0);
Brian Gix2b64d152011-12-21 16:12:12 -0800945
Brian Gix2b64d152011-12-21 16:12:12 -0800946 return ret;
947}
948
Johan Hedberg1cc61142014-05-20 09:45:52 +0300949static u8 smp_confirm(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300950{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300951 struct l2cap_conn *conn = smp->conn;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300952 struct smp_cmd_pairing_confirm cp;
953 int ret;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300954
955 BT_DBG("conn %p", conn);
956
Johan Hedberge491eaf2014-10-25 21:15:37 +0200957 ret = smp_c1(smp->tfm_aes, smp->tk, smp->prnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200958 conn->hcon->init_addr_type, &conn->hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200959 conn->hcon->resp_addr_type, &conn->hcon->resp_addr,
960 cp.confirm_val);
Johan Hedberg1cc61142014-05-20 09:45:52 +0300961 if (ret)
962 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300963
Johan Hedberg4a74d652014-05-20 09:45:50 +0300964 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -0800965
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300966 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
967
Johan Hedbergb28b4942014-09-05 22:19:55 +0300968 if (conn->hcon->out)
969 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
970 else
971 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
972
Johan Hedberg1cc61142014-05-20 09:45:52 +0300973 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300974}
975
Johan Hedberg861580a2014-05-20 09:45:51 +0300976static u8 smp_random(struct smp_chan *smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300977{
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300978 struct l2cap_conn *conn = smp->conn;
979 struct hci_conn *hcon = conn->hcon;
Johan Hedberg861580a2014-05-20 09:45:51 +0300980 u8 confirm[16];
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300981 int ret;
982
Johan Hedbergec70f362014-06-27 14:23:04 +0300983 if (IS_ERR_OR_NULL(smp->tfm_aes))
Johan Hedberg861580a2014-05-20 09:45:51 +0300984 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300985
986 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
987
Johan Hedberge491eaf2014-10-25 21:15:37 +0200988 ret = smp_c1(smp->tfm_aes, smp->tk, smp->rrnd, smp->preq, smp->prsp,
Johan Hedbergb1cd5fd2014-02-28 12:54:17 +0200989 hcon->init_addr_type, &hcon->init_addr,
Johan Hedberg943a7322014-03-18 12:58:24 +0200990 hcon->resp_addr_type, &hcon->resp_addr, confirm);
Johan Hedberg861580a2014-05-20 09:45:51 +0300991 if (ret)
992 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300993
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300994 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
995 BT_ERR("Pairing failed (confirmation values mismatch)");
Johan Hedberg861580a2014-05-20 09:45:51 +0300996 return SMP_CONFIRM_FAILED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -0300997 }
998
999 if (hcon->out) {
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001000 u8 stk[16];
1001 __le64 rand = 0;
1002 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001003
Johan Hedberge491eaf2014-10-25 21:15:37 +02001004 smp_s1(smp->tfm_aes, smp->tk, smp->rrnd, smp->prnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001005
Johan Hedberg861580a2014-05-20 09:45:51 +03001006 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
1007 return SMP_UNSPECIFIED;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001008
Johan Hedberg8b76ce32015-06-08 18:14:39 +03001009 hci_le_start_enc(hcon, ediv, rand, stk, smp->enc_key_size);
Vinicius Costa Gomesf7aa6112012-01-30 19:29:12 -03001010 hcon->enc_key_size = smp->enc_key_size;
Johan Hedbergfe59a052014-07-01 19:14:12 +03001011 set_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001012 } else {
Johan Hedbergfff34902014-06-10 15:19:50 +03001013 u8 stk[16], auth;
Marcel Holtmannfe39c7b2014-02-27 16:00:28 -08001014 __le64 rand = 0;
1015 __le16 ediv = 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001016
Johan Hedberg943a7322014-03-18 12:58:24 +02001017 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
1018 smp->prnd);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001019
Johan Hedberge491eaf2014-10-25 21:15:37 +02001020 smp_s1(smp->tfm_aes, smp->tk, smp->prnd, smp->rrnd, stk);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001021
Johan Hedbergfff34902014-06-10 15:19:50 +03001022 if (hcon->pending_sec_level == BT_SECURITY_HIGH)
1023 auth = 1;
1024 else
1025 auth = 0;
1026
Johan Hedberg7d5843b2014-06-16 19:25:15 +03001027 /* Even though there's no _SLAVE suffix this is the
1028 * slave STK we're adding for later lookup (the master
1029 * STK never needs to be stored).
1030 */
Marcel Holtmannce39fb42013-10-13 02:23:39 -07001031 hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
Johan Hedberg2ceba532014-06-16 19:25:16 +03001032 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand);
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001033 }
1034
Johan Hedberg861580a2014-05-20 09:45:51 +03001035 return 0;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001036}
1037
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001038static void smp_notify_keys(struct l2cap_conn *conn)
1039{
1040 struct l2cap_chan *chan = conn->smp;
1041 struct smp_chan *smp = chan->data;
1042 struct hci_conn *hcon = conn->hcon;
1043 struct hci_dev *hdev = hcon->hdev;
1044 struct smp_cmd_pairing *req = (void *) &smp->preq[1];
1045 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1];
1046 bool persistent;
1047
Johan Hedbergcad20c22015-10-12 13:36:19 +02001048 if (hcon->type == ACL_LINK) {
1049 if (hcon->key_type == HCI_LK_DEBUG_COMBINATION)
1050 persistent = false;
1051 else
1052 persistent = !test_bit(HCI_CONN_FLUSH_KEY,
1053 &hcon->flags);
1054 } else {
1055 /* The LTKs, IRKs and CSRKs should be persistent only if
1056 * both sides had the bonding bit set in their
1057 * authentication requests.
1058 */
1059 persistent = !!((req->auth_req & rsp->auth_req) &
1060 SMP_AUTH_BONDING);
1061 }
1062
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001063 if (smp->remote_irk) {
Johan Hedbergcad20c22015-10-12 13:36:19 +02001064 mgmt_new_irk(hdev, smp->remote_irk, persistent);
1065
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001066 /* Now that user space can be considered to know the
1067 * identity address track the connection based on it
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001068 * from now on (assuming this is an LE link).
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001069 */
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001070 if (hcon->type == LE_LINK) {
1071 bacpy(&hcon->dst, &smp->remote_irk->bdaddr);
1072 hcon->dst_type = smp->remote_irk->addr_type;
1073 queue_work(hdev->workqueue, &conn->id_addr_update_work);
1074 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001075 }
1076
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001077 if (smp->csrk) {
1078 smp->csrk->bdaddr_type = hcon->dst_type;
1079 bacpy(&smp->csrk->bdaddr, &hcon->dst);
1080 mgmt_new_csrk(hdev, smp->csrk, persistent);
1081 }
1082
1083 if (smp->slave_csrk) {
1084 smp->slave_csrk->bdaddr_type = hcon->dst_type;
1085 bacpy(&smp->slave_csrk->bdaddr, &hcon->dst);
1086 mgmt_new_csrk(hdev, smp->slave_csrk, persistent);
1087 }
1088
1089 if (smp->ltk) {
1090 smp->ltk->bdaddr_type = hcon->dst_type;
1091 bacpy(&smp->ltk->bdaddr, &hcon->dst);
1092 mgmt_new_ltk(hdev, smp->ltk, persistent);
1093 }
1094
1095 if (smp->slave_ltk) {
1096 smp->slave_ltk->bdaddr_type = hcon->dst_type;
1097 bacpy(&smp->slave_ltk->bdaddr, &hcon->dst);
1098 mgmt_new_ltk(hdev, smp->slave_ltk, persistent);
1099 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001100
1101 if (smp->link_key) {
Johan Hedberge3befab2014-06-01 16:33:39 +03001102 struct link_key *key;
1103 u8 type;
1104
1105 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1106 type = HCI_LK_DEBUG_COMBINATION;
1107 else if (hcon->sec_level == BT_SECURITY_FIPS)
1108 type = HCI_LK_AUTH_COMBINATION_P256;
1109 else
1110 type = HCI_LK_UNAUTH_COMBINATION_P256;
1111
1112 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst,
1113 smp->link_key, type, 0, &persistent);
1114 if (key) {
1115 mgmt_new_link_key(hdev, key, persistent);
1116
1117 /* Don't keep debug keys around if the relevant
1118 * flag is not set.
1119 */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001120 if (!hci_dev_test_flag(hdev, HCI_KEEP_DEBUG_KEYS) &&
Johan Hedberge3befab2014-06-01 16:33:39 +03001121 key->type == HCI_LK_DEBUG_COMBINATION) {
1122 list_del_rcu(&key->list);
1123 kfree_rcu(key, rcu);
1124 }
1125 }
Johan Hedberg6a770832014-06-06 11:54:04 +03001126 }
1127}
1128
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001129static void sc_add_ltk(struct smp_chan *smp)
1130{
1131 struct hci_conn *hcon = smp->conn->hcon;
1132 u8 key_type, auth;
1133
1134 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags))
1135 key_type = SMP_LTK_P256_DEBUG;
1136 else
1137 key_type = SMP_LTK_P256;
1138
1139 if (hcon->pending_sec_level == BT_SECURITY_FIPS)
1140 auth = 1;
1141 else
1142 auth = 0;
1143
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001144 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type,
1145 key_type, auth, smp->tk, smp->enc_key_size,
1146 0, 0);
1147}
1148
Johan Hedberg6a770832014-06-06 11:54:04 +03001149static void sc_generate_link_key(struct smp_chan *smp)
1150{
1151 /* These constants are as specified in the core specification.
1152 * In ASCII they spell out to 'tmp1' and 'lebr'.
1153 */
1154 const u8 tmp1[4] = { 0x31, 0x70, 0x6d, 0x74 };
1155 const u8 lebr[4] = { 0x72, 0x62, 0x65, 0x6c };
1156
1157 smp->link_key = kzalloc(16, GFP_KERNEL);
1158 if (!smp->link_key)
1159 return;
1160
1161 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001162 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001163 smp->link_key = NULL;
1164 return;
1165 }
1166
1167 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) {
Marcel Holtmann276812e2015-03-16 01:10:18 -07001168 kzfree(smp->link_key);
Johan Hedberg6a770832014-06-06 11:54:04 +03001169 smp->link_key = NULL;
1170 return;
1171 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001172}
1173
Johan Hedbergb28b4942014-09-05 22:19:55 +03001174static void smp_allow_key_dist(struct smp_chan *smp)
1175{
1176 /* Allow the first expected phase 3 PDU. The rest of the PDUs
1177 * will be allowed in each PDU handler to ensure we receive
1178 * them in the correct order.
1179 */
1180 if (smp->remote_key_dist & SMP_DIST_ENC_KEY)
1181 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO);
1182 else if (smp->remote_key_dist & SMP_DIST_ID_KEY)
1183 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
1184 else if (smp->remote_key_dist & SMP_DIST_SIGN)
1185 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
1186}
1187
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001188static void sc_generate_ltk(struct smp_chan *smp)
1189{
1190 /* These constants are as specified in the core specification.
1191 * In ASCII they spell out to 'tmp2' and 'brle'.
1192 */
1193 const u8 tmp2[4] = { 0x32, 0x70, 0x6d, 0x74 };
1194 const u8 brle[4] = { 0x65, 0x6c, 0x72, 0x62 };
1195 struct hci_conn *hcon = smp->conn->hcon;
1196 struct hci_dev *hdev = hcon->hdev;
1197 struct link_key *key;
1198
1199 key = hci_find_link_key(hdev, &hcon->dst);
1200 if (!key) {
1201 BT_ERR("%s No Link Key found to generate LTK", hdev->name);
1202 return;
1203 }
1204
1205 if (key->type == HCI_LK_DEBUG_COMBINATION)
1206 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1207
1208 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk))
1209 return;
1210
1211 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk))
1212 return;
1213
1214 sc_add_ltk(smp);
1215}
1216
Johan Hedbergd6268e82014-09-05 22:19:51 +03001217static void smp_distribute_keys(struct smp_chan *smp)
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001218{
1219 struct smp_cmd_pairing *req, *rsp;
Johan Hedberg86d14072014-08-11 22:06:43 +03001220 struct l2cap_conn *conn = smp->conn;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001221 struct hci_conn *hcon = conn->hcon;
1222 struct hci_dev *hdev = hcon->hdev;
1223 __u8 *keydist;
1224
1225 BT_DBG("conn %p", conn);
1226
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001227 rsp = (void *) &smp->prsp[1];
1228
1229 /* The responder sends its keys first */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001230 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) {
1231 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001232 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001233 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001234
1235 req = (void *) &smp->preq[1];
1236
1237 if (hcon->out) {
1238 keydist = &rsp->init_key_dist;
1239 *keydist &= req->init_key_dist;
1240 } else {
1241 keydist = &rsp->resp_key_dist;
1242 *keydist &= req->resp_key_dist;
1243 }
1244
Johan Hedberg6a770832014-06-06 11:54:04 +03001245 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001246 if (hcon->type == LE_LINK && (*keydist & SMP_DIST_LINK_KEY))
Johan Hedberg6a770832014-06-06 11:54:04 +03001247 sc_generate_link_key(smp);
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001248 if (hcon->type == ACL_LINK && (*keydist & SMP_DIST_ENC_KEY))
1249 sc_generate_ltk(smp);
Johan Hedberg6a770832014-06-06 11:54:04 +03001250
1251 /* Clear the keys which are generated but not distributed */
1252 *keydist &= ~SMP_SC_NO_DIST;
1253 }
1254
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001255 BT_DBG("keydist 0x%x", *keydist);
1256
1257 if (*keydist & SMP_DIST_ENC_KEY) {
1258 struct smp_cmd_encrypt_info enc;
1259 struct smp_cmd_master_ident ident;
1260 struct smp_ltk *ltk;
1261 u8 authenticated;
1262 __le16 ediv;
1263 __le64 rand;
1264
Johan Hedberg1fc62c52015-06-10 11:11:20 +03001265 /* Make sure we generate only the significant amount of
1266 * bytes based on the encryption key size, and set the rest
1267 * of the value to zeroes.
1268 */
1269 get_random_bytes(enc.ltk, smp->enc_key_size);
1270 memset(enc.ltk + smp->enc_key_size, 0,
1271 sizeof(enc.ltk) - smp->enc_key_size);
1272
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001273 get_random_bytes(&ediv, sizeof(ediv));
1274 get_random_bytes(&rand, sizeof(rand));
1275
1276 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
1277
1278 authenticated = hcon->sec_level == BT_SECURITY_HIGH;
1279 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type,
1280 SMP_LTK_SLAVE, authenticated, enc.ltk,
1281 smp->enc_key_size, ediv, rand);
1282 smp->slave_ltk = ltk;
1283
1284 ident.ediv = ediv;
1285 ident.rand = rand;
1286
1287 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
1288
1289 *keydist &= ~SMP_DIST_ENC_KEY;
1290 }
1291
1292 if (*keydist & SMP_DIST_ID_KEY) {
1293 struct smp_cmd_ident_addr_info addrinfo;
1294 struct smp_cmd_ident_info idinfo;
1295
1296 memcpy(idinfo.irk, hdev->irk, sizeof(idinfo.irk));
1297
1298 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
1299
1300 /* The hci_conn contains the local identity address
1301 * after the connection has been established.
1302 *
1303 * This is true even when the connection has been
1304 * established using a resolvable random address.
1305 */
1306 bacpy(&addrinfo.bdaddr, &hcon->src);
1307 addrinfo.addr_type = hcon->src_type;
1308
1309 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
1310 &addrinfo);
1311
1312 *keydist &= ~SMP_DIST_ID_KEY;
1313 }
1314
1315 if (*keydist & SMP_DIST_SIGN) {
1316 struct smp_cmd_sign_info sign;
1317 struct smp_csrk *csrk;
1318
1319 /* Generate a new random key */
1320 get_random_bytes(sign.csrk, sizeof(sign.csrk));
1321
1322 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
1323 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02001324 if (hcon->sec_level > BT_SECURITY_MEDIUM)
1325 csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
1326 else
1327 csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001328 memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
1329 }
1330 smp->slave_csrk = csrk;
1331
1332 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
1333
1334 *keydist &= ~SMP_DIST_SIGN;
1335 }
1336
1337 /* If there are still keys to be received wait for them */
Johan Hedbergb28b4942014-09-05 22:19:55 +03001338 if (smp->remote_key_dist & KEY_DIST_MASK) {
1339 smp_allow_key_dist(smp);
Johan Hedberg86d14072014-08-11 22:06:43 +03001340 return;
Johan Hedbergb28b4942014-09-05 22:19:55 +03001341 }
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001342
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001343 set_bit(SMP_FLAG_COMPLETE, &smp->flags);
1344 smp_notify_keys(conn);
1345
1346 smp_chan_destroy(conn);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03001347}
1348
Johan Hedbergb68fda62014-08-11 22:06:40 +03001349static void smp_timeout(struct work_struct *work)
1350{
1351 struct smp_chan *smp = container_of(work, struct smp_chan,
1352 security_timer.work);
1353 struct l2cap_conn *conn = smp->conn;
1354
1355 BT_DBG("conn %p", conn);
1356
Johan Hedberg1e91c292014-08-18 20:33:29 +03001357 hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
Johan Hedbergb68fda62014-08-11 22:06:40 +03001358}
1359
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001360static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
1361{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001362 struct l2cap_chan *chan = conn->smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001363 struct smp_chan *smp;
1364
Marcel Holtmannf1560462013-10-13 05:43:25 -07001365 smp = kzalloc(sizeof(*smp), GFP_ATOMIC);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001366 if (!smp)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001367 return NULL;
1368
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001369 smp->tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
1370 if (IS_ERR(smp->tfm_aes)) {
1371 BT_ERR("Unable to create ECB crypto context");
Marcel Holtmann276812e2015-03-16 01:10:18 -07001372 kzfree(smp);
Johan Hedberg6a7bd102014-06-27 14:23:03 +03001373 return NULL;
1374 }
1375
Johan Hedberg407cecf2014-05-02 14:19:47 +03001376 smp->tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
1377 if (IS_ERR(smp->tfm_cmac)) {
1378 BT_ERR("Unable to create CMAC crypto context");
1379 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann276812e2015-03-16 01:10:18 -07001380 kzfree(smp);
Johan Hedberg407cecf2014-05-02 14:19:47 +03001381 return NULL;
1382 }
1383
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001384 smp->conn = conn;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001385 chan->data = smp;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001386
Johan Hedbergb28b4942014-09-05 22:19:55 +03001387 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL);
1388
Johan Hedbergb68fda62014-08-11 22:06:40 +03001389 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout);
1390
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001391 hci_conn_hold(conn->hcon);
1392
1393 return smp;
1394}
1395
Johan Hedberg760b0182014-06-06 11:44:05 +03001396static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16])
1397{
1398 struct hci_conn *hcon = smp->conn->hcon;
1399 u8 *na, *nb, a[7], b[7];
1400
1401 if (hcon->out) {
1402 na = smp->prnd;
1403 nb = smp->rrnd;
1404 } else {
1405 na = smp->rrnd;
1406 nb = smp->prnd;
1407 }
1408
1409 memcpy(a, &hcon->init_addr, 6);
1410 memcpy(b, &hcon->resp_addr, 6);
1411 a[6] = hcon->init_addr_type;
1412 b[6] = hcon->resp_addr_type;
1413
1414 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk);
1415}
1416
Johan Hedberg38606f12014-06-25 11:10:28 +03001417static void sc_dhkey_check(struct smp_chan *smp)
Johan Hedberg760b0182014-06-06 11:44:05 +03001418{
1419 struct hci_conn *hcon = smp->conn->hcon;
1420 struct smp_cmd_dhkey_check check;
1421 u8 a[7], b[7], *local_addr, *remote_addr;
1422 u8 io_cap[3], r[16];
1423
Johan Hedberg760b0182014-06-06 11:44:05 +03001424 memcpy(a, &hcon->init_addr, 6);
1425 memcpy(b, &hcon->resp_addr, 6);
1426 a[6] = hcon->init_addr_type;
1427 b[6] = hcon->resp_addr_type;
1428
1429 if (hcon->out) {
1430 local_addr = a;
1431 remote_addr = b;
1432 memcpy(io_cap, &smp->preq[1], 3);
1433 } else {
1434 local_addr = b;
1435 remote_addr = a;
1436 memcpy(io_cap, &smp->prsp[1], 3);
1437 }
1438
Johan Hedbergdddd3052014-06-01 15:38:09 +03001439 memset(r, 0, sizeof(r));
1440
1441 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
Johan Hedberg38606f12014-06-25 11:10:28 +03001442 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg760b0182014-06-06 11:44:05 +03001443
Johan Hedberga29b0732014-10-28 15:17:05 +01001444 if (smp->method == REQ_OOB)
1445 memcpy(r, smp->rr, 16);
1446
Johan Hedberg760b0182014-06-06 11:44:05 +03001447 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap,
1448 local_addr, remote_addr, check.e);
1449
1450 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check);
Johan Hedbergdddd3052014-06-01 15:38:09 +03001451}
1452
Johan Hedberg38606f12014-06-25 11:10:28 +03001453static u8 sc_passkey_send_confirm(struct smp_chan *smp)
1454{
1455 struct l2cap_conn *conn = smp->conn;
1456 struct hci_conn *hcon = conn->hcon;
1457 struct smp_cmd_pairing_confirm cfm;
1458 u8 r;
1459
1460 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1461 r |= 0x80;
1462
1463 get_random_bytes(smp->prnd, sizeof(smp->prnd));
1464
1465 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r,
1466 cfm.confirm_val))
1467 return SMP_UNSPECIFIED;
1468
1469 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
1470
1471 return 0;
1472}
1473
1474static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op)
1475{
1476 struct l2cap_conn *conn = smp->conn;
1477 struct hci_conn *hcon = conn->hcon;
1478 struct hci_dev *hdev = hcon->hdev;
1479 u8 cfm[16], r;
1480
1481 /* Ignore the PDU if we've already done 20 rounds (0 - 19) */
1482 if (smp->passkey_round >= 20)
1483 return 0;
1484
1485 switch (smp_op) {
1486 case SMP_CMD_PAIRING_RANDOM:
1487 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01);
1488 r |= 0x80;
1489
1490 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
1491 smp->rrnd, r, cfm))
1492 return SMP_UNSPECIFIED;
1493
1494 if (memcmp(smp->pcnf, cfm, 16))
1495 return SMP_CONFIRM_FAILED;
1496
1497 smp->passkey_round++;
1498
1499 if (smp->passkey_round == 20) {
1500 /* Generate MacKey and LTK */
1501 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk))
1502 return SMP_UNSPECIFIED;
1503 }
1504
1505 /* The round is only complete when the initiator
1506 * receives pairing random.
1507 */
1508 if (!hcon->out) {
1509 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1510 sizeof(smp->prnd), smp->prnd);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001511 if (smp->passkey_round == 20)
Johan Hedberg38606f12014-06-25 11:10:28 +03001512 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001513 else
Johan Hedberg38606f12014-06-25 11:10:28 +03001514 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
Johan Hedberg38606f12014-06-25 11:10:28 +03001515 return 0;
1516 }
1517
1518 /* Start the next round */
1519 if (smp->passkey_round != 20)
1520 return sc_passkey_round(smp, 0);
1521
1522 /* Passkey rounds are complete - start DHKey Check */
1523 sc_dhkey_check(smp);
1524 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1525
1526 break;
1527
1528 case SMP_CMD_PAIRING_CONFIRM:
1529 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
1530 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
1531 return 0;
1532 }
1533
1534 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
1535
1536 if (hcon->out) {
1537 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
1538 sizeof(smp->prnd), smp->prnd);
1539 return 0;
1540 }
1541
1542 return sc_passkey_send_confirm(smp);
1543
1544 case SMP_CMD_PUBLIC_KEY:
1545 default:
1546 /* Initiating device starts the round */
1547 if (!hcon->out)
1548 return 0;
1549
1550 BT_DBG("%s Starting passkey round %u", hdev->name,
1551 smp->passkey_round + 1);
1552
1553 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1554
1555 return sc_passkey_send_confirm(smp);
1556 }
1557
1558 return 0;
1559}
1560
Johan Hedbergdddd3052014-06-01 15:38:09 +03001561static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey)
1562{
Johan Hedberg38606f12014-06-25 11:10:28 +03001563 struct l2cap_conn *conn = smp->conn;
1564 struct hci_conn *hcon = conn->hcon;
1565 u8 smp_op;
1566
1567 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags);
1568
Johan Hedbergdddd3052014-06-01 15:38:09 +03001569 switch (mgmt_op) {
1570 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1571 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED);
1572 return 0;
1573 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
1574 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED);
1575 return 0;
Johan Hedberg38606f12014-06-25 11:10:28 +03001576 case MGMT_OP_USER_PASSKEY_REPLY:
1577 hcon->passkey_notify = le32_to_cpu(passkey);
1578 smp->passkey_round = 0;
1579
1580 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags))
1581 smp_op = SMP_CMD_PAIRING_CONFIRM;
1582 else
1583 smp_op = 0;
1584
1585 if (sc_passkey_round(smp, smp_op))
1586 return -EIO;
1587
1588 return 0;
Johan Hedbergdddd3052014-06-01 15:38:09 +03001589 }
1590
Johan Hedbergd3e54a82014-06-04 11:07:40 +03001591 /* Initiator sends DHKey check first */
1592 if (hcon->out) {
1593 sc_dhkey_check(smp);
1594 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
1595 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) {
1596 sc_dhkey_check(smp);
1597 sc_add_ltk(smp);
1598 }
Johan Hedberg760b0182014-06-06 11:44:05 +03001599
1600 return 0;
1601}
1602
Brian Gix2b64d152011-12-21 16:12:12 -08001603int smp_user_confirm_reply(struct hci_conn *hcon, u16 mgmt_op, __le32 passkey)
1604{
Johan Hedbergb10e8012014-06-27 14:23:07 +03001605 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001606 struct l2cap_chan *chan;
Brian Gix2b64d152011-12-21 16:12:12 -08001607 struct smp_chan *smp;
1608 u32 value;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001609 int err;
Brian Gix2b64d152011-12-21 16:12:12 -08001610
1611 BT_DBG("");
1612
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001613 if (!conn)
Brian Gix2b64d152011-12-21 16:12:12 -08001614 return -ENOTCONN;
1615
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001616 chan = conn->smp;
1617 if (!chan)
1618 return -ENOTCONN;
1619
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001620 l2cap_chan_lock(chan);
1621 if (!chan->data) {
1622 err = -ENOTCONN;
1623 goto unlock;
1624 }
1625
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001626 smp = chan->data;
Brian Gix2b64d152011-12-21 16:12:12 -08001627
Johan Hedberg760b0182014-06-06 11:44:05 +03001628 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1629 err = sc_user_reply(smp, mgmt_op, passkey);
1630 goto unlock;
1631 }
1632
Brian Gix2b64d152011-12-21 16:12:12 -08001633 switch (mgmt_op) {
1634 case MGMT_OP_USER_PASSKEY_REPLY:
1635 value = le32_to_cpu(passkey);
Johan Hedberg943a7322014-03-18 12:58:24 +02001636 memset(smp->tk, 0, sizeof(smp->tk));
Brian Gix2b64d152011-12-21 16:12:12 -08001637 BT_DBG("PassKey: %d", value);
Johan Hedberg943a7322014-03-18 12:58:24 +02001638 put_unaligned_le32(value, smp->tk);
Brian Gix2b64d152011-12-21 16:12:12 -08001639 /* Fall Through */
1640 case MGMT_OP_USER_CONFIRM_REPLY:
Johan Hedberg4a74d652014-05-20 09:45:50 +03001641 set_bit(SMP_FLAG_TK_VALID, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001642 break;
1643 case MGMT_OP_USER_PASSKEY_NEG_REPLY:
1644 case MGMT_OP_USER_CONFIRM_NEG_REPLY:
Johan Hedberg84794e12013-11-06 11:24:57 +02001645 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001646 err = 0;
1647 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001648 default:
Johan Hedberg84794e12013-11-06 11:24:57 +02001649 smp_failure(conn, SMP_PASSKEY_ENTRY_FAILED);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001650 err = -EOPNOTSUPP;
1651 goto unlock;
Brian Gix2b64d152011-12-21 16:12:12 -08001652 }
1653
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001654 err = 0;
1655
Brian Gix2b64d152011-12-21 16:12:12 -08001656 /* If it is our turn to send Pairing Confirm, do so now */
Johan Hedberg1cc61142014-05-20 09:45:52 +03001657 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) {
1658 u8 rsp = smp_confirm(smp);
1659 if (rsp)
1660 smp_failure(conn, rsp);
1661 }
Brian Gix2b64d152011-12-21 16:12:12 -08001662
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001663unlock:
1664 l2cap_chan_unlock(chan);
1665 return err;
Brian Gix2b64d152011-12-21 16:12:12 -08001666}
1667
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001668static void build_bredr_pairing_cmd(struct smp_chan *smp,
1669 struct smp_cmd_pairing *req,
1670 struct smp_cmd_pairing *rsp)
1671{
1672 struct l2cap_conn *conn = smp->conn;
1673 struct hci_dev *hdev = conn->hcon->hdev;
1674 u8 local_dist = 0, remote_dist = 0;
1675
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001676 if (hci_dev_test_flag(hdev, HCI_BONDABLE)) {
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001677 local_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1678 remote_dist = SMP_DIST_ENC_KEY | SMP_DIST_SIGN;
1679 }
1680
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001681 if (hci_dev_test_flag(hdev, HCI_RPA_RESOLVING))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001682 remote_dist |= SMP_DIST_ID_KEY;
1683
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001684 if (hci_dev_test_flag(hdev, HCI_PRIVACY))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001685 local_dist |= SMP_DIST_ID_KEY;
1686
1687 if (!rsp) {
1688 memset(req, 0, sizeof(*req));
1689
1690 req->init_key_dist = local_dist;
1691 req->resp_key_dist = remote_dist;
Johan Hedberge3f6a252015-06-11 13:52:30 +03001692 req->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001693
1694 smp->remote_key_dist = remote_dist;
1695
1696 return;
1697 }
1698
1699 memset(rsp, 0, sizeof(*rsp));
1700
Johan Hedberge3f6a252015-06-11 13:52:30 +03001701 rsp->max_key_size = conn->hcon->enc_key_size;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001702 rsp->init_key_dist = req->init_key_dist & remote_dist;
1703 rsp->resp_key_dist = req->resp_key_dist & local_dist;
1704
1705 smp->remote_key_dist = rsp->init_key_dist;
1706}
1707
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001708static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001709{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001710 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001711 struct l2cap_chan *chan = conn->smp;
Johan Hedbergb3c64102014-07-10 11:02:07 +03001712 struct hci_dev *hdev = conn->hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001713 struct smp_chan *smp;
Johan Hedbergc7262e72014-06-17 13:07:37 +03001714 u8 key_size, auth, sec_level;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001715 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001716
1717 BT_DBG("conn %p", conn);
1718
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001719 if (skb->len < sizeof(*req))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001720 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001721
Johan Hedberg40bef302014-07-16 11:42:27 +03001722 if (conn->hcon->role != HCI_ROLE_SLAVE)
Brian Gix2b64d152011-12-21 16:12:12 -08001723 return SMP_CMD_NOTSUPP;
1724
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001725 if (!chan->data)
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001726 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03001727 else
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001728 smp = chan->data;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001729
Andrei Emeltchenkod08fd0e2012-07-19 17:03:43 +03001730 if (!smp)
1731 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03001732
Johan Hedbergc05b9332014-09-10 17:37:42 -07001733 /* We didn't start the pairing, so match remote */
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001734 auth = req->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001735
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001736 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07001737 (auth & SMP_AUTH_BONDING))
Johan Hedbergb3c64102014-07-10 11:02:07 +03001738 return SMP_PAIRING_NOTSUPP;
1739
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001740 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001741 return SMP_AUTH_REQUIREMENTS;
1742
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001743 smp->preq[0] = SMP_CMD_PAIRING_REQ;
1744 memcpy(&smp->preq[1], req, sizeof(*req));
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001745 skb_pull(skb, sizeof(*req));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001746
Johan Hedbergcb06d362015-03-16 21:12:34 +02001747 /* If the remote side's OOB flag is set it means it has
1748 * successfully received our local OOB data - therefore set the
1749 * flag to indicate that local OOB is in use.
1750 */
Johan Hedberg58428562015-03-16 11:45:45 +02001751 if (req->oob_flag == SMP_OOB_PRESENT)
1752 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1753
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001754 /* SMP over BR/EDR requires special treatment */
1755 if (conn->hcon->type == ACL_LINK) {
1756 /* We must have a BR/EDR SC link */
Marcel Holtmann08f63cc2014-12-07 16:19:12 +01001757 if (!test_bit(HCI_CONN_AES_CCM, &conn->hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07001758 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001759 return SMP_CROSS_TRANSP_NOT_ALLOWED;
1760
1761 set_bit(SMP_FLAG_SC, &smp->flags);
1762
1763 build_bredr_pairing_cmd(smp, req, &rsp);
1764
1765 key_size = min(req->max_key_size, rsp.max_key_size);
1766 if (check_enc_key_size(conn, key_size))
1767 return SMP_ENC_KEY_SIZE;
1768
1769 /* Clear bits which are generated but not distributed */
1770 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1771
1772 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1773 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
1774 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
1775
1776 smp_distribute_keys(smp);
1777 return 0;
1778 }
1779
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03001780 build_pairing_cmd(conn, req, &rsp, auth);
1781
1782 if (rsp.auth_req & SMP_AUTH_SC)
1783 set_bit(SMP_FLAG_SC, &smp->flags);
1784
Johan Hedberg5be5e272014-09-10 17:58:54 -07001785 if (conn->hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07001786 sec_level = BT_SECURITY_MEDIUM;
1787 else
1788 sec_level = authreq_to_seclevel(auth);
1789
Johan Hedbergc7262e72014-06-17 13:07:37 +03001790 if (sec_level > conn->hcon->pending_sec_level)
1791 conn->hcon->pending_sec_level = sec_level;
Ido Yarivfdde0a22012-03-05 20:09:38 +02001792
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001793 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001794 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1795 u8 method;
1796
1797 method = get_auth_method(smp, conn->hcon->io_capability,
1798 req->io_capability);
1799 if (method == JUST_WORKS || method == JUST_CFM)
1800 return SMP_AUTH_REQUIREMENTS;
1801 }
1802
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001803 key_size = min(req->max_key_size, rsp.max_key_size);
1804 if (check_enc_key_size(conn, key_size))
1805 return SMP_ENC_KEY_SIZE;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001806
Johan Hedberge84a6b12013-12-02 10:49:03 +02001807 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03001808
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001809 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1810 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03001811
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001812 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
Johan Hedberg3b191462014-06-06 10:50:15 +03001813
1814 clear_bit(SMP_FLAG_INITIATOR, &smp->flags);
1815
Johan Hedberg19c5ce92015-03-15 19:34:04 +02001816 /* Strictly speaking we shouldn't allow Pairing Confirm for the
1817 * SC case, however some implementations incorrectly copy RFU auth
1818 * req bits from our security request, which may create a false
1819 * positive SC enablement.
1820 */
1821 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
1822
Johan Hedberg3b191462014-06-06 10:50:15 +03001823 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1824 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1825 /* Clear bits which are generated but not distributed */
1826 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1827 /* Wait for Public Key from Initiating Device */
1828 return 0;
Johan Hedberg3b191462014-06-06 10:50:15 +03001829 }
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001830
Brian Gix2b64d152011-12-21 16:12:12 -08001831 /* Request setup of TK */
1832 ret = tk_request(conn, 0, auth, rsp.io_capability, req->io_capability);
1833 if (ret)
1834 return SMP_UNSPECIFIED;
1835
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001836 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001837}
1838
Johan Hedberg3b191462014-06-06 10:50:15 +03001839static u8 sc_send_public_key(struct smp_chan *smp)
1840{
Johan Hedberg70157ef2014-06-24 15:22:59 +03001841 struct hci_dev *hdev = smp->conn->hcon->hdev;
1842
Johan Hedberg3b191462014-06-06 10:50:15 +03001843 BT_DBG("");
1844
Johan Hedberg1a8bab42015-03-16 11:45:44 +02001845 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) {
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001846 struct l2cap_chan *chan = hdev->smp_data;
1847 struct smp_dev *smp_dev;
1848
1849 if (!chan || !chan->data)
1850 return SMP_UNSPECIFIED;
1851
1852 smp_dev = chan->data;
1853
1854 memcpy(smp->local_pk, smp_dev->local_pk, 64);
1855 memcpy(smp->local_sk, smp_dev->local_sk, 32);
Marcel Holtmannfb334fe2015-03-16 12:34:57 -07001856 memcpy(smp->lr, smp_dev->local_rand, 16);
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001857
1858 if (smp_dev->debug_key)
1859 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1860
1861 goto done;
1862 }
1863
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001864 if (hci_dev_test_flag(hdev, HCI_USE_DEBUG_KEYS)) {
Johan Hedberg70157ef2014-06-24 15:22:59 +03001865 BT_DBG("Using debug keys");
1866 memcpy(smp->local_pk, debug_pk, 64);
1867 memcpy(smp->local_sk, debug_sk, 32);
1868 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
1869 } else {
1870 while (true) {
1871 /* Generate local key pair for Secure Connections */
1872 if (!ecc_make_key(smp->local_pk, smp->local_sk))
1873 return SMP_UNSPECIFIED;
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001874
Johan Hedberg70157ef2014-06-24 15:22:59 +03001875 /* This is unlikely, but we need to check that
1876 * we didn't accidentially generate a debug key.
1877 */
1878 if (memcmp(smp->local_sk, debug_sk, 32))
1879 break;
1880 }
Johan Hedberg6c0dcc52014-06-06 15:33:30 +03001881 }
Johan Hedberg3b191462014-06-06 10:50:15 +03001882
Marcel Holtmann33d0c032015-03-16 01:10:24 -07001883done:
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001884 SMP_DBG("Local Public Key X: %32phN", smp->local_pk);
Marcel Holtmann8e4e2ee2015-03-16 01:10:25 -07001885 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32);
Johan Hedbergc7a3d572014-12-01 22:03:16 +02001886 SMP_DBG("Local Private Key: %32phN", smp->local_sk);
Johan Hedberg3b191462014-06-06 10:50:15 +03001887
1888 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk);
1889
1890 return 0;
1891}
1892
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001893static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001894{
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001895 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03001896 struct l2cap_chan *chan = conn->smp;
1897 struct smp_chan *smp = chan->data;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001898 struct hci_dev *hdev = conn->hcon->hdev;
Johan Hedberg3a7dbfb2014-09-10 17:37:41 -07001899 u8 key_size, auth;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001900 int ret;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001901
1902 BT_DBG("conn %p", conn);
1903
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001904 if (skb->len < sizeof(*rsp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03001905 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02001906
Johan Hedberg40bef302014-07-16 11:42:27 +03001907 if (conn->hcon->role != HCI_ROLE_MASTER)
Brian Gix2b64d152011-12-21 16:12:12 -08001908 return SMP_CMD_NOTSUPP;
1909
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001910 skb_pull(skb, sizeof(*rsp));
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001911
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03001912 req = (void *) &smp->preq[1];
Vinicius Costa Gomes3158c502011-06-14 13:37:42 -03001913
1914 key_size = min(req->max_key_size, rsp->max_key_size);
1915 if (check_enc_key_size(conn, key_size))
1916 return SMP_ENC_KEY_SIZE;
1917
Johan Hedberg0edb14d2014-05-26 13:29:28 +03001918 auth = rsp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07001919
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07001920 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07001921 return SMP_AUTH_REQUIREMENTS;
1922
Johan Hedbergcb06d362015-03-16 21:12:34 +02001923 /* If the remote side's OOB flag is set it means it has
1924 * successfully received our local OOB data - therefore set the
1925 * flag to indicate that local OOB is in use.
1926 */
Johan Hedberg58428562015-03-16 11:45:45 +02001927 if (rsp->oob_flag == SMP_OOB_PRESENT)
1928 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags);
1929
Johan Hedbergb5ae3442014-08-14 12:34:26 +03001930 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
1931 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
1932
1933 /* Update remote key distribution in case the remote cleared
1934 * some bits that we had enabled in our request.
1935 */
1936 smp->remote_key_dist &= rsp->resp_key_dist;
1937
1938 /* For BR/EDR this means we're done and can start phase 3 */
1939 if (conn->hcon->type == ACL_LINK) {
1940 /* Clear bits which are generated but not distributed */
1941 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1942 smp_distribute_keys(smp);
1943 return 0;
1944 }
1945
Johan Hedberg65668772014-05-16 11:03:34 +03001946 if ((req->auth_req & SMP_AUTH_SC) && (auth & SMP_AUTH_SC))
1947 set_bit(SMP_FLAG_SC, &smp->flags);
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03001948 else if (conn->hcon->pending_sec_level > BT_SECURITY_HIGH)
1949 conn->hcon->pending_sec_level = BT_SECURITY_HIGH;
Johan Hedberg65668772014-05-16 11:03:34 +03001950
Stephen Hemminger49c922b2014-10-27 21:12:20 -07001951 /* If we need MITM check that it can be achieved */
Johan Hedberg2ed8f652014-06-17 13:07:39 +03001952 if (conn->hcon->pending_sec_level >= BT_SECURITY_HIGH) {
1953 u8 method;
1954
1955 method = get_auth_method(smp, req->io_capability,
1956 rsp->io_capability);
1957 if (method == JUST_WORKS || method == JUST_CFM)
1958 return SMP_AUTH_REQUIREMENTS;
1959 }
1960
Johan Hedberge84a6b12013-12-02 10:49:03 +02001961 get_random_bytes(smp->prnd, sizeof(smp->prnd));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03001962
Johan Hedbergfdcc4be2014-03-14 10:53:50 +02001963 /* Update remote key distribution in case the remote cleared
1964 * some bits that we had enabled in our request.
1965 */
1966 smp->remote_key_dist &= rsp->resp_key_dist;
1967
Johan Hedberg3b191462014-06-06 10:50:15 +03001968 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
1969 /* Clear bits which are generated but not distributed */
1970 smp->remote_key_dist &= ~SMP_SC_NO_DIST;
1971 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY);
1972 return sc_send_public_key(smp);
1973 }
1974
Johan Hedbergc05b9332014-09-10 17:37:42 -07001975 auth |= req->auth_req;
Brian Gix2b64d152011-12-21 16:12:12 -08001976
Johan Hedberg476585e2012-06-06 18:54:15 +08001977 ret = tk_request(conn, 0, auth, req->io_capability, rsp->io_capability);
Brian Gix2b64d152011-12-21 16:12:12 -08001978 if (ret)
1979 return SMP_UNSPECIFIED;
1980
Johan Hedberg4a74d652014-05-20 09:45:50 +03001981 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Brian Gix2b64d152011-12-21 16:12:12 -08001982
1983 /* Can't compose response until we have been confirmed */
Johan Hedberg4a74d652014-05-20 09:45:50 +03001984 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03001985 return smp_confirm(smp);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03001986
1987 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03001988}
1989
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001990static u8 sc_check_confirm(struct smp_chan *smp)
1991{
1992 struct l2cap_conn *conn = smp->conn;
1993
1994 BT_DBG("");
1995
Johan Hedberg38606f12014-06-25 11:10:28 +03001996 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
1997 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM);
1998
Johan Hedbergdcee2b32014-06-06 11:36:38 +03001999 if (conn->hcon->out) {
2000 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2001 smp->prnd);
2002 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2003 }
2004
2005 return 0;
2006}
2007
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002008/* Work-around for some implementations that incorrectly copy RFU bits
2009 * from our security request and thereby create the impression that
2010 * we're doing SC when in fact the remote doesn't support it.
2011 */
2012static int fixup_sc_false_positive(struct smp_chan *smp)
2013{
2014 struct l2cap_conn *conn = smp->conn;
2015 struct hci_conn *hcon = conn->hcon;
2016 struct hci_dev *hdev = hcon->hdev;
2017 struct smp_cmd_pairing *req, *rsp;
2018 u8 auth;
2019
2020 /* The issue is only observed when we're in slave role */
2021 if (hcon->out)
2022 return SMP_UNSPECIFIED;
2023
2024 if (hci_dev_test_flag(hdev, HCI_SC_ONLY)) {
2025 BT_ERR("Refusing SMP SC -> legacy fallback in SC-only mode");
2026 return SMP_UNSPECIFIED;
2027 }
2028
2029 BT_ERR("Trying to fall back to legacy SMP");
2030
2031 req = (void *) &smp->preq[1];
2032 rsp = (void *) &smp->prsp[1];
2033
2034 /* Rebuild key dist flags which may have been cleared for SC */
2035 smp->remote_key_dist = (req->init_key_dist & rsp->resp_key_dist);
2036
2037 auth = req->auth_req & AUTH_REQ_MASK(hdev);
2038
2039 if (tk_request(conn, 0, auth, rsp->io_capability, req->io_capability)) {
2040 BT_ERR("Failed to fall back to legacy SMP");
2041 return SMP_UNSPECIFIED;
2042 }
2043
2044 clear_bit(SMP_FLAG_SC, &smp->flags);
2045
2046 return 0;
2047}
2048
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002049static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002050{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002051 struct l2cap_chan *chan = conn->smp;
2052 struct smp_chan *smp = chan->data;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002053
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002054 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
2055
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002056 if (skb->len < sizeof(smp->pcnf))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002057 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002058
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002059 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
2060 skb_pull(skb, sizeof(smp->pcnf));
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002061
Johan Hedberg19c5ce92015-03-15 19:34:04 +02002062 if (test_bit(SMP_FLAG_SC, &smp->flags)) {
2063 int ret;
2064
2065 /* Public Key exchange must happen before any other steps */
2066 if (test_bit(SMP_FLAG_REMOTE_PK, &smp->flags))
2067 return sc_check_confirm(smp);
2068
2069 BT_ERR("Unexpected SMP Pairing Confirm");
2070
2071 ret = fixup_sc_false_positive(smp);
2072 if (ret)
2073 return ret;
2074 }
Johan Hedbergdcee2b32014-06-06 11:36:38 +03002075
Johan Hedbergb28b4942014-09-05 22:19:55 +03002076 if (conn->hcon->out) {
Johan Hedberg943a7322014-03-18 12:58:24 +02002077 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2078 smp->prnd);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002079 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2080 return 0;
2081 }
2082
2083 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags))
Johan Hedberg1cc61142014-05-20 09:45:52 +03002084 return smp_confirm(smp);
Marcel Holtmann983f9812015-03-11 17:47:40 -07002085
2086 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002087
2088 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002089}
2090
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002091static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002092{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002093 struct l2cap_chan *chan = conn->smp;
2094 struct smp_chan *smp = chan->data;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002095 struct hci_conn *hcon = conn->hcon;
2096 u8 *pkax, *pkbx, *na, *nb;
2097 u32 passkey;
2098 int err;
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002099
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002100 BT_DBG("conn %p", conn);
Anderson Briglia7d24ddc2011-06-09 18:50:46 -03002101
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002102 if (skb->len < sizeof(smp->rrnd))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002103 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002104
Johan Hedberg943a7322014-03-18 12:58:24 +02002105 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd));
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002106 skb_pull(skb, sizeof(smp->rrnd));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002107
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002108 if (!test_bit(SMP_FLAG_SC, &smp->flags))
2109 return smp_random(smp);
2110
Johan Hedberg580039e2014-12-03 16:26:37 +02002111 if (hcon->out) {
2112 pkax = smp->local_pk;
2113 pkbx = smp->remote_pk;
2114 na = smp->prnd;
2115 nb = smp->rrnd;
2116 } else {
2117 pkax = smp->remote_pk;
2118 pkbx = smp->local_pk;
2119 na = smp->rrnd;
2120 nb = smp->prnd;
2121 }
2122
Johan Hedberga29b0732014-10-28 15:17:05 +01002123 if (smp->method == REQ_OOB) {
2124 if (!hcon->out)
2125 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2126 sizeof(smp->prnd), smp->prnd);
2127 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2128 goto mackey_and_ltk;
2129 }
2130
Johan Hedberg38606f12014-06-25 11:10:28 +03002131 /* Passkey entry has special treatment */
2132 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2133 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM);
2134
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002135 if (hcon->out) {
2136 u8 cfm[16];
2137
2138 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk,
2139 smp->rrnd, 0, cfm);
2140 if (err)
2141 return SMP_UNSPECIFIED;
2142
2143 if (memcmp(smp->pcnf, cfm, 16))
2144 return SMP_CONFIRM_FAILED;
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002145 } else {
2146 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd),
2147 smp->prnd);
2148 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002149 }
2150
Johan Hedberga29b0732014-10-28 15:17:05 +01002151mackey_and_ltk:
Johan Hedberg760b0182014-06-06 11:44:05 +03002152 /* Generate MacKey and LTK */
2153 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk);
2154 if (err)
2155 return SMP_UNSPECIFIED;
2156
Johan Hedberga29b0732014-10-28 15:17:05 +01002157 if (smp->method == JUST_WORKS || smp->method == REQ_OOB) {
Johan Hedbergdddd3052014-06-01 15:38:09 +03002158 if (hcon->out) {
Johan Hedberg38606f12014-06-25 11:10:28 +03002159 sc_dhkey_check(smp);
Johan Hedbergdddd3052014-06-01 15:38:09 +03002160 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK);
2161 }
2162 return 0;
2163 }
2164
Johan Hedberg38606f12014-06-25 11:10:28 +03002165 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey);
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002166 if (err)
2167 return SMP_UNSPECIFIED;
2168
Johan Hedberg38606f12014-06-25 11:10:28 +03002169 err = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, hcon->type,
2170 hcon->dst_type, passkey, 0);
2171 if (err)
2172 return SMP_UNSPECIFIED;
2173
2174 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2175
Johan Hedberg191dc7f2014-06-06 11:39:49 +03002176 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002177}
2178
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002179static bool smp_ltk_encrypt(struct l2cap_conn *conn, u8 sec_level)
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002180{
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002181 struct smp_ltk *key;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002182 struct hci_conn *hcon = conn->hcon;
2183
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002184 key = hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role);
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002185 if (!key)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002186 return false;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002187
Johan Hedberga6f78332014-09-10 17:37:45 -07002188 if (smp_ltk_sec_level(key) < sec_level)
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002189 return false;
Johan Hedberg4dab7862012-06-07 14:58:37 +08002190
Johan Hedberg51a8efd2012-01-16 06:10:31 +02002191 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags))
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002192 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002193
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002194 hci_le_start_enc(hcon, key->ediv, key->rand, key->val, key->enc_size);
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002195 hcon->enc_key_size = key->enc_size;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002196
Johan Hedbergfe59a052014-07-01 19:14:12 +03002197 /* We never store STKs for master role, so clear this flag */
2198 clear_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags);
2199
Marcel Holtmannf81cd822014-07-01 10:59:24 +02002200 return true;
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002201}
Marcel Holtmannf1560462013-10-13 05:43:25 -07002202
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002203bool smp_sufficient_security(struct hci_conn *hcon, u8 sec_level,
2204 enum smp_key_pref key_pref)
Johan Hedberg854f4722014-07-01 18:40:20 +03002205{
2206 if (sec_level == BT_SECURITY_LOW)
2207 return true;
2208
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002209 /* If we're encrypted with an STK but the caller prefers using
2210 * LTK claim insufficient security. This way we allow the
2211 * connection to be re-encrypted with an LTK, even if the LTK
2212 * provides the same level of security. Only exception is if we
2213 * don't have an LTK (e.g. because of key distribution bits).
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002214 */
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002215 if (key_pref == SMP_USE_LTK &&
2216 test_bit(HCI_CONN_STK_ENCRYPT, &hcon->flags) &&
Johan Hedbergf3a73d92014-05-29 15:02:59 +03002217 hci_find_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, hcon->role))
Johan Hedberg9ab65d602014-07-01 19:14:13 +03002218 return false;
2219
Johan Hedberg854f4722014-07-01 18:40:20 +03002220 if (hcon->sec_level >= sec_level)
2221 return true;
2222
2223 return false;
2224}
2225
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002226static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002227{
2228 struct smp_cmd_security_req *rp = (void *) skb->data;
2229 struct smp_cmd_pairing cp;
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002230 struct hci_conn *hcon = conn->hcon;
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002231 struct hci_dev *hdev = hcon->hdev;
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002232 struct smp_chan *smp;
Johan Hedbergc05b9332014-09-10 17:37:42 -07002233 u8 sec_level, auth;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002234
2235 BT_DBG("conn %p", conn);
2236
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002237 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002238 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002239
Johan Hedberg40bef302014-07-16 11:42:27 +03002240 if (hcon->role != HCI_ROLE_MASTER)
Johan Hedberg86ca9ea2013-11-05 11:30:39 +02002241 return SMP_CMD_NOTSUPP;
2242
Johan Hedberg0edb14d2014-05-26 13:29:28 +03002243 auth = rp->auth_req & AUTH_REQ_MASK(hdev);
Johan Hedbergc05b9332014-09-10 17:37:42 -07002244
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002245 if (hci_dev_test_flag(hdev, HCI_SC_ONLY) && !(auth & SMP_AUTH_SC))
Johan Hedberg903b71c2014-09-08 16:59:18 -07002246 return SMP_AUTH_REQUIREMENTS;
2247
Johan Hedberg5be5e272014-09-10 17:58:54 -07002248 if (hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
Johan Hedberg1afc2a12014-09-10 17:37:44 -07002249 sec_level = BT_SECURITY_MEDIUM;
2250 else
2251 sec_level = authreq_to_seclevel(auth);
2252
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002253 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Johan Hedberg854f4722014-07-01 18:40:20 +03002254 return 0;
2255
Johan Hedbergc7262e72014-06-17 13:07:37 +03002256 if (sec_level > hcon->pending_sec_level)
2257 hcon->pending_sec_level = sec_level;
Vinicius Costa Gomesfeb45eb2011-08-25 20:02:35 -03002258
Johan Hedberg4dab7862012-06-07 14:58:37 +08002259 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
Vinicius Costa Gomes988c5992011-08-25 20:02:28 -03002260 return 0;
2261
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002262 smp = smp_chan_create(conn);
Johan Hedbergc29d2442014-06-16 19:25:14 +03002263 if (!smp)
2264 return SMP_UNSPECIFIED;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002265
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002266 if (!hci_dev_test_flag(hdev, HCI_BONDABLE) &&
Johan Hedbergc05b9332014-09-10 17:37:42 -07002267 (auth & SMP_AUTH_BONDING))
Johan Hedberg616d55b2014-07-29 14:18:48 +03002268 return SMP_PAIRING_NOTSUPP;
2269
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002270 skb_pull(skb, sizeof(*rp));
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002271
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002272 memset(&cp, 0, sizeof(cp));
Johan Hedbergc05b9332014-09-10 17:37:42 -07002273 build_pairing_cmd(conn, &cp, NULL, auth);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002274
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002275 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2276 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002277
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002278 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002279 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002280
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002281 return 0;
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002282}
2283
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002284int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002285{
Vinicius Costa Gomescc110922012-08-23 21:32:43 -03002286 struct l2cap_conn *conn = hcon->l2cap_data;
Johan Hedbergc68b7f12014-09-06 06:59:10 +03002287 struct l2cap_chan *chan;
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002288 struct smp_chan *smp;
Brian Gix2b64d152011-12-21 16:12:12 -08002289 __u8 authreq;
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002290 int ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002291
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002292 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
2293
Johan Hedberg0a66cf22014-03-24 14:39:03 +02002294 /* This may be NULL if there's an unexpected disconnection */
2295 if (!conn)
2296 return 1;
2297
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002298 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED))
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002299 return 1;
2300
Johan Hedberg35dc6f82014-11-13 10:55:18 +02002301 if (smp_sufficient_security(hcon, sec_level, SMP_USE_LTK))
Vinicius Costa Gomesf1cb9af2011-01-26 21:42:57 -03002302 return 1;
2303
Johan Hedbergc7262e72014-06-17 13:07:37 +03002304 if (sec_level > hcon->pending_sec_level)
2305 hcon->pending_sec_level = sec_level;
2306
Johan Hedberg40bef302014-07-16 11:42:27 +03002307 if (hcon->role == HCI_ROLE_MASTER)
Johan Hedbergc7262e72014-06-17 13:07:37 +03002308 if (smp_ltk_encrypt(conn, hcon->pending_sec_level))
2309 return 0;
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002310
Johan Hedbergd8949aa2015-09-04 12:22:46 +03002311 chan = conn->smp;
2312 if (!chan) {
2313 BT_ERR("SMP security requested but not available");
2314 return 1;
2315 }
2316
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002317 l2cap_chan_lock(chan);
2318
2319 /* If SMP is already in progress ignore this request */
2320 if (chan->data) {
2321 ret = 0;
2322 goto unlock;
2323 }
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002324
Vinicius Costa Gomes8aab4752011-09-05 14:31:31 -03002325 smp = smp_chan_create(conn);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002326 if (!smp) {
2327 ret = 1;
2328 goto unlock;
2329 }
Brian Gix2b64d152011-12-21 16:12:12 -08002330
2331 authreq = seclevel_to_authreq(sec_level);
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002332
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002333 if (hci_dev_test_flag(hcon->hdev, HCI_SC_ENABLED))
Johan Hedbergd2eb9e12014-05-16 10:59:06 +03002334 authreq |= SMP_AUTH_SC;
2335
Johan Hedberg79897d22014-06-01 09:45:24 +03002336 /* Require MITM if IO Capability allows or the security level
2337 * requires it.
Johan Hedberg2e233642014-03-18 15:42:30 +02002338 */
Johan Hedberg79897d22014-06-01 09:45:24 +03002339 if (hcon->io_capability != HCI_IO_NO_INPUT_OUTPUT ||
Johan Hedbergc7262e72014-06-17 13:07:37 +03002340 hcon->pending_sec_level > BT_SECURITY_MEDIUM)
Johan Hedberg2e233642014-03-18 15:42:30 +02002341 authreq |= SMP_AUTH_MITM;
2342
Johan Hedberg40bef302014-07-16 11:42:27 +03002343 if (hcon->role == HCI_ROLE_MASTER) {
Vinicius Costa Gomesd26a2342011-08-19 21:06:51 -03002344 struct smp_cmd_pairing cp;
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002345
Brian Gix2b64d152011-12-21 16:12:12 -08002346 build_pairing_cmd(conn, &cp, NULL, authreq);
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002347 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2348 memcpy(&smp->preq[1], &cp, sizeof(cp));
Anderson Brigliaf01ead32011-06-09 18:50:45 -03002349
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002350 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002351 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002352 } else {
2353 struct smp_cmd_security_req cp;
Brian Gix2b64d152011-12-21 16:12:12 -08002354 cp.auth_req = authreq;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002355 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002356 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002357 }
2358
Johan Hedberg4a74d652014-05-20 09:45:50 +03002359 set_bit(SMP_FLAG_INITIATOR, &smp->flags);
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002360 ret = 0;
Johan Hedbergedca7922014-03-24 15:54:11 +02002361
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002362unlock:
2363 l2cap_chan_unlock(chan);
2364 return ret;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002365}
2366
Johan Hedbergc81d5552015-10-22 09:38:35 +03002367void smp_cancel_pairing(struct hci_conn *hcon)
2368{
2369 struct l2cap_conn *conn = hcon->l2cap_data;
2370 struct l2cap_chan *chan;
2371 struct smp_chan *smp;
2372
2373 if (!conn)
2374 return;
2375
2376 chan = conn->smp;
2377 if (!chan)
2378 return;
2379
2380 l2cap_chan_lock(chan);
2381
2382 smp = chan->data;
2383 if (smp) {
2384 if (test_bit(SMP_FLAG_COMPLETE, &smp->flags))
2385 smp_failure(conn, 0);
2386 else
2387 smp_failure(conn, SMP_UNSPECIFIED);
2388 }
2389
2390 l2cap_chan_unlock(chan);
2391}
2392
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002393static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
2394{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002395 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002396 struct l2cap_chan *chan = conn->smp;
2397 struct smp_chan *smp = chan->data;
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002398
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002399 BT_DBG("conn %p", conn);
2400
2401 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002402 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002403
Johan Hedbergb28b4942014-09-05 22:19:55 +03002404 SMP_ALLOW_CMD(smp, SMP_CMD_MASTER_IDENT);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002405
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002406 skb_pull(skb, sizeof(*rp));
2407
Vinicius Costa Gomes1c1def02011-09-05 14:31:30 -03002408 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002409
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002410 return 0;
2411}
2412
2413static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
2414{
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002415 struct smp_cmd_master_ident *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002416 struct l2cap_chan *chan = conn->smp;
2417 struct smp_chan *smp = chan->data;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002418 struct hci_dev *hdev = conn->hcon->hdev;
2419 struct hci_conn *hcon = conn->hcon;
Johan Hedberg23d0e122014-02-19 14:57:46 +02002420 struct smp_ltk *ltk;
Vinicius Costa Gomesc9839a12012-02-02 21:08:01 -03002421 u8 authenticated;
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002422
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002423 BT_DBG("conn %p", conn);
2424
2425 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002426 return SMP_INVALID_PARAMS;
Johan Hedbergc46b98b2014-02-18 10:19:29 +02002427
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002428 /* Mark the information as received */
2429 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY;
2430
Johan Hedbergb28b4942014-09-05 22:19:55 +03002431 if (smp->remote_key_dist & SMP_DIST_ID_KEY)
2432 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO);
Johan Hedberg196332f2014-09-09 16:21:46 -07002433 else if (smp->remote_key_dist & SMP_DIST_SIGN)
2434 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
Johan Hedbergb28b4942014-09-05 22:19:55 +03002435
Vinicius Costa Gomes16b90832011-07-07 18:59:39 -03002436 skb_pull(skb, sizeof(*rp));
2437
Marcel Holtmannce39fb42013-10-13 02:23:39 -07002438 authenticated = (hcon->sec_level == BT_SECURITY_HIGH);
Johan Hedberg2ceba532014-06-16 19:25:16 +03002439 ltk = hci_add_ltk(hdev, &hcon->dst, hcon->dst_type, SMP_LTK,
Johan Hedberg23d0e122014-02-19 14:57:46 +02002440 authenticated, smp->tk, smp->enc_key_size,
2441 rp->ediv, rp->rand);
2442 smp->ltk = ltk;
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002443 if (!(smp->remote_key_dist & KEY_DIST_MASK))
Johan Hedbergd6268e82014-09-05 22:19:51 +03002444 smp_distribute_keys(smp);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002445
2446 return 0;
2447}
2448
Johan Hedbergfd349c02014-02-18 10:19:36 +02002449static int smp_cmd_ident_info(struct l2cap_conn *conn, struct sk_buff *skb)
2450{
2451 struct smp_cmd_ident_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002452 struct l2cap_chan *chan = conn->smp;
2453 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002454
2455 BT_DBG("");
2456
2457 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002458 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002459
Johan Hedbergb28b4942014-09-05 22:19:55 +03002460 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO);
Johan Hedberg6131ddc2014-02-18 10:19:37 +02002461
Johan Hedbergfd349c02014-02-18 10:19:36 +02002462 skb_pull(skb, sizeof(*info));
2463
2464 memcpy(smp->irk, info->irk, 16);
2465
2466 return 0;
2467}
2468
2469static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
2470 struct sk_buff *skb)
2471{
2472 struct smp_cmd_ident_addr_info *info = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002473 struct l2cap_chan *chan = conn->smp;
2474 struct smp_chan *smp = chan->data;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002475 struct hci_conn *hcon = conn->hcon;
2476 bdaddr_t rpa;
2477
2478 BT_DBG("");
2479
2480 if (skb->len < sizeof(*info))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002481 return SMP_INVALID_PARAMS;
Johan Hedbergfd349c02014-02-18 10:19:36 +02002482
Johan Hedberg9747a9f2014-02-26 23:33:43 +02002483 /* Mark the information as received */
2484 smp->remote_key_dist &= ~SMP_DIST_ID_KEY;
2485
Johan Hedbergb28b4942014-09-05 22:19:55 +03002486 if (smp->remote_key_dist & SMP_DIST_SIGN)
2487 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO);
2488
Johan Hedbergfd349c02014-02-18 10:19:36 +02002489 skb_pull(skb, sizeof(*info));
2490
Johan Hedberga9a58f82014-02-25 22:24:37 +02002491 /* Strictly speaking the Core Specification (4.1) allows sending
2492 * an empty address which would force us to rely on just the IRK
2493 * as "identity information". However, since such
2494 * implementations are not known of and in order to not over
2495 * complicate our implementation, simply pretend that we never
2496 * received an IRK for such a device.
Johan Hedberge12af482015-01-14 20:51:37 +02002497 *
2498 * The Identity Address must also be a Static Random or Public
2499 * Address, which hci_is_identity_address() checks for.
Johan Hedberga9a58f82014-02-25 22:24:37 +02002500 */
Johan Hedberge12af482015-01-14 20:51:37 +02002501 if (!bacmp(&info->bdaddr, BDADDR_ANY) ||
2502 !hci_is_identity_address(&info->bdaddr, info->addr_type)) {
Johan Hedberga9a58f82014-02-25 22:24:37 +02002503 BT_ERR("Ignoring IRK with no identity address");
Johan Hedberg31dd6242014-06-27 14:23:02 +03002504 goto distribute;
Johan Hedberga9a58f82014-02-25 22:24:37 +02002505 }
2506
Johan Hedbergfd349c02014-02-18 10:19:36 +02002507 bacpy(&smp->id_addr, &info->bdaddr);
2508 smp->id_addr_type = info->addr_type;
2509
2510 if (hci_bdaddr_is_rpa(&hcon->dst, hcon->dst_type))
2511 bacpy(&rpa, &hcon->dst);
2512 else
2513 bacpy(&rpa, BDADDR_ANY);
2514
Johan Hedberg23d0e122014-02-19 14:57:46 +02002515 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr,
2516 smp->id_addr_type, smp->irk, &rpa);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002517
Johan Hedberg31dd6242014-06-27 14:23:02 +03002518distribute:
Johan Hedbergc6e81e92014-09-05 22:19:54 +03002519 if (!(smp->remote_key_dist & KEY_DIST_MASK))
2520 smp_distribute_keys(smp);
Johan Hedbergfd349c02014-02-18 10:19:36 +02002521
2522 return 0;
2523}
2524
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002525static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
2526{
2527 struct smp_cmd_sign_info *rp = (void *) skb->data;
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002528 struct l2cap_chan *chan = conn->smp;
2529 struct smp_chan *smp = chan->data;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002530 struct smp_csrk *csrk;
2531
2532 BT_DBG("conn %p", conn);
2533
2534 if (skb->len < sizeof(*rp))
Johan Hedberg38e4a912014-05-08 14:19:11 +03002535 return SMP_INVALID_PARAMS;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002536
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002537 /* Mark the information as received */
2538 smp->remote_key_dist &= ~SMP_DIST_SIGN;
2539
2540 skb_pull(skb, sizeof(*rp));
2541
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002542 csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
2543 if (csrk) {
Johan Hedberg4cd39282015-02-27 10:11:13 +02002544 if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
2545 csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
2546 else
2547 csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002548 memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
2549 }
2550 smp->csrk = csrk;
Johan Hedbergd6268e82014-09-05 22:19:51 +03002551 smp_distribute_keys(smp);
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002552
2553 return 0;
2554}
2555
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002556static u8 sc_select_method(struct smp_chan *smp)
2557{
2558 struct l2cap_conn *conn = smp->conn;
2559 struct hci_conn *hcon = conn->hcon;
2560 struct smp_cmd_pairing *local, *remote;
2561 u8 local_mitm, remote_mitm, local_io, remote_io, method;
2562
Johan Hedberg1a8bab42015-03-16 11:45:44 +02002563 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) ||
2564 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags))
Johan Hedberga29b0732014-10-28 15:17:05 +01002565 return REQ_OOB;
2566
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002567 /* The preq/prsp contain the raw Pairing Request/Response PDUs
2568 * which are needed as inputs to some crypto functions. To get
2569 * the "struct smp_cmd_pairing" from them we need to skip the
2570 * first byte which contains the opcode.
2571 */
2572 if (hcon->out) {
2573 local = (void *) &smp->preq[1];
2574 remote = (void *) &smp->prsp[1];
2575 } else {
2576 local = (void *) &smp->prsp[1];
2577 remote = (void *) &smp->preq[1];
2578 }
2579
2580 local_io = local->io_capability;
2581 remote_io = remote->io_capability;
2582
2583 local_mitm = (local->auth_req & SMP_AUTH_MITM);
2584 remote_mitm = (remote->auth_req & SMP_AUTH_MITM);
2585
2586 /* If either side wants MITM, look up the method from the table,
2587 * otherwise use JUST WORKS.
2588 */
2589 if (local_mitm || remote_mitm)
2590 method = get_auth_method(smp, local_io, remote_io);
2591 else
2592 method = JUST_WORKS;
2593
2594 /* Don't confirm locally initiated pairing attempts */
2595 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags))
2596 method = JUST_WORKS;
2597
2598 return method;
2599}
2600
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002601static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb)
2602{
2603 struct smp_cmd_public_key *key = (void *) skb->data;
2604 struct hci_conn *hcon = conn->hcon;
2605 struct l2cap_chan *chan = conn->smp;
2606 struct smp_chan *smp = chan->data;
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002607 struct hci_dev *hdev = hcon->hdev;
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002608 struct smp_cmd_pairing_confirm cfm;
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002609 int err;
2610
2611 BT_DBG("conn %p", conn);
2612
2613 if (skb->len < sizeof(*key))
2614 return SMP_INVALID_PARAMS;
2615
2616 memcpy(smp->remote_pk, key, 64);
2617
Johan Hedberga8ca6172015-03-16 18:12:57 +02002618 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) {
2619 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk,
2620 smp->rr, 0, cfm.confirm_val);
2621 if (err)
2622 return SMP_UNSPECIFIED;
2623
2624 if (memcmp(cfm.confirm_val, smp->pcnf, 16))
2625 return SMP_CONFIRM_FAILED;
2626 }
2627
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002628 /* Non-initiating device sends its public key after receiving
2629 * the key from the initiating device.
2630 */
2631 if (!hcon->out) {
2632 err = sc_send_public_key(smp);
2633 if (err)
2634 return err;
2635 }
2636
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002637 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk);
Marcel Holtmanne0915262015-03-16 12:34:55 -07002638 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002639
2640 if (!ecdh_shared_secret(smp->remote_pk, smp->local_sk, smp->dhkey))
2641 return SMP_UNSPECIFIED;
2642
Johan Hedbergc7a3d572014-12-01 22:03:16 +02002643 SMP_DBG("DHKey %32phN", smp->dhkey);
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002644
2645 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags);
2646
Johan Hedberg5e3d3d92014-05-31 18:51:02 +03002647 smp->method = sc_select_method(smp);
2648
2649 BT_DBG("%s selected method 0x%02x", hdev->name, smp->method);
2650
2651 /* JUST_WORKS and JUST_CFM result in an unauthenticated key */
2652 if (smp->method == JUST_WORKS || smp->method == JUST_CFM)
2653 hcon->pending_sec_level = BT_SECURITY_MEDIUM;
2654 else
2655 hcon->pending_sec_level = BT_SECURITY_FIPS;
2656
Johan Hedbergaeb7d462014-05-31 18:52:28 +03002657 if (!memcmp(debug_pk, smp->remote_pk, 64))
2658 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags);
2659
Johan Hedberg38606f12014-06-25 11:10:28 +03002660 if (smp->method == DSP_PASSKEY) {
2661 get_random_bytes(&hcon->passkey_notify,
2662 sizeof(hcon->passkey_notify));
2663 hcon->passkey_notify %= 1000000;
2664 hcon->passkey_entered = 0;
2665 smp->passkey_round = 0;
2666 if (mgmt_user_passkey_notify(hdev, &hcon->dst, hcon->type,
2667 hcon->dst_type,
2668 hcon->passkey_notify,
2669 hcon->passkey_entered))
2670 return SMP_UNSPECIFIED;
2671 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2672 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY);
2673 }
2674
Johan Hedberg94ea7252015-03-16 11:45:46 +02002675 if (smp->method == REQ_OOB) {
Johan Hedberga29b0732014-10-28 15:17:05 +01002676 if (hcon->out)
2677 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM,
2678 sizeof(smp->prnd), smp->prnd);
2679
2680 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2681
2682 return 0;
2683 }
2684
Johan Hedberg38606f12014-06-25 11:10:28 +03002685 if (hcon->out)
2686 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2687
2688 if (smp->method == REQ_PASSKEY) {
2689 if (mgmt_user_passkey_request(hdev, &hcon->dst, hcon->type,
2690 hcon->dst_type))
2691 return SMP_UNSPECIFIED;
2692 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM);
2693 set_bit(SMP_FLAG_WAIT_USER, &smp->flags);
2694 return 0;
2695 }
2696
Johan Hedbergcbbbe3e2014-06-06 11:30:08 +03002697 /* The Initiating device waits for the non-initiating device to
2698 * send the confirm value.
2699 */
2700 if (conn->hcon->out)
2701 return 0;
2702
2703 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd,
2704 0, cfm.confirm_val);
2705 if (err)
2706 return SMP_UNSPECIFIED;
2707
2708 smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cfm), &cfm);
2709 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM);
2710
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002711 return 0;
2712}
2713
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002714static int smp_cmd_dhkey_check(struct l2cap_conn *conn, struct sk_buff *skb)
2715{
2716 struct smp_cmd_dhkey_check *check = (void *) skb->data;
2717 struct l2cap_chan *chan = conn->smp;
2718 struct hci_conn *hcon = conn->hcon;
2719 struct smp_chan *smp = chan->data;
2720 u8 a[7], b[7], *local_addr, *remote_addr;
2721 u8 io_cap[3], r[16], e[16];
2722 int err;
2723
2724 BT_DBG("conn %p", conn);
2725
2726 if (skb->len < sizeof(*check))
2727 return SMP_INVALID_PARAMS;
2728
2729 memcpy(a, &hcon->init_addr, 6);
2730 memcpy(b, &hcon->resp_addr, 6);
2731 a[6] = hcon->init_addr_type;
2732 b[6] = hcon->resp_addr_type;
2733
2734 if (hcon->out) {
2735 local_addr = a;
2736 remote_addr = b;
2737 memcpy(io_cap, &smp->prsp[1], 3);
2738 } else {
2739 local_addr = b;
2740 remote_addr = a;
2741 memcpy(io_cap, &smp->preq[1], 3);
2742 }
2743
2744 memset(r, 0, sizeof(r));
2745
Johan Hedberg38606f12014-06-25 11:10:28 +03002746 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY)
2747 put_unaligned_le32(hcon->passkey_notify, r);
Johan Hedberg882fafa2015-03-16 11:45:43 +02002748 else if (smp->method == REQ_OOB)
2749 memcpy(r, smp->lr, 16);
Johan Hedberg38606f12014-06-25 11:10:28 +03002750
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002751 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r,
2752 io_cap, remote_addr, local_addr, e);
2753 if (err)
2754 return SMP_UNSPECIFIED;
2755
2756 if (memcmp(check->e, e, 16))
2757 return SMP_DHKEY_CHECK_FAILED;
2758
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002759 if (!hcon->out) {
2760 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) {
2761 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags);
2762 return 0;
2763 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002764
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002765 /* Slave sends DHKey check as response to master */
2766 sc_dhkey_check(smp);
2767 }
Johan Hedbergd378a2d2014-05-31 18:53:36 +03002768
Johan Hedbergd3e54a82014-06-04 11:07:40 +03002769 sc_add_ltk(smp);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002770
2771 if (hcon->out) {
Johan Hedberg8b76ce32015-06-08 18:14:39 +03002772 hci_le_start_enc(hcon, 0, 0, smp->tk, smp->enc_key_size);
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002773 hcon->enc_key_size = smp->enc_key_size;
2774 }
2775
2776 return 0;
2777}
2778
Johan Hedberg1408bb62014-06-04 22:45:57 +03002779static int smp_cmd_keypress_notify(struct l2cap_conn *conn,
2780 struct sk_buff *skb)
2781{
2782 struct smp_cmd_keypress_notify *kp = (void *) skb->data;
2783
2784 BT_DBG("value 0x%02x", kp->value);
2785
2786 return 0;
2787}
2788
Johan Hedberg4befb862014-08-11 22:06:38 +03002789static int smp_sig_channel(struct l2cap_chan *chan, struct sk_buff *skb)
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002790{
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002791 struct l2cap_conn *conn = chan->conn;
Marcel Holtmann7b9899d2013-10-03 00:00:57 -07002792 struct hci_conn *hcon = conn->hcon;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002793 struct smp_chan *smp;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002794 __u8 code, reason;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002795 int err = 0;
2796
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002797 if (skb->len < 1)
Marcel Holtmann92381f52013-10-03 01:23:08 -07002798 return -EILSEQ;
Marcel Holtmann92381f52013-10-03 01:23:08 -07002799
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002800 if (!hci_dev_test_flag(hcon->hdev, HCI_LE_ENABLED)) {
Andre Guedes2e65c9d2011-06-30 19:20:56 -03002801 reason = SMP_PAIRING_NOTSUPP;
2802 goto done;
2803 }
2804
Marcel Holtmann92381f52013-10-03 01:23:08 -07002805 code = skb->data[0];
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002806 skb_pull(skb, sizeof(code));
2807
Johan Hedbergb28b4942014-09-05 22:19:55 +03002808 smp = chan->data;
2809
2810 if (code > SMP_CMD_MAX)
2811 goto drop;
2812
Johan Hedberg24bd0bd2014-09-10 17:37:43 -07002813 if (smp && !test_and_clear_bit(code, &smp->allow_cmd))
Johan Hedbergb28b4942014-09-05 22:19:55 +03002814 goto drop;
2815
2816 /* If we don't have a context the only allowed commands are
2817 * pairing request and security request.
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002818 */
Johan Hedbergb28b4942014-09-05 22:19:55 +03002819 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ)
2820 goto drop;
Johan Hedberg8cf9fa12013-01-29 10:44:23 -06002821
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002822 switch (code) {
2823 case SMP_CMD_PAIRING_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002824 reason = smp_cmd_pairing_req(conn, skb);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002825 break;
2826
2827 case SMP_CMD_PAIRING_FAIL:
Johan Hedberg84794e12013-11-06 11:24:57 +02002828 smp_failure(conn, 0);
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002829 err = -EPERM;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002830 break;
2831
2832 case SMP_CMD_PAIRING_RSP:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002833 reason = smp_cmd_pairing_rsp(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002834 break;
2835
2836 case SMP_CMD_SECURITY_REQ:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002837 reason = smp_cmd_security_req(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002838 break;
2839
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002840 case SMP_CMD_PAIRING_CONFIRM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002841 reason = smp_cmd_pairing_confirm(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002842 break;
2843
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002844 case SMP_CMD_PAIRING_RANDOM:
Vinicius Costa Gomesda85e5e2011-06-09 18:50:53 -03002845 reason = smp_cmd_pairing_random(conn, skb);
Anderson Briglia88ba43b2011-06-09 18:50:42 -03002846 break;
2847
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002848 case SMP_CMD_ENCRYPT_INFO:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002849 reason = smp_cmd_encrypt_info(conn, skb);
2850 break;
2851
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002852 case SMP_CMD_MASTER_IDENT:
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002853 reason = smp_cmd_master_ident(conn, skb);
2854 break;
2855
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002856 case SMP_CMD_IDENT_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002857 reason = smp_cmd_ident_info(conn, skb);
2858 break;
2859
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002860 case SMP_CMD_IDENT_ADDR_INFO:
Johan Hedbergfd349c02014-02-18 10:19:36 +02002861 reason = smp_cmd_ident_addr_info(conn, skb);
2862 break;
2863
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002864 case SMP_CMD_SIGN_INFO:
Marcel Holtmann7ee4ea32014-03-09 12:19:17 -07002865 reason = smp_cmd_sign_info(conn, skb);
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002866 break;
2867
Johan Hedbergd8f8edb2014-06-06 11:09:28 +03002868 case SMP_CMD_PUBLIC_KEY:
2869 reason = smp_cmd_public_key(conn, skb);
2870 break;
2871
Johan Hedberg6433a9a2014-06-06 11:47:30 +03002872 case SMP_CMD_DHKEY_CHECK:
2873 reason = smp_cmd_dhkey_check(conn, skb);
2874 break;
2875
Johan Hedberg1408bb62014-06-04 22:45:57 +03002876 case SMP_CMD_KEYPRESS_NOTIFY:
2877 reason = smp_cmd_keypress_notify(conn, skb);
2878 break;
2879
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002880 default:
2881 BT_DBG("Unknown command code 0x%2.2x", code);
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002882 reason = SMP_CMD_NOTSUPP;
Vinicius Costa Gomes3a0259b2011-06-09 18:50:43 -03002883 goto done;
2884 }
2885
2886done:
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002887 if (!err) {
2888 if (reason)
2889 smp_failure(conn, reason);
Johan Hedberg8ae9b982014-08-11 22:06:39 +03002890 kfree_skb(skb);
Johan Hedberg9b7b18e2014-08-18 20:33:31 +03002891 }
2892
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002893 return err;
Johan Hedbergb28b4942014-09-05 22:19:55 +03002894
2895drop:
2896 BT_ERR("%s unexpected SMP command 0x%02x from %pMR", hcon->hdev->name,
2897 code, &hcon->dst);
2898 kfree_skb(skb);
2899 return 0;
Anderson Brigliaeb492e02011-06-09 18:50:40 -03002900}
Vinicius Costa Gomes7034b912011-07-07 18:59:34 -03002901
Johan Hedberg70db83c2014-08-08 09:37:16 +03002902static void smp_teardown_cb(struct l2cap_chan *chan, int err)
2903{
2904 struct l2cap_conn *conn = chan->conn;
2905
2906 BT_DBG("chan %p", chan);
2907
Johan Hedbergfc75cc82014-09-05 22:19:52 +03002908 if (chan->data)
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002909 smp_chan_destroy(conn);
Johan Hedberg5d88cc72014-08-08 09:37:18 +03002910
Johan Hedberg70db83c2014-08-08 09:37:16 +03002911 conn->smp = NULL;
2912 l2cap_chan_put(chan);
2913}
2914
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002915static void bredr_pairing(struct l2cap_chan *chan)
2916{
2917 struct l2cap_conn *conn = chan->conn;
2918 struct hci_conn *hcon = conn->hcon;
2919 struct hci_dev *hdev = hcon->hdev;
2920 struct smp_cmd_pairing req;
2921 struct smp_chan *smp;
2922
2923 BT_DBG("chan %p", chan);
2924
2925 /* Only new pairings are interesting */
2926 if (!test_bit(HCI_CONN_NEW_LINK_KEY, &hcon->flags))
2927 return;
2928
2929 /* Don't bother if we're not encrypted */
2930 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
2931 return;
2932
2933 /* Only master may initiate SMP over BR/EDR */
2934 if (hcon->role != HCI_ROLE_MASTER)
2935 return;
2936
2937 /* Secure Connections support must be enabled */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002938 if (!hci_dev_test_flag(hdev, HCI_SC_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002939 return;
2940
2941 /* BR/EDR must use Secure Connections for SMP */
2942 if (!test_bit(HCI_CONN_AES_CCM, &hcon->flags) &&
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07002943 !hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002944 return;
2945
2946 /* If our LE support is not enabled don't do anything */
Marcel Holtmannd7a5a112015-03-13 02:11:00 -07002947 if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED))
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002948 return;
2949
2950 /* Don't bother if remote LE support is not enabled */
2951 if (!lmp_host_le_capable(hcon))
2952 return;
2953
2954 /* Remote must support SMP fixed chan for BR/EDR */
2955 if (!(conn->remote_fixed_chan & L2CAP_FC_SMP_BREDR))
2956 return;
2957
2958 /* Don't bother if SMP is already ongoing */
2959 if (chan->data)
2960 return;
2961
2962 smp = smp_chan_create(conn);
2963 if (!smp) {
2964 BT_ERR("%s unable to create SMP context for BR/EDR",
2965 hdev->name);
2966 return;
2967 }
2968
2969 set_bit(SMP_FLAG_SC, &smp->flags);
2970
2971 BT_DBG("%s starting SMP over BR/EDR", hdev->name);
2972
2973 /* Prepare and send the BR/EDR SMP Pairing Request */
2974 build_bredr_pairing_cmd(smp, &req, NULL);
2975
2976 smp->preq[0] = SMP_CMD_PAIRING_REQ;
2977 memcpy(&smp->preq[1], &req, sizeof(req));
2978
2979 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(req), &req);
2980 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP);
2981}
2982
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002983static void smp_resume_cb(struct l2cap_chan *chan)
2984{
Johan Hedbergb68fda62014-08-11 22:06:40 +03002985 struct smp_chan *smp = chan->data;
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03002986 struct l2cap_conn *conn = chan->conn;
2987 struct hci_conn *hcon = conn->hcon;
2988
2989 BT_DBG("chan %p", chan);
2990
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002991 if (hcon->type == ACL_LINK) {
2992 bredr_pairing(chan);
Johan Hedbergef8efe42014-08-13 15:12:32 +03002993 return;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03002994 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03002995
Johan Hedberg86d14072014-08-11 22:06:43 +03002996 if (!smp)
2997 return;
Johan Hedbergb68fda62014-08-11 22:06:40 +03002998
Johan Hedberg84bc0db2014-09-05 22:19:49 +03002999 if (!test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3000 return;
3001
Johan Hedberg86d14072014-08-11 22:06:43 +03003002 cancel_delayed_work(&smp->security_timer);
3003
Johan Hedbergd6268e82014-09-05 22:19:51 +03003004 smp_distribute_keys(smp);
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003005}
3006
Johan Hedberg70db83c2014-08-08 09:37:16 +03003007static void smp_ready_cb(struct l2cap_chan *chan)
3008{
3009 struct l2cap_conn *conn = chan->conn;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003010 struct hci_conn *hcon = conn->hcon;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003011
3012 BT_DBG("chan %p", chan);
3013
Johan Hedberg78837462015-11-11 21:47:12 +02003014 /* No need to call l2cap_chan_hold() here since we already own
3015 * the reference taken in smp_new_conn_cb(). This is just the
3016 * first time that we tie it to a specific pointer. The code in
3017 * l2cap_core.c ensures that there's no risk this function wont
3018 * get called if smp_new_conn_cb was previously called.
3019 */
Johan Hedberg70db83c2014-08-08 09:37:16 +03003020 conn->smp = chan;
Johan Hedbergb5ae3442014-08-14 12:34:26 +03003021
3022 if (hcon->type == ACL_LINK && test_bit(HCI_CONN_ENCRYPT, &hcon->flags))
3023 bredr_pairing(chan);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003024}
3025
Johan Hedberg4befb862014-08-11 22:06:38 +03003026static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
3027{
3028 int err;
3029
3030 BT_DBG("chan %p", chan);
3031
3032 err = smp_sig_channel(chan, skb);
3033 if (err) {
Johan Hedbergb68fda62014-08-11 22:06:40 +03003034 struct smp_chan *smp = chan->data;
Johan Hedberg4befb862014-08-11 22:06:38 +03003035
Johan Hedbergb68fda62014-08-11 22:06:40 +03003036 if (smp)
3037 cancel_delayed_work_sync(&smp->security_timer);
Johan Hedberg4befb862014-08-11 22:06:38 +03003038
Johan Hedberg1e91c292014-08-18 20:33:29 +03003039 hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
Johan Hedberg4befb862014-08-11 22:06:38 +03003040 }
3041
3042 return err;
3043}
3044
Johan Hedberg70db83c2014-08-08 09:37:16 +03003045static struct sk_buff *smp_alloc_skb_cb(struct l2cap_chan *chan,
3046 unsigned long hdr_len,
3047 unsigned long len, int nb)
3048{
3049 struct sk_buff *skb;
3050
3051 skb = bt_skb_alloc(hdr_len + len, GFP_KERNEL);
3052 if (!skb)
3053 return ERR_PTR(-ENOMEM);
3054
3055 skb->priority = HCI_PRIO_MAX;
Johan Hedberga4368ff2015-03-30 23:21:01 +03003056 bt_cb(skb)->l2cap.chan = chan;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003057
3058 return skb;
3059}
3060
3061static const struct l2cap_ops smp_chan_ops = {
3062 .name = "Security Manager",
3063 .ready = smp_ready_cb,
Johan Hedberg5d88cc72014-08-08 09:37:18 +03003064 .recv = smp_recv_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003065 .alloc_skb = smp_alloc_skb_cb,
3066 .teardown = smp_teardown_cb,
Johan Hedberg44f1a7a2014-08-11 22:06:36 +03003067 .resume = smp_resume_cb,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003068
3069 .new_connection = l2cap_chan_no_new_connection,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003070 .state_change = l2cap_chan_no_state_change,
3071 .close = l2cap_chan_no_close,
3072 .defer = l2cap_chan_no_defer,
3073 .suspend = l2cap_chan_no_suspend,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003074 .set_shutdown = l2cap_chan_no_set_shutdown,
3075 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003076};
3077
3078static inline struct l2cap_chan *smp_new_conn_cb(struct l2cap_chan *pchan)
3079{
3080 struct l2cap_chan *chan;
3081
3082 BT_DBG("pchan %p", pchan);
3083
3084 chan = l2cap_chan_create();
3085 if (!chan)
3086 return NULL;
3087
3088 chan->chan_type = pchan->chan_type;
3089 chan->ops = &smp_chan_ops;
3090 chan->scid = pchan->scid;
3091 chan->dcid = chan->scid;
3092 chan->imtu = pchan->imtu;
3093 chan->omtu = pchan->omtu;
3094 chan->mode = pchan->mode;
3095
Johan Hedbergabe84902014-11-12 22:22:21 +02003096 /* Other L2CAP channels may request SMP routines in order to
3097 * change the security level. This means that the SMP channel
3098 * lock must be considered in its own category to avoid lockdep
3099 * warnings.
3100 */
3101 atomic_set(&chan->nesting, L2CAP_NESTING_SMP);
3102
Johan Hedberg70db83c2014-08-08 09:37:16 +03003103 BT_DBG("created chan %p", chan);
3104
3105 return chan;
3106}
3107
3108static const struct l2cap_ops smp_root_chan_ops = {
3109 .name = "Security Manager Root",
3110 .new_connection = smp_new_conn_cb,
3111
3112 /* None of these are implemented for the root channel */
3113 .close = l2cap_chan_no_close,
3114 .alloc_skb = l2cap_chan_no_alloc_skb,
3115 .recv = l2cap_chan_no_recv,
3116 .state_change = l2cap_chan_no_state_change,
3117 .teardown = l2cap_chan_no_teardown,
3118 .ready = l2cap_chan_no_ready,
3119 .defer = l2cap_chan_no_defer,
3120 .suspend = l2cap_chan_no_suspend,
3121 .resume = l2cap_chan_no_resume,
3122 .set_shutdown = l2cap_chan_no_set_shutdown,
3123 .get_sndtimeo = l2cap_chan_no_get_sndtimeo,
Johan Hedberg70db83c2014-08-08 09:37:16 +03003124};
3125
Johan Hedbergef8efe42014-08-13 15:12:32 +03003126static struct l2cap_chan *smp_add_cid(struct hci_dev *hdev, u16 cid)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003127{
Johan Hedberg70db83c2014-08-08 09:37:16 +03003128 struct l2cap_chan *chan;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003129 struct smp_dev *smp;
3130 struct crypto_blkcipher *tfm_aes;
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003131 struct crypto_hash *tfm_cmac;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003132
Johan Hedbergef8efe42014-08-13 15:12:32 +03003133 if (cid == L2CAP_CID_SMP_BREDR) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003134 smp = NULL;
Johan Hedbergef8efe42014-08-13 15:12:32 +03003135 goto create_chan;
3136 }
Johan Hedberg711eafe2014-08-08 09:32:52 +03003137
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003138 smp = kzalloc(sizeof(*smp), GFP_KERNEL);
3139 if (!smp)
3140 return ERR_PTR(-ENOMEM);
3141
3142 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003143 if (IS_ERR(tfm_aes)) {
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003144 BT_ERR("Unable to create ECB crypto context");
3145 kzfree(smp);
Fengguang Wufe700772014-12-08 03:04:38 +08003146 return ERR_CAST(tfm_aes);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003147 }
3148
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003149 tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
3150 if (IS_ERR(tfm_cmac)) {
3151 BT_ERR("Unable to create CMAC crypto context");
3152 crypto_free_blkcipher(tfm_aes);
3153 kzfree(smp);
3154 return ERR_CAST(tfm_cmac);
3155 }
3156
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003157 smp->tfm_aes = tfm_aes;
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003158 smp->tfm_cmac = tfm_cmac;
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003159 smp->min_key_size = SMP_MIN_ENC_KEY_SIZE;
Johan Hedberg2fd36552015-06-11 13:52:26 +03003160 smp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003161
Johan Hedbergef8efe42014-08-13 15:12:32 +03003162create_chan:
Johan Hedberg70db83c2014-08-08 09:37:16 +03003163 chan = l2cap_chan_create();
3164 if (!chan) {
Marcel Holtmann63511f6d2015-03-17 11:38:24 -07003165 if (smp) {
3166 crypto_free_blkcipher(smp->tfm_aes);
3167 crypto_free_hash(smp->tfm_cmac);
3168 kzfree(smp);
3169 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003170 return ERR_PTR(-ENOMEM);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003171 }
3172
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003173 chan->data = smp;
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003174
Johan Hedbergef8efe42014-08-13 15:12:32 +03003175 l2cap_add_scid(chan, cid);
Johan Hedberg70db83c2014-08-08 09:37:16 +03003176
3177 l2cap_chan_set_defaults(chan);
3178
Marcel Holtmann157029b2015-01-14 15:43:09 -08003179 if (cid == L2CAP_CID_SMP) {
Johan Hedberg39e3e742015-02-20 13:48:24 +02003180 u8 bdaddr_type;
3181
3182 hci_copy_identity_address(hdev, &chan->src, &bdaddr_type);
3183
3184 if (bdaddr_type == ADDR_LE_DEV_PUBLIC)
Marcel Holtmann157029b2015-01-14 15:43:09 -08003185 chan->src_type = BDADDR_LE_PUBLIC;
Johan Hedberg39e3e742015-02-20 13:48:24 +02003186 else
3187 chan->src_type = BDADDR_LE_RANDOM;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003188 } else {
3189 bacpy(&chan->src, &hdev->bdaddr);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003190 chan->src_type = BDADDR_BREDR;
Marcel Holtmann157029b2015-01-14 15:43:09 -08003191 }
3192
Johan Hedberg70db83c2014-08-08 09:37:16 +03003193 chan->state = BT_LISTEN;
3194 chan->mode = L2CAP_MODE_BASIC;
3195 chan->imtu = L2CAP_DEFAULT_MTU;
3196 chan->ops = &smp_root_chan_ops;
3197
Johan Hedbergabe84902014-11-12 22:22:21 +02003198 /* Set correct nesting level for a parent/listening channel */
3199 atomic_set(&chan->nesting, L2CAP_NESTING_PARENT);
3200
Johan Hedbergef8efe42014-08-13 15:12:32 +03003201 return chan;
Johan Hedberg711eafe2014-08-08 09:32:52 +03003202}
3203
Johan Hedbergef8efe42014-08-13 15:12:32 +03003204static void smp_del_chan(struct l2cap_chan *chan)
Johan Hedberg711eafe2014-08-08 09:32:52 +03003205{
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003206 struct smp_dev *smp;
Johan Hedberg70db83c2014-08-08 09:37:16 +03003207
Johan Hedbergef8efe42014-08-13 15:12:32 +03003208 BT_DBG("chan %p", chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003209
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003210 smp = chan->data;
3211 if (smp) {
Johan Hedbergdefce9e2014-08-08 09:37:17 +03003212 chan->data = NULL;
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003213 if (smp->tfm_aes)
3214 crypto_free_blkcipher(smp->tfm_aes);
Marcel Holtmann6e2dc6d2015-03-16 01:10:21 -07003215 if (smp->tfm_cmac)
3216 crypto_free_hash(smp->tfm_cmac);
Marcel Holtmann88a479d2015-03-16 01:10:19 -07003217 kzfree(smp);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003218 }
Johan Hedberg70db83c2014-08-08 09:37:16 +03003219
Johan Hedberg70db83c2014-08-08 09:37:16 +03003220 l2cap_chan_put(chan);
Johan Hedberg711eafe2014-08-08 09:32:52 +03003221}
Johan Hedbergef8efe42014-08-13 15:12:32 +03003222
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003223static ssize_t force_bredr_smp_read(struct file *file,
3224 char __user *user_buf,
3225 size_t count, loff_t *ppos)
3226{
3227 struct hci_dev *hdev = file->private_data;
3228 char buf[3];
3229
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003230 buf[0] = hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP) ? 'Y': 'N';
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003231 buf[1] = '\n';
3232 buf[2] = '\0';
3233 return simple_read_from_buffer(user_buf, count, ppos, buf, 2);
3234}
3235
3236static ssize_t force_bredr_smp_write(struct file *file,
3237 const char __user *user_buf,
3238 size_t count, loff_t *ppos)
3239{
3240 struct hci_dev *hdev = file->private_data;
3241 char buf[32];
3242 size_t buf_size = min(count, (sizeof(buf)-1));
3243 bool enable;
3244
3245 if (copy_from_user(buf, user_buf, buf_size))
3246 return -EFAULT;
3247
3248 buf[buf_size] = '\0';
3249 if (strtobool(buf, &enable))
3250 return -EINVAL;
3251
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003252 if (enable == hci_dev_test_flag(hdev, HCI_FORCE_BREDR_SMP))
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003253 return -EALREADY;
3254
3255 if (enable) {
3256 struct l2cap_chan *chan;
3257
3258 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3259 if (IS_ERR(chan))
3260 return PTR_ERR(chan);
3261
3262 hdev->smp_bredr_data = chan;
3263 } else {
3264 struct l2cap_chan *chan;
3265
3266 chan = hdev->smp_bredr_data;
3267 hdev->smp_bredr_data = NULL;
3268 smp_del_chan(chan);
3269 }
3270
Marcel Holtmannb7cb93e2015-03-13 10:20:35 -07003271 hci_dev_change_flag(hdev, HCI_FORCE_BREDR_SMP);
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003272
3273 return count;
3274}
3275
3276static const struct file_operations force_bredr_smp_fops = {
3277 .open = simple_open,
3278 .read = force_bredr_smp_read,
3279 .write = force_bredr_smp_write,
3280 .llseek = default_llseek,
3281};
3282
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003283static ssize_t le_min_key_size_read(struct file *file,
3284 char __user *user_buf,
3285 size_t count, loff_t *ppos)
3286{
3287 struct hci_dev *hdev = file->private_data;
3288 char buf[4];
3289
3290 snprintf(buf, sizeof(buf), "%2u\n", SMP_DEV(hdev)->min_key_size);
3291
3292 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
3293}
3294
3295static ssize_t le_min_key_size_write(struct file *file,
3296 const char __user *user_buf,
3297 size_t count, loff_t *ppos)
3298{
3299 struct hci_dev *hdev = file->private_data;
3300 char buf[32];
3301 size_t buf_size = min(count, (sizeof(buf) - 1));
3302 u8 key_size;
3303
3304 if (copy_from_user(buf, user_buf, buf_size))
3305 return -EFAULT;
3306
3307 buf[buf_size] = '\0';
3308
3309 sscanf(buf, "%hhu", &key_size);
3310
3311 if (key_size > SMP_DEV(hdev)->max_key_size ||
3312 key_size < SMP_MIN_ENC_KEY_SIZE)
3313 return -EINVAL;
3314
3315 SMP_DEV(hdev)->min_key_size = key_size;
3316
3317 return count;
3318}
3319
3320static const struct file_operations le_min_key_size_fops = {
3321 .open = simple_open,
3322 .read = le_min_key_size_read,
3323 .write = le_min_key_size_write,
3324 .llseek = default_llseek,
3325};
3326
Johan Hedberg2fd36552015-06-11 13:52:26 +03003327static ssize_t le_max_key_size_read(struct file *file,
3328 char __user *user_buf,
3329 size_t count, loff_t *ppos)
3330{
3331 struct hci_dev *hdev = file->private_data;
3332 char buf[4];
3333
3334 snprintf(buf, sizeof(buf), "%2u\n", SMP_DEV(hdev)->max_key_size);
3335
3336 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
3337}
3338
3339static ssize_t le_max_key_size_write(struct file *file,
3340 const char __user *user_buf,
3341 size_t count, loff_t *ppos)
3342{
3343 struct hci_dev *hdev = file->private_data;
3344 char buf[32];
3345 size_t buf_size = min(count, (sizeof(buf) - 1));
3346 u8 key_size;
3347
3348 if (copy_from_user(buf, user_buf, buf_size))
3349 return -EFAULT;
3350
3351 buf[buf_size] = '\0';
3352
3353 sscanf(buf, "%hhu", &key_size);
3354
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003355 if (key_size > SMP_MAX_ENC_KEY_SIZE ||
3356 key_size < SMP_DEV(hdev)->min_key_size)
Johan Hedberg2fd36552015-06-11 13:52:26 +03003357 return -EINVAL;
3358
3359 SMP_DEV(hdev)->max_key_size = key_size;
3360
3361 return count;
3362}
3363
3364static const struct file_operations le_max_key_size_fops = {
3365 .open = simple_open,
3366 .read = le_max_key_size_read,
3367 .write = le_max_key_size_write,
3368 .llseek = default_llseek,
3369};
3370
Johan Hedbergef8efe42014-08-13 15:12:32 +03003371int smp_register(struct hci_dev *hdev)
3372{
3373 struct l2cap_chan *chan;
3374
3375 BT_DBG("%s", hdev->name);
3376
Marcel Holtmann7e7ec442015-01-14 15:43:10 -08003377 /* If the controller does not support Low Energy operation, then
3378 * there is also no need to register any SMP channel.
3379 */
3380 if (!lmp_le_capable(hdev))
3381 return 0;
3382
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003383 if (WARN_ON(hdev->smp_data)) {
3384 chan = hdev->smp_data;
3385 hdev->smp_data = NULL;
3386 smp_del_chan(chan);
3387 }
3388
Johan Hedbergef8efe42014-08-13 15:12:32 +03003389 chan = smp_add_cid(hdev, L2CAP_CID_SMP);
3390 if (IS_ERR(chan))
3391 return PTR_ERR(chan);
3392
3393 hdev->smp_data = chan;
3394
Johan Hedbergb1f663c2015-06-11 13:52:27 +03003395 debugfs_create_file("le_min_key_size", 0644, hdev->debugfs, hdev,
3396 &le_min_key_size_fops);
Johan Hedberg2fd36552015-06-11 13:52:26 +03003397 debugfs_create_file("le_max_key_size", 0644, hdev->debugfs, hdev,
3398 &le_max_key_size_fops);
3399
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003400 /* If the controller does not support BR/EDR Secure Connections
3401 * feature, then the BR/EDR SMP channel shall not be present.
3402 *
3403 * To test this with Bluetooth 4.0 controllers, create a debugfs
3404 * switch that allows forcing BR/EDR SMP support and accepting
3405 * cross-transport pairing on non-AES encrypted connections.
3406 */
3407 if (!lmp_sc_capable(hdev)) {
3408 debugfs_create_file("force_bredr_smp", 0644, hdev->debugfs,
3409 hdev, &force_bredr_smp_fops);
Johan Hedbergef8efe42014-08-13 15:12:32 +03003410 return 0;
Marcel Holtmann300acfde2014-12-31 14:43:16 -08003411 }
Johan Hedbergef8efe42014-08-13 15:12:32 +03003412
Marcel Holtmann2b8df322015-01-15 08:04:21 -08003413 if (WARN_ON(hdev->smp_bredr_data)) {
3414 chan = hdev->smp_bredr_data;
3415 hdev->smp_bredr_data = NULL;
3416 smp_del_chan(chan);
3417 }
3418
Johan Hedbergef8efe42014-08-13 15:12:32 +03003419 chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
3420 if (IS_ERR(chan)) {
3421 int err = PTR_ERR(chan);
3422 chan = hdev->smp_data;
3423 hdev->smp_data = NULL;
3424 smp_del_chan(chan);
3425 return err;
3426 }
3427
3428 hdev->smp_bredr_data = chan;
3429
3430 return 0;
3431}
3432
3433void smp_unregister(struct hci_dev *hdev)
3434{
3435 struct l2cap_chan *chan;
3436
3437 if (hdev->smp_bredr_data) {
3438 chan = hdev->smp_bredr_data;
3439 hdev->smp_bredr_data = NULL;
3440 smp_del_chan(chan);
3441 }
3442
3443 if (hdev->smp_data) {
3444 chan = hdev->smp_data;
3445 hdev->smp_data = NULL;
3446 smp_del_chan(chan);
3447 }
3448}
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003449
3450#if IS_ENABLED(CONFIG_BT_SELFTEST_SMP)
3451
Johan Hedbergcfc41982014-12-30 09:50:40 +02003452static int __init test_ah(struct crypto_blkcipher *tfm_aes)
3453{
3454 const u8 irk[16] = {
3455 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3456 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3457 const u8 r[3] = { 0x94, 0x81, 0x70 };
3458 const u8 exp[3] = { 0xaa, 0xfb, 0x0d };
3459 u8 res[3];
3460 int err;
3461
3462 err = smp_ah(tfm_aes, irk, r, res);
3463 if (err)
3464 return err;
3465
3466 if (memcmp(res, exp, 3))
3467 return -EINVAL;
3468
3469 return 0;
3470}
3471
3472static int __init test_c1(struct crypto_blkcipher *tfm_aes)
3473{
3474 const u8 k[16] = {
3475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3477 const u8 r[16] = {
3478 0xe0, 0x2e, 0x70, 0xc6, 0x4e, 0x27, 0x88, 0x63,
3479 0x0e, 0x6f, 0xad, 0x56, 0x21, 0xd5, 0x83, 0x57 };
3480 const u8 preq[7] = { 0x01, 0x01, 0x00, 0x00, 0x10, 0x07, 0x07 };
3481 const u8 pres[7] = { 0x02, 0x03, 0x00, 0x00, 0x08, 0x00, 0x05 };
3482 const u8 _iat = 0x01;
3483 const u8 _rat = 0x00;
3484 const bdaddr_t ra = { { 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1 } };
3485 const bdaddr_t ia = { { 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1 } };
3486 const u8 exp[16] = {
3487 0x86, 0x3b, 0xf1, 0xbe, 0xc5, 0x4d, 0xa7, 0xd2,
3488 0xea, 0x88, 0x89, 0x87, 0xef, 0x3f, 0x1e, 0x1e };
3489 u8 res[16];
3490 int err;
3491
3492 err = smp_c1(tfm_aes, k, r, preq, pres, _iat, &ia, _rat, &ra, res);
3493 if (err)
3494 return err;
3495
3496 if (memcmp(res, exp, 16))
3497 return -EINVAL;
3498
3499 return 0;
3500}
3501
3502static int __init test_s1(struct crypto_blkcipher *tfm_aes)
3503{
3504 const u8 k[16] = {
3505 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3506 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
3507 const u8 r1[16] = {
3508 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11 };
3509 const u8 r2[16] = {
3510 0x00, 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99 };
3511 const u8 exp[16] = {
3512 0x62, 0xa0, 0x6d, 0x79, 0xae, 0x16, 0x42, 0x5b,
3513 0x9b, 0xf4, 0xb0, 0xe8, 0xf0, 0xe1, 0x1f, 0x9a };
3514 u8 res[16];
3515 int err;
3516
3517 err = smp_s1(tfm_aes, k, r1, r2, res);
3518 if (err)
3519 return err;
3520
3521 if (memcmp(res, exp, 16))
3522 return -EINVAL;
3523
3524 return 0;
3525}
3526
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003527static int __init test_f4(struct crypto_hash *tfm_cmac)
3528{
3529 const u8 u[32] = {
3530 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3531 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3532 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3533 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3534 const u8 v[32] = {
3535 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3536 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3537 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3538 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3539 const u8 x[16] = {
3540 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3541 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3542 const u8 z = 0x00;
3543 const u8 exp[16] = {
3544 0x2d, 0x87, 0x74, 0xa9, 0xbe, 0xa1, 0xed, 0xf1,
3545 0x1c, 0xbd, 0xa9, 0x07, 0xf1, 0x16, 0xc9, 0xf2 };
3546 u8 res[16];
3547 int err;
3548
3549 err = smp_f4(tfm_cmac, u, v, x, z, res);
3550 if (err)
3551 return err;
3552
3553 if (memcmp(res, exp, 16))
3554 return -EINVAL;
3555
3556 return 0;
3557}
3558
3559static int __init test_f5(struct crypto_hash *tfm_cmac)
3560{
3561 const u8 w[32] = {
3562 0x98, 0xa6, 0xbf, 0x73, 0xf3, 0x34, 0x8d, 0x86,
3563 0xf1, 0x66, 0xf8, 0xb4, 0x13, 0x6b, 0x79, 0x99,
3564 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3565 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3566 const u8 n1[16] = {
3567 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3568 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3569 const u8 n2[16] = {
3570 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3571 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3572 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3573 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3574 const u8 exp_ltk[16] = {
3575 0x38, 0x0a, 0x75, 0x94, 0xb5, 0x22, 0x05, 0x98,
3576 0x23, 0xcd, 0xd7, 0x69, 0x11, 0x79, 0x86, 0x69 };
3577 const u8 exp_mackey[16] = {
3578 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3579 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3580 u8 mackey[16], ltk[16];
3581 int err;
3582
3583 err = smp_f5(tfm_cmac, w, n1, n2, a1, a2, mackey, ltk);
3584 if (err)
3585 return err;
3586
3587 if (memcmp(mackey, exp_mackey, 16))
3588 return -EINVAL;
3589
3590 if (memcmp(ltk, exp_ltk, 16))
3591 return -EINVAL;
3592
3593 return 0;
3594}
3595
3596static int __init test_f6(struct crypto_hash *tfm_cmac)
3597{
3598 const u8 w[16] = {
3599 0x20, 0x6e, 0x63, 0xce, 0x20, 0x6a, 0x3f, 0xfd,
3600 0x02, 0x4a, 0x08, 0xa1, 0x76, 0xf1, 0x65, 0x29 };
3601 const u8 n1[16] = {
3602 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3603 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3604 const u8 n2[16] = {
3605 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3606 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3607 const u8 r[16] = {
3608 0xc8, 0x0f, 0x2d, 0x0c, 0xd2, 0x42, 0xda, 0x08,
3609 0x54, 0xbb, 0x53, 0xb4, 0x3b, 0x34, 0xa3, 0x12 };
3610 const u8 io_cap[3] = { 0x02, 0x01, 0x01 };
3611 const u8 a1[7] = { 0xce, 0xbf, 0x37, 0x37, 0x12, 0x56, 0x00 };
3612 const u8 a2[7] = { 0xc1, 0xcf, 0x2d, 0x70, 0x13, 0xa7, 0x00 };
3613 const u8 exp[16] = {
3614 0x61, 0x8f, 0x95, 0xda, 0x09, 0x0b, 0x6c, 0xd2,
3615 0xc5, 0xe8, 0xd0, 0x9c, 0x98, 0x73, 0xc4, 0xe3 };
3616 u8 res[16];
3617 int err;
3618
3619 err = smp_f6(tfm_cmac, w, n1, n2, r, io_cap, a1, a2, res);
3620 if (err)
3621 return err;
3622
3623 if (memcmp(res, exp, 16))
3624 return -EINVAL;
3625
3626 return 0;
3627}
3628
3629static int __init test_g2(struct crypto_hash *tfm_cmac)
3630{
3631 const u8 u[32] = {
3632 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc,
3633 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef,
3634 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e,
3635 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20 };
3636 const u8 v[32] = {
3637 0xfd, 0xc5, 0x7f, 0xf4, 0x49, 0xdd, 0x4f, 0x6b,
3638 0xfb, 0x7c, 0x9d, 0xf1, 0xc2, 0x9a, 0xcb, 0x59,
3639 0x2a, 0xe7, 0xd4, 0xee, 0xfb, 0xfc, 0x0a, 0x90,
3640 0x9a, 0xbb, 0xf6, 0x32, 0x3d, 0x8b, 0x18, 0x55 };
3641 const u8 x[16] = {
3642 0xab, 0xae, 0x2b, 0x71, 0xec, 0xb2, 0xff, 0xff,
3643 0x3e, 0x73, 0x77, 0xd1, 0x54, 0x84, 0xcb, 0xd5 };
3644 const u8 y[16] = {
3645 0xcf, 0xc4, 0x3d, 0xff, 0xf7, 0x83, 0x65, 0x21,
3646 0x6e, 0x5f, 0xa7, 0x25, 0xcc, 0xe7, 0xe8, 0xa6 };
3647 const u32 exp_val = 0x2f9ed5ba % 1000000;
3648 u32 val;
3649 int err;
3650
3651 err = smp_g2(tfm_cmac, u, v, x, y, &val);
3652 if (err)
3653 return err;
3654
3655 if (val != exp_val)
3656 return -EINVAL;
3657
3658 return 0;
3659}
3660
3661static int __init test_h6(struct crypto_hash *tfm_cmac)
3662{
3663 const u8 w[16] = {
3664 0x9b, 0x7d, 0x39, 0x0a, 0xa6, 0x10, 0x10, 0x34,
3665 0x05, 0xad, 0xc8, 0x57, 0xa3, 0x34, 0x02, 0xec };
3666 const u8 key_id[4] = { 0x72, 0x62, 0x65, 0x6c };
3667 const u8 exp[16] = {
3668 0x99, 0x63, 0xb1, 0x80, 0xe2, 0xa9, 0xd3, 0xe8,
3669 0x1c, 0xc9, 0x6d, 0xe7, 0x02, 0xe1, 0x9a, 0x2d };
3670 u8 res[16];
3671 int err;
3672
3673 err = smp_h6(tfm_cmac, w, key_id, res);
3674 if (err)
3675 return err;
3676
3677 if (memcmp(res, exp, 16))
3678 return -EINVAL;
3679
3680 return 0;
3681}
3682
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003683static char test_smp_buffer[32];
3684
3685static ssize_t test_smp_read(struct file *file, char __user *user_buf,
3686 size_t count, loff_t *ppos)
3687{
3688 return simple_read_from_buffer(user_buf, count, ppos, test_smp_buffer,
3689 strlen(test_smp_buffer));
3690}
3691
3692static const struct file_operations test_smp_fops = {
3693 .open = simple_open,
3694 .read = test_smp_read,
3695 .llseek = default_llseek,
3696};
3697
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003698static int __init run_selftests(struct crypto_blkcipher *tfm_aes,
3699 struct crypto_hash *tfm_cmac)
3700{
Marcel Holtmann255047b2014-12-30 00:11:20 -08003701 ktime_t calltime, delta, rettime;
3702 unsigned long long duration;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003703 int err;
3704
Marcel Holtmann255047b2014-12-30 00:11:20 -08003705 calltime = ktime_get();
3706
Johan Hedbergcfc41982014-12-30 09:50:40 +02003707 err = test_ah(tfm_aes);
3708 if (err) {
3709 BT_ERR("smp_ah test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003710 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003711 }
3712
3713 err = test_c1(tfm_aes);
3714 if (err) {
3715 BT_ERR("smp_c1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003716 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003717 }
3718
3719 err = test_s1(tfm_aes);
3720 if (err) {
3721 BT_ERR("smp_s1 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003722 goto done;
Johan Hedbergcfc41982014-12-30 09:50:40 +02003723 }
3724
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003725 err = test_f4(tfm_cmac);
3726 if (err) {
3727 BT_ERR("smp_f4 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003728 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003729 }
3730
3731 err = test_f5(tfm_cmac);
3732 if (err) {
3733 BT_ERR("smp_f5 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003734 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003735 }
3736
3737 err = test_f6(tfm_cmac);
3738 if (err) {
3739 BT_ERR("smp_f6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003740 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003741 }
3742
3743 err = test_g2(tfm_cmac);
3744 if (err) {
3745 BT_ERR("smp_g2 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003746 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003747 }
3748
3749 err = test_h6(tfm_cmac);
3750 if (err) {
3751 BT_ERR("smp_h6 test failed");
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003752 goto done;
Johan Hedbergfb2969a2014-12-30 09:50:41 +02003753 }
3754
Marcel Holtmann255047b2014-12-30 00:11:20 -08003755 rettime = ktime_get();
3756 delta = ktime_sub(rettime, calltime);
3757 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
3758
Marcel Holtmann5ced2462015-01-12 23:09:48 -08003759 BT_INFO("SMP test passed in %llu usecs", duration);
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003760
Marcel Holtmann64dd3742015-04-01 12:52:13 -07003761done:
3762 if (!err)
3763 snprintf(test_smp_buffer, sizeof(test_smp_buffer),
3764 "PASS (%llu usecs)\n", duration);
3765 else
3766 snprintf(test_smp_buffer, sizeof(test_smp_buffer), "FAIL\n");
3767
3768 debugfs_create_file("selftest_smp", 0444, bt_debugfs, NULL,
3769 &test_smp_fops);
3770
3771 return err;
Johan Hedberg0a2b0f02014-12-30 09:50:39 +02003772}
3773
3774int __init bt_selftest_smp(void)
3775{
3776 struct crypto_blkcipher *tfm_aes;
3777 struct crypto_hash *tfm_cmac;
3778 int err;
3779
3780 tfm_aes = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
3781 if (IS_ERR(tfm_aes)) {
3782 BT_ERR("Unable to create ECB crypto context");
3783 return PTR_ERR(tfm_aes);
3784 }
3785
3786 tfm_cmac = crypto_alloc_hash("cmac(aes)", 0, CRYPTO_ALG_ASYNC);
3787 if (IS_ERR(tfm_cmac)) {
3788 BT_ERR("Unable to create CMAC crypto context");
3789 crypto_free_blkcipher(tfm_aes);
3790 return PTR_ERR(tfm_cmac);
3791 }
3792
3793 err = run_selftests(tfm_aes, tfm_cmac);
3794
3795 crypto_free_hash(tfm_cmac);
3796 crypto_free_blkcipher(tfm_aes);
3797
3798 return err;
3799}
3800
3801#endif