BLE: Set identity address to random static.

This also ensure the random static address used by gap is the correct one.
pull/13759/head
Vincent Coubard 2020-09-16 15:26:16 +01:00
parent 0b98682109
commit 4859dbe426
2 changed files with 31 additions and 4 deletions

View File

@ -450,6 +450,20 @@ public:
return _local_identity.irk; return _local_identity.irk;
} }
/**
* Return local identity address.
*/
virtual const address_t& get_local_identity_address() {
return _local_identity.identity_address;
}
/**
* Return if the local identity address is public or not
*/
virtual bool is_local_identity_address_public() {
return _local_identity.identity_address_is_public;
}
/* list management */ /* list management */
/** /**

View File

@ -1032,9 +1032,24 @@ ble_error_t SecurityManager::init_identity()
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
const irk_t *pirk = nullptr; const irk_t *pirk = nullptr;
ble::Gap& gap = BLE::Instance().gap();
irk_t irk = _db->get_local_irk(); irk_t irk = _db->get_local_irk();
if (irk != irk_t()) { if (irk != irk_t()) {
pirk = &irk; pirk = &irk;
if (!_db->is_local_identity_address_public()) {
// Some controllers doesn't store their random static address and
// instead generates them at each reboot.
// The code should replace the random static address with the identity
// address if this is the case.
if (_db->get_local_identity_address() != gap.getRandomStaticAddress()) {
ble_error_t err = gap.setRandomStaticAddress(_db->get_local_identity_address());
if (err) {
return err;
}
}
}
} else { } else {
ble_error_t ret = get_random_data(irk.data(), irk.size()); ble_error_t ret = get_random_data(irk.data(), irk.size());
if (ret != BLE_ERROR_NONE) { if (ret != BLE_ERROR_NONE) {
@ -1042,13 +1057,11 @@ ble_error_t SecurityManager::init_identity()
} }
pirk = &irk; pirk = &irk;
address_t identity_address; address_t random_static_address = gap.getRandomStaticAddress();
bool public_address;
ret = _pal.get_identity_address(identity_address, public_address);
if (ret != BLE_ERROR_NONE) { if (ret != BLE_ERROR_NONE) {
return ret; return ret;
} }
_db->set_local_identity(irk, identity_address, public_address); _db->set_local_identity(irk, random_static_address, /* public_address */ false);
} }
auto err = _pal.set_irk(*pirk); auto err = _pal.set_irk(*pirk);