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);