smp.c 12.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
   BlueZ - Bluetooth protocol stack for Linux
   Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2 as
   published by the Free Software Foundation;

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
   SOFTWARE IS DISCLAIMED.
*/

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
#include <net/bluetooth/l2cap.h>
#include <net/bluetooth/smp.h>
27
#include <linux/crypto.h>
28
#include <linux/scatterlist.h>
29 30
#include <crypto/b128ops.h>

31 32
#define SMP_TIMEOUT 30000 /* 30 seconds */

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
static inline void swap128(u8 src[16], u8 dst[16])
{
	int i;
	for (i = 0; i < 16; i++)
		dst[15 - i] = src[i];
}

static inline void swap56(u8 src[7], u8 dst[7])
{
	int i;
	for (i = 0; i < 7; i++)
		dst[6 - i] = src[i];
}

static int smp_e(struct crypto_blkcipher *tfm, const u8 *k, u8 *r)
{
	struct blkcipher_desc desc;
	struct scatterlist sg;
	int err, iv_len;
	unsigned char iv[128];

	if (tfm == NULL) {
		BT_ERR("tfm %p", tfm);
		return -EINVAL;
	}

	desc.tfm = tfm;
	desc.flags = 0;

	err = crypto_blkcipher_setkey(tfm, k, 16);
	if (err) {
		BT_ERR("cipher setkey failed: %d", err);
		return err;
	}

	sg_init_one(&sg, r, 16);

	iv_len = crypto_blkcipher_ivsize(tfm);
	if (iv_len) {
		memset(&iv, 0xff, iv_len);
		crypto_blkcipher_set_iv(tfm, iv, iv_len);
	}

	err = crypto_blkcipher_encrypt(&desc, &sg, &sg, 16);
	if (err)
		BT_ERR("Encrypt data error %d", err);

	return err;
}

static int smp_c1(struct crypto_blkcipher *tfm, u8 k[16], u8 r[16],
		u8 preq[7], u8 pres[7], u8 _iat, bdaddr_t *ia,
		u8 _rat, bdaddr_t *ra, u8 res[16])
{
	u8 p1[16], p2[16];
	int err;

	memset(p1, 0, 16);

	/* p1 = pres || preq || _rat || _iat */
	swap56(pres, p1);
	swap56(preq, p1 + 7);
	p1[14] = _rat;
	p1[15] = _iat;

	memset(p2, 0, 16);

	/* p2 = padding || ia || ra */
	baswap((bdaddr_t *) (p2 + 4), ia);
	baswap((bdaddr_t *) (p2 + 10), ra);

	/* res = r XOR p1 */
	u128_xor((u128 *) res, (u128 *) r, (u128 *) p1);

	/* res = e(k, res) */
	err = smp_e(tfm, k, res);
	if (err) {
		BT_ERR("Encrypt data error");
		return err;
	}

	/* res = res XOR p2 */
	u128_xor((u128 *) res, (u128 *) res, (u128 *) p2);

	/* res = e(k, res) */
	err = smp_e(tfm, k, res);
	if (err)
		BT_ERR("Encrypt data error");

	return err;
}

static int smp_s1(struct crypto_blkcipher *tfm, u8 k[16],
			u8 r1[16], u8 r2[16], u8 _r[16])
{
	int err;

	/* Just least significant octets from r1 and r2 are considered */
	memcpy(_r, r1 + 8, 8);
	memcpy(_r + 8, r2 + 8, 8);

	err = smp_e(tfm, k, _r);
	if (err)
		BT_ERR("Encrypt data error");

	return err;
}

static int smp_rand(u8 *buf)
{
	get_random_bytes(buf, 16);

	return 0;
}
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

static struct sk_buff *smp_build_cmd(struct l2cap_conn *conn, u8 code,
						u16 dlen, void *data)
{
	struct sk_buff *skb;
	struct l2cap_hdr *lh;
	int len;

	len = L2CAP_HDR_SIZE + sizeof(code) + dlen;

	if (len > conn->mtu)
		return NULL;

	skb = bt_skb_alloc(len, GFP_ATOMIC);
	if (!skb)
		return NULL;

	lh = (struct l2cap_hdr *) skb_put(skb, L2CAP_HDR_SIZE);
	lh->len = cpu_to_le16(sizeof(code) + dlen);
	lh->cid = cpu_to_le16(L2CAP_CID_SMP);

	memcpy(skb_put(skb, sizeof(code)), &code, sizeof(code));

	memcpy(skb_put(skb, dlen), data, dlen);

	return skb;
}

static void smp_send_cmd(struct l2cap_conn *conn, u8 code, u16 len, void *data)
{
	struct sk_buff *skb = smp_build_cmd(conn, code, len, data);

	BT_DBG("code 0x%2.2x", code);

	if (!skb)
		return;

	hci_send_acl(conn->hcon, skb, 0);
}

187 188 189 190 191 192 193 194 195 196 197 198
static __u8 seclevel_to_authreq(__u8 level)
{
	switch (level) {
	case BT_SECURITY_HIGH:
		/* Right now we don't support bonding */
		return SMP_AUTH_MITM;

	default:
		return SMP_AUTH_NONE;
	}
}

199 200 201 202 203
static void build_pairing_cmd(struct l2cap_conn *conn,
				struct smp_cmd_pairing *cmd, __u8 authreq)
{
	cmd->io_capability = conn->hcon->io_capability;
	cmd->oob_flag = SMP_OOB_NOT_PRESENT;
204
	cmd->max_key_size = SMP_MAX_ENC_KEY_SIZE;
205 206 207 208 209
	cmd->init_key_dist = 0x00;
	cmd->resp_key_dist = 0x00;
	cmd->auth_req = authreq;
}

210 211 212 213 214 215 216 217 218 219 220
static u8 check_enc_key_size(struct l2cap_conn *conn, __u8 max_key_size)
{
	if ((max_key_size > SMP_MAX_ENC_KEY_SIZE) ||
			(max_key_size < SMP_MIN_ENC_KEY_SIZE))
		return SMP_ENC_KEY_SIZE;

	conn->smp_key_size = max_key_size;

	return 0;
}

221
static u8 smp_cmd_pairing_req(struct l2cap_conn *conn, struct sk_buff *skb)
222
{
223 224
	struct smp_cmd_pairing rsp, *req = (void *) skb->data;
	u8 key_size;
225 226 227

	BT_DBG("conn %p", conn);

228
	conn->preq[0] = SMP_CMD_PAIRING_REQ;
229 230
	memcpy(&conn->preq[1], req, sizeof(*req));
	skb_pull(skb, sizeof(*req));
231

232
	if (req->oob_flag)
233 234 235
		return SMP_OOB_NOT_AVAIL;

	/* We didn't start the pairing, so no requirements */
236 237 238 239 240
	build_pairing_cmd(conn, &rsp, SMP_AUTH_NONE);

	key_size = min(req->max_key_size, rsp.max_key_size);
	if (check_enc_key_size(conn, key_size))
		return SMP_ENC_KEY_SIZE;
241

242 243 244
	/* Just works */
	memset(conn->tk, 0, sizeof(conn->tk));

245
	conn->prsp[0] = SMP_CMD_PAIRING_RSP;
246
	memcpy(&conn->prsp[1], &rsp, sizeof(rsp));
247

248
	smp_send_cmd(conn, SMP_CMD_PAIRING_RSP, sizeof(rsp), &rsp);
249

250 251 252
	mod_timer(&conn->security_timer, jiffies +
					msecs_to_jiffies(SMP_TIMEOUT));

253
	return 0;
254 255
}

256
static u8 smp_cmd_pairing_rsp(struct l2cap_conn *conn, struct sk_buff *skb)
257
{
258
	struct smp_cmd_pairing *req, *rsp = (void *) skb->data;
259
	struct smp_cmd_pairing_confirm cp;
260 261
	struct crypto_blkcipher *tfm = conn->hcon->hdev->tfm;
	int ret;
262
	u8 res[16], key_size;
263 264 265

	BT_DBG("conn %p", conn);

266 267 268
	skb_pull(skb, sizeof(*rsp));

	req = (void *) &conn->preq[1];
269

270 271 272 273 274
	key_size = min(req->max_key_size, rsp->max_key_size);
	if (check_enc_key_size(conn, key_size))
		return SMP_ENC_KEY_SIZE;

	if (rsp->oob_flag)
275 276
		return SMP_OOB_NOT_AVAIL;

277 278
	/* Just works */
	memset(conn->tk, 0, sizeof(conn->tk));
279

280
	conn->prsp[0] = SMP_CMD_PAIRING_RSP;
281
	memcpy(&conn->prsp[1], rsp, sizeof(*rsp));
282

283 284
	ret = smp_rand(conn->prnd);
	if (ret)
285
		return SMP_UNSPECIFIED;
286 287 288 289

	ret = smp_c1(tfm, conn->tk, conn->prnd, conn->preq, conn->prsp, 0,
			conn->src, conn->hcon->dst_type, conn->dst, res);
	if (ret)
290
		return SMP_UNSPECIFIED;
291 292 293

	swap128(res, cp.confirm_val);

294
	smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
295 296

	return 0;
297 298
}

