Lines Matching refs:smp

54 #define SMP_ALLOW_CMD(smp, code)	set_bit(code, &smp->allow_cmd)  argument
542 struct smp_dev *smp; in smp_generate_oob() local
548 smp = chan->data; in smp_generate_oob()
552 err = set_ecdh_privkey(smp->tfm_ecdh, debug_sk); in smp_generate_oob()
555 memcpy(smp->local_pk, debug_pk, 64); in smp_generate_oob()
556 smp->debug_key = true; in smp_generate_oob()
560 err = generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk); in smp_generate_oob()
567 if (crypto_memneq(smp->local_pk, debug_pk, 64)) in smp_generate_oob()
570 smp->debug_key = false; in smp_generate_oob()
573 SMP_DBG("OOB Public Key X: %32phN", smp->local_pk); in smp_generate_oob()
574 SMP_DBG("OOB Public Key Y: %32phN", smp->local_pk + 32); in smp_generate_oob()
576 get_random_bytes(smp->local_rand, 16); in smp_generate_oob()
578 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->local_pk, in smp_generate_oob()
579 smp->local_rand, 0, hash); in smp_generate_oob()
583 memcpy(rand, smp->local_rand, 16); in smp_generate_oob()
585 smp->local_oob = true; in smp_generate_oob()
592 struct l2cap_chan *chan = conn->smp; in smp_send_cmd()
593 struct smp_chan *smp; in smp_send_cmd() local
617 smp = chan->data; in smp_send_cmd()
619 cancel_delayed_work_sync(&smp->security_timer); in smp_send_cmd()
620 schedule_delayed_work(&smp->security_timer, SMP_TIMEOUT); in smp_send_cmd()
652 struct l2cap_chan *chan = conn->smp; in build_pairing_cmd()
653 struct smp_chan *smp = chan->data; in build_pairing_cmd() local
690 set_bit(SMP_FLAG_REMOTE_OOB, &smp->flags); in build_pairing_cmd()
692 memcpy(smp->rr, oob_data->rand256, 16); in build_pairing_cmd()
693 memcpy(smp->pcnf, oob_data->hash256, 16); in build_pairing_cmd()
694 SMP_DBG("OOB Remote Confirmation: %16phN", smp->pcnf); in build_pairing_cmd()
695 SMP_DBG("OOB Remote Random: %16phN", smp->rr); in build_pairing_cmd()
710 smp->remote_key_dist = remote_dist; in build_pairing_cmd()
721 smp->remote_key_dist = rsp->init_key_dist; in build_pairing_cmd()
726 struct l2cap_chan *chan = conn->smp; in check_enc_key_size()
728 struct smp_chan *smp = chan->data; in check_enc_key_size() local
738 smp->enc_key_size = max_key_size; in check_enc_key_size()
745 struct l2cap_chan *chan = conn->smp; in smp_chan_destroy()
746 struct smp_chan *smp = chan->data; in smp_chan_destroy() local
750 BUG_ON(!smp); in smp_chan_destroy()
752 cancel_delayed_work_sync(&smp->security_timer); in smp_chan_destroy()
754 complete = test_bit(SMP_FLAG_COMPLETE, &smp->flags); in smp_chan_destroy()
757 kfree_sensitive(smp->csrk); in smp_chan_destroy()
758 kfree_sensitive(smp->responder_csrk); in smp_chan_destroy()
759 kfree_sensitive(smp->link_key); in smp_chan_destroy()
761 crypto_free_shash(smp->tfm_cmac); in smp_chan_destroy()
762 crypto_free_kpp(smp->tfm_ecdh); in smp_chan_destroy()
767 if (smp->ltk && smp->ltk->type == SMP_LTK_P256_DEBUG && in smp_chan_destroy()
769 list_del_rcu(&smp->ltk->list); in smp_chan_destroy()
770 kfree_rcu(smp->ltk, rcu); in smp_chan_destroy()
771 smp->ltk = NULL; in smp_chan_destroy()
776 if (smp->ltk) { in smp_chan_destroy()
777 list_del_rcu(&smp->ltk->list); in smp_chan_destroy()
778 kfree_rcu(smp->ltk, rcu); in smp_chan_destroy()
781 if (smp->responder_ltk) { in smp_chan_destroy()
782 list_del_rcu(&smp->responder_ltk->list); in smp_chan_destroy()
783 kfree_rcu(smp->responder_ltk, rcu); in smp_chan_destroy()
786 if (smp->remote_irk) { in smp_chan_destroy()
787 list_del_rcu(&smp->remote_irk->list); in smp_chan_destroy()
788 kfree_rcu(smp->remote_irk, rcu); in smp_chan_destroy()
793 kfree_sensitive(smp); in smp_chan_destroy()
800 struct l2cap_chan *chan = conn->smp; in smp_failure()
836 static u8 get_auth_method(struct smp_chan *smp, u8 local_io, u8 remote_io) in get_auth_method() argument
845 if (test_bit(SMP_FLAG_SC, &smp->flags)) in get_auth_method()
855 struct l2cap_chan *chan = conn->smp; in tk_request()
856 struct smp_chan *smp = chan->data; in tk_request() local
861 memset(smp->tk, 0, sizeof(smp->tk)); in tk_request()
862 clear_bit(SMP_FLAG_TK_VALID, &smp->flags); in tk_request()
874 smp->method = JUST_CFM; in tk_request()
876 smp->method = get_auth_method(smp, local_io, remote_io); in tk_request()
879 if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, in tk_request()
880 &smp->flags)) in tk_request()
881 smp->method = JUST_WORKS; in tk_request()
884 if (smp->method == JUST_CFM && in tk_request()
886 smp->method = JUST_WORKS; in tk_request()
890 if (smp->method == JUST_WORKS) { in tk_request()
897 set_bit(SMP_FLAG_WAIT_USER, &smp->flags); in tk_request()
904 if (test_bit(SMP_FLAG_SC, &smp->flags)) in tk_request()
908 if (smp->method != JUST_CFM) { in tk_request()
909 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags); in tk_request()
917 if (smp->method == OVERLAP) { in tk_request()
919 smp->method = CFM_PASSKEY; in tk_request()
921 smp->method = REQ_PASSKEY; in tk_request()
925 if (smp->method == CFM_PASSKEY) { in tk_request()
926 memset(smp->tk, 0, sizeof(smp->tk)); in tk_request()
929 put_unaligned_le32(passkey, smp->tk); in tk_request()
931 set_bit(SMP_FLAG_TK_VALID, &smp->flags); in tk_request()
934 if (smp->method == REQ_PASSKEY) in tk_request()
937 else if (smp->method == JUST_CFM) in tk_request()
949 static u8 smp_confirm(struct smp_chan *smp) in smp_confirm() argument
951 struct l2cap_conn *conn = smp->conn; in smp_confirm()
957 ret = smp_c1(smp->tk, smp->prnd, smp->preq, smp->prsp, in smp_confirm()
964 clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags); in smp_confirm()
966 smp_send_cmd(smp->conn, SMP_CMD_PAIRING_CONFIRM, sizeof(cp), &cp); in smp_confirm()
969 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in smp_confirm()
971 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM); in smp_confirm()
976 static u8 smp_random(struct smp_chan *smp) in smp_random() argument
978 struct l2cap_conn *conn = smp->conn; in smp_random()
986 ret = smp_c1(smp->tk, smp->rrnd, smp->preq, smp->prsp, in smp_random()
992 if (crypto_memneq(smp->pcnf, confirm, sizeof(smp->pcnf))) { in smp_random()
1003 smp_s1(smp->tk, smp->rrnd, smp->prnd, stk); in smp_random()
1008 hci_le_start_enc(hcon, ediv, rand, stk, smp->enc_key_size); in smp_random()
1009 hcon->enc_key_size = smp->enc_key_size; in smp_random()
1016 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd), in smp_random()
1017 smp->prnd); in smp_random()
1019 smp_s1(smp->tk, smp->prnd, smp->rrnd, stk); in smp_random()
1031 SMP_STK, auth, stk, smp->enc_key_size, ediv, rand); in smp_random()
1039 struct l2cap_chan *chan = conn->smp; in smp_notify_keys()
1040 struct smp_chan *smp = chan->data; in smp_notify_keys() local
1043 struct smp_cmd_pairing *req = (void *) &smp->preq[1]; in smp_notify_keys()
1044 struct smp_cmd_pairing *rsp = (void *) &smp->prsp[1]; in smp_notify_keys()
1062 if (smp->remote_irk) { in smp_notify_keys()
1063 mgmt_new_irk(hdev, smp->remote_irk, persistent); in smp_notify_keys()
1070 bacpy(&hcon->dst, &smp->remote_irk->bdaddr); in smp_notify_keys()
1071 hcon->dst_type = smp->remote_irk->addr_type; in smp_notify_keys()
1081 if (smp->csrk) { in smp_notify_keys()
1082 smp->csrk->bdaddr_type = hcon->dst_type; in smp_notify_keys()
1083 bacpy(&smp->csrk->bdaddr, &hcon->dst); in smp_notify_keys()
1084 mgmt_new_csrk(hdev, smp->csrk, persistent); in smp_notify_keys()
1087 if (smp->responder_csrk) { in smp_notify_keys()
1088 smp->responder_csrk->bdaddr_type = hcon->dst_type; in smp_notify_keys()
1089 bacpy(&smp->responder_csrk->bdaddr, &hcon->dst); in smp_notify_keys()
1090 mgmt_new_csrk(hdev, smp->responder_csrk, persistent); in smp_notify_keys()
1093 if (smp->ltk) { in smp_notify_keys()
1094 smp->ltk->bdaddr_type = hcon->dst_type; in smp_notify_keys()
1095 bacpy(&smp->ltk->bdaddr, &hcon->dst); in smp_notify_keys()
1096 mgmt_new_ltk(hdev, smp->ltk, persistent); in smp_notify_keys()
1099 if (smp->responder_ltk) { in smp_notify_keys()
1100 smp->responder_ltk->bdaddr_type = hcon->dst_type; in smp_notify_keys()
1101 bacpy(&smp->responder_ltk->bdaddr, &hcon->dst); in smp_notify_keys()
1102 mgmt_new_ltk(hdev, smp->responder_ltk, persistent); in smp_notify_keys()
1105 if (smp->link_key) { in smp_notify_keys()
1109 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags)) in smp_notify_keys()
1116 key = hci_add_link_key(hdev, smp->conn->hcon, &hcon->dst, in smp_notify_keys()
1117 smp->link_key, type, 0, &persistent); in smp_notify_keys()
1133 static void sc_add_ltk(struct smp_chan *smp) in sc_add_ltk() argument
1135 struct hci_conn *hcon = smp->conn->hcon; in sc_add_ltk()
1138 if (test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags)) in sc_add_ltk()
1148 smp->ltk = hci_add_ltk(hcon->hdev, &hcon->dst, hcon->dst_type, in sc_add_ltk()
1149 key_type, auth, smp->tk, smp->enc_key_size, in sc_add_ltk()
1153 static void sc_generate_link_key(struct smp_chan *smp) in sc_generate_link_key() argument
1158 smp->link_key = kzalloc(16, GFP_KERNEL); in sc_generate_link_key()
1159 if (!smp->link_key) in sc_generate_link_key()
1162 if (test_bit(SMP_FLAG_CT2, &smp->flags)) { in sc_generate_link_key()
1166 if (smp_h7(smp->tfm_cmac, smp->tk, salt, smp->link_key)) { in sc_generate_link_key()
1167 kfree_sensitive(smp->link_key); in sc_generate_link_key()
1168 smp->link_key = NULL; in sc_generate_link_key()
1175 if (smp_h6(smp->tfm_cmac, smp->tk, tmp1, smp->link_key)) { in sc_generate_link_key()
1176 kfree_sensitive(smp->link_key); in sc_generate_link_key()
1177 smp->link_key = NULL; in sc_generate_link_key()
1182 if (smp_h6(smp->tfm_cmac, smp->link_key, lebr, smp->link_key)) { in sc_generate_link_key()
1183 kfree_sensitive(smp->link_key); in sc_generate_link_key()
1184 smp->link_key = NULL; in sc_generate_link_key()
1189 static void smp_allow_key_dist(struct smp_chan *smp) in smp_allow_key_dist() argument
1195 if (smp->remote_key_dist & SMP_DIST_ENC_KEY) in smp_allow_key_dist()
1196 SMP_ALLOW_CMD(smp, SMP_CMD_ENCRYPT_INFO); in smp_allow_key_dist()
1197 else if (smp->remote_key_dist & SMP_DIST_ID_KEY) in smp_allow_key_dist()
1198 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO); in smp_allow_key_dist()
1199 else if (smp->remote_key_dist & SMP_DIST_SIGN) in smp_allow_key_dist()
1200 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO); in smp_allow_key_dist()
1203 static void sc_generate_ltk(struct smp_chan *smp) in sc_generate_ltk() argument
1207 struct hci_conn *hcon = smp->conn->hcon; in sc_generate_ltk()
1218 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags); in sc_generate_ltk()
1220 if (test_bit(SMP_FLAG_CT2, &smp->flags)) { in sc_generate_ltk()
1224 if (smp_h7(smp->tfm_cmac, key->val, salt, smp->tk)) in sc_generate_ltk()
1230 if (smp_h6(smp->tfm_cmac, key->val, tmp2, smp->tk)) in sc_generate_ltk()
1234 if (smp_h6(smp->tfm_cmac, smp->tk, brle, smp->tk)) in sc_generate_ltk()
1237 sc_add_ltk(smp); in sc_generate_ltk()
1240 static void smp_distribute_keys(struct smp_chan *smp) in smp_distribute_keys() argument
1243 struct l2cap_conn *conn = smp->conn; in smp_distribute_keys()
1250 rsp = (void *) &smp->prsp[1]; in smp_distribute_keys()
1253 if (hcon->out && (smp->remote_key_dist & KEY_DIST_MASK)) { in smp_distribute_keys()
1254 smp_allow_key_dist(smp); in smp_distribute_keys()
1258 req = (void *) &smp->preq[1]; in smp_distribute_keys()
1268 if (test_bit(SMP_FLAG_SC, &smp->flags)) { in smp_distribute_keys()
1270 sc_generate_link_key(smp); in smp_distribute_keys()
1272 sc_generate_ltk(smp); in smp_distribute_keys()
1292 get_random_bytes(enc.ltk, smp->enc_key_size); in smp_distribute_keys()
1293 memset(enc.ltk + smp->enc_key_size, 0, in smp_distribute_keys()
1294 sizeof(enc.ltk) - smp->enc_key_size); in smp_distribute_keys()
1304 smp->enc_key_size, ediv, rand); in smp_distribute_keys()
1305 smp->responder_ltk = ltk; in smp_distribute_keys()
1354 smp->responder_csrk = csrk; in smp_distribute_keys()
1362 if (smp->remote_key_dist & KEY_DIST_MASK) { in smp_distribute_keys()
1363 smp_allow_key_dist(smp); in smp_distribute_keys()
1367 set_bit(SMP_FLAG_COMPLETE, &smp->flags); in smp_distribute_keys()
1375 struct smp_chan *smp = container_of(work, struct smp_chan, in smp_timeout() local
1377 struct l2cap_conn *conn = smp->conn; in smp_timeout()
1387 struct l2cap_chan *chan = conn->smp; in smp_chan_create()
1388 struct smp_chan *smp; in smp_chan_create() local
1390 smp = kzalloc(sizeof(*smp), GFP_ATOMIC); in smp_chan_create()
1391 if (!smp) in smp_chan_create()
1394 smp->tfm_cmac = crypto_alloc_shash("cmac(aes)", 0, 0); in smp_chan_create()
1395 if (IS_ERR(smp->tfm_cmac)) { in smp_chan_create()
1400 smp->tfm_ecdh = crypto_alloc_kpp("ecdh-nist-p256", 0, 0); in smp_chan_create()
1401 if (IS_ERR(smp->tfm_ecdh)) { in smp_chan_create()
1406 smp->conn = conn; in smp_chan_create()
1407 chan->data = smp; in smp_chan_create()
1409 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_FAIL); in smp_chan_create()
1411 INIT_DELAYED_WORK(&smp->security_timer, smp_timeout); in smp_chan_create()
1415 return smp; in smp_chan_create()
1418 crypto_free_shash(smp->tfm_cmac); in smp_chan_create()
1420 kfree_sensitive(smp); in smp_chan_create()
1424 static int sc_mackey_and_ltk(struct smp_chan *smp, u8 mackey[16], u8 ltk[16]) in sc_mackey_and_ltk() argument
1426 struct hci_conn *hcon = smp->conn->hcon; in sc_mackey_and_ltk()
1430 na = smp->prnd; in sc_mackey_and_ltk()
1431 nb = smp->rrnd; in sc_mackey_and_ltk()
1433 na = smp->rrnd; in sc_mackey_and_ltk()
1434 nb = smp->prnd; in sc_mackey_and_ltk()
1442 return smp_f5(smp->tfm_cmac, smp->dhkey, na, nb, a, b, mackey, ltk); in sc_mackey_and_ltk()
1445 static void sc_dhkey_check(struct smp_chan *smp) in sc_dhkey_check() argument
1447 struct hci_conn *hcon = smp->conn->hcon; in sc_dhkey_check()
1460 memcpy(io_cap, &smp->preq[1], 3); in sc_dhkey_check()
1464 memcpy(io_cap, &smp->prsp[1], 3); in sc_dhkey_check()
1469 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY) in sc_dhkey_check()
1472 if (smp->method == REQ_OOB) in sc_dhkey_check()
1473 memcpy(r, smp->rr, 16); in sc_dhkey_check()
1475 smp_f6(smp->tfm_cmac, smp->mackey, smp->prnd, smp->rrnd, r, io_cap, in sc_dhkey_check()
1478 smp_send_cmd(smp->conn, SMP_CMD_DHKEY_CHECK, sizeof(check), &check); in sc_dhkey_check()
1481 static u8 sc_passkey_send_confirm(struct smp_chan *smp) in sc_passkey_send_confirm() argument
1483 struct l2cap_conn *conn = smp->conn; in sc_passkey_send_confirm()
1488 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01); in sc_passkey_send_confirm()
1491 get_random_bytes(smp->prnd, sizeof(smp->prnd)); in sc_passkey_send_confirm()
1493 if (smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, r, in sc_passkey_send_confirm()
1502 static u8 sc_passkey_round(struct smp_chan *smp, u8 smp_op) in sc_passkey_round() argument
1504 struct l2cap_conn *conn = smp->conn; in sc_passkey_round()
1510 if (smp->passkey_round >= 20) in sc_passkey_round()
1515 r = ((hcon->passkey_notify >> smp->passkey_round) & 0x01); in sc_passkey_round()
1518 if (smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk, in sc_passkey_round()
1519 smp->rrnd, r, cfm)) in sc_passkey_round()
1522 if (crypto_memneq(smp->pcnf, cfm, 16)) in sc_passkey_round()
1525 smp->passkey_round++; in sc_passkey_round()
1527 if (smp->passkey_round == 20) { in sc_passkey_round()
1529 if (sc_mackey_and_ltk(smp, smp->mackey, smp->tk)) in sc_passkey_round()
1538 sizeof(smp->prnd), smp->prnd); in sc_passkey_round()
1539 if (smp->passkey_round == 20) in sc_passkey_round()
1540 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK); in sc_passkey_round()
1542 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in sc_passkey_round()
1547 if (smp->passkey_round != 20) in sc_passkey_round()
1548 return sc_passkey_round(smp, 0); in sc_passkey_round()
1551 sc_dhkey_check(smp); in sc_passkey_round()
1552 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK); in sc_passkey_round()
1557 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) { in sc_passkey_round()
1558 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags); in sc_passkey_round()
1562 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM); in sc_passkey_round()
1566 sizeof(smp->prnd), smp->prnd); in sc_passkey_round()
1570 return sc_passkey_send_confirm(smp); in sc_passkey_round()
1579 smp->passkey_round + 1); in sc_passkey_round()
1581 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in sc_passkey_round()
1583 return sc_passkey_send_confirm(smp); in sc_passkey_round()
1589 static int sc_user_reply(struct smp_chan *smp, u16 mgmt_op, __le32 passkey) in sc_user_reply() argument
1591 struct l2cap_conn *conn = smp->conn; in sc_user_reply()
1595 clear_bit(SMP_FLAG_WAIT_USER, &smp->flags); in sc_user_reply()
1599 smp_failure(smp->conn, SMP_PASSKEY_ENTRY_FAILED); in sc_user_reply()
1602 smp_failure(smp->conn, SMP_NUMERIC_COMP_FAILED); in sc_user_reply()
1606 smp->passkey_round = 0; in sc_user_reply()
1608 if (test_and_clear_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) in sc_user_reply()
1613 if (sc_passkey_round(smp, smp_op)) in sc_user_reply()
1621 sc_dhkey_check(smp); in sc_user_reply()
1622 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK); in sc_user_reply()
1623 } else if (test_and_clear_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags)) { in sc_user_reply()
1624 sc_dhkey_check(smp); in sc_user_reply()
1625 sc_add_ltk(smp); in sc_user_reply()
1635 struct smp_chan *smp; in smp_user_confirm_reply() local
1644 chan = conn->smp; in smp_user_confirm_reply()
1654 smp = chan->data; in smp_user_confirm_reply()
1656 if (test_bit(SMP_FLAG_SC, &smp->flags)) { in smp_user_confirm_reply()
1657 err = sc_user_reply(smp, mgmt_op, passkey); in smp_user_confirm_reply()
1664 memset(smp->tk, 0, sizeof(smp->tk)); in smp_user_confirm_reply()
1666 put_unaligned_le32(value, smp->tk); in smp_user_confirm_reply()
1669 set_bit(SMP_FLAG_TK_VALID, &smp->flags); in smp_user_confirm_reply()
1685 if (test_bit(SMP_FLAG_CFM_PENDING, &smp->flags)) { in smp_user_confirm_reply()
1686 u8 rsp = smp_confirm(smp); in smp_user_confirm_reply()
1696 static void build_bredr_pairing_cmd(struct smp_chan *smp, in build_bredr_pairing_cmd() argument
1700 struct l2cap_conn *conn = smp->conn; in build_bredr_pairing_cmd()
1723 smp->remote_key_dist = remote_dist; in build_bredr_pairing_cmd()
1735 smp->remote_key_dist = rsp->init_key_dist; in build_bredr_pairing_cmd()
1741 struct l2cap_chan *chan = conn->smp; in smp_cmd_pairing_req()
1743 struct smp_chan *smp; in smp_cmd_pairing_req() local
1756 smp = smp_chan_create(conn); in smp_cmd_pairing_req()
1758 smp = chan->data; in smp_cmd_pairing_req()
1760 if (!smp) in smp_cmd_pairing_req()
1773 smp->preq[0] = SMP_CMD_PAIRING_REQ; in smp_cmd_pairing_req()
1774 memcpy(&smp->preq[1], req, sizeof(*req)); in smp_cmd_pairing_req()
1782 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags); in smp_cmd_pairing_req()
1791 set_bit(SMP_FLAG_SC, &smp->flags); in smp_cmd_pairing_req()
1793 build_bredr_pairing_cmd(smp, req, &rsp); in smp_cmd_pairing_req()
1796 set_bit(SMP_FLAG_CT2, &smp->flags); in smp_cmd_pairing_req()
1803 smp->remote_key_dist &= ~SMP_SC_NO_DIST; in smp_cmd_pairing_req()
1805 smp->prsp[0] = SMP_CMD_PAIRING_RSP; in smp_cmd_pairing_req()
1806 memcpy(&smp->prsp[1], &rsp, sizeof(rsp)); in smp_cmd_pairing_req()
1809 smp_distribute_keys(smp); in smp_cmd_pairing_req()
1816 set_bit(SMP_FLAG_SC, &smp->flags); in smp_cmd_pairing_req()
1819 set_bit(SMP_FLAG_CT2, &smp->flags); in smp_cmd_pairing_req()
1834 method = get_auth_method(smp, conn->hcon->io_capability, in smp_cmd_pairing_req()
1844 get_random_bytes(smp->prnd, sizeof(smp->prnd)); in smp_cmd_pairing_req()
1846 smp->prsp[0] = SMP_CMD_PAIRING_RSP; in smp_cmd_pairing_req()
1847 memcpy(&smp->prsp[1], &rsp, sizeof(rsp)); in smp_cmd_pairing_req()
1851 clear_bit(SMP_FLAG_INITIATOR, &smp->flags); in smp_cmd_pairing_req()
1858 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in smp_cmd_pairing_req()
1860 if (test_bit(SMP_FLAG_SC, &smp->flags)) { in smp_cmd_pairing_req()
1861 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY); in smp_cmd_pairing_req()
1863 smp->remote_key_dist &= ~SMP_SC_NO_DIST; in smp_cmd_pairing_req()
1876 static u8 sc_send_public_key(struct smp_chan *smp) in sc_send_public_key() argument
1878 struct hci_dev *hdev = smp->conn->hcon->hdev; in sc_send_public_key()
1882 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) { in sc_send_public_key()
1891 memcpy(smp->local_pk, smp_dev->local_pk, 64); in sc_send_public_key()
1892 memcpy(smp->lr, smp_dev->local_rand, 16); in sc_send_public_key()
1895 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags); in sc_send_public_key()
1902 if (set_ecdh_privkey(smp->tfm_ecdh, debug_sk)) in sc_send_public_key()
1904 memcpy(smp->local_pk, debug_pk, 64); in sc_send_public_key()
1905 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags); in sc_send_public_key()
1909 if (generate_ecdh_keys(smp->tfm_ecdh, smp->local_pk)) in sc_send_public_key()
1915 if (crypto_memneq(smp->local_pk, debug_pk, 64)) in sc_send_public_key()
1921 SMP_DBG("Local Public Key X: %32phN", smp->local_pk); in sc_send_public_key()
1922 SMP_DBG("Local Public Key Y: %32phN", smp->local_pk + 32); in sc_send_public_key()
1924 smp_send_cmd(smp->conn, SMP_CMD_PUBLIC_KEY, 64, smp->local_pk); in sc_send_public_key()
1932 struct l2cap_chan *chan = conn->smp; in smp_cmd_pairing_rsp()
1933 struct smp_chan *smp = chan->data; in smp_cmd_pairing_rsp() local
1948 req = (void *) &smp->preq[1]; in smp_cmd_pairing_rsp()
1964 set_bit(SMP_FLAG_LOCAL_OOB, &smp->flags); in smp_cmd_pairing_rsp()
1966 smp->prsp[0] = SMP_CMD_PAIRING_RSP; in smp_cmd_pairing_rsp()
1967 memcpy(&smp->prsp[1], rsp, sizeof(*rsp)); in smp_cmd_pairing_rsp()
1972 smp->remote_key_dist &= rsp->resp_key_dist; in smp_cmd_pairing_rsp()
1975 set_bit(SMP_FLAG_CT2, &smp->flags); in smp_cmd_pairing_rsp()
1980 smp->remote_key_dist &= ~SMP_SC_NO_DIST; in smp_cmd_pairing_rsp()
1981 smp_distribute_keys(smp); in smp_cmd_pairing_rsp()
1986 set_bit(SMP_FLAG_SC, &smp->flags); in smp_cmd_pairing_rsp()
1994 method = get_auth_method(smp, req->io_capability, in smp_cmd_pairing_rsp()
2000 get_random_bytes(smp->prnd, sizeof(smp->prnd)); in smp_cmd_pairing_rsp()
2005 smp->remote_key_dist &= rsp->resp_key_dist; in smp_cmd_pairing_rsp()
2007 if (test_bit(SMP_FLAG_SC, &smp->flags)) { in smp_cmd_pairing_rsp()
2009 smp->remote_key_dist &= ~SMP_SC_NO_DIST; in smp_cmd_pairing_rsp()
2010 SMP_ALLOW_CMD(smp, SMP_CMD_PUBLIC_KEY); in smp_cmd_pairing_rsp()
2011 return sc_send_public_key(smp); in smp_cmd_pairing_rsp()
2020 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags); in smp_cmd_pairing_rsp()
2023 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags)) in smp_cmd_pairing_rsp()
2024 return smp_confirm(smp); in smp_cmd_pairing_rsp()
2029 static u8 sc_check_confirm(struct smp_chan *smp) in sc_check_confirm() argument
2031 struct l2cap_conn *conn = smp->conn; in sc_check_confirm()
2035 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY) in sc_check_confirm()
2036 return sc_passkey_round(smp, SMP_CMD_PAIRING_CONFIRM); in sc_check_confirm()
2039 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd), in sc_check_confirm()
2040 smp->prnd); in sc_check_confirm()
2041 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM); in sc_check_confirm()
2051 static int fixup_sc_false_positive(struct smp_chan *smp) in fixup_sc_false_positive() argument
2053 struct l2cap_conn *conn = smp->conn; in fixup_sc_false_positive()
2070 req = (void *) &smp->preq[1]; in fixup_sc_false_positive()
2071 rsp = (void *) &smp->prsp[1]; in fixup_sc_false_positive()
2074 smp->remote_key_dist = (req->init_key_dist & rsp->resp_key_dist); in fixup_sc_false_positive()
2083 clear_bit(SMP_FLAG_SC, &smp->flags); in fixup_sc_false_positive()
2090 struct l2cap_chan *chan = conn->smp; in smp_cmd_pairing_confirm()
2091 struct smp_chan *smp = chan->data; in smp_cmd_pairing_confirm() local
2098 if (skb->len < sizeof(smp->pcnf)) in smp_cmd_pairing_confirm()
2101 memcpy(smp->pcnf, skb->data, sizeof(smp->pcnf)); in smp_cmd_pairing_confirm()
2102 skb_pull(skb, sizeof(smp->pcnf)); in smp_cmd_pairing_confirm()
2104 if (test_bit(SMP_FLAG_SC, &smp->flags)) { in smp_cmd_pairing_confirm()
2108 if (test_bit(SMP_FLAG_REMOTE_PK, &smp->flags)) in smp_cmd_pairing_confirm()
2109 return sc_check_confirm(smp); in smp_cmd_pairing_confirm()
2113 ret = fixup_sc_false_positive(smp); in smp_cmd_pairing_confirm()
2119 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd), in smp_cmd_pairing_confirm()
2120 smp->prnd); in smp_cmd_pairing_confirm()
2121 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM); in smp_cmd_pairing_confirm()
2125 if (test_bit(SMP_FLAG_TK_VALID, &smp->flags)) in smp_cmd_pairing_confirm()
2126 return smp_confirm(smp); in smp_cmd_pairing_confirm()
2128 set_bit(SMP_FLAG_CFM_PENDING, &smp->flags); in smp_cmd_pairing_confirm()
2135 struct l2cap_chan *chan = conn->smp; in smp_cmd_pairing_random()
2136 struct smp_chan *smp = chan->data; in smp_cmd_pairing_random() local
2144 if (skb->len < sizeof(smp->rrnd)) in smp_cmd_pairing_random()
2147 memcpy(smp->rrnd, skb->data, sizeof(smp->rrnd)); in smp_cmd_pairing_random()
2148 skb_pull(skb, sizeof(smp->rrnd)); in smp_cmd_pairing_random()
2150 if (!test_bit(SMP_FLAG_SC, &smp->flags)) in smp_cmd_pairing_random()
2151 return smp_random(smp); in smp_cmd_pairing_random()
2154 pkax = smp->local_pk; in smp_cmd_pairing_random()
2155 pkbx = smp->remote_pk; in smp_cmd_pairing_random()
2156 na = smp->prnd; in smp_cmd_pairing_random()
2157 nb = smp->rrnd; in smp_cmd_pairing_random()
2159 pkax = smp->remote_pk; in smp_cmd_pairing_random()
2160 pkbx = smp->local_pk; in smp_cmd_pairing_random()
2161 na = smp->rrnd; in smp_cmd_pairing_random()
2162 nb = smp->prnd; in smp_cmd_pairing_random()
2165 if (smp->method == REQ_OOB) { in smp_cmd_pairing_random()
2168 sizeof(smp->prnd), smp->prnd); in smp_cmd_pairing_random()
2169 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK); in smp_cmd_pairing_random()
2174 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY) in smp_cmd_pairing_random()
2175 return sc_passkey_round(smp, SMP_CMD_PAIRING_RANDOM); in smp_cmd_pairing_random()
2180 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->local_pk, in smp_cmd_pairing_random()
2181 smp->rrnd, 0, cfm); in smp_cmd_pairing_random()
2185 if (crypto_memneq(smp->pcnf, cfm, 16)) in smp_cmd_pairing_random()
2188 smp_send_cmd(conn, SMP_CMD_PAIRING_RANDOM, sizeof(smp->prnd), in smp_cmd_pairing_random()
2189 smp->prnd); in smp_cmd_pairing_random()
2190 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK); in smp_cmd_pairing_random()
2193 if (smp->method != JUST_WORKS) in smp_cmd_pairing_random()
2213 err = sc_mackey_and_ltk(smp, smp->mackey, smp->tk); in smp_cmd_pairing_random()
2217 if (smp->method == REQ_OOB) { in smp_cmd_pairing_random()
2219 sc_dhkey_check(smp); in smp_cmd_pairing_random()
2220 SMP_ALLOW_CMD(smp, SMP_CMD_DHKEY_CHECK); in smp_cmd_pairing_random()
2225 err = smp_g2(smp->tfm_cmac, pkax, pkbx, na, nb, &passkey); in smp_cmd_pairing_random()
2232 if (smp->method == JUST_WORKS) in smp_cmd_pairing_random()
2240 set_bit(SMP_FLAG_WAIT_USER, &smp->flags); in smp_cmd_pairing_random()
2298 struct smp_chan *smp; in smp_cmd_security_req() local
2334 smp = smp_chan_create(conn); in smp_cmd_security_req()
2335 if (!smp) in smp_cmd_security_req()
2347 smp->preq[0] = SMP_CMD_PAIRING_REQ; in smp_cmd_security_req()
2348 memcpy(&smp->preq[1], &cp, sizeof(cp)); in smp_cmd_security_req()
2351 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP); in smp_cmd_security_req()
2360 struct smp_chan *smp; in smp_conn_security() local
2384 chan = conn->smp; in smp_conn_security()
2398 smp = smp_chan_create(conn); in smp_conn_security()
2399 if (!smp) { in smp_conn_security()
2428 smp->preq[0] = SMP_CMD_PAIRING_REQ; in smp_conn_security()
2429 memcpy(&smp->preq[1], &cp, sizeof(cp)); in smp_conn_security()
2432 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP); in smp_conn_security()
2437 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_REQ); in smp_conn_security()
2440 set_bit(SMP_FLAG_INITIATOR, &smp->flags); in smp_conn_security()
2454 struct smp_chan *smp; in smp_cancel_and_remove_pairing() local
2468 chan = conn->smp; in smp_cancel_and_remove_pairing()
2474 smp = chan->data; in smp_cancel_and_remove_pairing()
2475 if (smp) { in smp_cancel_and_remove_pairing()
2478 smp->ltk = NULL; in smp_cancel_and_remove_pairing()
2479 smp->responder_ltk = NULL; in smp_cancel_and_remove_pairing()
2480 smp->remote_irk = NULL; in smp_cancel_and_remove_pairing()
2482 if (test_bit(SMP_FLAG_COMPLETE, &smp->flags)) in smp_cancel_and_remove_pairing()
2498 struct l2cap_chan *chan = conn->smp; in smp_cmd_encrypt_info()
2499 struct smp_chan *smp = chan->data; in smp_cmd_encrypt_info() local
2515 SMP_ALLOW_CMD(smp, SMP_CMD_INITIATOR_IDENT); in smp_cmd_encrypt_info()
2519 memcpy(smp->tk, rp->ltk, sizeof(smp->tk)); in smp_cmd_encrypt_info()
2527 struct l2cap_chan *chan = conn->smp; in smp_cmd_initiator_ident()
2528 struct smp_chan *smp = chan->data; in smp_cmd_initiator_ident() local
2540 smp->remote_key_dist &= ~SMP_DIST_ENC_KEY; in smp_cmd_initiator_ident()
2542 if (smp->remote_key_dist & SMP_DIST_ID_KEY) in smp_cmd_initiator_ident()
2543 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_INFO); in smp_cmd_initiator_ident()
2544 else if (smp->remote_key_dist & SMP_DIST_SIGN) in smp_cmd_initiator_ident()
2545 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO); in smp_cmd_initiator_ident()
2551 authenticated, smp->tk, smp->enc_key_size, in smp_cmd_initiator_ident()
2553 smp->ltk = ltk; in smp_cmd_initiator_ident()
2554 if (!(smp->remote_key_dist & KEY_DIST_MASK)) in smp_cmd_initiator_ident()
2555 smp_distribute_keys(smp); in smp_cmd_initiator_ident()
2563 struct l2cap_chan *chan = conn->smp; in smp_cmd_ident_info()
2564 struct smp_chan *smp = chan->data; in smp_cmd_ident_info() local
2580 SMP_ALLOW_CMD(smp, SMP_CMD_IDENT_ADDR_INFO); in smp_cmd_ident_info()
2584 memcpy(smp->irk, info->irk, 16); in smp_cmd_ident_info()
2593 struct l2cap_chan *chan = conn->smp; in smp_cmd_ident_addr_info()
2594 struct smp_chan *smp = chan->data; in smp_cmd_ident_addr_info() local
2604 smp->remote_key_dist &= ~SMP_DIST_ID_KEY; in smp_cmd_ident_addr_info()
2606 if (smp->remote_key_dist & SMP_DIST_SIGN) in smp_cmd_ident_addr_info()
2607 SMP_ALLOW_CMD(smp, SMP_CMD_SIGN_INFO); in smp_cmd_ident_addr_info()
2640 bacpy(&smp->id_addr, &info->bdaddr); in smp_cmd_ident_addr_info()
2641 smp->id_addr_type = info->addr_type; in smp_cmd_ident_addr_info()
2648 smp->remote_irk = hci_add_irk(conn->hcon->hdev, &smp->id_addr, in smp_cmd_ident_addr_info()
2649 smp->id_addr_type, smp->irk, &rpa); in smp_cmd_ident_addr_info()
2652 if (!(smp->remote_key_dist & KEY_DIST_MASK)) in smp_cmd_ident_addr_info()
2653 smp_distribute_keys(smp); in smp_cmd_ident_addr_info()
2661 struct l2cap_chan *chan = conn->smp; in smp_cmd_sign_info()
2662 struct smp_chan *smp = chan->data; in smp_cmd_sign_info() local
2671 smp->remote_key_dist &= ~SMP_DIST_SIGN; in smp_cmd_sign_info()
2683 smp->csrk = csrk; in smp_cmd_sign_info()
2684 smp_distribute_keys(smp); in smp_cmd_sign_info()
2689 static u8 sc_select_method(struct smp_chan *smp) in sc_select_method() argument
2691 struct l2cap_conn *conn = smp->conn; in sc_select_method()
2696 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags) || in sc_select_method()
2697 test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) in sc_select_method()
2706 local = (void *) &smp->preq[1]; in sc_select_method()
2707 remote = (void *) &smp->prsp[1]; in sc_select_method()
2709 local = (void *) &smp->prsp[1]; in sc_select_method()
2710 remote = (void *) &smp->preq[1]; in sc_select_method()
2723 method = get_auth_method(smp, local_io, remote_io); in sc_select_method()
2728 if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags)) in sc_select_method()
2738 struct l2cap_chan *chan = conn->smp; in smp_cmd_public_key()
2739 struct smp_chan *smp = chan->data; in smp_cmd_public_key() local
2753 if (!test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags) && in smp_cmd_public_key()
2754 !crypto_memneq(key, smp->local_pk, 64)) { in smp_cmd_public_key()
2759 memcpy(smp->remote_pk, key, 64); in smp_cmd_public_key()
2761 if (test_bit(SMP_FLAG_REMOTE_OOB, &smp->flags)) { in smp_cmd_public_key()
2762 err = smp_f4(smp->tfm_cmac, smp->remote_pk, smp->remote_pk, in smp_cmd_public_key()
2763 smp->rr, 0, cfm.confirm_val); in smp_cmd_public_key()
2767 if (crypto_memneq(cfm.confirm_val, smp->pcnf, 16)) in smp_cmd_public_key()
2775 err = sc_send_public_key(smp); in smp_cmd_public_key()
2780 SMP_DBG("Remote Public Key X: %32phN", smp->remote_pk); in smp_cmd_public_key()
2781 SMP_DBG("Remote Public Key Y: %32phN", smp->remote_pk + 32); in smp_cmd_public_key()
2786 if (test_bit(SMP_FLAG_LOCAL_OOB, &smp->flags)) { in smp_cmd_public_key()
2797 tfm_ecdh = smp->tfm_ecdh; in smp_cmd_public_key()
2800 if (compute_ecdh_secret(tfm_ecdh, smp->remote_pk, smp->dhkey)) in smp_cmd_public_key()
2803 SMP_DBG("DHKey %32phN", smp->dhkey); in smp_cmd_public_key()
2805 set_bit(SMP_FLAG_REMOTE_PK, &smp->flags); in smp_cmd_public_key()
2807 smp->method = sc_select_method(smp); in smp_cmd_public_key()
2809 bt_dev_dbg(hdev, "selected method 0x%02x", smp->method); in smp_cmd_public_key()
2812 if (smp->method == JUST_WORKS || smp->method == JUST_CFM) in smp_cmd_public_key()
2817 if (!crypto_memneq(debug_pk, smp->remote_pk, 64)) in smp_cmd_public_key()
2818 set_bit(SMP_FLAG_DEBUG_KEY, &smp->flags); in smp_cmd_public_key()
2820 if (smp->method == DSP_PASSKEY) { in smp_cmd_public_key()
2825 smp->passkey_round = 0; in smp_cmd_public_key()
2831 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in smp_cmd_public_key()
2832 return sc_passkey_round(smp, SMP_CMD_PUBLIC_KEY); in smp_cmd_public_key()
2835 if (smp->method == REQ_OOB) { in smp_cmd_public_key()
2838 sizeof(smp->prnd), smp->prnd); in smp_cmd_public_key()
2840 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM); in smp_cmd_public_key()
2846 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in smp_cmd_public_key()
2848 if (smp->method == REQ_PASSKEY) { in smp_cmd_public_key()
2852 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_CONFIRM); in smp_cmd_public_key()
2853 set_bit(SMP_FLAG_WAIT_USER, &smp->flags); in smp_cmd_public_key()
2863 err = smp_f4(smp->tfm_cmac, smp->local_pk, smp->remote_pk, smp->prnd, in smp_cmd_public_key()
2869 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RANDOM); in smp_cmd_public_key()
2877 struct l2cap_chan *chan = conn->smp; in smp_cmd_dhkey_check()
2879 struct smp_chan *smp = chan->data; in smp_cmd_dhkey_check() local
2897 memcpy(io_cap, &smp->prsp[1], 3); in smp_cmd_dhkey_check()
2901 memcpy(io_cap, &smp->preq[1], 3); in smp_cmd_dhkey_check()
2906 if (smp->method == REQ_PASSKEY || smp->method == DSP_PASSKEY) in smp_cmd_dhkey_check()
2908 else if (smp->method == REQ_OOB) in smp_cmd_dhkey_check()
2909 memcpy(r, smp->lr, 16); in smp_cmd_dhkey_check()
2911 err = smp_f6(smp->tfm_cmac, smp->mackey, smp->rrnd, smp->prnd, r, in smp_cmd_dhkey_check()
2920 if (test_bit(SMP_FLAG_WAIT_USER, &smp->flags)) { in smp_cmd_dhkey_check()
2921 set_bit(SMP_FLAG_DHKEY_PENDING, &smp->flags); in smp_cmd_dhkey_check()
2926 sc_dhkey_check(smp); in smp_cmd_dhkey_check()
2929 sc_add_ltk(smp); in smp_cmd_dhkey_check()
2932 hci_le_start_enc(hcon, 0, 0, smp->tk, smp->enc_key_size); in smp_cmd_dhkey_check()
2933 hcon->enc_key_size = smp->enc_key_size; in smp_cmd_dhkey_check()
2953 struct smp_chan *smp; in smp_sig_channel() local
2968 smp = chan->data; in smp_sig_channel()
2973 if (smp && !test_and_clear_bit(code, &smp->allow_cmd)) in smp_sig_channel()
2979 if (!smp && code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ) in smp_sig_channel()
3071 conn->smp = NULL; in smp_teardown_cb()
3081 struct smp_chan *smp; in bredr_pairing() local
3122 smp = smp_chan_create(conn); in bredr_pairing()
3123 if (!smp) { in bredr_pairing()
3128 set_bit(SMP_FLAG_SC, &smp->flags); in bredr_pairing()
3133 build_bredr_pairing_cmd(smp, &req, NULL); in bredr_pairing()
3135 smp->preq[0] = SMP_CMD_PAIRING_REQ; in bredr_pairing()
3136 memcpy(&smp->preq[1], &req, sizeof(req)); in bredr_pairing()
3139 SMP_ALLOW_CMD(smp, SMP_CMD_PAIRING_RSP); in bredr_pairing()
3144 struct smp_chan *smp = chan->data; in smp_resume_cb() local
3155 if (!smp) in smp_resume_cb()
3161 cancel_delayed_work(&smp->security_timer); in smp_resume_cb()
3163 smp_distribute_keys(smp); in smp_resume_cb()
3179 conn->smp = chan; in smp_ready_cb()
3193 struct smp_chan *smp = chan->data; in smp_recv_cb() local
3195 if (smp) in smp_recv_cb()
3196 cancel_delayed_work_sync(&smp->security_timer); in smp_recv_cb()
3288 struct smp_dev *smp; in smp_add_cid() local
3293 smp = NULL; in smp_add_cid()
3297 smp = kzalloc(sizeof(*smp), GFP_KERNEL); in smp_add_cid()
3298 if (!smp) in smp_add_cid()
3304 kfree_sensitive(smp); in smp_add_cid()
3312 kfree_sensitive(smp); in smp_add_cid()
3316 smp->local_oob = false; in smp_add_cid()
3317 smp->tfm_cmac = tfm_cmac; in smp_add_cid()
3318 smp->tfm_ecdh = tfm_ecdh; in smp_add_cid()
3323 if (smp) { in smp_add_cid()
3324 crypto_free_shash(smp->tfm_cmac); in smp_add_cid()
3325 crypto_free_kpp(smp->tfm_ecdh); in smp_add_cid()
3326 kfree_sensitive(smp); in smp_add_cid()
3331 chan->data = smp; in smp_add_cid()
3364 struct smp_dev *smp; in smp_del_chan() local
3368 smp = chan->data; in smp_del_chan()
3369 if (smp) { in smp_del_chan()
3371 crypto_free_shash(smp->tfm_cmac); in smp_del_chan()
3372 crypto_free_kpp(smp->tfm_ecdh); in smp_del_chan()
3373 kfree_sensitive(smp); in smp_del_chan()