提交 783e0574 编写于 作者: J Johan Hedberg 提交者: Marcel Holtmann

Bluetooth: Track authentication method in SMP context

For Secure Connections we'll select the authentication method as soon as
we receive the public key, but only use it later (both when actually
triggering the method as well as when determining the quality of the
resulting LTK). Store the method therefore in the SMP context.
Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
上级 6a77083a
...@@ -79,6 +79,7 @@ struct smp_chan { ...@@ -79,6 +79,7 @@ struct smp_chan {
struct smp_irk *remote_irk; struct smp_irk *remote_irk;
u8 *link_key; u8 *link_key;
unsigned long flags; unsigned long flags;
u8 method;
/* Secure Connections variables */ /* Secure Connections variables */
u8 local_pk[64]; u8 local_pk[64];
...@@ -688,7 +689,6 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, ...@@ -688,7 +689,6 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
struct hci_conn *hcon = conn->hcon; struct hci_conn *hcon = conn->hcon;
struct l2cap_chan *chan = conn->smp; struct l2cap_chan *chan = conn->smp;
struct smp_chan *smp = chan->data; struct smp_chan *smp = chan->data;
u8 method;
u32 passkey = 0; u32 passkey = 0;
int ret = 0; int ret = 0;
...@@ -705,26 +705,28 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, ...@@ -705,26 +705,28 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
* table. * table.
*/ */
if (!(auth & SMP_AUTH_MITM)) if (!(auth & SMP_AUTH_MITM))
method = JUST_CFM; smp->method = JUST_CFM;
else else
method = get_auth_method(smp, local_io, remote_io); smp->method = get_auth_method(smp, local_io, remote_io);
/* Don't confirm locally initiated pairing attempts */ /* Don't confirm locally initiated pairing attempts */
if (method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR, &smp->flags)) if (smp->method == JUST_CFM && test_bit(SMP_FLAG_INITIATOR,
method = JUST_WORKS; &smp->flags))
smp->method = JUST_WORKS;
/* Don't bother user space with no IO capabilities */ /* Don't bother user space with no IO capabilities */
if (method == JUST_CFM && hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT) if (smp->method == JUST_CFM &&
method = JUST_WORKS; hcon->io_capability == HCI_IO_NO_INPUT_OUTPUT)
smp->method = JUST_WORKS;
/* If Just Works, Continue with Zero TK */ /* If Just Works, Continue with Zero TK */
if (method == JUST_WORKS) { if (smp->method == JUST_WORKS) {
set_bit(SMP_FLAG_TK_VALID, &smp->flags); set_bit(SMP_FLAG_TK_VALID, &smp->flags);
return 0; return 0;
} }
/* Not Just Works/Confirm results in MITM Authentication */ /* Not Just Works/Confirm results in MITM Authentication */
if (method != JUST_CFM) { if (smp->method != JUST_CFM) {
set_bit(SMP_FLAG_MITM_AUTH, &smp->flags); set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
if (hcon->pending_sec_level < BT_SECURITY_HIGH) if (hcon->pending_sec_level < BT_SECURITY_HIGH)
hcon->pending_sec_level = BT_SECURITY_HIGH; hcon->pending_sec_level = BT_SECURITY_HIGH;
...@@ -733,15 +735,15 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, ...@@ -733,15 +735,15 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
/* If both devices have Keyoard-Display I/O, the master /* If both devices have Keyoard-Display I/O, the master
* Confirms and the slave Enters the passkey. * Confirms and the slave Enters the passkey.
*/ */
if (method == OVERLAP) { if (smp->method == OVERLAP) {
if (hcon->role == HCI_ROLE_MASTER) if (hcon->role == HCI_ROLE_MASTER)
method = CFM_PASSKEY; smp->method = CFM_PASSKEY;
else else
method = REQ_PASSKEY; smp->method = REQ_PASSKEY;
} }
/* Generate random passkey. */ /* Generate random passkey. */
if (method == CFM_PASSKEY) { if (smp->method == CFM_PASSKEY) {
memset(smp->tk, 0, sizeof(smp->tk)); memset(smp->tk, 0, sizeof(smp->tk));
get_random_bytes(&passkey, sizeof(passkey)); get_random_bytes(&passkey, sizeof(passkey));
passkey %= 1000000; passkey %= 1000000;
...@@ -750,10 +752,10 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth, ...@@ -750,10 +752,10 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
set_bit(SMP_FLAG_TK_VALID, &smp->flags); set_bit(SMP_FLAG_TK_VALID, &smp->flags);
} }
if (method == REQ_PASSKEY) if (smp->method == REQ_PASSKEY)
ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst, ret = mgmt_user_passkey_request(hcon->hdev, &hcon->dst,
hcon->type, hcon->dst_type); hcon->type, hcon->dst_type);
else if (method == JUST_CFM) else if (smp->method == JUST_CFM)
ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst, ret = mgmt_user_confirm_request(hcon->hdev, &hcon->dst,
hcon->type, hcon->dst_type, hcon->type, hcon->dst_type,
passkey, 1); passkey, 1);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册