299
static u8 smp_cmd_pairing_confirm(struct l2cap_conn *conn, struct sk_buff *skb)
300
{
301 302
	struct crypto_blkcipher *tfm = conn->hcon->hdev->tfm;

303 304
	BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");

305 306
	memcpy(conn->pcnf, skb->data, sizeof(conn->pcnf));
	skb_pull(skb, sizeof(conn->pcnf));
307

308 309
	if (conn->hcon->out) {
		u8 random[16];
310

311
		swap128(conn->prnd, random);
312
		smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(random),
313
								random);
314
	} else {
315 316 317
		struct smp_cmd_pairing_confirm cp;
		int ret;
		u8 res[16];
318

319 320
		ret = smp_rand(conn->prnd);
		if (ret)
321
			return SMP_UNSPECIFIED;
322

323 324 325 326
		ret = smp_c1(tfm, conn->tk, conn->prnd, conn->preq, conn->prsp,
						conn->hcon->dst_type, conn->dst,
						0, conn->src, res);
		if (ret)
327
			return SMP_CONFIRM_FAILED;
328 329 330 331

		swap128(res, cp.confirm_val);

		smp_send_cmd(conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp);
332
	}
333

334 335 336
	mod_timer(&conn->security_timer, jiffies +
					msecs_to_jiffies(SMP_TIMEOUT));

337
	return 0;
338 339
}

340
static u8 smp_cmd_pairing_random(struct l2cap_conn *conn, struct sk_buff *skb)
341
{
342 343
	struct hci_conn *hcon = conn->hcon;
	struct crypto_blkcipher *tfm = hcon->hdev->tfm;
344
	int ret;
345
	u8 key[16], res[16], random[16], confirm[16];
346 347 348 349

	swap128(skb->data, random);
	skb_pull(skb, sizeof(random));

350 351
	memset(hcon->ltk, 0, sizeof(hcon->ltk));

352 353 354 355 356 357 358 359 360
	if (conn->hcon->out)
		ret = smp_c1(tfm, conn->tk, random, conn->preq, conn->prsp, 0,
				conn->src, conn->hcon->dst_type, conn->dst,
				res);
	else
		ret = smp_c1(tfm, conn->tk, random, conn->preq, conn->prsp,
				conn->hcon->dst_type, conn->dst, 0, conn->src,
				res);
	if (ret)
361
		return SMP_UNSPECIFIED;
362 363 364

	BT_DBG("conn %p %s", conn, conn->hcon->out ? "master" : "slave");

365 366 367 368
	swap128(res, confirm);

	if (memcmp(conn->pcnf, confirm, sizeof(conn->pcnf)) != 0) {
		BT_ERR("Pairing failed (confirmation values mismatch)");
369
		return SMP_CONFIRM_FAILED;
370
	}
371 372

	if (conn->hcon->out) {
373 374 375
		__le16 ediv;
		u8 rand[8];

376
		smp_s1(tfm, conn->tk, random, conn->prnd, key);
377
		swap128(key, hcon->ltk);
378

379 380 381
		memset(hcon->ltk + conn->smp_key_size, 0,
				SMP_MAX_ENC_KEY_SIZE - conn->smp_key_size);

382 383 384
		memset(rand, 0, sizeof(rand));
		ediv = 0;
		hci_le_start_enc(hcon, ediv, rand, hcon->ltk);
385
	} else {
386 387 388 389 390 391
		u8 r[16];

		swap128(conn->prnd, r);
		smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(r), r);

		smp_s1(tfm, conn->tk, conn->prnd, random, key);
392
		swap128(key, hcon->ltk);
393 394 395

		memset(hcon->ltk + conn->smp_key_size, 0,
				SMP_MAX_ENC_KEY_SIZE - conn->smp_key_size);
396
	}
397 398

	return 0;
399 400
}

401
static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
402 403 404
{
	struct smp_cmd_security_req *rp = (void *) skb->data;
	struct smp_cmd_pairing cp;
405
	struct hci_conn *hcon = conn->hcon;
406 407 408

	BT_DBG("conn %p", conn);

409
	if (test_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend))
