BLE - Devirtualize ::ble::generic::GenericSecurityManager

Two parameters are expected by the template:
- TPalSecurityManager a template class of the security manager of the form TPalSecurityManager<EventHandler>. The GenericSecurityManager is the event handler.
- SigningMonitor a template in the form SigningMonitor<Handler>.
pull/9727/head
Vincent Coubard 2019-02-25 19:22:10 +00:00
parent b135074821
commit 04d26f7ab5
2 changed files with 315 additions and 194 deletions

View File

@ -17,6 +17,7 @@
#ifndef _GENERIC_SECURITY_MANAGER_H_ #ifndef _GENERIC_SECURITY_MANAGER_H_
#define _GENERIC_SECURITY_MANAGER_H_ #define _GENERIC_SECURITY_MANAGER_H_
#include "ble/SecurityManager.h"
#include "ble/pal/GapTypes.h" #include "ble/pal/GapTypes.h"
#include "ble/BLETypes.h" #include "ble/BLETypes.h"
#include "ble/generic/SecurityDb.h" #include "ble/generic/SecurityDb.h"
@ -30,12 +31,45 @@
namespace ble { namespace ble {
namespace generic { namespace generic {
typedef SecurityManager::SecurityIOCapabilities_t SecurityIOCapabilities_t; template <template<class> class TPalSecurityManager, template<class> class SigningMonitor>
class GenericSecurityManager :
public interface::SecurityManager<GenericSecurityManager<TPalSecurityManager, SigningMonitor > >, // SecurityManager
public pal::SecurityManagerEventHandler<GenericSecurityManager<TPalSecurityManager, SigningMonitor> >, // PalSmEventHandler
public pal::ConnectionEventMonitorEventHandler<GenericSecurityManager<TPalSecurityManager, SigningMonitor> >, // ConnectionObserver
public pal::SigningMonitorEventHandler<GenericSecurityManager<TPalSecurityManager, SigningMonitor> > //SigningObserver
{
// typedefs
typedef interface::SecurityManager<GenericSecurityManager> SecurityManager;
typedef SigningMonitor<GenericSecurityManager> SigningEventMonitor;
typedef typename TPalSecurityManager<GenericSecurityManager>::Base PalSecurityManager;
// friends
friend class pal::ConnectionEventMonitorEventHandler<GenericSecurityManager>;
// imports from SecurityManager
typedef typename SecurityManager::SecurityIOCapabilities_t SecurityIOCapabilities_t;
typedef typename SecurityManager::SecurityMode_t SecurityMode_t;
typedef typename SecurityManager::SecurityCompletionStatus_t SecurityCompletionStatus_t;
typedef typename SecurityManager::Passkey_t Passkey_t;
typedef typename SecurityManager::Keypress_t Keypress_t;
typedef typename SecurityManager::EventHandler SecurityManagerEventHandler;
using SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK;
using SecurityManager::SECURITY_MODE_ENCRYPTION_NO_MITM;
using SecurityManager::SECURITY_MODE_ENCRYPTION_WITH_MITM;
using SecurityManager::SECURITY_MODE_SIGNED_NO_MITM;
using SecurityManager::SECURITY_MODE_SIGNED_WITH_MITM;
using SecurityManager::SEC_STATUS_TIMEOUT;
using SecurityManager::SEC_STATUS_SUCCESS;
using SecurityManager::eventHandler;
using SecurityManager::requestPairing;
using SecurityManager::getLinkEncryption;
using SecurityManager::requestAuthentication;
using SecurityManager::generateOOB;
using SecurityManager::cancelPairingRequest;
using SecurityManager::acceptPairingRequest;
class GenericSecurityManager : public SecurityManager,
public pal::SecurityManager::EventHandler,
public pal::ConnectionEventMonitor::EventHandler,
public pal::SigningEventMonitor::EventHandler {
public: public:
/* implements SecurityManager */ /* implements SecurityManager */
@ -44,20 +78,20 @@ public:
// SM lifecycle management // SM lifecycle management
// //
virtual ble_error_t init( ble_error_t init_(
bool bondable = true, bool bondable,
bool mitm = true, bool mitm,
SecurityIOCapabilities_t iocaps = IO_CAPS_NONE, SecurityIOCapabilities_t iocaps,
const Passkey_t passkey = NULL, const uint8_t* passkey,
bool signing = true, bool signing,
const char* db_path = NULL const char* db_path
); );
virtual ble_error_t setDatabaseFilepath(const char *db_path = NULL); ble_error_t setDatabaseFilepath_(const char *db_path = NULL);
virtual ble_error_t reset(); ble_error_t reset_();
virtual ble_error_t preserveBondingStateOnReset( ble_error_t preserveBondingStateOnReset_(
bool enabled bool enabled
); );
@ -65,9 +99,9 @@ public:
// List management // List management
// //
virtual ble_error_t purgeAllBondingState(); ble_error_t purgeAllBondingState_();
virtual ble_error_t generateWhitelistFromBondTable( ble_error_t generateWhitelistFromBondTable_(
::Gap::Whitelist_t *whitelist ::Gap::Whitelist_t *whitelist
) const; ) const;
@ -75,19 +109,19 @@ public:
// Pairing // Pairing
// //
virtual ble_error_t requestPairing( ble_error_t requestPairing_(
connection_handle_t connection connection_handle_t connection
); );
virtual ble_error_t acceptPairingRequest( ble_error_t acceptPairingRequest_(
connection_handle_t connection connection_handle_t connection
); );
virtual ble_error_t cancelPairingRequest( ble_error_t cancelPairingRequest_(
connection_handle_t connection connection_handle_t connection
); );
virtual ble_error_t setPairingRequestAuthorisation( ble_error_t setPairingRequestAuthorisation_(
bool required = true bool required = true
); );
@ -95,11 +129,11 @@ public:
// Feature support // Feature support
// //
virtual ble_error_t allowLegacyPairing( ble_error_t allowLegacyPairing_(
bool allow = true bool allow = true
); );
virtual ble_error_t getSecureConnectionsSupport( ble_error_t getSecureConnectionsSupport_(
bool *enabled bool *enabled
); );
@ -107,62 +141,62 @@ public:
// Security settings // Security settings
// //
virtual ble_error_t setIoCapability( ble_error_t setIoCapability_(
SecurityIOCapabilities_t iocaps SecurityIOCapabilities_t iocaps
); );
virtual ble_error_t setDisplayPasskey( ble_error_t setDisplayPasskey_(
const Passkey_t passkey const uint8_t* passkey
); );
virtual ble_error_t setAuthenticationTimeout( ble_error_t setAuthenticationTimeout_(
connection_handle_t connection, connection_handle_t connection,
uint32_t timeout_in_ms uint32_t timeout_in_ms
); );
virtual ble_error_t getAuthenticationTimeout( ble_error_t getAuthenticationTimeout_(
connection_handle_t connection, connection_handle_t connection,
uint32_t *timeout_in_ms uint32_t *timeout_in_ms
); );
virtual ble_error_t setLinkSecurity( ble_error_t setLinkSecurity_(
connection_handle_t connection, connection_handle_t connection,
SecurityMode_t securityMode SecurityMode_t securityMode
); );
virtual ble_error_t setKeypressNotification( ble_error_t setKeypressNotification_(
bool enabled = true bool enabled
); );
virtual ble_error_t enableSigning( ble_error_t enableSigning_(
connection_handle_t connection, connection_handle_t connection,
bool enabled = true bool enabled
); );
virtual ble_error_t setHintFutureRoleReversal( ble_error_t setHintFutureRoleReversal_(
bool enable = true bool enable
); );
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// Encryption // Encryption
// //
virtual ble_error_t getLinkEncryption( ble_error_t getLinkEncryption_(
connection_handle_t connection, connection_handle_t connection,
link_encryption_t *encryption link_encryption_t *encryption
); );
virtual ble_error_t setLinkEncryption( ble_error_t setLinkEncryption_(
connection_handle_t connection, connection_handle_t connection,
link_encryption_t encryption link_encryption_t encryption
); );
virtual ble_error_t getEncryptionKeySize( ble_error_t getEncryptionKeySize_(
connection_handle_t connection, connection_handle_t connection,
uint8_t *size uint8_t *size
); );
virtual ble_error_t setEncryptionKeyRequirements( ble_error_t setEncryptionKeyRequirements_(
uint8_t minimumByteSize, uint8_t minimumByteSize,
uint8_t maximumByteSize uint8_t maximumByteSize
); );
@ -171,7 +205,7 @@ public:
// Privacy // Privacy
// //
virtual ble_error_t setPrivateAddressTimeout( ble_error_t setPrivateAddressTimeout_(
uint16_t timeout_in_seconds uint16_t timeout_in_seconds
); );
@ -179,7 +213,7 @@ public:
// Keys // Keys
// //
virtual ble_error_t getSigningKey( ble_error_t getSigningKey_(
connection_handle_t connection, connection_handle_t connection,
bool authenticated bool authenticated
); );
@ -188,7 +222,7 @@ public:
// Authentication // Authentication
// //
virtual ble_error_t requestAuthentication( ble_error_t requestAuthentication_(
connection_handle_t connection connection_handle_t connection
); );
@ -196,37 +230,37 @@ public:
// MITM // MITM
// //
virtual ble_error_t generateOOB( ble_error_t generateOOB_(
const address_t *address const address_t *address
); );
virtual ble_error_t setOOBDataUsage( ble_error_t setOOBDataUsage_(
connection_handle_t connection, connection_handle_t connection,
bool useOOB, bool useOOB,
bool OOBProvidesMITM = true bool OOBProvidesMITM
); );
virtual ble_error_t confirmationEntered( ble_error_t confirmationEntered_(
connection_handle_t connection, connection_handle_t connection,
bool confirmation bool confirmation
); );
virtual ble_error_t passkeyEntered( ble_error_t passkeyEntered_(
connection_handle_t connection, connection_handle_t connection,
Passkey_t passkey Passkey_t passkey
); );
virtual ble_error_t sendKeypressNotification( ble_error_t sendKeypressNotification_(
connection_handle_t connection, connection_handle_t connection,
Keypress_t keypress Keypress_t keypress
); );
virtual ble_error_t legacyPairingOobReceived( ble_error_t legacyPairingOobReceived_(
const address_t *address, const address_t *address,
const oob_tk_t *tk const oob_tk_t *tk
); );
virtual ble_error_t oobReceived( ble_error_t oobReceived_(
const address_t *address, const address_t *address,
const oob_lesc_value_t *random, const oob_lesc_value_t *random,
const oob_confirm_t *confirm const oob_confirm_t *confirm
@ -236,9 +270,9 @@ public:
public: public:
GenericSecurityManager( GenericSecurityManager(
pal::SecurityManager &palImpl, PalSecurityManager &palImpl,
pal::ConnectionEventMonitor &connMonitorImpl, pal::ConnectionEventMonitor<GenericSecurityManager> &connMonitorImpl,
pal::SigningEventMonitor &signingMonitorImpl SigningEventMonitor &signingMonitorImpl
) : _pal(palImpl), ) : _pal(palImpl),
_connection_monitor(connMonitorImpl), _connection_monitor(connMonitorImpl),
_signing_monitor(signingMonitorImpl), _signing_monitor(signingMonitorImpl),
@ -380,7 +414,7 @@ private:
* @param[in] connectionHandle Handle to identify the connection. * @param[in] connectionHandle Handle to identify the connection.
* @param[in] enable if true set the MITM protection to on. * @param[in] enable if true set the MITM protection to on.
*/ */
virtual void set_mitm_performed( void set_mitm_performed(
connection_handle_t connection, connection_handle_t connection,
bool enable = true bool enable = true
); );
@ -396,7 +430,7 @@ private:
* @param[in] peer_address Address of the connected device. * @param[in] peer_address Address of the connected device.
* @return BLE_ERROR_NONE or appropriate error code indicating the failure reason. * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
*/ */
virtual void on_connected( void on_connected_(
connection_handle_t connection, connection_handle_t connection,
::Gap::Role_t role, ::Gap::Role_t role,
peer_address_type_t peer_address_type, peer_address_type_t peer_address_type,
@ -413,7 +447,7 @@ private:
* @param[in] connectionHandle Handle to identify the connection. * @param[in] connectionHandle Handle to identify the connection.
* @return BLE_ERROR_NONE or appropriate error code indicating the failure reason. * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
*/ */
virtual void on_disconnected( void on_disconnected_(
connection_handle_t connection, connection_handle_t connection,
::Gap::DisconnectionReason_t reason ::Gap::DisconnectionReason_t reason
); );
@ -490,9 +524,9 @@ private:
uint8_t csrk_failures:2; uint8_t csrk_failures:2;
}; };
pal::SecurityManager &_pal; PalSecurityManager &_pal;
pal::ConnectionEventMonitor &_connection_monitor; pal::ConnectionEventMonitor<GenericSecurityManager> &_connection_monitor;
pal::SigningEventMonitor &_signing_monitor; SigningEventMonitor &_signing_monitor;
SecurityDb *_db; SecurityDb *_db;
@ -523,7 +557,7 @@ public:
/** @copydoc ble::pal::SecurityManager::on_pairing_request /** @copydoc ble::pal::SecurityManager::on_pairing_request
*/ */
virtual void on_pairing_request( void on_pairing_request_(
connection_handle_t connection, connection_handle_t connection,
bool use_oob, bool use_oob,
pal::AuthenticationMask authentication, pal::AuthenticationMask authentication,
@ -533,20 +567,20 @@ public:
/** @copydoc ble::pal::SecurityManager::on_pairing_error /** @copydoc ble::pal::SecurityManager::on_pairing_error
*/ */
virtual void on_pairing_error( void on_pairing_error_(
connection_handle_t connection, connection_handle_t connection,
pairing_failure_t error pairing_failure_t error
); );
/** @copydoc ble::pal::SecurityManager::on_pairing_timed_out /** @copydoc ble::pal::SecurityManager::on_pairing_timed_out
*/ */
virtual void on_pairing_timed_out( void on_pairing_timed_out_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_pairing_completed /** @copydoc ble::pal::SecurityManager::on_pairing_completed
*/ */
virtual void on_pairing_completed( void on_pairing_completed_(
connection_handle_t connection connection_handle_t connection
); );
@ -556,30 +590,30 @@ public:
/** @copydoc ble::pal::SecurityManager::on_valid_mic_timeout /** @copydoc ble::pal::SecurityManager::on_valid_mic_timeout
*/ */
virtual void on_valid_mic_timeout( void on_valid_mic_timeout_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_signed_write_received /** @copydoc ble::pal::SecurityManager::on_signed_write_received
*/ */
virtual void on_signed_write_received( void on_signed_write_received_(
connection_handle_t connection, connection_handle_t connection,
uint32_t sign_coutner uint32_t sign_coutner
); );
/** @copydoc ble::pal::SecurityManager::on_signed_write_verification_failure /** @copydoc ble::pal::SecurityManager::on_signed_write_verification_failure
*/ */
virtual void on_signed_write_verification_failure( void on_signed_write_verification_failure_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_signed_write /** @copydoc ble::pal::SecurityManager::on_signed_write
*/ */
virtual void on_signed_write(); void on_signed_write_();
/** @copydoc ble::pal::SecurityManager::on_slave_security_request /** @copydoc ble::pal::SecurityManager::on_slave_security_request
*/ */
virtual void on_slave_security_request( void on_slave_security_request_(
connection_handle_t connection, connection_handle_t connection,
pal::AuthenticationMask authentication pal::AuthenticationMask authentication
); );
@ -590,14 +624,14 @@ public:
/** @copydoc ble::pal::SecurityManager::on_link_encryption_result /** @copydoc ble::pal::SecurityManager::on_link_encryption_result
*/ */
virtual void on_link_encryption_result( void on_link_encryption_result_(
connection_handle_t connection, connection_handle_t connection,
link_encryption_t result link_encryption_t result
); );
/** @copydoc ble::pal::SecurityManager::on_link_encryption_request_timed_out /** @copydoc ble::pal::SecurityManager::on_link_encryption_request_timed_out
*/ */
virtual void on_link_encryption_request_timed_out( void on_link_encryption_request_timed_out_(
connection_handle_t connection connection_handle_t connection
); );
@ -607,45 +641,45 @@ public:
/** @copydoc ble::pal::SecurityManager::on_passkey_display /** @copydoc ble::pal::SecurityManager::on_passkey_display
*/ */
virtual void on_passkey_display( void on_passkey_display_(
connection_handle_t connection, connection_handle_t connection,
passkey_num_t passkey passkey_num_t passkey
); );
/** @copydoc ble::pal::SecurityManager::on_keypress_notification /** @copydoc ble::pal::SecurityManager::on_keypress_notification
*/ */
virtual void on_keypress_notification( void on_keypress_notification_(
connection_handle_t connection, connection_handle_t connection,
SecurityManager::Keypress_t keypress Keypress_t keypress
); );
/** @copydoc ble::pal::SecurityManager::on_passkey_request /** @copydoc ble::pal::SecurityManager::on_passkey_request
*/ */
virtual void on_passkey_request( void on_passkey_request_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_confirmation_request /** @copydoc ble::pal::SecurityManager::on_confirmation_request
*/ */
virtual void on_confirmation_request( void on_confirmation_request_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_secure_connections_oob_request /** @copydoc ble::pal::SecurityManager::on_secure_connections_oob_request
*/ */
virtual void on_secure_connections_oob_request( void on_secure_connections_oob_request_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_legacy_pairing_oob_request /** @copydoc ble::pal::SecurityManager::on_legacy_pairing_oob_request
*/ */
virtual void on_legacy_pairing_oob_request( void on_legacy_pairing_oob_request_(
connection_handle_t connection connection_handle_t connection
); );
/** @copydoc ble::pal::SecurityManager::on_secure_connections_oob_generated /** @copydoc ble::pal::SecurityManager::on_secure_connections_oob_generated
*/ */
virtual void on_secure_connections_oob_generated( void on_secure_connections_oob_generated_(
const oob_lesc_value_t &random, const oob_lesc_value_t &random,
const oob_confirm_t &confirm const oob_confirm_t &confirm
); );
@ -656,21 +690,21 @@ public:
/** @copydoc ble::pal::SecurityManager::on_secure_connections_ltk_generated /** @copydoc ble::pal::SecurityManager::on_secure_connections_ltk_generated
*/ */
virtual void on_secure_connections_ltk_generated( void on_secure_connections_ltk_generated_(
connection_handle_t connection, connection_handle_t connection,
const ltk_t &ltk const ltk_t &ltk
); );
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_ltk /** @copydoc ble::pal::SecurityManager::on_keys_distributed_ltk
*/ */
virtual void on_keys_distributed_ltk( void on_keys_distributed_ltk_(
connection_handle_t connection, connection_handle_t connection,
const ltk_t &ltk const ltk_t &ltk
); );
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_ediv_rand /** @copydoc ble::pal::SecurityManager::on_keys_distributed_ediv_rand
*/ */
virtual void on_keys_distributed_ediv_rand( void on_keys_distributed_ediv_rand_(
connection_handle_t connection, connection_handle_t connection,
const ediv_t &ediv, const ediv_t &ediv,
const rand_t &rand const rand_t &rand
@ -678,14 +712,14 @@ public:
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_local_ltk /** @copydoc ble::pal::SecurityManager::on_keys_distributed_local_ltk
*/ */
virtual void on_keys_distributed_local_ltk( void on_keys_distributed_local_ltk_(
connection_handle_t connection, connection_handle_t connection,
const ltk_t &ltk const ltk_t &ltk
); );
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_local_ediv_rand /** @copydoc ble::pal::SecurityManager::on_keys_distributed_local_ediv_rand
*/ */
virtual void on_keys_distributed_local_ediv_rand( void on_keys_distributed_local_ediv_rand_(
connection_handle_t connection, connection_handle_t connection,
const ediv_t &ediv, const ediv_t &ediv,
const rand_t &rand const rand_t &rand
@ -693,14 +727,14 @@ public:
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_irk /** @copydoc ble::pal::SecurityManager::on_keys_distributed_irk
*/ */
virtual void on_keys_distributed_irk( void on_keys_distributed_irk_(
connection_handle_t connection, connection_handle_t connection,
const irk_t &irk const irk_t &irk
); );
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_bdaddr /** @copydoc ble::pal::SecurityManager::on_keys_distributed_bdaddr
*/ */
virtual void on_keys_distributed_bdaddr( void on_keys_distributed_bdaddr_(
connection_handle_t connection, connection_handle_t connection,
pal::advertising_peer_address_type_t peer_address_type, pal::advertising_peer_address_type_t peer_address_type,
const address_t &peer_identity_address const address_t &peer_identity_address
@ -708,14 +742,14 @@ public:
/** @copydoc ble::pal::SecurityManager::on_keys_distributed_csrk /** @copydoc ble::pal::SecurityManager::on_keys_distributed_csrk
*/ */
virtual void on_keys_distributed_csrk( void on_keys_distributed_csrk_(
connection_handle_t connection, connection_handle_t connection,
const csrk_t &csrk const csrk_t &csrk
); );
/** @copydoc ble::pal::SecurityManager::on_ltk_requeston_ltk_request /** @copydoc ble::pal::SecurityManager::on_ltk_requeston_ltk_request
*/ */
virtual void on_ltk_request( void on_ltk_request_(
connection_handle_t connection, connection_handle_t connection,
const ediv_t &ediv, const ediv_t &ediv,
const rand_t &rand const rand_t &rand
@ -723,7 +757,7 @@ public:
/** @copydoc ble::pal::SecurityManager::on_ltk_requeston_ltk_request /** @copydoc ble::pal::SecurityManager::on_ltk_requeston_ltk_request
*/ */
virtual void on_ltk_request( void on_ltk_request_(
connection_handle_t connection connection_handle_t connection
); );

View File

@ -34,18 +34,19 @@ namespace generic {
// SM lifecycle management // SM lifecycle management
// //
ble_error_t GenericSecurityManager::init( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_(
bool bondable, bool bondable,
bool mitm, bool mitm,
SecurityIOCapabilities_t iocaps, SecurityIOCapabilities_t iocaps,
const Passkey_t passkey, const uint8_t* passkey,
bool signing, bool signing,
const char* db_path const char* db_path
) { ) {
ble_error_t result = _pal.initialize(); ble_error_t result = _pal.initialize();
if (result != BLE_ERROR_NONE) { if (result != BLE_ERROR_NONE) {
return result; return result;
} }
result = init_database(db_path); result = init_database(db_path);
@ -94,7 +95,8 @@ ble_error_t GenericSecurityManager::init(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::setDatabaseFilepath( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setDatabaseFilepath_(
const char *db_path const char *db_path
) { ) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
@ -116,14 +118,16 @@ ble_error_t GenericSecurityManager::setDatabaseFilepath(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::reset(void) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::reset_(void) {
_pal.reset(); _pal.reset();
SecurityManager::reset(); SecurityManager::reset_();
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::preserveBondingStateOnReset(bool enabled) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::preserveBondingStateOnReset_(bool enabled) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
_db->set_restore(enabled); _db->set_restore(enabled);
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
@ -133,20 +137,22 @@ ble_error_t GenericSecurityManager::preserveBondingStateOnReset(bool enabled) {
// List management // List management
// //
ble_error_t GenericSecurityManager::purgeAllBondingState(void) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::purgeAllBondingState_(void) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
_db->clear_entries(); _db->clear_entries();
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::generateWhitelistFromBondTable(::Gap::Whitelist_t *whitelist) const { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::generateWhitelistFromBondTable_(::Gap::Whitelist_t *whitelist) const {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
if (eventHandler) { if (eventHandler) {
if (!whitelist) { if (!whitelist) {
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
_db->generate_whitelist_from_bond_table( _db->generate_whitelist_from_bond_table(
mbed::callback(eventHandler, &::SecurityManager::EventHandler::whitelistFromBondTable), mbed::callback(eventHandler, &SecurityManagerEventHandler::whitelistFromBondTable),
whitelist whitelist
); );
} }
@ -157,7 +163,8 @@ ble_error_t GenericSecurityManager::generateWhitelistFromBondTable(::Gap::Whitel
// Pairing // Pairing
// //
ble_error_t GenericSecurityManager::requestPairing(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::requestPairing_(connection_handle_t connection) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -210,7 +217,8 @@ ble_error_t GenericSecurityManager::requestPairing(connection_handle_t connectio
); );
} }
ble_error_t GenericSecurityManager::acceptPairingRequest(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::acceptPairingRequest_(connection_handle_t connection) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -268,12 +276,14 @@ ble_error_t GenericSecurityManager::acceptPairingRequest(connection_handle_t con
); );
} }
ble_error_t GenericSecurityManager::cancelPairingRequest(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::cancelPairingRequest_(connection_handle_t connection) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
return _pal.cancel_pairing(connection, pairing_failure_t::UNSPECIFIED_REASON); return _pal.cancel_pairing(connection, pairing_failure_t::UNSPECIFIED_REASON);
} }
ble_error_t GenericSecurityManager::setPairingRequestAuthorisation(bool required) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setPairingRequestAuthorisation_(bool required) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
_pairing_authorisation_required = required; _pairing_authorisation_required = required;
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
@ -283,12 +293,14 @@ ble_error_t GenericSecurityManager::setPairingRequestAuthorisation(bool required
// Feature support // Feature support
// //
ble_error_t GenericSecurityManager::allowLegacyPairing(bool allow) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::allowLegacyPairing_(bool allow) {
_legacy_pairing_allowed = allow; _legacy_pairing_allowed = allow;
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::getSecureConnectionsSupport(bool *enabled) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getSecureConnectionsSupport_(bool *enabled) {
return _pal.get_secure_connections_support(*enabled); return _pal.get_secure_connections_support(*enabled);
} }
@ -296,17 +308,20 @@ ble_error_t GenericSecurityManager::getSecureConnectionsSupport(bool *enabled) {
// Security settings // Security settings
// //
ble_error_t GenericSecurityManager::setIoCapability(SecurityIOCapabilities_t iocaps) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setIoCapability_(SecurityIOCapabilities_t iocaps) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
return _pal.set_io_capability((io_capability_t::type) iocaps); return _pal.set_io_capability((io_capability_t::type) iocaps);
} }
ble_error_t GenericSecurityManager::setDisplayPasskey(const Passkey_t passkey) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setDisplayPasskey_(const uint8_t* passkey) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
return _pal.set_display_passkey(PasskeyAscii::to_num(passkey)); return _pal.set_display_passkey(PasskeyAscii::to_num(passkey));
} }
ble_error_t GenericSecurityManager::setAuthenticationTimeout( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setAuthenticationTimeout_(
connection_handle_t connection, connection_handle_t connection,
uint32_t timeout_in_ms uint32_t timeout_in_ms
) { ) {
@ -314,7 +329,8 @@ ble_error_t GenericSecurityManager::setAuthenticationTimeout(
return _pal.set_authentication_timeout(connection, timeout_in_ms / 10); return _pal.set_authentication_timeout(connection, timeout_in_ms / 10);
} }
ble_error_t GenericSecurityManager::getAuthenticationTimeout( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getAuthenticationTimeout_(
connection_handle_t connection, connection_handle_t connection,
uint32_t *timeout_in_ms uint32_t *timeout_in_ms
) { ) {
@ -325,7 +341,8 @@ ble_error_t GenericSecurityManager::getAuthenticationTimeout(
return status; return status;
} }
ble_error_t GenericSecurityManager::setLinkSecurity( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setLinkSecurity_(
connection_handle_t connection, connection_handle_t connection,
SecurityMode_t securityMode SecurityMode_t securityMode
) { ) {
@ -341,32 +358,34 @@ ble_error_t GenericSecurityManager::setLinkSecurity(
switch (securityMode) { switch (securityMode) {
case SECURITY_MODE_ENCRYPTION_OPEN_LINK: case SECURITY_MODE_ENCRYPTION_OPEN_LINK:
return setLinkEncryption(connection, link_encryption_t::NOT_ENCRYPTED); return setLinkEncryption_(connection, link_encryption_t::NOT_ENCRYPTED);
case SECURITY_MODE_ENCRYPTION_NO_MITM: case SECURITY_MODE_ENCRYPTION_NO_MITM:
return setLinkEncryption(connection, link_encryption_t::ENCRYPTED); return setLinkEncryption_(connection, link_encryption_t::ENCRYPTED);
case SECURITY_MODE_ENCRYPTION_WITH_MITM: case SECURITY_MODE_ENCRYPTION_WITH_MITM:
return setLinkEncryption(connection, link_encryption_t::ENCRYPTED_WITH_MITM); return setLinkEncryption_(connection, link_encryption_t::ENCRYPTED_WITH_MITM);
case SECURITY_MODE_SIGNED_NO_MITM: case SECURITY_MODE_SIGNED_NO_MITM:
return getSigningKey(connection, false); return getSigningKey_(connection, false);
case SECURITY_MODE_SIGNED_WITH_MITM: case SECURITY_MODE_SIGNED_WITH_MITM:
return getSigningKey(connection, true); return getSigningKey_(connection, true);
default: default:
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
} }
ble_error_t GenericSecurityManager::setKeypressNotification(bool enabled) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setKeypressNotification_(bool enabled) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
_default_authentication.set_keypress_notification(enabled); _default_authentication.set_keypress_notification(enabled);
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::enableSigning( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::enableSigning_(
connection_handle_t connection, connection_handle_t connection,
bool enabled bool enabled
) { ) {
@ -395,9 +414,9 @@ ble_error_t GenericSecurityManager::enableSigning(
/* create keys if needed and exchange them */ /* create keys if needed and exchange them */
init_signing(); init_signing();
if (cb->is_master) { if (cb->is_master) {
return requestPairing(connection); return requestPairing_(connection);
} else { } else {
return slave_security_request(connection); return slave_security_request(connection);
} }
} }
} else { } else {
@ -407,7 +426,8 @@ ble_error_t GenericSecurityManager::enableSigning(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::setHintFutureRoleReversal(bool enable) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setHintFutureRoleReversal_(bool enable) {
_master_sends_keys = enable; _master_sends_keys = enable;
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
@ -416,7 +436,8 @@ ble_error_t GenericSecurityManager::setHintFutureRoleReversal(bool enable) {
// Encryption // Encryption
// //
ble_error_t GenericSecurityManager::getLinkEncryption( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getLinkEncryption_(
connection_handle_t connection, connection_handle_t connection,
link_encryption_t *encryption link_encryption_t *encryption
) { ) {
@ -450,7 +471,8 @@ ble_error_t GenericSecurityManager::getLinkEncryption(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::setLinkEncryption( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setLinkEncryption_(
connection_handle_t connection, connection_handle_t connection,
link_encryption_t encryption link_encryption_t encryption
) { ) {
@ -521,7 +543,8 @@ ble_error_t GenericSecurityManager::setLinkEncryption(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::getEncryptionKeySize( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::getEncryptionKeySize_(
connection_handle_t connection, connection_handle_t connection,
uint8_t *size uint8_t *size
) { ) {
@ -540,7 +563,8 @@ ble_error_t GenericSecurityManager::getEncryptionKeySize(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::setEncryptionKeyRequirements( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setEncryptionKeyRequirements_(
uint8_t minimumByteSize, uint8_t minimumByteSize,
uint8_t maximumByteSize uint8_t maximumByteSize
) { ) {
@ -552,7 +576,8 @@ ble_error_t GenericSecurityManager::setEncryptionKeyRequirements(
// Keys // Keys
// //
ble_error_t GenericSecurityManager::getSigningKey(connection_handle_t connection, bool authenticated) { 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; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -590,16 +615,18 @@ ble_error_t GenericSecurityManager::getSigningKey(connection_handle_t connection
// Privacy // Privacy
// //
ble_error_t GenericSecurityManager::setPrivateAddressTimeout(uint16_t timeout_in_seconds) { 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; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
return _pal.set_private_address_timeout(timeout_in_seconds); return _pal.set_private_address_timeout(timeout_in_seconds);
} }
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// Authentication // Authentication
// //
ble_error_t GenericSecurityManager::requestAuthentication(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::requestAuthentication_(connection_handle_t connection) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -632,7 +659,8 @@ ble_error_t GenericSecurityManager::requestAuthentication(connection_handle_t co
// MITM // MITM
// //
ble_error_t GenericSecurityManager::generateOOB( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::generateOOB_(
const address_t *address const address_t *address
) { ) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
@ -676,7 +704,8 @@ ble_error_t GenericSecurityManager::generateOOB(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::setOOBDataUsage( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::setOOBDataUsage_(
connection_handle_t connection, connection_handle_t connection,
bool useOOB, bool useOOB,
bool OOBProvidesMITM bool OOBProvidesMITM
@ -697,7 +726,8 @@ ble_error_t GenericSecurityManager::setOOBDataUsage(
} }
} }
ble_error_t GenericSecurityManager::confirmationEntered( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::confirmationEntered_(
connection_handle_t connection, connection_handle_t connection,
bool confirmation bool confirmation
) { ) {
@ -705,7 +735,8 @@ ble_error_t GenericSecurityManager::confirmationEntered(
return _pal.confirmation_entered(connection, confirmation); return _pal.confirmation_entered(connection, confirmation);
} }
ble_error_t GenericSecurityManager::passkeyEntered( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::passkeyEntered_(
connection_handle_t connection, connection_handle_t connection,
Passkey_t passkey Passkey_t passkey
) { ) {
@ -716,7 +747,8 @@ ble_error_t GenericSecurityManager::passkeyEntered(
); );
} }
ble_error_t GenericSecurityManager::sendKeypressNotification( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::sendKeypressNotification_(
connection_handle_t connection, connection_handle_t connection,
Keypress_t keypress Keypress_t keypress
) { ) {
@ -724,7 +756,8 @@ ble_error_t GenericSecurityManager::sendKeypressNotification(
return _pal.send_keypress_notification(connection, keypress); return _pal.send_keypress_notification(connection, keypress);
} }
ble_error_t GenericSecurityManager::legacyPairingOobReceived( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::legacyPairingOobReceived_(
const address_t *address, const address_t *address,
const oob_tk_t *tk const oob_tk_t *tk
) { ) {
@ -748,7 +781,7 @@ ble_error_t GenericSecurityManager::legacyPairingOobReceived(
} }
if (cb->legacy_pairing_oob_request_pending) { if (cb->legacy_pairing_oob_request_pending) {
on_legacy_pairing_oob_request(cb->connection); on_legacy_pairing_oob_request_(cb->connection);
/* legacy_pairing_oob_request_pending stops us from /* legacy_pairing_oob_request_pending stops us from
* going into a loop of asking the user for oob * going into a loop of asking the user for oob
* so this reset needs to happen after the call above */ * so this reset needs to happen after the call above */
@ -758,7 +791,8 @@ ble_error_t GenericSecurityManager::legacyPairingOobReceived(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::oobReceived( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::oobReceived_(
const address_t *address, const address_t *address,
const oob_lesc_value_t *random, const oob_lesc_value_t *random,
const oob_confirm_t *confirm const oob_confirm_t *confirm
@ -778,7 +812,8 @@ ble_error_t GenericSecurityManager::oobReceived(
// Helper functions // Helper functions
// //
ble_error_t GenericSecurityManager::init_database( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::init_database(
const char *db_path const char *db_path
) { ) {
delete _db; delete _db;
@ -800,7 +835,8 @@ ble_error_t GenericSecurityManager::init_database(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::init_resolving_list() { 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; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
/* match the resolving list to the currently stored set of IRKs */ /* match the resolving list to the currently stored set of IRKs */
@ -825,7 +861,8 @@ ble_error_t GenericSecurityManager::init_resolving_list() {
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::init_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; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
const csrk_t *pcsrk = _db->get_local_csrk(); const csrk_t *pcsrk = _db->get_local_csrk();
sign_count_t local_sign_counter = _db->get_local_sign_counter(); sign_count_t local_sign_counter = _db->get_local_sign_counter();
@ -846,7 +883,8 @@ ble_error_t GenericSecurityManager::init_signing() {
return _pal.set_csrk(*pcsrk, local_sign_counter); return _pal.set_csrk(*pcsrk, local_sign_counter);
} }
ble_error_t GenericSecurityManager::get_random_data(uint8_t *buffer, size_t size) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
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;
while (size) { while (size) {
@ -865,7 +903,8 @@ ble_error_t GenericSecurityManager::get_random_data(uint8_t *buffer, size_t size
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t GenericSecurityManager::slave_security_request(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::slave_security_request(connection_handle_t connection) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -876,7 +915,8 @@ ble_error_t GenericSecurityManager::slave_security_request(connection_handle_t c
return _pal.slave_security_request(connection, link_authentication); return _pal.slave_security_request(connection, link_authentication);
} }
ble_error_t GenericSecurityManager::enable_encryption(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::enable_encryption(connection_handle_t connection) {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE; if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -903,7 +943,8 @@ ble_error_t GenericSecurityManager::enable_encryption(connection_handle_t connec
} }
} }
void GenericSecurityManager::enable_encryption_cb( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::enable_encryption_cb(
SecurityDb::entry_handle_t db_entry, SecurityDb::entry_handle_t db_entry,
const SecurityEntryKeys_t* entryKeys const SecurityEntryKeys_t* entryKeys
) { ) {
@ -927,7 +968,8 @@ void GenericSecurityManager::enable_encryption_cb(
} }
} }
void GenericSecurityManager::set_ltk_cb( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::set_ltk_cb(
SecurityDb::entry_handle_t db_entry, SecurityDb::entry_handle_t db_entry,
const SecurityEntryKeys_t* entryKeys const SecurityEntryKeys_t* entryKeys
) { ) {
@ -954,7 +996,8 @@ void GenericSecurityManager::set_ltk_cb(
} }
} }
void GenericSecurityManager::set_peer_csrk_cb( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::set_peer_csrk_cb(
SecurityDb::entry_handle_t db_entry, SecurityDb::entry_handle_t db_entry,
const SecurityEntrySigning_t* signing const SecurityEntrySigning_t* signing
) { ) {
@ -976,7 +1019,8 @@ void GenericSecurityManager::set_peer_csrk_cb(
); );
} }
void GenericSecurityManager::return_csrk_cb( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::return_csrk_cb(
SecurityDb::entry_handle_t db_entry, SecurityDb::entry_handle_t db_entry,
const SecurityEntrySigning_t *signing const SecurityEntrySigning_t *signing
) { ) {
@ -998,7 +1042,8 @@ void GenericSecurityManager::return_csrk_cb(
); );
} }
void GenericSecurityManager::update_oob_presence(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::update_oob_presence(connection_handle_t connection) {
MBED_ASSERT(_db); MBED_ASSERT(_db);
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -1025,7 +1070,8 @@ void GenericSecurityManager::update_oob_presence(connection_handle_t connection)
} }
} }
void GenericSecurityManager::set_mitm_performed(connection_handle_t connection, bool enable) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::set_mitm_performed(connection_handle_t connection, bool enable) {
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (cb) { if (cb) {
cb->mitm_performed = enable; cb->mitm_performed = enable;
@ -1037,7 +1083,8 @@ void GenericSecurityManager::set_mitm_performed(connection_handle_t connection,
} }
} }
void GenericSecurityManager::on_connected( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_connected_(
connection_handle_t connection, connection_handle_t connection,
::Gap::Role_t role, ::Gap::Role_t role,
peer_address_type_t peer_address_type, peer_address_type_t peer_address_type,
@ -1067,8 +1114,8 @@ void GenericSecurityManager::on_connected(
(peer_address_type == peer_address_type_t::PUBLIC_IDENTITY); (peer_address_type == peer_address_type_t::PUBLIC_IDENTITY);
const bool signing = cb->signing_override_default ? const bool signing = cb->signing_override_default ?
cb->signing_requested : cb->signing_requested :
_default_key_distribution.get_signing(); _default_key_distribution.get_signing();
if (signing && flags->csrk_stored) { if (signing && flags->csrk_stored) {
_db->get_entry_peer_csrk( _db->get_entry_peer_csrk(
@ -1078,7 +1125,8 @@ void GenericSecurityManager::on_connected(
} }
} }
void GenericSecurityManager::on_disconnected( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_disconnected_(
connection_handle_t connection, connection_handle_t connection,
::Gap::DisconnectionReason_t reason ::Gap::DisconnectionReason_t reason
) { ) {
@ -1094,7 +1142,8 @@ void GenericSecurityManager::on_disconnected(
release_control_block(cb); release_control_block(cb);
} }
void GenericSecurityManager::on_security_entry_retrieved( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_security_entry_retrieved(
SecurityDb::entry_handle_t entry, SecurityDb::entry_handle_t entry,
const SecurityEntryIdentity_t* identity const SecurityEntryIdentity_t* identity
) { ) {
@ -1113,7 +1162,8 @@ void GenericSecurityManager::on_security_entry_retrieved(
); );
} }
void GenericSecurityManager::on_identity_list_retrieved( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_identity_list_retrieved(
ble::ArrayView<SecurityEntryIdentity_t>& identity_list, ble::ArrayView<SecurityEntryIdentity_t>& identity_list,
size_t count size_t count
) { ) {
@ -1140,7 +1190,8 @@ void GenericSecurityManager::on_identity_list_retrieved(
// Pairing // Pairing
// //
void GenericSecurityManager::on_pairing_request( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_pairing_request_(
connection_handle_t connection, connection_handle_t connection,
bool use_oob, bool use_oob,
AuthenticationMask authentication, AuthenticationMask authentication,
@ -1170,7 +1221,8 @@ void GenericSecurityManager::on_pairing_request(
} }
} }
void GenericSecurityManager::on_pairing_error( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_pairing_error_(
connection_handle_t connection, connection_handle_t connection,
pairing_failure_t error pairing_failure_t error
) { ) {
@ -1178,7 +1230,7 @@ void GenericSecurityManager::on_pairing_error(
eventHandler->pairingResult( eventHandler->pairingResult(
connection, connection,
(SecurityManager::SecurityCompletionStatus_t)(error.value() | 0x80) (SecurityCompletionStatus_t)(error.value() | 0x80)
); );
/* if this pairing was triggered by a failed encryption attempt /* if this pairing was triggered by a failed encryption attempt
@ -1192,16 +1244,18 @@ void GenericSecurityManager::on_pairing_error(
} }
} }
void GenericSecurityManager::on_pairing_timed_out(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_pairing_timed_out_(connection_handle_t connection) {
set_mitm_performed(connection, false); set_mitm_performed(connection, false);
eventHandler->pairingResult( eventHandler->pairingResult(
connection, connection,
SecurityManager::SEC_STATUS_TIMEOUT SEC_STATUS_TIMEOUT
); );
} }
void GenericSecurityManager::on_pairing_completed(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_pairing_completed_(connection_handle_t connection) {
MBED_ASSERT(_db); MBED_ASSERT(_db);
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (cb) { if (cb) {
@ -1213,7 +1267,7 @@ void GenericSecurityManager::on_pairing_completed(connection_handle_t connection
eventHandler->pairingResult( eventHandler->pairingResult(
connection, connection,
SecurityManager::SEC_STATUS_SUCCESS SEC_STATUS_SUCCESS
); );
} }
@ -1221,11 +1275,13 @@ void GenericSecurityManager::on_pairing_completed(connection_handle_t connection
// Security // Security
// //
void GenericSecurityManager::on_valid_mic_timeout(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_valid_mic_timeout_(connection_handle_t connection) {
(void)connection; (void)connection;
} }
void GenericSecurityManager::on_signed_write_received( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_signed_write_received_(
connection_handle_t connection, connection_handle_t connection,
sign_count_t sign_counter sign_count_t sign_counter
) { ) {
@ -1237,7 +1293,8 @@ void GenericSecurityManager::on_signed_write_received(
_db->set_entry_peer_sign_counter(cb->db_entry, sign_counter); _db->set_entry_peer_sign_counter(cb->db_entry, sign_counter);
} }
void GenericSecurityManager::on_signed_write_verification_failure( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_signed_write_verification_failure_(
connection_handle_t connection connection_handle_t connection
) { ) {
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
@ -1246,8 +1303,8 @@ void GenericSecurityManager::on_signed_write_verification_failure(
} }
const bool signing = cb->signing_override_default ? const bool signing = cb->signing_override_default ?
cb->signing_requested : cb->signing_requested :
_default_key_distribution.get_signing(); _default_key_distribution.get_signing();
if (signing) { if (signing) {
cb->csrk_failures++; cb->csrk_failures++;
@ -1262,12 +1319,14 @@ void GenericSecurityManager::on_signed_write_verification_failure(
} }
} }
void GenericSecurityManager::on_signed_write() { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_signed_write_() {
MBED_ASSERT(_db); MBED_ASSERT(_db);
_db->set_local_sign_counter(_db->get_local_sign_counter() + 1); _db->set_local_sign_counter(_db->get_local_sign_counter() + 1);
} }
void GenericSecurityManager::on_slave_security_request( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_slave_security_request_(
connection_handle_t connection, connection_handle_t connection,
AuthenticationMask authentication AuthenticationMask authentication
) { ) {
@ -1306,7 +1365,8 @@ void GenericSecurityManager::on_slave_security_request(
// Encryption // Encryption
// //
void GenericSecurityManager::on_link_encryption_result( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_link_encryption_result_(
connection_handle_t connection, connection_handle_t connection,
link_encryption_t result link_encryption_t result
) { ) {
@ -1347,7 +1407,8 @@ void GenericSecurityManager::on_link_encryption_result(
eventHandler->linkEncryptionResult(connection, result); eventHandler->linkEncryptionResult(connection, result);
} }
void GenericSecurityManager::on_link_encryption_request_timed_out( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_link_encryption_request_timed_out_(
connection_handle_t connection connection_handle_t connection
) { ) {
eventHandler->linkEncryptionResult( eventHandler->linkEncryptionResult(
@ -1360,7 +1421,8 @@ void GenericSecurityManager::on_link_encryption_request_timed_out(
// MITM // MITM
// //
void GenericSecurityManager::on_passkey_display( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_passkey_display_(
connection_handle_t connection, connection_handle_t connection,
passkey_num_t passkey passkey_num_t passkey
) { ) {
@ -1368,25 +1430,29 @@ void GenericSecurityManager::on_passkey_display(
eventHandler->passkeyDisplay(connection, PasskeyAscii(passkey).value()); eventHandler->passkeyDisplay(connection, PasskeyAscii(passkey).value());
} }
void GenericSecurityManager::on_keypress_notification( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keypress_notification_(
connection_handle_t connection, connection_handle_t connection,
SecurityManager::Keypress_t keypress Keypress_t keypress
) { ) {
set_mitm_performed(connection); set_mitm_performed(connection);
eventHandler->keypressNotification(connection, keypress); eventHandler->keypressNotification(connection, keypress);
} }
void GenericSecurityManager::on_passkey_request(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_passkey_request_(connection_handle_t connection) {
set_mitm_performed(connection); set_mitm_performed(connection);
eventHandler->passkeyRequest(connection); eventHandler->passkeyRequest(connection);
} }
void GenericSecurityManager::on_confirmation_request(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_confirmation_request_(connection_handle_t connection) {
set_mitm_performed(connection); set_mitm_performed(connection);
eventHandler->confirmationRequest(connection); eventHandler->confirmationRequest(connection);
} }
void GenericSecurityManager::on_secure_connections_oob_request(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_secure_connections_oob_request_(connection_handle_t connection) {
set_mitm_performed(connection); set_mitm_performed(connection);
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
@ -1408,7 +1474,8 @@ void GenericSecurityManager::on_secure_connections_oob_request(connection_handle
} }
} }
void GenericSecurityManager::on_legacy_pairing_oob_request(connection_handle_t connection) { template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_legacy_pairing_oob_request_(connection_handle_t connection) {
MBED_ASSERT(_db); MBED_ASSERT(_db);
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
if (!cb) { if (!cb) {
@ -1439,7 +1506,8 @@ void GenericSecurityManager::on_legacy_pairing_oob_request(connection_handle_t c
} }
} }
void GenericSecurityManager::on_secure_connections_oob_generated( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_secure_connections_oob_generated_(
const oob_lesc_value_t &random, const oob_lesc_value_t &random,
const oob_confirm_t &confirm const oob_confirm_t &confirm
) { ) {
@ -1451,7 +1519,8 @@ void GenericSecurityManager::on_secure_connections_oob_generated(
// Keys // Keys
// //
void GenericSecurityManager::on_secure_connections_ltk_generated( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_secure_connections_ltk_generated_(
connection_handle_t connection, connection_handle_t connection,
const ltk_t &ltk const ltk_t &ltk
) { ) {
@ -1473,7 +1542,8 @@ void GenericSecurityManager::on_secure_connections_ltk_generated(
_db->set_entry_local_ltk(cb->db_entry, ltk); _db->set_entry_local_ltk(cb->db_entry, ltk);
} }
void GenericSecurityManager::on_keys_distributed_ltk( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_ltk_(
connection_handle_t connection, connection_handle_t connection,
const ltk_t &ltk const ltk_t &ltk
) { ) {
@ -1493,7 +1563,8 @@ void GenericSecurityManager::on_keys_distributed_ltk(
_db->set_entry_peer_ltk(cb->db_entry, ltk); _db->set_entry_peer_ltk(cb->db_entry, ltk);
} }
void GenericSecurityManager::on_keys_distributed_ediv_rand( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_ediv_rand_(
connection_handle_t connection, connection_handle_t connection,
const ediv_t &ediv, const ediv_t &ediv,
const rand_t &rand const rand_t &rand
@ -1507,7 +1578,8 @@ void GenericSecurityManager::on_keys_distributed_ediv_rand(
_db->set_entry_peer_ediv_rand(cb->db_entry, ediv, rand); _db->set_entry_peer_ediv_rand(cb->db_entry, ediv, rand);
} }
void GenericSecurityManager::on_keys_distributed_local_ltk( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_local_ltk_(
connection_handle_t connection, connection_handle_t connection,
const ltk_t &ltk const ltk_t &ltk
) { ) {
@ -1525,7 +1597,8 @@ void GenericSecurityManager::on_keys_distributed_local_ltk(
_db->set_entry_local_ltk(cb->db_entry, ltk); _db->set_entry_local_ltk(cb->db_entry, ltk);
} }
void GenericSecurityManager::on_keys_distributed_local_ediv_rand( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_local_ediv_rand_(
connection_handle_t connection, connection_handle_t connection,
const ediv_t &ediv, const ediv_t &ediv,
const rand_t &rand const rand_t &rand
@ -1539,7 +1612,8 @@ void GenericSecurityManager::on_keys_distributed_local_ediv_rand(
_db->set_entry_local_ediv_rand(cb->db_entry, ediv, rand); _db->set_entry_local_ediv_rand(cb->db_entry, ediv, rand);
} }
void GenericSecurityManager::on_keys_distributed_irk( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_irk_(
connection_handle_t connection, connection_handle_t connection,
const irk_t &irk const irk_t &irk
) { ) {
@ -1557,7 +1631,8 @@ void GenericSecurityManager::on_keys_distributed_irk(
_db->set_entry_peer_irk(cb->db_entry, irk); _db->set_entry_peer_irk(cb->db_entry, irk);
} }
void GenericSecurityManager::on_keys_distributed_bdaddr( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_bdaddr_(
connection_handle_t connection, connection_handle_t connection,
advertising_peer_address_type_t peer_address_type, advertising_peer_address_type_t peer_address_type,
const address_t &peer_identity_address const address_t &peer_identity_address
@ -1575,7 +1650,8 @@ void GenericSecurityManager::on_keys_distributed_bdaddr(
); );
} }
void GenericSecurityManager::on_keys_distributed_csrk( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_keys_distributed_csrk_(
connection_handle_t connection, connection_handle_t connection,
const csrk_t &csrk const csrk_t &csrk
) { ) {
@ -1600,7 +1676,8 @@ void GenericSecurityManager::on_keys_distributed_csrk(
); );
} }
void GenericSecurityManager::on_ltk_request( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_ltk_request_(
connection_handle_t connection, connection_handle_t connection,
const ediv_t &ediv, const ediv_t &ediv,
const rand_t &rand const rand_t &rand
@ -1626,7 +1703,8 @@ void GenericSecurityManager::on_ltk_request(
/* control blocks list management */ /* control blocks list management */
GenericSecurityManager::ControlBlock_t::ControlBlock_t() : template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
GenericSecurityManager<TPalSecurityManager, SigningMonitor>::ControlBlock_t::ControlBlock_t() :
connection(0), connection(0),
db_entry(0), db_entry(0),
local_address(), local_address(),
@ -1646,7 +1724,8 @@ GenericSecurityManager::ControlBlock_t::ControlBlock_t() :
legacy_pairing_oob_request_pending(false), legacy_pairing_oob_request_pending(false),
csrk_failures(0) { } csrk_failures(0) { }
void GenericSecurityManager::on_ltk_request(connection_handle_t connection) template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::on_ltk_request_(connection_handle_t connection)
{ {
MBED_ASSERT(_db); MBED_ASSERT(_db);
ControlBlock_t *cb = get_control_block(connection); ControlBlock_t *cb = get_control_block(connection);
@ -1660,8 +1739,9 @@ void GenericSecurityManager::on_ltk_request(connection_handle_t connection)
); );
} }
GenericSecurityManager::ControlBlock_t* template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
GenericSecurityManager::acquire_control_block(connection_handle_t connection) typename GenericSecurityManager<TPalSecurityManager, SigningMonitor>::ControlBlock_t*
GenericSecurityManager<TPalSecurityManager, SigningMonitor>::acquire_control_block(connection_handle_t connection)
{ {
/* grab the first disconnected slot*/ /* grab the first disconnected slot*/
for (size_t i = 0; i < MAX_CONTROL_BLOCKS; i++) { for (size_t i = 0; i < MAX_CONTROL_BLOCKS; i++) {
@ -1676,7 +1756,9 @@ GenericSecurityManager::acquire_control_block(connection_handle_t connection)
return NULL; return NULL;
} }
GenericSecurityManager::ControlBlock_t* GenericSecurityManager::get_control_block( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
typename GenericSecurityManager<TPalSecurityManager, SigningMonitor>::ControlBlock_t*
GenericSecurityManager<TPalSecurityManager, SigningMonitor>::get_control_block(
connection_handle_t connection connection_handle_t connection
) { ) {
for (size_t i = 0; i < MAX_CONTROL_BLOCKS; i++) { for (size_t i = 0; i < MAX_CONTROL_BLOCKS; i++) {
@ -1689,7 +1771,9 @@ GenericSecurityManager::ControlBlock_t* GenericSecurityManager::get_control_bloc
return NULL; return NULL;
} }
GenericSecurityManager::ControlBlock_t* GenericSecurityManager::get_control_block( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
typename GenericSecurityManager<TPalSecurityManager, SigningMonitor>::ControlBlock_t*
GenericSecurityManager<TPalSecurityManager, SigningMonitor>::get_control_block(
const address_t &peer_address const address_t &peer_address
) { ) {
MBED_ASSERT(_db); MBED_ASSERT(_db);
@ -1705,7 +1789,9 @@ GenericSecurityManager::ControlBlock_t* GenericSecurityManager::get_control_bloc
return NULL; return NULL;
} }
GenericSecurityManager::ControlBlock_t* GenericSecurityManager::get_control_block( template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
typename GenericSecurityManager<TPalSecurityManager, SigningMonitor>::ControlBlock_t*
GenericSecurityManager<TPalSecurityManager, SigningMonitor>::get_control_block(
SecurityDb::entry_handle_t db_entry SecurityDb::entry_handle_t db_entry
) { ) {
for (size_t i = 0; i < MAX_CONTROL_BLOCKS; i++) { for (size_t i = 0; i < MAX_CONTROL_BLOCKS; i++) {
@ -1718,7 +1804,8 @@ GenericSecurityManager::ControlBlock_t* GenericSecurityManager::get_control_bloc
return NULL; return NULL;
} }
void GenericSecurityManager::release_control_block(ControlBlock_t* cb) template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
void GenericSecurityManager<TPalSecurityManager, SigningMonitor>::release_control_block(ControlBlock_t* cb)
{ {
*cb = ControlBlock_t(); *cb = ControlBlock_t();
} }