Bluetooth: Add support for storing the LTK
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>
Thu, 7 Jul 2011 21:59:39 +0000 (18:59 -0300)
committerGustavo F. Padovan <padovan@profusion.mobi>
Fri, 8 Jul 2011 20:37:07 +0000 (17:37 -0300)
Now when the LTK is received from the remote or generated it is stored,
so it can later be used.

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

index ffbfdd9e573808fbb5cbcf28732c06e773446f7c..600a70b95a00a4ab5c7cdc9cbe333306be521ec0 100644 (file)
@@ -496,18 +496,23 @@ int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
 
 static int smp_cmd_encrypt_info(struct l2cap_conn *conn, struct sk_buff *skb)
 {
-       BT_DBG("conn %p", conn);
-       /* FIXME: store the ltk */
+       struct smp_cmd_encrypt_info *rp = (void *) skb->data;
+
+       skb_pull(skb, sizeof(*rp));
+
+       memcpy(conn->tk, rp->ltk, sizeof(conn->tk));
+
        return 0;
 }
 
 static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
 {
-       struct smp_cmd_pairing *paircmd = (void *) &conn->prsp[1];
-       u8 keydist = paircmd->init_key_dist;
+       struct smp_cmd_master_ident *rp = (void *) skb->data;
+
+       skb_pull(skb, sizeof(*rp));
 
-       BT_DBG("keydist 0x%x", keydist);
-       /* FIXME: store ediv and rand */
+       hci_add_ltk(conn->hcon->hdev, 1, conn->src, rp->ediv,
+                                               rp->rand, conn->tk);
 
        smp_distribute_keys(conn, 1);
 
@@ -632,6 +637,9 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
 
                smp_send_cmd(conn, SMP_CMD_ENCRYPT_INFO, sizeof(enc), &enc);
 
+               hci_add_ltk(conn->hcon->hdev, 1, conn->dst, ediv,
+                                                       ident.rand, enc.ltk);
+
                ident.ediv = cpu_to_le16(ediv);
 
                smp_send_cmd(conn, SMP_CMD_MASTER_IDENT, sizeof(ident), &ident);