410
		return 0;
411

412 413
	skb_pull(skb, sizeof(*rp));

414 415
	memset(&cp, 0, sizeof(cp));
	build_pairing_cmd(conn, &cp, rp->auth_req);
416

417 418 419
	conn->preq[0] = SMP_CMD_PAIRING_REQ;
	memcpy(&conn->preq[1], &cp, sizeof(cp));

420
	smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
421

422 423 424
	mod_timer(&conn->security_timer, jiffies +
					msecs_to_jiffies(SMP_TIMEOUT));

425 426
	set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend);

427
	return 0;
428 429
}

430 431
int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
{
432
	struct hci_conn *hcon = conn->hcon;
433 434
	__u8 authreq;

435 436
	BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level);

437 438 439
	if (!lmp_host_le_capable(hcon->hdev))
		return 1;

440 441
	if (IS_ERR(hcon->hdev->tfm))
		return 1;
442

443 444
	if (test_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend))
		return 0;
445

446 447
	if (sec_level == BT_SECURITY_LOW)
		return 1;
448

449
	if (hcon->sec_level >= sec_level)
450
		return 1;
451 452

	authreq = seclevel_to_authreq(sec_level);
453

454
	if (hcon->link_mode & HCI_LM_MASTER) {
455
		struct smp_cmd_pairing cp;
456

457
		build_pairing_cmd(conn, &cp, authreq);
458 459 460
		conn->preq[0] = SMP_CMD_PAIRING_REQ;
		memcpy(&conn->preq[1], &cp, sizeof(cp));

461 462 463
		mod_timer(&conn->security_timer, jiffies +
					msecs_to_jiffies(SMP_TIMEOUT));

464 465 466 467 468 469 470
		smp_send_cmd(conn, SMP_CMD_PAIRING_REQ, sizeof(cp), &cp);
	} else {
		struct smp_cmd_security_req cp;
		cp.auth_req = authreq;
		smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
	}

471 472 473
	hcon->pending_sec_level = sec_level;
	set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend);

474 475 476 477 478 479 480 481 482
	return 0;
}

int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
{
	__u8 code = skb->data[0];
	__u8 reason;
	int err = 0;

483 484 485 486 487 488
	if (!lmp_host_le_capable(conn->hcon->hdev)) {
		err = -ENOTSUPP;
		reason = SMP_PAIRING_NOTSUPP;
		goto done;
	}

489 490 491 492 493 494
	if (IS_ERR(conn->hcon->hdev->tfm)) {
		err = PTR_ERR(conn->hcon->hdev->tfm);
		reason = SMP_PAIRING_NOTSUPP;
		goto done;
	}

495 496 497 498
	skb_pull(skb, sizeof(code));

	switch (code) {
	case SMP_CMD_PAIRING_REQ:
499
		reason = smp_cmd_pairing_req(conn, skb);
500 501 502
		break;

	case SMP_CMD_PAIRING_FAIL:
503 504
		reason = 0;
		err = -EPERM;
505 506 507
		break;

	case SMP_CMD_PAIRING_RSP:
508
		reason = smp_cmd_pairing_rsp(conn, skb);
509 510 511
		break;

	case SMP_CMD_SECURITY_REQ:
512
		reason = smp_cmd_security_req(conn, skb);
513 514
		break;

515
	case SMP_CMD_PAIRING_CONFIRM:
516
		reason = smp_cmd_pairing_confirm(conn, skb);
517 518
		break;

519
	case SMP_CMD_PAIRING_RANDOM:
520
		reason = smp_cmd_pairing_random(conn, skb);
521 522
		break;

523 524 525 526 527 528 529 530 531 532
	case SMP_CMD_ENCRYPT_INFO:
	case SMP_CMD_MASTER_IDENT:
	case SMP_CMD_IDENT_INFO:
	case SMP_CMD_IDENT_ADDR_INFO:
	case SMP_CMD_SIGN_INFO:
	default:
		BT_DBG("Unknown command code 0x%2.2x", code);

		reason = SMP_CMD_NOTSUPP;
		err = -EOPNOTSUPP;
533
		goto done;
534 535
	}

536 537 538 539 540
done:
	if (reason)
		smp_send_cmd(conn, SMP_CMD_PAIRING_FAIL, sizeof(reason),
								&reason);

541 542 543
	kfree_skb(skb);
	return err;
}