|
@@ -1215,40 +1215,40 @@ struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static int hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
|
|
|
+static bool hci_persistent_key(struct hci_dev *hdev, struct hci_conn *conn,
|
|
|
u8 key_type, u8 old_key_type)
|
|
|
{
|
|
|
/* Legacy key */
|
|
|
if (key_type < 0x03)
|
|
|
- return 1;
|
|
|
+ return true;
|
|
|
|
|
|
/* Debug keys are insecure so don't store them persistently */
|
|
|
if (key_type == HCI_LK_DEBUG_COMBINATION)
|
|
|
- return 0;
|
|
|
+ return false;
|
|
|
|
|
|
/* Changed combination key and there's no previous one */
|
|
|
if (key_type == HCI_LK_CHANGED_COMBINATION && old_key_type == 0xff)
|
|
|
- return 0;
|
|
|
+ return false;
|
|
|
|
|
|
/* Security mode 3 case */
|
|
|
if (!conn)
|
|
|
- return 1;
|
|
|
+ return true;
|
|
|
|
|
|
/* Neither local nor remote side had no-bonding as requirement */
|
|
|
if (conn->auth_type > 0x01 && conn->remote_auth > 0x01)
|
|
|
- return 1;
|
|
|
+ return true;
|
|
|
|
|
|
/* Local side had dedicated bonding as requirement */
|
|
|
if (conn->auth_type == 0x02 || conn->auth_type == 0x03)
|
|
|
- return 1;
|
|
|
+ return true;
|
|
|
|
|
|
/* Remote side had dedicated bonding as requirement */
|
|
|
if (conn->remote_auth == 0x02 || conn->remote_auth == 0x03)
|
|
|
- return 1;
|
|
|
+ return true;
|
|
|
|
|
|
/* If none of the above criteria match, then don't store the key
|
|
|
* persistently */
|
|
|
- return 0;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8])
|
|
@@ -1285,7 +1285,8 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
|
|
|
bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len)
|
|
|
{
|
|
|
struct link_key *key, *old_key;
|
|
|
- u8 old_key_type, persistent;
|
|
|
+ u8 old_key_type;
|
|
|
+ bool persistent;
|
|
|
|
|
|
old_key = hci_find_link_key(hdev, bdaddr);
|
|
|
if (old_key) {
|
|
@@ -1328,10 +1329,8 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
|
|
|
|
|
|
mgmt_new_link_key(hdev, key, persistent);
|
|
|
|
|
|
- if (!persistent) {
|
|
|
- list_del(&key->list);
|
|
|
- kfree(key);
|
|
|
- }
|
|
|
+ if (conn)
|
|
|
+ conn->flush_key = !persistent;
|
|
|
|
|
|
return 0;
|
|
|
}
|