Commit 0821a2c5 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Johan Hedberg

Bluetooth: Return LE SC confirm and random values for out-of-band data

Then the local out-of-band data for LE SC pairing is requested via Read
Local OOB Extended Data command, then fill in the values generated by
the smp_generate_oob function. Every call of this command will overwrite
previously generated values.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent 60a27d65
...@@ -6274,7 +6274,7 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, ...@@ -6274,7 +6274,7 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
struct mgmt_rp_read_local_oob_ext_data *rp; struct mgmt_rp_read_local_oob_ext_data *rp;
size_t rp_len; size_t rp_len;
u16 eir_len; u16 eir_len;
u8 status, flags, role, addr[7]; u8 status, flags, role, addr[7], hash[16], rand[16];
int err; int err;
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -6302,7 +6302,7 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, ...@@ -6302,7 +6302,7 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
MGMT_OP_READ_LOCAL_OOB_EXT_DATA, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
status, &cp->type, status, &cp->type,
sizeof(cp->type)); sizeof(cp->type));
eir_len = 15; eir_len = 9 + 3 + 18 + 18 + 3;
break; break;
default: default:
return mgmt_cmd_complete(sk, hdev->id, return mgmt_cmd_complete(sk, hdev->id,
...@@ -6327,6 +6327,15 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, ...@@ -6327,6 +6327,15 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
hdev->dev_class, 3); hdev->dev_class, 3);
break; break;
case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)): case (BIT(BDADDR_LE_PUBLIC) | BIT(BDADDR_LE_RANDOM)):
if (smp_generate_oob(hdev, hash, rand) < 0) {
hci_dev_unlock(hdev);
err = mgmt_cmd_complete(sk, hdev->id,
MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
MGMT_STATUS_FAILED,
&cp->type, sizeof(cp->type));
goto done;
}
if (hci_dev_test_flag(hdev, HCI_PRIVACY)) { if (hci_dev_test_flag(hdev, HCI_PRIVACY)) {
memcpy(addr, &hdev->rpa, 6); memcpy(addr, &hdev->rpa, 6);
addr[6] = 0x01; addr[6] = 0x01;
...@@ -6352,6 +6361,12 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, ...@@ -6352,6 +6361,12 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE, eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_ROLE,
&role, sizeof(role)); &role, sizeof(role));
eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_SC_CONFIRM,
hash, sizeof(hash));
eir_len = eir_append_data(rp->eir, eir_len, EIR_LE_SC_RANDOM,
rand, sizeof(rand));
flags = get_adv_discov_flags(hdev); flags = get_adv_discov_flags(hdev);
if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED)) if (!hci_dev_test_flag(hdev, HCI_BREDR_ENABLED))
...@@ -6370,6 +6385,7 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev, ...@@ -6370,6 +6385,7 @@ static int read_local_oob_ext_data(struct sock *sk, struct hci_dev *hdev,
err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA, err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
MGMT_STATUS_SUCCESS, rp, rp_len); MGMT_STATUS_SUCCESS, rp, rp_len);
done:
kfree(rp); kfree(rp);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment