mirror of https://github.com/ARMmbed/mbed-os.git
fix privacy initialisation and give access to local identity
Initialises identity addres when privacy is enabled. Stores the identity. Retrieves local identity if previously stored.pull/13037/head
parent
73b4bebee0
commit
110b190b38
|
@ -285,6 +285,22 @@ public:
|
||||||
(void)result;
|
(void)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicate that a peer address has been saved by the security manager or if we are
|
||||||
|
* bonded to the peer the identity has been retrieved from the database on connection.
|
||||||
|
*
|
||||||
|
* @param[in] connectionHandle Connection handle.
|
||||||
|
* @param[in] peer_address Peer address that has been saved by the security database, NULL it not found.
|
||||||
|
* @param[in] address_is_public Address type, true if public. Invalid if peer_address NULL.
|
||||||
|
*/
|
||||||
|
virtual void peerIdentity(ble::connection_handle_t connectionHandle,
|
||||||
|
const address_t *peer_address,
|
||||||
|
bool address_is_public) {
|
||||||
|
(void)connectionHandle;
|
||||||
|
(void)peer_address;
|
||||||
|
(void)address_is_public;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// Security
|
// Security
|
||||||
//
|
//
|
||||||
|
@ -561,6 +577,14 @@ public:
|
||||||
*/
|
*/
|
||||||
ble_error_t setPairingRequestAuthorisation(bool required = true);
|
ble_error_t setPairingRequestAuthorisation(bool required = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve identity address for the peer on the given connection.
|
||||||
|
*
|
||||||
|
* @param[in] connectionHandle Handle to identify the connection.
|
||||||
|
* @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
|
||||||
|
*/
|
||||||
|
ble_error_t getPeerIdentity(ble::connection_handle_t connectionHandle);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// Feature support
|
// Feature support
|
||||||
//
|
//
|
||||||
|
@ -899,6 +923,10 @@ protected:
|
||||||
ble::connection_handle_t connectionHandle
|
ble::connection_handle_t connectionHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ble_error_t getPeerIdentity_(
|
||||||
|
ble::connection_handle_t connectionHandle
|
||||||
|
);
|
||||||
|
|
||||||
ble_error_t setPairingRequestAuthorisation_(
|
ble_error_t setPairingRequestAuthorisation_(
|
||||||
bool required
|
bool required
|
||||||
);
|
);
|
||||||
|
|
|
@ -124,6 +124,10 @@ public:
|
||||||
bool required = true
|
bool required = true
|
||||||
);
|
);
|
||||||
|
|
||||||
|
ble_error_t getPeerIdentity_(
|
||||||
|
connection_handle_t connection
|
||||||
|
);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// Feature support
|
// Feature support
|
||||||
//
|
//
|
||||||
|
@ -321,6 +325,13 @@ private:
|
||||||
*/
|
*/
|
||||||
ble_error_t init_signing();
|
ble_error_t init_signing();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the IRK if needed.
|
||||||
|
*
|
||||||
|
* @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
|
||||||
|
*/
|
||||||
|
ble_error_t init_identity();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fills the buffer with the specified number of bytes of random data
|
* Fills the buffer with the specified number of bytes of random data
|
||||||
* produced by the link controller
|
* produced by the link controller
|
||||||
|
|
|
@ -102,13 +102,19 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_(
|
||||||
result = init_resolving_list();
|
result = init_resolving_list();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if BLE_FEATURE_PRIVACY
|
||||||
|
// set the local identity address and irk
|
||||||
|
if (result != BLE_ERROR_NONE) {
|
||||||
|
result = init_identity();
|
||||||
|
}
|
||||||
|
#endif // BLE_FEATURE_PRIVACY
|
||||||
|
|
||||||
if (result != BLE_ERROR_NONE) {
|
if (result != BLE_ERROR_NONE) {
|
||||||
delete _db;
|
delete _db;
|
||||||
_db = NULL;
|
_db = NULL;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return BLE_ERROR_NONE;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||||
|
@ -309,6 +315,33 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setPair
|
||||||
return BLE_ERROR_NONE;
|
return BLE_ERROR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||||
|
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getPeerIdentity_(connection_handle_t connection) {
|
||||||
|
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
|
||||||
|
if (eventHandler) {
|
||||||
|
ControlBlock_t *cb = get_control_block(connection);
|
||||||
|
if (!cb) {
|
||||||
|
return BLE_ERROR_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
_db->get_entry_identity(
|
||||||
|
[connection,this](SecurityDb::entry_handle_t handle, const SecurityEntryIdentity_t* identity) {
|
||||||
|
if (eventHandler) {
|
||||||
|
eventHandler->peerIdentity(
|
||||||
|
connection,
|
||||||
|
identity ? &identity->identity_address : nullptr,
|
||||||
|
identity ? identity->identity_address_is_public : false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cb->db_entry
|
||||||
|
);
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
} else {
|
||||||
|
return BLE_ERROR_INVALID_STATE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
// Feature support
|
// Feature support
|
||||||
//
|
//
|
||||||
|
@ -901,6 +934,33 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_si
|
||||||
return _pal.set_csrk(*pcsrk, local_sign_counter);
|
return _pal.set_csrk(*pcsrk, local_sign_counter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||||
|
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_identity() {
|
||||||
|
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
|
||||||
|
const irk_t *pirk = nullptr;
|
||||||
|
|
||||||
|
irk_t irk = _db->get_local_irk();
|
||||||
|
if (irk != irk_t()) {
|
||||||
|
pirk = &irk;
|
||||||
|
} else {
|
||||||
|
ble_error_t ret = get_random_data(irk.data(), irk.size());
|
||||||
|
if (ret != BLE_ERROR_NONE) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
pirk = &irk;
|
||||||
|
address_t identity_address;
|
||||||
|
bool public_address;
|
||||||
|
ret = _pal.get_identity_address(identity_address, public_address);
|
||||||
|
if (ret != BLE_ERROR_NONE) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
_db->set_local_identity(irk, identity_address, public_address);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _pal.set_irk(*pirk);
|
||||||
|
}
|
||||||
|
|
||||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::get_random_data(uint8_t *buffer, size_t size) {
|
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::get_random_data(uint8_t *buffer, size_t size) {
|
||||||
byte_array_t<8> random_data;
|
byte_array_t<8> random_data;
|
||||||
|
|
Loading…
Reference in New Issue