Bluetooth: BR/EDR: Update keys management

Updates keys interfaces allowing to store and locate legacy link key
in keys database.

Change-Id: Ibd50edff890e998e3c6f80ee7f1442dff7a7c91f
Signed-off-by: Arkadiusz Lichwa <arkadiusz.lichwa@tieto.com>
This commit is contained in:
Arkadiusz Lichwa 2015-12-28 16:39:57 +01:00 committed by Anas Nashif
commit 53de0818f9
2 changed files with 110 additions and 5 deletions

View file

@ -53,8 +53,7 @@ struct bt_keys *bt_keys_get_addr(const bt_addr_le_t *addr)
if (!bt_addr_le_cmp(&keys->addr, BT_ADDR_LE_ANY)) {
bt_addr_le_copy(&keys->addr, addr);
BT_DBG("created %p for %s", keys,
bt_addr_le_str(addr));
BT_DBG("created %p for %s", keys, bt_addr_le_str(addr));
return keys;
}
}
@ -178,3 +177,88 @@ struct bt_keys *bt_keys_find_addr(const bt_addr_le_t *addr)
return NULL;
}
#if defined(CONFIG_BLUETOOTH_BREDR)
static struct bt_keys *bt_keys_get_addr_br(const bt_addr_t *addr)
{
struct bt_keys *keys;
int i;
BT_DBG("%s", bt_addr_str(addr));
for (i = 0; i < ARRAY_SIZE(key_pool); i++) {
keys = &key_pool[i];
/*
* When both LE and BR/EDR keys are for the same device,
* the bt_addr_le_t is the public address, i.e. the same
* as the BR/EDR address.
*/
if (keys->addr.type == BT_ADDR_LE_PUBLIC &&
!bt_addr_cmp((const bt_addr_t *)keys->addr.val, addr)) {
return keys;
}
/*
* BT_ADDR_LE_ANY has the same type of as BT_ADDR_LE_PUBLIC
* value. No need to make redudant comparision against
* BT_ADDR_LE_PUBLIC.
*/
if (!bt_addr_le_cmp(&keys->addr, BT_ADDR_LE_ANY)) {
bt_addr_copy((bt_addr_t *)keys->addr.val, addr);
BT_DBG("created %p for %s", keys, bt_addr_str(addr));
return keys;
}
}
BT_DBG("unable to create keys for %s", bt_addr_str(addr));
return NULL;
}
struct bt_keys *bt_keys_find_link_key(const bt_addr_t *addr)
{
struct bt_keys *keys;
int i;
BT_DBG("%s", bt_addr_str(addr));
for (i = 0; i < ARRAY_SIZE(key_pool); i++) {
keys = &key_pool[i];
/*
* When both LE and BR/EDR keys are for the same device,
* the bt_addr_le_t is the public address, i.e. the same
* as the BR/EDR address.
*/
if (keys->addr.type == BT_ADDR_LE_PUBLIC &&
(keys->keys & BT_KEYS_LINK_KEY) &&
!bt_addr_cmp((const bt_addr_t *)keys->addr.val, addr)) {
return keys;
}
}
return NULL;
}
struct bt_keys *bt_keys_get_link_key(const bt_addr_t *addr)
{
struct bt_keys *keys;
BT_DBG("%s", bt_addr_str(addr));
keys = bt_keys_find_link_key(addr);
if (keys) {
return keys;
}
keys = bt_keys_get_addr_br(addr);
if (!keys) {
return NULL;
}
bt_keys_add_type(keys, BT_KEYS_LINK_KEY);
return keys;
}
#endif /* CONFIG_BLUETOOTH_BREDR */

View file

@ -16,7 +16,7 @@
* limitations under the License.
*/
#if defined(CONFIG_BLUETOOTH_SMP)
#if defined(CONFIG_BLUETOOTH_SMP) || defined(CONFIG_BLUETOOTH_BREDR)
enum {
BT_KEYS_SLAVE_LTK = (1 << 0),
BT_KEYS_IRK = (1 << 1),
@ -24,10 +24,12 @@ enum {
BT_KEYS_LOCAL_CSRK = (1 << 3),
BT_KEYS_REMOTE_CSRK = (1 << 4),
BT_KEYS_LTK_P256 = (1 << 5),
BT_KEYS_LINK_KEY = (1 << 6),
BT_KEYS_ALL = (BT_KEYS_SLAVE_LTK | BT_KEYS_IRK | \
BT_KEYS_LTK | BT_KEYS_LOCAL_CSRK | \
BT_KEYS_REMOTE_CSRK | BT_KEYS_LTK_P256),
BT_KEYS_REMOTE_CSRK | BT_KEYS_LTK_P256 | \
BT_KEYS_LINK_KEY),
};
enum {
@ -50,12 +52,21 @@ struct bt_csrk {
uint32_t cnt;
};
#if defined(CONFIG_BLUETOOTH_BREDR)
struct bt_link_key {
uint8_t val[16];
};
#endif /* CONFIG_BLUETOOTH_BREDR */
struct bt_keys {
bt_addr_le_t addr;
#if defined(CONFIG_BLUETOOTH_SMP)
uint8_t enc_size;
#endif
atomic_t flags;
uint16_t keys;
#if defined(CONFIG_BLUETOOTH_SMP)
#if !defined(CONFIG_BLUETOOTH_SMP_SC_ONLY)
struct bt_ltk slave_ltk;
#endif /* CONFIG_BLUETOOTH_SMP_SC_ONLY */
@ -65,8 +76,18 @@ struct bt_keys {
struct bt_csrk local_csrk;
struct bt_csrk remote_csrk;
#endif /* BLUETOOTH_SIGNING */
#endif /* CONFIG_BLUETOOTH_SMP */
#if defined(CONFIG_BLUETOOTH_BREDR)
struct bt_link_key link_key;
#endif /* CONFIG_BLUETOOTH_BREDR */
};
#if defined(CONFIG_BLUETOOTH_BREDR)
struct bt_keys *bt_keys_get_link_key(const bt_addr_t *addr);
struct bt_keys *bt_keys_find_link_key(const bt_addr_t *addr);
#endif /* CONFIG_BLUETOOTH_BREDR */
struct bt_keys *bt_keys_get_addr(const bt_addr_le_t *addr);
struct bt_keys *bt_keys_get_type(int type, const bt_addr_le_t *addr);
void bt_keys_add_type(struct bt_keys *keys, int type);
@ -79,4 +100,4 @@ static inline struct bt_keys *bt_keys_find_addr(const bt_addr_le_t *addr)
{
return NULL;
}
#endif /* CONFIG_BLUETOOTH_SMP */
#endif /* CONFIG_BLUETOOTH_SMP || CONFIG_BLUETOOTH_BREDR */