Bluetooth: Host: Add option to force pairing in bt_conn_security
Add option to force the host to initiate pairing procedure even if the host has encryption keys for the peer. This option can be used to pair with a bonded peer that has deleted its bonding information without deleting the keys. If new pairing results in weaker keys the pairing will be aborted. Signed-off-by: Joakim Andersson <joakim.andersson@nordicsemi.no>
This commit is contained in:
parent
6d4b842a10
commit
128cf42d8a
4 changed files with 12 additions and 1 deletions
|
@ -288,6 +288,10 @@ typedef enum __packed {
|
||||||
BT_SECURITY_HIGH,
|
BT_SECURITY_HIGH,
|
||||||
/** Authenticated Secure Connections */
|
/** Authenticated Secure Connections */
|
||||||
BT_SECURITY_FIPS,
|
BT_SECURITY_FIPS,
|
||||||
|
/** Bit to force new pairing procedure, bit-wise OR with requested
|
||||||
|
* security level.
|
||||||
|
*/
|
||||||
|
BT_SECURITY_FORCE_PAIR = BIT(7),
|
||||||
} bt_security_t;
|
} bt_security_t;
|
||||||
|
|
||||||
/** @brief Set security level for a connection.
|
/** @brief Set security level for a connection.
|
||||||
|
|
|
@ -1058,7 +1058,9 @@ int bt_conn_security(struct bt_conn *conn, bt_security_t sec)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
conn->required_sec_level = sec;
|
atomic_set_bit_to(conn->flags, BT_CONN_FORCE_PAIR,
|
||||||
|
sec & BT_SECURITY_FORCE_PAIR);
|
||||||
|
conn->required_sec_level = sec & ~BT_SECURITY_FORCE_PAIR;
|
||||||
|
|
||||||
err = start_security(conn);
|
err = start_security(conn);
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@ enum {
|
||||||
BT_CONN_SLAVE_PARAM_UPDATE, /* If slave param update timer fired */
|
BT_CONN_SLAVE_PARAM_UPDATE, /* If slave param update timer fired */
|
||||||
BT_CONN_SLAVE_PARAM_SET, /* If slave param were set from app */
|
BT_CONN_SLAVE_PARAM_SET, /* If slave param were set from app */
|
||||||
BT_CONN_SLAVE_PARAM_L2CAP, /* If should force L2CAP for CPUP */
|
BT_CONN_SLAVE_PARAM_L2CAP, /* If should force L2CAP for CPUP */
|
||||||
|
BT_CONN_FORCE_PAIR, /* Pairing even with existing keys. */
|
||||||
|
|
||||||
/* Total number of flags - must be at the end of the enum */
|
/* Total number of flags - must be at the end of the enum */
|
||||||
BT_CONN_NUM_FLAGS,
|
BT_CONN_NUM_FLAGS,
|
||||||
|
|
|
@ -4911,6 +4911,10 @@ bool bt_smp_get_tk(struct bt_conn *conn, u8_t *tk)
|
||||||
|
|
||||||
bool bt_smp_keys_check(struct bt_conn *conn)
|
bool bt_smp_keys_check(struct bt_conn *conn)
|
||||||
{
|
{
|
||||||
|
if (atomic_test_bit(conn->flags, BT_CONN_FORCE_PAIR)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!conn->le.keys) {
|
if (!conn->le.keys) {
|
||||||
conn->le.keys = bt_keys_find(BT_KEYS_LTK_P256,
|
conn->le.keys = bt_keys_find(BT_KEYS_LTK_P256,
|
||||||
conn->id, &conn->le.dst);
|
conn->id, &conn->le.dst);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue