From 998d72a98693e7c67649aca7f5629e82075897c7 Mon Sep 17 00:00:00 2001 From: Arkadiusz Lichwa Date: Wed, 20 Jan 2016 13:00:58 +0100 Subject: [PATCH] Bluetooth: BR/EDR: Track 16 digits PIN code As a pairing acceptor starts tracking 16 octets PIN entered by user when pairing devices working in Security Mode 3. Based on PIN tracker state, the generated link key is saved in keys database as combination of un/authenticated and legacy key type. Change-Id: I4cbb20942fb38697d952971df807aec8b16c74e4 Signed-off-by: Arkadiusz Lichwa --- net/bluetooth/conn.c | 4 ++++ net/bluetooth/conn_internal.h | 1 + net/bluetooth/hci_core.c | 10 ++++++++++ 3 files changed, 15 insertions(+) diff --git a/net/bluetooth/conn.c b/net/bluetooth/conn.c index 046b3a7b22e..24095230eea 100644 --- a/net/bluetooth/conn.c +++ b/net/bluetooth/conn.c @@ -1126,6 +1126,10 @@ int bt_conn_auth_pincode_entry(struct bt_conn *conn, const char *pin) return -EPERM; } + if (len == 16) { + atomic_set_bit(conn->flags, BT_CONN_BR_LEGACY_SECURE); + } + return pin_code_reply(conn, pin, len); } diff --git a/net/bluetooth/conn_internal.h b/net/bluetooth/conn_internal.h index 05c5cc3caad..5ad2a53008b 100644 --- a/net/bluetooth/conn_internal.h +++ b/net/bluetooth/conn_internal.h @@ -29,6 +29,7 @@ typedef enum __packed { /* bt_conn flags: the flags defined here represent connection parameters */ enum { BT_CONN_AUTO_CONNECT, + BT_CONN_BR_LEGACY_SECURE, /* 16 digits legacy PIN tracker */ }; struct bt_conn_le { diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 9795cdf8408..56145bbcd58 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c @@ -1609,6 +1609,16 @@ static void link_key_notify(struct net_buf *buf) if (evt->key_type == BT_LK_COMBINATION) { atomic_set_bit(&conn->keys->flags, BT_KEYS_BR_LEGACY); + + /* + * Setting Combination Link Key as AUTHENTICATED means it was + * successfully generated by 16 digits wide PIN code. + */ + if (atomic_test_and_clear_bit(conn->flags, + BT_CONN_BR_LEGACY_SECURE)) { + atomic_set_bit(&conn->keys->flags, + BT_KEYS_AUTHENTICATED); + } } bt_conn_unref(conn);