mirror of https://github.com/ARMmbed/mbed-os.git
partial security pass
parent
a1815e31f0
commit
bc3ff56504
|
@ -272,12 +272,20 @@ public:
|
|||
|
||||
public:
|
||||
GenericSecurityManager(
|
||||
PalSecurityManager &palImpl,
|
||||
pal::ConnectionEventMonitor<GenericSecurityManager> &connMonitorImpl,
|
||||
SigningEventMonitor &signingMonitorImpl
|
||||
PalSecurityManager &palImpl
|
||||
#if BLE_FEATURE_CONNECTABLE
|
||||
, pal::ConnectionEventMonitor<GenericSecurityManager> &connMonitorImpl
|
||||
#endif
|
||||
#if BLE_FEATURE_SIGNING
|
||||
, SigningEventMonitor &signingMonitorImpl
|
||||
#endif
|
||||
) : _pal(palImpl),
|
||||
#if BLE_FEATURE_CONNECTABLE
|
||||
_connection_monitor(connMonitorImpl),
|
||||
#endif
|
||||
#if BLE_FEATURE_SIGNING
|
||||
_signing_monitor(signingMonitorImpl),
|
||||
#endif
|
||||
_db(NULL),
|
||||
_default_authentication(0),
|
||||
_default_key_distribution(pal::KeyDistribution::KEY_DISTRIBUTION_ALL),
|
||||
|
@ -527,8 +535,12 @@ private:
|
|||
};
|
||||
|
||||
PalSecurityManager &_pal;
|
||||
#if BLE_FEATURE_CONNECTABLE
|
||||
pal::ConnectionEventMonitor<GenericSecurityManager> &_connection_monitor;
|
||||
#endif
|
||||
#if BLE_FEATURE_SIGNING
|
||||
SigningEventMonitor &_signing_monitor;
|
||||
#endif
|
||||
|
||||
SecurityDb *_db;
|
||||
|
||||
|
|
|
@ -520,18 +520,18 @@ public:
|
|||
impl()->on_keys_distributed_local_ediv_rand_(connection, ediv, rand);
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
/**
|
||||
* Store the results of key distribution after IRK has been received.
|
||||
*
|
||||
* @param[in] connection connection handle
|
||||
* @param[in] irk identity resolution key
|
||||
*/
|
||||
void on_keys_distributed_irk(
|
||||
virtual void on_keys_distributed_irk(
|
||||
connection_handle_t connection,
|
||||
const irk_t &irk
|
||||
) {
|
||||
impl()->on_keys_distributed_irk_(connection, irk);
|
||||
}
|
||||
) = 0;
|
||||
#endif // BLE_FEATURE_PRIVACY
|
||||
|
||||
/**
|
||||
* Store the identity address of the peer after it has been distributed.
|
||||
|
@ -540,26 +540,24 @@ public:
|
|||
* @param[in] peer_identity_address_type public or private address indication
|
||||
* @param[in] peer_identity_address peer address
|
||||
*/
|
||||
void on_keys_distributed_bdaddr(
|
||||
virtual void on_keys_distributed_bdaddr(
|
||||
connection_handle_t connection,
|
||||
advertising_peer_address_type_t peer_identity_address_type,
|
||||
const address_t &peer_identity_address
|
||||
) {
|
||||
impl()->on_keys_distributed_bdaddr_(connection, peer_identity_address_type, peer_identity_address);
|
||||
}
|
||||
) = 0;
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
/**
|
||||
* Store the peer's CSRK after it has been distributed.
|
||||
*
|
||||
* @param[in] connection connection handle
|
||||
* @param[in] csrk signing key
|
||||
*/
|
||||
void on_keys_distributed_csrk(
|
||||
virtual void on_keys_distributed_csrk(
|
||||
connection_handle_t connection,
|
||||
const csrk_t &csrk
|
||||
) {
|
||||
impl()->on_keys_distributed_csrk_(connection, csrk);
|
||||
}
|
||||
) = 0;
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
/**
|
||||
* Request the LTK since the peer is asking us to encrypt the link. We need to
|
||||
|
@ -642,7 +640,7 @@ public:
|
|||
////////////////////////////////////////////////////////////////////////////
|
||||
// Resolving list management
|
||||
//
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
/**
|
||||
* Return the number of address translation entries that can be stored by the
|
||||
* subsystem.
|
||||
|
@ -704,6 +702,7 @@ public:
|
|||
ble_error_t clear_resolving_list() {
|
||||
return impl()->clear_resolving_list_();
|
||||
}
|
||||
#endif // BLE_FEATURE_PRIVACY
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Pairing
|
||||
|
@ -1004,6 +1003,7 @@ public:
|
|||
return impl()->set_ltk_not_found_(connection);
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
/**
|
||||
* Set the local IRK.
|
||||
*
|
||||
|
@ -1015,7 +1015,9 @@ public:
|
|||
) {
|
||||
return impl()->set_irk_(irk);
|
||||
}
|
||||
#endif // BLE_FEATURE_PRIVACY
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
/**
|
||||
* Set the local CSRK.
|
||||
*
|
||||
|
@ -1056,6 +1058,7 @@ public:
|
|||
ble_error_t remove_peer_csrk(connection_handle_t connection) {
|
||||
return impl()->remove_peer_csrk_(connection);
|
||||
}
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Authentication
|
||||
|
|
|
@ -47,6 +47,11 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_(
|
|||
bool signing,
|
||||
const char* db_path
|
||||
) {
|
||||
#if !(BLE_FEATURE_SIGNING)
|
||||
if (signing) {
|
||||
return BLE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
#endif // !(BLE_FEATURE_SIGNING)
|
||||
ble_error_t result = _pal.initialize();
|
||||
|
||||
if (result != BLE_ERROR_NONE) {
|
||||
|
@ -79,14 +84,20 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_(
|
|||
|
||||
// FIXME: depends on BR/EDR support
|
||||
_default_key_distribution.set_link(false);
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
_default_key_distribution.set_signing(signing);
|
||||
if (signing) {
|
||||
init_signing();
|
||||
}
|
||||
|
||||
#else
|
||||
_default_key_distribution.set_signing(false);
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
#if BLE_FEATURE_CONNECTABLE
|
||||
_connection_monitor.set_connection_event_handler(this);
|
||||
#endif
|
||||
#if BLE_FEATURE_SIGNING
|
||||
_signing_monitor.set_signing_event_handler(this);
|
||||
#endif
|
||||
_pal.set_event_handler(this);
|
||||
|
||||
result = init_resolving_list();
|
||||
|
@ -388,6 +399,7 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setKeyp
|
|||
return BLE_ERROR_NONE;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::enableSigning_(
|
||||
connection_handle_t connection,
|
||||
|
@ -429,6 +441,7 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::enableS
|
|||
|
||||
return BLE_ERROR_NONE;
|
||||
}
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setHintFutureRoleReversal_(bool enable) {
|
||||
|
@ -579,7 +592,7 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setEncr
|
|||
////////////////////////////////////////////////////////////////////////////
|
||||
// Keys
|
||||
//
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getSigningKey_(connection_handle_t connection, bool authenticated) {
|
||||
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
|
||||
|
@ -614,16 +627,19 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getSign
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Privacy
|
||||
//
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setPrivateAddressTimeout_(uint16_t timeout_in_seconds) {
|
||||
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
|
||||
return _pal.set_private_address_timeout(timeout_in_seconds);
|
||||
}
|
||||
#endif // BLE_FEATURE_PRIVACY
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Authentication
|
||||
|
@ -839,6 +855,7 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_da
|
|||
return BLE_ERROR_NONE;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_resolving_list() {
|
||||
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
|
||||
|
@ -864,7 +881,9 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_re
|
|||
|
||||
return BLE_ERROR_NONE;
|
||||
}
|
||||
#endif // BLE_FEATURE_PRIVACY
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_signing() {
|
||||
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
|
||||
|
@ -886,6 +905,7 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_si
|
|||
|
||||
return _pal.set_csrk(*pcsrk, local_sign_counter);
|
||||
}
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::get_random_data(uint8_t *buffer, size_t size) {
|
||||
|
@ -1000,6 +1020,7 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::set_ltk_cb(
|
|||
}
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::set_peer_csrk_cb(
|
||||
SecurityDb::entry_handle_t db_entry,
|
||||
|
@ -1045,6 +1066,7 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::return_csrk_cb
|
|||
flags->csrk_mitm_protected
|
||||
);
|
||||
}
|
||||
#endif BLE_FEATURE_SIGNING
|
||||
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::update_oob_presence(connection_handle_t connection) {
|
||||
|
@ -1139,8 +1161,9 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_disconnecte
|
|||
if (!cb) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
_pal.remove_peer_csrk(connection);
|
||||
#endif
|
||||
|
||||
_db->close_entry(cb->db_entry);
|
||||
release_control_block(cb);
|
||||
|
@ -1618,6 +1641,7 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distri
|
|||
_db->set_entry_local_ediv_rand(cb->db_entry, ediv, rand);
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_irk_(
|
||||
connection_handle_t connection,
|
||||
|
@ -1636,6 +1660,7 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distri
|
|||
|
||||
_db->set_entry_peer_irk(cb->db_entry, irk);
|
||||
}
|
||||
#endif BLE_FEATURE_PRIVACY
|
||||
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_bdaddr_(
|
||||
|
@ -1656,6 +1681,7 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distri
|
|||
);
|
||||
}
|
||||
|
||||
#if BLE_FEATURE_SIGNING
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_csrk_(
|
||||
connection_handle_t connection,
|
||||
|
@ -1681,6 +1707,7 @@ void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distri
|
|||
flags->csrk_mitm_protected
|
||||
);
|
||||
}
|
||||
#endif // BLE_FEATURE_SIGNING
|
||||
|
||||
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
|
||||
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_ltk_request_(
|
||||
|
|
|
@ -233,11 +233,17 @@ impl::PalGattClientImpl& BLE::getPalGattClient()
|
|||
#if BLE_FEATURE_SECURITY
|
||||
SecurityManager& BLE::getSecurityManager()
|
||||
{
|
||||
#if BLE_FEATURE_SIGNING
|
||||
static vendor::cordio::SigningEventMonitor<impl::GenericSecurityManagerImpl> signing_event_monitor;
|
||||
#endif
|
||||
static impl::GenericSecurityManagerImpl m_instance(
|
||||
impl::PalSecurityManagerImpl::get_security_manager(),
|
||||
getGap(),
|
||||
signing_event_monitor
|
||||
impl::PalSecurityManagerImpl::get_security_manager()
|
||||
#if BLE_FEATURE_CONNECTABLE
|
||||
, getGap()
|
||||
#endif
|
||||
#if BLE_FEATURE_SIGNING
|
||||
, signing_event_monitor
|
||||
#endif
|
||||
);
|
||||
|
||||
return m_instance;
|
||||
|
|
|
@ -704,7 +704,7 @@ bool CordioSecurityManager<EventHandler>::sm_handler(const wsfMsgHdr_t* msg) {
|
|||
evt->keyData.ltk.rand
|
||||
);
|
||||
break;
|
||||
|
||||
#if BLE_FEATURE_PRIVACY
|
||||
case DM_KEY_IRK:
|
||||
handler->on_keys_distributed_bdaddr(
|
||||
connection,
|
||||
|
@ -717,6 +717,7 @@ bool CordioSecurityManager<EventHandler>::sm_handler(const wsfMsgHdr_t* msg) {
|
|||
irk_t(reinterpret_cast<uint8_t*>(evt->keyData.irk.key))
|
||||
);
|
||||
break;
|
||||
#endif // BLE_FEATURE_PRIVACY
|
||||
#if BLE_FEATURE_SIGNING
|
||||
case DM_KEY_CSRK:
|
||||
handler->on_keys_distributed_csrk(
|
||||
|
|
Loading…
Reference in New Issue