Bluetooth: Fix OOB data present value for BR/EDR Secure Connections
authorMarcel Holtmann <marcel@holtmann.org>
Sat, 31 Jan 2015 07:20:56 +0000 (23:20 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 31 Jan 2015 20:26:12 +0000 (21:26 +0100)
When BR/EDR Secure Connections has been enabled, the OOB data present
value can take 2 additional values. The host has to clearly provide
details about if P-192 OOB data, P-256 OOB data or a combination of
P-192 and P-256 OOB data is present.

In case BR/EDR Secure Connections is not enabled or not supported,
then check that P-192 OOB data is actually present and return the
correct value based on that.

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

index 055625b..af181f4 100644 (file)
@@ -3881,8 +3881,25 @@ static u8 bredr_oob_data_present(struct hci_conn *conn)
             !memcmp(data->hash256, ZERO_KEY, 16)))
                return 0x00;
 
-       if (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags))
+       if (conn->out || test_bit(HCI_CONN_REMOTE_OOB, &conn->flags)) {
+               /* When Secure Connections has been enabled, then just
+                * return the present value stored with the OOB data. It
+                * will contain the right information about which data
+                * is present.
+                */
+               if (bredr_sc_enabled(hdev))
+                       return data->present;
+
+               /* When Secure Connections is not enabled or actually
+                * not supported by the hardware, then check that if
+                * P-192 data values are present.
+                */
+               if (!memcmp(data->rand192, ZERO_KEY, 16) ||
+                   !memcmp(data->hash192, ZERO_KEY, 16))
+                       return 0x00;
+
                return 0x01;
+       }
 
        return 0x00;
 }