Bluetooth: Use the stored LTK for restabilishing security
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>
Thu, 7 Jul 2011 21:59:41 +0000 (18:59 -0300)
committerGustavo F. Padovan <padovan@profusion.mobi>
Fri, 8 Jul 2011 20:37:18 +0000 (17:37 -0300)
Now that it's possible that the exchanged key is present in
the link key list, we may be able to estabilish security with
an already existing key, without need to perform any SMP
procedure.

Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@openbossa.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
net/bluetooth/smp.c

index 6df51017df21ff50ab41f23a6b45f3339ab59be4..5b7217919202acb0588b2809b77538abf57a2645 100644 (file)
@@ -480,6 +480,17 @@ int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
 
        if (hcon->link_mode & HCI_LM_MASTER) {
                struct smp_cmd_pairing cp;
+               struct link_key *key;
+
+               key = hci_find_link_key_type(hcon->hdev, conn->dst,
+                                                       HCI_LK_SMP_LTK);
+               if (key) {
+                       struct key_master_id *master = (void *) key->data;
+
+                       hci_le_start_enc(hcon, master->ediv, master->rand,
+                                                               key->val);
+                       goto done;
+               }
 
                build_pairing_cmd(conn, &cp, NULL, authreq);
                conn->preq[0] = SMP_CMD_PAIRING_REQ;
@@ -495,6 +506,7 @@ int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
                smp_send_cmd(conn, SMP_CMD_SECURITY_REQ, sizeof(cp), &cp);
        }
 
+done:
        hcon->pending_sec_level = sec_level;
        set_bit(HCI_CONN_ENCRYPT_PEND, &hcon->pend);