Revert "Bluetooth: Add support for communicating keys with userspace"
[deliverable/linux.git] / net / bluetooth / smp.c
CommitLineData
eb492e01
AB
1/*
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
23#include <net/bluetooth/bluetooth.h>
24#include <net/bluetooth/hci_core.h>
25#include <net/bluetooth/l2cap.h>
26#include <net/bluetooth/smp.h>
d22ef0bc 27#include <linux/crypto.h>
f70490e6 28#include <linux/scatterlist.h>
d22ef0bc
AB
29#include <crypto/b128ops.h>
30
5d3de7df
VCG
31#define SMP_TIMEOUT 30000 /* 30 seconds */
32
d22ef0bc
AB
33static inline void swap128(u8 src[16], u8 dst[16])
34{
35 int i;
36 for (i = 0; i < 16; i++)
37 dst[15 - i] = src[i];
38}
39
40static inline void swap56(u8 src[7], u8 dst[7])
41{
42 int i;
43 for (i = 0; i < 7; i++)
44 dst[6 - i] = src[i];
45}
46
47static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
48{
49 struct blkcipher_desc desc;
50 struct scatterlist sg;
51 int err, iv_len;
52 unsigned char iv[128];
53
54 if (tfm == NULL) {
55 BT_ERR("tfm %p", tfm);
56 return -EINVAL;
57 }
58
59 desc.tfm = tfm;
60 desc.flags = 0;
61
62 err = crypto_blkcipher_setkey(tfm, k, 16);
63 if (err) {
64 BT_ERR("cipher setkey failed: %d", err);
65 return err;
66 }
67
68 sg_init_one(&sg, r, 16);
69
70 iv_len = crypto_blkcipher_ivsize(tfm);
71 if (iv_len) {
72 memset(&iv, 0xff, iv_len);
73 crypto_blkcipher_set_iv(tfm, iv, iv_len);
74 }
75
76 err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
77 if (err)
78 BT_ERR("Encrypt data error %d", err);
79
80 return err;
81}
82
83static int smp_c1(struct crypto_blkcipher *tfm, u8 k[16], u8 r[16],
84 u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia,
85 u8 _rat, bdaddr_t *ra, u8 res[16])
86{
87 u8 p1[16], p2[16];
88 int err;
89
90 memset(p1, 0, 16);
91
92 /* p1 = pres || preq || _rat || _iat */
93 swap56(pres, p1);
94 swap56(preq, p1 + 7);
95 p1[14] = _rat;
96 p1[15] = _iat;
97
98 memset(p2, 0, 16);
99
100 /* p2 = padding || ia || ra */
101 baswap((bdaddr_t *) (p2 + 4), ia);
102 baswap((bdaddr_t *) (p2 + 10), ra);
103
104 /* res = r XOR p1 */
105 u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);
106
107 /* res = e(k, res) */
108 err = smp_e(tfm, k, res);
109 if (err) {
110 BT_ERR("Encrypt data error");
111 return err;
112 }
113
114 /* res = res XOR p2 */
115 u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);
116
117 /* res = e(k, res) */
118 err = smp_e(tfm, k, res);
119 if (err)
120 BT_ERR("Encrypt data error");
121
122 return err;
123}
124
125static int smp_s1(struct crypto_blkcipher *tfm, u8 k[16],
126 u8 r1[16], u8 r2[16], u8 _r[16])
127{
128 int err;
129
130 /* Just least significant octets from r1 and r2 are considered */
131 memcpy(_r, r1 + 8, 8);
132 memcpy(_r + 8, r2 + 8, 8);
133
134 err = smp_e(tfm, k, _r);
135 if (err)
136 BT_ERR("Encrypt data error");
137
138 return err;
139}
140
141static int smp_rand(u8 *buf)
142{
143 get_random_bytes(buf, 16);
144
145 return 0;
146}
eb492e01
AB
147
148static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
149 u16 dlen, void *data)
150{
151 struct sk_buff *skb;
152 struct l2cap_hdr *lh;
153 int len;
154
155 len = L2CAP_HDR_SIZE + sizeof(code) + dlen;
156
157 if (len > conn->mtu)
158 return NULL;
159
160 skb = bt_skb_alloc(len, GFP_ATOMIC);
161 if (!skb)
162 return NULL;
163
164 lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
165 lh->len = cpu_to_le16(sizeof(code) + dlen);
166 lh->cid = cpu_to_le16(L2CAP_CID_SMP);
167
168 memcpy(skb_put(skb, sizeof(code)), &code, sizeof(code));
169
170 memcpy(skb_put(skb, dlen), data, dlen);
171
172 return skb;
173}
174
175static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
176{
177 struct sk_buff *skb = smp_build_cmd(conn, code, len, data);
178
179 BT_DBG("code 0x%2.2x", code);
180
181 if (!skb)
182 return;
183
184 hci_send_acl(conn->hcon, skb, 0);
e2dcd113
VCG
185
186 mod_timer(&conn->security_timer, jiffies +
187 msecs_to_jiffies(SMP_TIMEOUT));
eb492e01
AB
188}
189
b8e66eac 190static void build_pairing_cmd(struct l2cap_conn *conn,
54790f73
VCG
191 struct smp_cmd_pairing *req,
192 struct smp_cmd_pairing *rsp,
193 __u8 authreq)
b8e66eac 194{
54790f73
VCG
195 u8 dist_keys;
196
197 dist_keys = 0;
198 if (test_bit(HCI_PAIRABLE, &conn->hcon->hdev->flags)) {
199 dist_keys = SMP_DIST_ENC_KEY | SMP_DIST_ID_KEY | SMP_DIST_SIGN;
200 authreq |= SMP_AUTH_BONDING;
201 }
202
203 if (rsp == NULL) {
204 req->io_capability = conn->hcon->io_capability;
205 req->oob_flag = SMP_OOB_NOT_PRESENT;
206 req->max_key_size = SMP_MAX_ENC_KEY_SIZE;
207 req->init_key_dist = dist_keys;
208 req->resp_key_dist = dist_keys;
209 req->auth_req = authreq;
210 return;
211 }
212
213 rsp->io_capability = conn->hcon->io_capability;
214 rsp->oob_flag = SMP_OOB_NOT_PRESENT;
215 rsp->max_key_size = SMP_MAX_ENC_KEY_SIZE;
216 rsp->init_key_dist = req->init_key_dist & dist_keys;
217 rsp->resp_key_dist = req->resp_key_dist & dist_keys;
218 rsp->auth_req = authreq;
b8e66eac
VCG
219}
220
3158c50c
VCG
221static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
222{
1c1def09
VCG
223 struct smp_chan *smp = conn->smp_chan;
224
3158c50c
VCG
225 if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
226 (max_key_size < SMP_MIN_ENC_KEY_SIZE))
227 return SMP_ENC_KEY_SIZE;
228
1c1def09 229 smp->smp_key_size = max_key_size;
3158c50c
VCG
230
231 return 0;
232}
233
8aab4757
VCG
234static void confirm_work(struct work_struct *work)
235{
236 struct smp_chan *smp = container_of(work, struct smp_chan, confirm);
237 struct l2cap_conn *conn = smp->conn;
238 struct crypto_blkcipher *tfm;
239 struct smp_cmd_pairing_confirm cp;
240 int ret;
241 u8 res[16], reason;
242
243 BT_DBG("conn %p", conn);
244
245 tfm = crypto_alloc_blkcipher("ecb(aes)", 0, CRYPTO_ALG_ASYNC);
246 if (IS_ERR(tfm)) {
247 reason = SMP_UNSPECIFIED;
248 goto error;
249 }
250
251 smp->tfm = tfm;
252
253 if (conn->hcon->out)
254 ret = smp_c1(tfm, smp->tk, smp->prnd, smp->preq, smp->prsp, 0,
255 conn->src, conn->hcon->dst_type, conn->dst,
256 res);
257 else
258 ret = smp_c1(tfm, smp->tk, smp->prnd, smp->preq, smp->prsp,
259 conn->hcon->dst_type, conn->dst, 0, conn->src,
260 res);
261 if (ret) {
262 reason = SMP_UNSPECIFIED;
263 goto error;
264 }
265
266 swap128(res, cp.confirm_val);
267 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
268
269 return;
270
271error:
272 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason), &reason);
273 smp_chan_destroy(conn);
274}
275
276static void random_work(struct work_struct *work)
277{
278 struct smp_chan *smp = container_of(work, struct smp_chan, random);
279 struct l2cap_conn *conn = smp->conn;
280 struct hci_conn *hcon = conn->hcon;
281 struct crypto_blkcipher *tfm = smp->tfm;
282 u8 reason, confirm[16], res[16], key[16];
283 int ret;
284
285 if (IS_ERR_OR_NULL(tfm)) {
286 reason = SMP_UNSPECIFIED;
287 goto error;
288 }
289
290 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
291
292 if (hcon->out)
293 ret = smp_c1(tfm, smp->tk, smp->rrnd, smp->preq, smp->prsp, 0,
294 conn->src, hcon->dst_type, conn->dst,
295 res);
296 else
297 ret = smp_c1(tfm, smp->tk, smp->rrnd, smp->preq, smp->prsp,
298 hcon->dst_type, conn->dst, 0, conn->src,
299 res);
300 if (ret) {
301 reason = SMP_UNSPECIFIED;
302 goto error;
303 }
304
305 swap128(res, confirm);
306
307 if (memcmp(smp->pcnf, confirm, sizeof(smp->pcnf)) != 0) {
308 BT_ERR("Pairing failed (confirmation values mismatch)");
309 reason = SMP_CONFIRM_FAILED;
310 goto error;
311 }
312
313 if (hcon->out) {
314 u8 stk[16], rand[8];
315 __le16 ediv;
316
317 memset(rand, 0, sizeof(rand));
318 ediv = 0;
319
320 smp_s1(tfm, smp->tk, smp->rrnd, smp->prnd, key);
321 swap128(key, stk);
322
323 memset(stk + smp->smp_key_size, 0,
324 SMP_MAX_ENC_KEY_SIZE - smp->smp_key_size);
325
326 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend)) {
327 reason = SMP_UNSPECIFIED;
328 goto error;
329 }
330
331 hci_le_start_enc(hcon, ediv, rand, stk);
332 hcon->enc_key_size = smp->smp_key_size;
333 } else {
334 u8 stk[16], r[16], rand[8];
335 __le16 ediv;
336
337 memset(rand, 0, sizeof(rand));
338 ediv = 0;
339
340 swap128(smp->prnd, r);
341 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(r), r);
342
343 smp_s1(tfm, smp->tk, smp->prnd, smp->rrnd, key);
344 swap128(key, stk);
345
346 memset(stk + smp->smp_key_size, 0,
347 SMP_MAX_ENC_KEY_SIZE - smp->smp_key_size);
348
349 hci_add_ltk(hcon->hdev, 0, conn->dst, smp->smp_key_size,
350 ediv, rand, stk);
351 }
352
353 return;
354
355error:
356 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason), &reason);
357 smp_chan_destroy(conn);
358}
359
360static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
361{
362 struct smp_chan *smp;
363
364 smp = kzalloc(sizeof(struct smp_chan), GFP_ATOMIC);
365 if (!smp)
366 return NULL;
367
368 INIT_WORK(&smp->confirm, confirm_work);
369 INIT_WORK(&smp->random, random_work);
370
371 smp->conn = conn;
372 conn->smp_chan = smp;
373
374 hci_conn_hold(conn->hcon);
375
376 return smp;
377}
378
379void smp_chan_destroy(struct l2cap_conn *conn)
380{
381 kfree(conn->smp_chan);
382 hci_conn_put(conn->hcon);
383}
384
da85e5e5 385static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
88ba43b6 386{
3158c50c 387 struct smp_cmd_pairing rsp, *req = (void *) skb->data;
8aab4757 388 struct smp_chan *smp;
3158c50c 389 u8 key_size;
8aab4757 390 int ret;
88ba43b6
AB
391
392 BT_DBG("conn %p", conn);
393
d26a2345 394 if (!test_and_set_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->pend))
8aab4757
VCG
395 smp = smp_chan_create(conn);
396
397 smp = conn->smp_chan;
d26a2345 398
1c1def09
VCG
399 smp->preq[0] = SMP_CMD_PAIRING_REQ;
400 memcpy(&smp->preq[1], req, sizeof(*req));
3158c50c 401 skb_pull(skb, sizeof(*req));
88ba43b6 402
3158c50c 403 if (req->oob_flag)
da85e5e5
VCG
404 return SMP_OOB_NOT_AVAIL;
405
406 /* We didn't start the pairing, so no requirements */
54790f73 407 build_pairing_cmd(conn, req, &rsp, SMP_AUTH_NONE);
3158c50c
VCG
408
409 key_size = min(req->max_key_size, rsp.max_key_size);
410 if (check_enc_key_size(conn, key_size))
411 return SMP_ENC_KEY_SIZE;
88ba43b6 412
7d24ddcc 413 /* Just works */
1c1def09 414 memset(smp->tk, 0, sizeof(smp->tk));
7d24ddcc 415
8aab4757
VCG
416 ret = smp_rand(smp->prnd);
417 if (ret)
418 return SMP_UNSPECIFIED;
419
1c1def09
VCG
420 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
421 memcpy(&smp->prsp[1], &rsp, sizeof(rsp));
f01ead31 422
3158c50c 423 smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
da85e5e5
VCG
424
425 return 0;
88ba43b6
AB
426}
427
da85e5e5 428static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
88ba43b6 429{
3158c50c 430 struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
1c1def09 431 struct smp_chan *smp = conn->smp_chan;
8aab4757
VCG
432 struct hci_dev *hdev = conn->hcon->hdev;
433 u8 key_size;
7d24ddcc 434 int ret;
88ba43b6
AB
435
436 BT_DBG("conn %p", conn);
437
3158c50c
VCG
438 skb_pull(skb, sizeof(*rsp));
439
1c1def09 440 req = (void *) &smp->preq[1];
da85e5e5 441
3158c50c
VCG
442 key_size = min(req->max_key_size, rsp->max_key_size);
443 if (check_enc_key_size(conn, key_size))
444 return SMP_ENC_KEY_SIZE;
445
446 if (rsp->oob_flag)
da85e5e5
VCG
447 return SMP_OOB_NOT_AVAIL;
448
7d24ddcc 449 /* Just works */
1c1def09 450 memset(smp->tk, 0, sizeof(smp->tk));
88ba43b6 451
1c1def09 452 ret = smp_rand(smp->prnd);
7d24ddcc 453 if (ret)
da85e5e5 454 return SMP_UNSPECIFIED;
7d24ddcc 455
8aab4757
VCG
456 smp->prsp[0] = SMP_CMD_PAIRING_RSP;
457 memcpy(&smp->prsp[1], rsp, sizeof(*rsp));
7d24ddcc 458
8aab4757 459 queue_work(hdev->workqueue, &smp->confirm);
da85e5e5
VCG
460
461 return 0;
88ba43b6
AB
462}
463
da85e5e5 464static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
88ba43b6 465{
1c1def09 466 struct smp_chan *smp = conn->smp_chan;
8aab4757 467 struct hci_dev *hdev = conn->hcon->hdev;
7d24ddcc 468
88ba43b6
AB
469 BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");
470
1c1def09
VCG
471 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf));
472 skb_pull(skb, sizeof(smp->pcnf));
88ba43b6 473
7d24ddcc
AB
474 if (conn->hcon->out) {
475 u8 random[16];
88ba43b6 476
1c1def09 477 swap128(smp->prnd, random);
88ba43b6 478 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(random),
7d24ddcc 479 random);
88ba43b6 480 } else {
8aab4757 481 queue_work(hdev->workqueue, &smp->confirm);
88ba43b6 482 }
da85e5e5
VCG
483
484 return 0;
88ba43b6
AB
485}
486
da85e5e5 487static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
88ba43b6 488{
1c1def09 489 struct smp_chan *smp = conn->smp_chan;
8aab4757 490 struct hci_dev *hdev = conn->hcon->hdev;
7d24ddcc 491
8aab4757 492 BT_DBG("conn %p", conn);
3158c50c 493
8aab4757
VCG
494 swap128(skb->data, smp->rrnd);
495 skb_pull(skb, sizeof(smp->rrnd));
e7e62c85 496
8aab4757 497 queue_work(hdev->workqueue, &smp->random);
da85e5e5
VCG
498
499 return 0;
88ba43b6
AB
500}
501
988c5997
VCG
502static u8 smp_ltk_encrypt(struct l2cap_conn *conn)
503{
504 struct link_key *key;
505 struct key_master_id *master;
506 struct hci_conn *hcon = conn->hcon;
507
508 key = hci_find_link_key_type(hcon->hdev, conn->dst,
509 HCI_LK_SMP_LTK);
510 if (!key)
511 return 0;
512
513 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND,
514 &hcon->pend))
515 return 1;
516
517 master = (void *) key->data;
518 hci_le_start_enc(hcon, master->ediv, master->rand,
519 key->val);
520 hcon->enc_key_size = key->pin_len;
521
522 return 1;
523
524}
da85e5e5 525static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
88ba43b6
AB
526{
527 struct smp_cmd_security_req *rp = (void *) skb->data;
528 struct smp_cmd_pairing cp;
f1cb9af5 529 struct hci_conn *hcon = conn->hcon;
8aab4757 530 struct smp_chan *smp;
88ba43b6
AB
531
532 BT_DBG("conn %p", conn);
533
988c5997
VCG
534 if (smp_ltk_encrypt(conn))
535 return 0;
536
d26a2345 537 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->pend))
da85e5e5 538 return 0;
f1cb9af5 539
8aab4757 540 smp = smp_chan_create(conn);
d26a2345 541
88ba43b6 542 skb_pull(skb, sizeof(*rp));
88ba43b6 543
da85e5e5 544 memset(&cp, 0, sizeof(cp));
54790f73 545 build_pairing_cmd(conn, &cp, NULL, rp->auth_req);
88ba43b6 546
1c1def09
VCG
547 smp->preq[0] = SMP_CMD_PAIRING_REQ;
548 memcpy(&smp->preq[1], &cp, sizeof(cp));
f01ead31 549
88ba43b6 550 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
f1cb9af5 551
da85e5e5 552 return 0;
88ba43b6
AB
553}
554
eb492e01
AB
555int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
556{
3a0259bb 557 struct hci_conn *hcon = conn->hcon;
1c1def09 558 struct smp_chan *smp = conn->smp_chan;
eb492e01 559
3a0259bb
VCG
560 BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);
561
2e65c9d2
AG
562 if (!lmp_host_le_capable(hcon->hdev))
563 return 1;
564
f1cb9af5
VCG
565 if (sec_level == BT_SECURITY_LOW)
566 return 1;
eb492e01 567
f1cb9af5 568 if (hcon->sec_level >= sec_level)
eb492e01 569 return 1;
f1cb9af5 570
988c5997
VCG
571 if (hcon->link_mode & HCI_LM_MASTER)
572 if (smp_ltk_encrypt(conn))
02bc7455 573 goto done;
d26a2345
VCG
574
575 if (test_and_set_bit(HCI_CONN_LE_SMP_PEND, &hcon->pend))
576 return 0;
577
8aab4757 578 smp = smp_chan_create(conn);
d26a2345 579
d26a2345
VCG
580 if (hcon->link_mode & HCI_LM_MASTER) {
581 struct smp_cmd_pairing cp;
f01ead31 582
0fb4eb6f 583 build_pairing_cmd(conn, &cp, NULL, SMP_AUTH_NONE);
1c1def09
VCG
584 smp->preq[0] = SMP_CMD_PAIRING_REQ;
585 memcpy(&smp->preq[1], &cp, sizeof(cp));
f01ead31 586
eb492e01
AB
587 smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
588 } else {
589 struct smp_cmd_security_req cp;
0fb4eb6f 590 cp.auth_req = SMP_AUTH_NONE;
eb492e01
AB
591 smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
592 }
593
02bc7455 594done:
f1cb9af5 595 hcon->pending_sec_level = sec_level;
f1cb9af5 596
eb492e01
AB
597 return 0;
598}
599
7034b911
VCG
600static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
601{
16b90839 602 struct smp_cmd_encrypt_info *rp = (void *) skb->data;
1c1def09 603 struct smp_chan *smp = conn->smp_chan;
16b90839
VCG
604
605 skb_pull(skb, sizeof(*rp));
606
1c1def09 607 memcpy(smp->tk, rp->ltk, sizeof(smp->tk));
16b90839 608
7034b911
VCG
609 return 0;
610}
611
612static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
613{
16b90839 614 struct smp_cmd_master_ident *rp = (void *) skb->data;
1c1def09 615 struct smp_chan *smp = conn->smp_chan;
16b90839
VCG
616
617 skb_pull(skb, sizeof(*rp));
7034b911 618
1c1def09
VCG
619 hci_add_ltk(conn->hcon->hdev, 1, conn->src, smp->smp_key_size,
620 rp->ediv, rp->rand, smp->tk);
7034b911
VCG
621
622 smp_distribute_keys(conn, 1);
623
624 return 0;
625}
626
eb492e01
AB
627int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
628{
629 __u8 code = skb->data[0];
630 __u8 reason;
631 int err = 0;
632
2e65c9d2
AG
633 if (!lmp_host_le_capable(conn->hcon->hdev)) {
634 err = -ENOTSUPP;
635 reason = SMP_PAIRING_NOTSUPP;
636 goto done;
637 }
638
eb492e01
AB
639 skb_pull(skb, sizeof(code));
640
641 switch (code) {
642 case SMP_CMD_PAIRING_REQ:
da85e5e5 643 reason = smp_cmd_pairing_req(conn, skb);
eb492e01
AB
644 break;
645
646 case SMP_CMD_PAIRING_FAIL:
da85e5e5
VCG
647 reason = 0;
648 err = -EPERM;
eb492e01
AB
649 break;
650
651 case SMP_CMD_PAIRING_RSP:
da85e5e5 652 reason = smp_cmd_pairing_rsp(conn, skb);
88ba43b6
AB
653 break;
654
655 case SMP_CMD_SECURITY_REQ:
da85e5e5 656 reason = smp_cmd_security_req(conn, skb);
88ba43b6
AB
657 break;
658
eb492e01 659 case SMP_CMD_PAIRING_CONFIRM:
da85e5e5 660 reason = smp_cmd_pairing_confirm(conn, skb);
88ba43b6
AB
661 break;
662
eb492e01 663 case SMP_CMD_PAIRING_RANDOM:
da85e5e5 664 reason = smp_cmd_pairing_random(conn, skb);
88ba43b6
AB
665 break;
666
eb492e01 667 case SMP_CMD_ENCRYPT_INFO:
7034b911
VCG
668 reason = smp_cmd_encrypt_info(conn, skb);
669 break;
670
eb492e01 671 case SMP_CMD_MASTER_IDENT:
7034b911
VCG
672 reason = smp_cmd_master_ident(conn, skb);
673 break;
674
eb492e01
AB
675 case SMP_CMD_IDENT_INFO:
676 case SMP_CMD_IDENT_ADDR_INFO:
677 case SMP_CMD_SIGN_INFO:
7034b911
VCG
678 /* Just ignored */
679 reason = 0;
680 break;
681
eb492e01
AB
682 default:
683 BT_DBG("Unknown command code 0x%2.2x", code);
684
685 reason = SMP_CMD_NOTSUPP;
eb492e01 686 err = -EOPNOTSUPP;
3a0259bb 687 goto done;
eb492e01
AB
688 }
689
3a0259bb
VCG
690done:
691 if (reason)
692 smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
693 &reason);
694
eb492e01
AB
695 kfree_skb(skb);
696 return err;
697}
7034b911
VCG
698
699int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
700{
701 struct smp_cmd_pairing *req, *rsp;
1c1def09 702 struct smp_chan *smp = conn->smp_chan;
7034b911
VCG
703 __u8 *keydist;
704
705 BT_DBG("conn %p force %d", conn, force);
706
d26a2345
VCG
707 if (!test_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->pend))
708 return 0;
709
1c1def09 710 rsp = (void *) &smp->prsp[1];
7034b911
VCG
711
712 /* The responder sends its keys first */
713 if (!force && conn->hcon->out && (rsp->resp_key_dist & 0x07))
714 return 0;
715
1c1def09 716 req = (void *) &smp->preq[1];
7034b911
VCG
717
718 if (conn->hcon->out) {
719 keydist = &rsp->init_key_dist;
720 *keydist &= req->init_key_dist;
721 } else {
722 keydist = &rsp->resp_key_dist;
723 *keydist &= req->resp_key_dist;
724 }
725
726
727 BT_DBG("keydist 0x%x", *keydist);
728
729 if (*keydist & SMP_DIST_ENC_KEY) {
730 struct smp_cmd_encrypt_info enc;
731 struct smp_cmd_master_ident ident;
732 __le16 ediv;
733
734 get_random_bytes(enc.ltk, sizeof(enc.ltk));
735 get_random_bytes(&ediv, sizeof(ediv));
736 get_random_bytes(ident.rand, sizeof(ident.rand));
737
738 smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
739
1c1def09 740 hci_add_ltk(conn->hcon->hdev, 1, conn->dst, smp->smp_key_size,
726b4ffc 741 ediv, ident.rand, enc.ltk);
16b90839 742
7034b911
VCG
743 ident.ediv = cpu_to_le16(ediv);
744
745 smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);
746
747 *keydist &= ~SMP_DIST_ENC_KEY;
748 }
749
750 if (*keydist & SMP_DIST_ID_KEY) {
751 struct smp_cmd_ident_addr_info addrinfo;
752 struct smp_cmd_ident_info idinfo;
753
754 /* Send a dummy key */
755 get_random_bytes(idinfo.irk, sizeof(idinfo.irk));
756
757 smp_send_cmd(conn, SMP_CMD_IDENT_INFO, sizeof(idinfo), &idinfo);
758
759 /* Just public address */
760 memset(&addrinfo, 0, sizeof(addrinfo));
761 bacpy(&addrinfo.bdaddr, conn->src);
762
763 smp_send_cmd(conn, SMP_CMD_IDENT_ADDR_INFO, sizeof(addrinfo),
764 &addrinfo);
765
766 *keydist &= ~SMP_DIST_ID_KEY;
767 }
768
769 if (*keydist & SMP_DIST_SIGN) {
770 struct smp_cmd_sign_info sign;
771
772 /* Send a dummy key */
773 get_random_bytes(sign.csrk, sizeof(sign.csrk));
774
775 smp_send_cmd(conn, SMP_CMD_SIGN_INFO, sizeof(sign), &sign);
776
777 *keydist &= ~SMP_DIST_SIGN;
778 }
779
d26a2345
VCG
780 if (conn->hcon->out || force) {
781 clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->pend);
782 del_timer(&conn->security_timer);
8aab4757 783 smp_chan_destroy(conn);
d26a2345
VCG
784 }
785
7034b911
VCG
786 return 0;
787}
This page took 0.158467 seconds and 5 git commands to generate.