Bluetooth: Update New CSRK event to match latest specification
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 27 Feb 2015 08:11:13 +0000 (10:11 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 27 Feb 2015 17:25:48 +0000 (18:25 +0100)
The 'master' parameter of the New CSRK event was recently renamed to
'type', with the old values kept for backwards compatibility as
unauthenticated local/remote keys. This patch updates the code to take
into account the two new (authenticated) values and ensures they get
used based on the security level of the connection that the respective
keys get distributed over.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci_core.h
include/net/bluetooth/mgmt.h
net/bluetooth/mgmt.c
net/bluetooth/smp.c

index a831c8ad10f147df8f53469ce505c777dc634ce6..acec9140c3f9a5ea12b452845373b8d74ee9471f 100644 (file)
@@ -108,7 +108,7 @@ struct bt_uuid {
 struct smp_csrk {
        bdaddr_t bdaddr;
        u8 bdaddr_type;
-       u8 master;
+       u8 type;
        u8 val[16];
 };
 
index e218a30f206134776ab2eed1a19a98c0d31ef395..fe8eef00e9ca9c846bb2efb7aeacffc7abc24687 100644 (file)
@@ -647,9 +647,14 @@ struct mgmt_ev_new_irk {
        struct mgmt_irk_info irk;
 } __packed;
 
+#define MGMT_CSRK_LOCAL_UNAUTHENTICATED                0x00
+#define MGMT_CSRK_REMOTE_UNAUTHENTICATED       0x01
+#define MGMT_CSRK_LOCAL_AUTHENTICATED          0x02
+#define MGMT_CSRK_REMOTE_AUTHENTICATED         0x03
+
 struct mgmt_csrk_info {
        struct mgmt_addr_info addr;
-       __u8 master;
+       __u8 type;
        __u8 val[16];
 } __packed;
 
index d5d46e7676f1d35e5288006919dbb36b1dbf8c77..1e4635a3374d00607bf6e3317289953f1ba108b5 100644 (file)
@@ -6664,7 +6664,7 @@ void mgmt_new_csrk(struct hci_dev *hdev, struct smp_csrk *csrk,
 
        bacpy(&ev.key.addr.bdaddr, &csrk->bdaddr);
        ev.key.addr.type = link_to_bdaddr(LE_LINK, csrk->bdaddr_type);
-       ev.key.master = csrk->master;
+       ev.key.type = csrk->type;
        memcpy(ev.key.val, csrk->val, sizeof(csrk->val));
 
        mgmt_event(MGMT_EV_NEW_CSRK, hdev, &ev, sizeof(ev), NULL);
index b2803bd6e0d85924998911a62b7c739211e3280a..c91c19bfc0a86a8f187e67b279f9551b8c2306e5 100644 (file)
@@ -1252,7 +1252,10 @@ static void smp_distribute_keys(struct smp_chan *smp)
 
                csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
                if (csrk) {
-                       csrk->master = 0x00;
+                       if (hcon->sec_level > BT_SECURITY_MEDIUM)
+                               csrk->type = MGMT_CSRK_LOCAL_AUTHENTICATED;
+                       else
+                               csrk->type = MGMT_CSRK_LOCAL_UNAUTHENTICATED;
                        memcpy(csrk->val, sign.csrk, sizeof(csrk->val));
                }
                smp->slave_csrk = csrk;
@@ -2352,7 +2355,10 @@ static int smp_cmd_sign_info(struct l2cap_conn *conn, struct sk_buff *skb)
 
        csrk = kzalloc(sizeof(*csrk), GFP_KERNEL);
        if (csrk) {
-               csrk->master = 0x01;
+               if (conn->hcon->sec_level > BT_SECURITY_MEDIUM)
+                       csrk->type = MGMT_CSRK_REMOTE_AUTHENTICATED;
+               else
+                       csrk->type = MGMT_CSRK_REMOTE_UNAUTHENTICATED;
                memcpy(csrk->val, rp->csrk, sizeof(csrk->val));
        }
        smp->csrk = csrk;