pointers changed to references for a consistent PAL

pull/6188/head
paul-szczepanek-arm 2018-02-11 18:08:21 +00:00
parent 68db4dd52f
commit 934d8f9235
5 changed files with 207 additions and 237 deletions

View File

@ -334,10 +334,10 @@ protected:
}; };
/** 128 bit keys used by paired devices */ /** 128 bit keys used by paired devices */
class key_t : public octet_type_t<16> {} ; struct key_t : public octet_type_t<16> {} ;
class irk_t : public key_t {}; struct irk_t : public key_t {};
class csrk_t : public key_t {}; struct csrk_t : public key_t {};
class ltk_t : public key_t {}; struct ltk_t : public key_t {};
/** Used to identify LTK for legacy pairing connections */ /** Used to identify LTK for legacy pairing connections */
typedef octet_type_t<2> ediv_t; typedef octet_type_t<2> ediv_t;
@ -361,7 +361,7 @@ typedef octet_type_t<32> dhkey_t;
/** /**
* MAC address data type. * MAC address data type.
*/ */
struct address_t : public octet_type_t<6>{ struct address_t : public octet_type_t<6> {
/** /**
* Create an invalid mac address, equal to FF:FF:FF:FF:FF:FF * Create an invalid mac address, equal to FF:FF:FF:FF:FF:FF
*/ */

View File

@ -182,8 +182,19 @@ public:
virtual void get_entry_local_keys( virtual void get_entry_local_keys(
SecurityEntryKeysDbCb_t cb, SecurityEntryKeysDbCb_t cb,
connection_handle_t connection, connection_handle_t connection,
const ediv_t *ediv, const ediv_t &ediv,
const rand_t *rand const rand_t &rand
) = 0;
/**
* Retrieve stored LTK generated during secure connections pairing.
*
* @param[in] cb callback that will receive the LTK struct
* @param[in] connection handle for the connection requesting the key
*/
virtual void get_entry_local_keys(
SecurityEntryKeysDbCb_t cb,
connection_handle_t connection
) = 0; ) = 0;
/** /**
@ -195,7 +206,7 @@ public:
*/ */
virtual void set_entry_local_ltk( virtual void set_entry_local_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) = 0; ) = 0;
/** /**
@ -207,8 +218,8 @@ public:
*/ */
virtual void set_entry_local_ediv_rand( virtual void set_entry_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
) = 0; ) = 0;
/* peer's keys */ /* peer's keys */
@ -237,29 +248,6 @@ public:
connection_handle_t connection connection_handle_t connection
) = 0; ) = 0;
/**
* Update all values in one call.
*
* @param[in] connection for which the values are being updated
* @param[in] address_is_public is the address public or private
* @param[in] peer_address identity address of the peer
* @param[in] ediv EDIV value
* @param[in] rand RAND value
* @param[in] ltk LTK value
* @param[in] irk IRK value
* @param[in] csrk CSRK value
*/
virtual void set_entry_peer(
connection_handle_t connection,
bool address_is_public,
const address_t &peer_address,
const ediv_t *ediv,
const rand_t *rand,
const ltk_t *ltk,
const irk_t *irk,
const csrk_t *csrk
) = 0;
/** /**
* Save new LTK received from the peer. * Save new LTK received from the peer.
* *
@ -269,7 +257,7 @@ public:
*/ */
virtual void set_entry_peer_ltk( virtual void set_entry_peer_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) = 0; ) = 0;
/** /**
@ -281,8 +269,8 @@ public:
*/ */
virtual void set_entry_peer_ediv_rand( virtual void set_entry_peer_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
) = 0; ) = 0;
/** /**
@ -293,7 +281,7 @@ public:
*/ */
virtual void set_entry_peer_irk( virtual void set_entry_peer_irk(
connection_handle_t connection, connection_handle_t connection,
const irk_t *irk const irk_t &irk
) = 0; ) = 0;
/** /**
@ -317,7 +305,7 @@ public:
*/ */
virtual void set_entry_peer_csrk( virtual void set_entry_peer_csrk(
connection_handle_t connection, connection_handle_t connection,
const csrk_t *csrk const csrk_t &csrk
) = 0; ) = 0;
/* local csrk */ /* local csrk */
@ -335,7 +323,7 @@ public:
* @param[in] csrk new CSRK value * @param[in] csrk new CSRK value
*/ */
virtual void set_local_csrk( virtual void set_local_csrk(
const csrk_t *csrk const csrk_t &csrk
) = 0; ) = 0;
/* public keys */ /* public keys */
@ -361,8 +349,8 @@ public:
* @param[in] public_key_y new public key value of the y coordinate * @param[in] public_key_y new public key value of the y coordinate
*/ */
virtual void set_public_key( virtual void set_public_key(
const public_key_t& public_key_x, const public_key_t &public_key_x,
const public_key_t& public_key_y const public_key_t &public_key_y
) = 0; ) = 0;
/* oob data */ /* oob data */
@ -401,10 +389,10 @@ public:
* @param[out] local_random random number chosen by the local device * @param[out] local_random random number chosen by the local device
*/ */
virtual void get_sc_oob_data( virtual void get_sc_oob_data(
address_t& peer_address, address_t &peer_address,
oob_rand_t& peer_random, oob_rand_t &peer_random,
oob_confirm_t& peer_confirm, oob_confirm_t &peer_confirm,
oob_rand_t& local_random oob_rand_t &local_random
) = 0; ) = 0;
/** /**
@ -424,9 +412,9 @@ public:
* on the random number, its public key and address * on the random number, its public key and address
*/ */
virtual void set_peer_sc_oob_data( virtual void set_peer_sc_oob_data(
const address_t& address, const address_t &address,
const oob_rand_t& random, const oob_rand_t &random,
const oob_confirm_t& confirm const oob_confirm_t &confirm
) = 0; ) = 0;
/** /**
@ -435,7 +423,7 @@ public:
* @param random random number chosen by the local device * @param random random number chosen by the local device
*/ */
virtual void set_local_sc_oob_random( virtual void set_local_sc_oob_random(
const oob_rand_t& random const oob_rand_t &random
) = 0; ) = 0;
/* list management */ /* list management */
@ -454,8 +442,8 @@ public:
virtual SecurityEntry_t* connect_entry( virtual SecurityEntry_t* connect_entry(
connection_handle_t connection, connection_handle_t connection,
BLEProtocol::AddressType_t peer_address_type, BLEProtocol::AddressType_t peer_address_type,
const address_t& peer_address, const address_t &peer_address,
const address_t& local_address const address_t &local_address
) = 0; ) = 0;
/** /**
@ -515,7 +503,7 @@ public:
* @param[in] whitelist * @param[in] whitelist
*/ */
virtual void set_whitelist( virtual void set_whitelist(
const Gap::Whitelist_t& whitelist const Gap::Whitelist_t &whitelist
) = 0; ) = 0;
/** /**
@ -609,8 +597,8 @@ public:
virtual void get_entry_local_keys( virtual void get_entry_local_keys(
SecurityEntryKeysDbCb_t cb, SecurityEntryKeysDbCb_t cb,
connection_handle_t connection, connection_handle_t connection,
const ediv_t *ediv, const ediv_t &ediv,
const rand_t *rand const rand_t &rand
) { ) {
SecurityEntry_t *entry = NULL; SecurityEntry_t *entry = NULL;
db_store_t *store = get_store(connection); db_store_t *store = get_store(connection);
@ -619,35 +607,53 @@ public:
} }
/* validate we have the correct key */ /* validate we have the correct key */
if (ediv && rand if (ediv == store->local_keys.ediv
&& *ediv == store->local_keys.ediv && rand == store->local_keys.rand) {
&& *rand == store->local_keys.rand) {
cb(entry, &store->local_keys); cb(entry, &store->local_keys);
} else { } else {
cb(entry, NULL); cb(entry, NULL);
} }
} }
virtual void get_entry_local_keys(
SecurityEntryKeysDbCb_t cb,
connection_handle_t connection
) {
SecurityEntry_t *entry = NULL;
db_store_t *store = get_store(connection);
if (store) {
entry = &store->entry;
}
/* validate we have the correct key */
if (entry->secure_connections_paired) {
cb(entry, &store->local_keys);
} else {
cb(entry, NULL);
}
}
/* set */ /* set */
virtual void set_entry_local_ltk( virtual void set_entry_local_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) { ) {
db_store_t *store = get_store(connection); db_store_t *store = get_store(connection);
if (store) { if (store) {
store->local_keys.ltk = *ltk; store->local_keys.ltk = ltk;
} }
} }
virtual void set_entry_local_ediv_rand( virtual void set_entry_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
) { ) {
db_store_t *store = get_store(connection); db_store_t *store = get_store(connection);
if (store) { if (store) {
store->local_keys.ediv = *ediv; store->local_keys.ediv = ediv;
store->local_keys.rand = *rand; store->local_keys.rand = rand;
} }
} }
@ -683,27 +689,6 @@ public:
} }
/* set */ /* set */
virtual void set_entry_peer(
connection_handle_t connection,
bool address_is_public,
const address_t &peer_address,
const ediv_t *ediv,
const rand_t *rand,
const ltk_t *ltk,
const irk_t *irk,
const csrk_t *csrk
) {
db_store_t *store = get_store(connection);
if (store) {
store->peer_keys.ltk = *ltk;
store->peer_keys.ediv = *ediv;
store->peer_keys.rand = *rand;
store->csrk = *csrk;
size_t index = store - _db;
_identities[index].irk = *irk;
_identities[index].identity_address = peer_address;
}
}
virtual void set_entry_peer_ltk( virtual void set_entry_peer_ltk(
connection_handle_t connection, connection_handle_t connection,
@ -717,24 +702,24 @@ public:
virtual void set_entry_peer_ediv_rand( virtual void set_entry_peer_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
) { ) {
db_store_t *store = get_store(connection); db_store_t *store = get_store(connection);
if (store) { if (store) {
store->peer_keys.ediv = *ediv; store->peer_keys.ediv = ediv;
store->peer_keys.rand = *rand; store->peer_keys.rand = rand;
} }
} }
virtual void set_entry_peer_irk( virtual void set_entry_peer_irk(
connection_handle_t connection, connection_handle_t connection,
const irk_t *irk const irk_t &irk
) { ) {
db_store_t *store = get_store(connection); db_store_t *store = get_store(connection);
if (store) { if (store) {
size_t index = store - _db; size_t index = store - _db;
_identities[index].irk = *irk; _identities[index].irk = irk;
} }
} }
@ -752,11 +737,11 @@ public:
virtual void set_entry_peer_csrk( virtual void set_entry_peer_csrk(
connection_handle_t connection, connection_handle_t connection,
const csrk_t *csrk const csrk_t &csrk
) { ) {
db_store_t *store = get_store(connection); db_store_t *store = get_store(connection);
if (store) { if (store) {
store->csrk = *csrk; store->csrk = csrk;
} }
} }
@ -766,8 +751,8 @@ public:
return &_local_csrk; return &_local_csrk;
} }
virtual void set_local_csrk(const csrk_t *csrk) { virtual void set_local_csrk(const csrk_t &csrk) {
_local_csrk = *csrk; _local_csrk = csrk;
} }
/* public key */ /* public key */
@ -781,8 +766,8 @@ public:
} }
virtual void set_public_key( virtual void set_public_key(
const public_key_t& public_key_x, const public_key_t &public_key_x,
const public_key_t& public_key_y const public_key_t &public_key_y
) { ) {
_public_key_x = public_key_x; _public_key_x = public_key_x;
_public_key_y = public_key_y; _public_key_y = public_key_y;
@ -805,10 +790,10 @@ public:
} }
virtual void get_sc_oob_data( virtual void get_sc_oob_data(
address_t& peer_address, address_t &peer_address,
oob_rand_t& peer_random, oob_rand_t &peer_random,
oob_confirm_t& peer_confirm, oob_confirm_t &peer_confirm,
oob_rand_t& local_random oob_rand_t &local_random
) { ) {
peer_address = _peer_sc_oob_address; peer_address = _peer_sc_oob_address;
peer_random = _peer_sc_oob_random; peer_random = _peer_sc_oob_random;
@ -821,9 +806,9 @@ public:
} }
virtual void set_peer_sc_oob_data( virtual void set_peer_sc_oob_data(
const address_t& address, const address_t &address,
const oob_rand_t& random, const oob_rand_t &random,
const oob_confirm_t& confirm const oob_confirm_t &confirm
) { ) {
_peer_sc_oob_address = address; _peer_sc_oob_address = address;
_peer_sc_oob_random = random; _peer_sc_oob_random = random;
@ -831,7 +816,7 @@ public:
} }
virtual void set_local_sc_oob_random( virtual void set_local_sc_oob_random(
const oob_rand_t& random const oob_rand_t &random
) { ) {
_local_sc_oob_random = random; _local_sc_oob_random = random;
} }
@ -841,8 +826,8 @@ public:
virtual SecurityEntry_t* connect_entry( virtual SecurityEntry_t* connect_entry(
connection_handle_t connection, connection_handle_t connection,
BLEProtocol::AddressType_t peer_address_type, BLEProtocol::AddressType_t peer_address_type,
const address_t& peer_address, const address_t &peer_address,
const address_t& local_address const address_t &local_address
) { ) {
const bool peer_address_public = const bool peer_address_public =
(peer_address_type == BLEProtocol::AddressType::PUBLIC); (peer_address_type == BLEProtocol::AddressType::PUBLIC);
@ -906,7 +891,7 @@ public:
cb(whitelist); cb(whitelist);
} }
virtual void update_whitelist(Gap::Whitelist_t& whitelist) { } virtual void update_whitelist(Gap::Whitelist_t &whitelist) { }
virtual void add_whitelist_entry(const address_t &address) { } virtual void add_whitelist_entry(const address_t &address) { }

View File

@ -363,6 +363,14 @@ private:
); );
#endif #endif
/**
* Set the MITM protection setting on the database entry
*
* @param[in] connectionHandle Handle to identify the connection.
* @param[in] enable if true set the MITM protection to on.
*/
virtual void set_mitm_performed(connection_handle_t connection, bool enable = true);
/** /**
* Inform the security manager that a device has been disconnected and its * Inform the security manager that a device has been disconnected and its
* entry can be put in NVM storage. Called by GAP. * entry can be put in NVM storage. Called by GAP.
@ -492,10 +500,6 @@ public:
// MITM // MITM
// //
/** @copydoc SecurityManagerEventHandler::set_mitm_performed
*/
virtual void set_mitm_performed(connection_handle_t connection, bool enable = true);
/** @copydoc SecurityManagerEventHandler::on_passkey_display /** @copydoc SecurityManagerEventHandler::on_passkey_display
*/ */
virtual void on_passkey_display( virtual void on_passkey_display(
@ -549,57 +553,44 @@ public:
*/ */
virtual void on_secure_connections_ltk_generated( virtual void on_secure_connections_ltk_generated(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
);
/** @copydoc SecurityManagerEventHandler::on_keys_distributed
*/
virtual void on_keys_distributed(
connection_handle_t connection,
advertising_peer_address_type_t peer_address_type,
const address_t &peer_identity_address,
const ediv_t *ediv,
const rand_t *rand,
const ltk_t *ltk,
const irk_t *irk,
const csrk_t *csrk
); );
/** @copydoc SecurityManagerEventHandler::on_keys_distributed_ltk /** @copydoc SecurityManagerEventHandler::on_keys_distributed_ltk
*/ */
virtual void on_keys_distributed_ltk( virtual void on_keys_distributed_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
); );
/** @copydoc SecurityManagerEventHandler::on_keys_distributed_ediv_rand /** @copydoc SecurityManagerEventHandler::on_keys_distributed_ediv_rand
*/ */
virtual void on_keys_distributed_ediv_rand( virtual 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
); );
/** @copydoc SecurityManagerEventHandler::on_keys_distributed_local_ltk /** @copydoc SecurityManagerEventHandler::on_keys_distributed_local_ltk
*/ */
virtual void on_keys_distributed_local_ltk( virtual void on_keys_distributed_local_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
); );
/** @copydoc SecurityManagerEventHandler::on_keys_distributed_local_ediv_rand /** @copydoc SecurityManagerEventHandler::on_keys_distributed_local_ediv_rand
*/ */
virtual void on_keys_distributed_local_ediv_rand( virtual 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
); );
/** @copydoc SecurityManagerEventHandler::on_keys_distributed_irk /** @copydoc SecurityManagerEventHandler::on_keys_distributed_irk
*/ */
virtual void on_keys_distributed_irk( virtual void on_keys_distributed_irk(
connection_handle_t connection, connection_handle_t connection,
const irk_t *irk const irk_t &irk
); );
/** @copydoc SecurityManagerEventHandler::on_keys_distributed_bdaddr /** @copydoc SecurityManagerEventHandler::on_keys_distributed_bdaddr
@ -614,15 +605,21 @@ public:
*/ */
virtual void on_keys_distributed_csrk( virtual void on_keys_distributed_csrk(
connection_handle_t connection, connection_handle_t connection,
const csrk_t *csrk const csrk_t &csrk
); );
/** @copydoc SecurityManagerEventHandler::on_ltk_requeston_ltk_request /** @copydoc SecurityManagerEventHandler::on_ltk_requeston_ltk_request
*/ */
virtual void on_ltk_request( virtual 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
);
/** @copydoc SecurityManagerEventHandler::on_ltk_requeston_ltk_request
*/
virtual void on_ltk_request(
connection_handle_t connection
); );
/* end implements ble::pal::SecurityManagerEventHandler */ /* end implements ble::pal::SecurityManagerEventHandler */

View File

@ -398,30 +398,7 @@ public:
*/ */
virtual void on_secure_connections_ltk_generated( virtual void on_secure_connections_ltk_generated(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) = 0;
/**
* Store the results of key distribution after all the keys have been received.
*
* @param[in] connection connection handle
* @param[in] peer_address_type public or private address indication from the SMP
* @param[in] peer_address identity address from the peer
* @param[in] ediv encryption diversifier from the peer
* @param[in] rand random value from the peer
* @param[in] ltk long term key from the peer
* @param[in] irk identity resolution key
* @param[in] csrk signing key
*/
virtual void on_keys_distributed(
connection_handle_t connection,
advertising_peer_address_type_t peer_address_type,
const address_t &peer_address,
const ediv_t *ediv,
const rand_t *rand,
const ltk_t *ltk,
const irk_t *irk,
const csrk_t *csrk
) = 0; ) = 0;
/** /**
@ -432,7 +409,7 @@ public:
*/ */
virtual void on_keys_distributed_ltk( virtual void on_keys_distributed_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) = 0; ) = 0;
/** /**
@ -443,8 +420,8 @@ public:
*/ */
virtual void on_keys_distributed_ediv_rand( virtual 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
) = 0; ) = 0;
/** /**
@ -456,7 +433,7 @@ public:
*/ */
virtual void on_keys_distributed_local_ltk( virtual void on_keys_distributed_local_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) = 0; ) = 0;
/** /**
@ -471,8 +448,8 @@ public:
*/ */
virtual void on_keys_distributed_local_ediv_rand( virtual 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
) = 0; ) = 0;
/** /**
@ -483,7 +460,7 @@ public:
*/ */
virtual void on_keys_distributed_irk( virtual void on_keys_distributed_irk(
connection_handle_t connection, connection_handle_t connection,
const irk_t *irk const irk_t &irk
) = 0; ) = 0;
/** /**
@ -507,7 +484,7 @@ public:
*/ */
virtual void on_keys_distributed_csrk( virtual void on_keys_distributed_csrk(
connection_handle_t connection, connection_handle_t connection,
const csrk_t *csrk const csrk_t &csrk
) = 0; ) = 0;
/** /**
@ -521,8 +498,19 @@ public:
*/ */
virtual void on_ltk_request( virtual 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
) = 0;
/**
* Request the LTK since the peer is asking us to encrypt the link.
* @note No EDIV or RAND is provided as this requests a secure
* connections LTK where their values are all zeroes
*
* @param[in] connection connection handle
*/
virtual void on_ltk_request(
connection_handle_t connection
) = 0; ) = 0;
}; };
@ -770,9 +758,22 @@ public:
*/ */
virtual ble_error_t enable_encryption( virtual ble_error_t enable_encryption(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk, const ltk_t &ltk,
const rand_t *rand = NULL, const rand_t &rand,
const ediv_t *ediv = NULL const ediv_t &ediv
) = 0;
/**
* Enabled encryption using the LTK given on a connection established with secure
* connections pairing.
*
* @param[in] connection connection handle
* @param[in] ltk long term key from the peer
* @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure
*/
virtual ble_error_t enable_encryption(
connection_handle_t connection,
const ltk_t &ltk
) = 0; ) = 0;
virtual ble_error_t disable_encryption( virtual ble_error_t disable_encryption(
@ -800,7 +801,7 @@ public:
* @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure
*/ */
virtual ble_error_t encrypt_data( virtual ble_error_t encrypt_data(
const key_t *key, const key_t &key,
encryption_block_t &data encryption_block_t &data
) = 0; ) = 0;
@ -820,12 +821,22 @@ public:
* Set the LTK that is to be used for encryption. * Set the LTK that is to be used for encryption.
* *
* @param[in] connection connection handle * @param[in] connection connection handle
* @param[in] ltk long term key, NULL if key has not been found * @param[in] ltk long term key
* @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure
*/ */
virtual ble_error_t set_ltk( virtual ble_error_t set_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) = 0;
/**
* Inform the stack we don't have the LTK.
*
* @param[in] connection connection handle
* @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure
*/
virtual ble_error_t set_ltk_not_found(
connection_handle_t connection
) = 0; ) = 0;
/** /**
@ -835,7 +846,7 @@ public:
* @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure
*/ */
virtual ble_error_t set_irk( virtual ble_error_t set_irk(
const irk_t *irk const irk_t &irk
) = 0; ) = 0;
/** /**
@ -845,7 +856,7 @@ public:
* @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure * @retval BLE_ERROR_NONE On success, else an error code indicating reason for failure
*/ */
virtual ble_error_t set_csrk( virtual ble_error_t set_csrk(
const csrk_t *csrk const csrk_t &csrk
) = 0; ) = 0;
/** /**

View File

@ -539,9 +539,9 @@ ble_error_t GenericSecurityManager::init_signing() {
} }
pcsrk = &csrk; pcsrk = &csrk;
_db.set_local_csrk(pcsrk); _db.set_local_csrk(csrk);
} }
return _pal.set_csrk(pcsrk); return _pal.set_csrk(*pcsrk);
} }
ble_error_t GenericSecurityManager::get_random_data(uint8_t *buffer, size_t size) { ble_error_t GenericSecurityManager::get_random_data(uint8_t *buffer, size_t size) {
@ -598,7 +598,11 @@ void GenericSecurityManager::enable_encryption_cb(
const SecurityEntryKeys_t* entryKeys const SecurityEntryKeys_t* entryKeys
) { ) {
if (entry && entryKeys) { if (entry && entryKeys) {
_pal.enable_encryption(entry->handle, &entryKeys->ltk, &entryKeys->rand, &entryKeys->ediv); if (entry->secure_connections_paired) {
_pal.enable_encryption(entry->handle, entryKeys->ltk);
} else {
_pal.enable_encryption(entry->handle, entryKeys->ltk, entryKeys->rand, entryKeys->ediv);
}
} }
} }
@ -608,9 +612,9 @@ void GenericSecurityManager::set_ltk_cb(
) { ) {
if (entry) { if (entry) {
if (entryKeys) { if (entryKeys) {
_pal.set_ltk(entry->handle, &entryKeys->ltk); _pal.set_ltk(entry->handle, entryKeys->ltk);
} else { } else {
_pal.set_ltk(entry->handle, NULL); _pal.set_ltk_not_found(entry->handle);
} }
} }
} }
@ -716,6 +720,13 @@ bool GenericSecurityManager::crypto_toolbox_f4(
} }
#endif #endif
void GenericSecurityManager::set_mitm_performed(connection_handle_t connection, bool enable) {
SecurityEntry_t *entry = _db.get_entry(connection);
if (entry) {
entry->mitm_performed = true;
}
}
void GenericSecurityManager::on_disconnected(connection_handle_t connection) { void GenericSecurityManager::on_disconnected(connection_handle_t connection) {
SecurityEntry_t *entry = _db.get_entry(connection); SecurityEntry_t *entry = _db.get_entry(connection);
if (!entry) { if (!entry) {
@ -922,13 +933,6 @@ void GenericSecurityManager::on_link_encryption_request_timed_out(
// MITM // MITM
// //
void GenericSecurityManager::set_mitm_performed(connection_handle_t connection, bool enable) {
SecurityEntry_t *entry = _db.get_entry(connection);
if (entry) {
entry->mitm_performed = true;
}
}
void GenericSecurityManager::on_passkey_display( void GenericSecurityManager::on_passkey_display(
connection_handle_t connection, connection_handle_t connection,
passkey_num_t passkey passkey_num_t passkey
@ -1011,7 +1015,7 @@ void GenericSecurityManager::on_public_key_generated(
void GenericSecurityManager::on_secure_connections_ltk_generated( void GenericSecurityManager::on_secure_connections_ltk_generated(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) { ) {
SecurityEntry_t *entry = _db.get_entry(connection); SecurityEntry_t *entry = _db.get_entry(connection);
if (!entry) { if (!entry) {
@ -1024,45 +1028,9 @@ void GenericSecurityManager::on_secure_connections_ltk_generated(
_db.set_entry_peer_ltk(connection, ltk); _db.set_entry_peer_ltk(connection, ltk);
} }
void GenericSecurityManager::on_keys_distributed(
connection_handle_t connection,
advertising_peer_address_type_t peer_address_type,
const address_t &peer_identity_address,
const ediv_t *ediv,
const rand_t *rand,
const ltk_t *ltk,
const irk_t *irk,
const csrk_t *csrk
) {
SecurityEntry_t *entry = _db.get_entry(connection);
if (!entry) {
return;
}
entry->ltk_mitm_protected = entry->mitm_performed;
entry->csrk_mitm_protected = entry->mitm_performed;
_db.set_entry_peer(
connection,
(peer_address_type == advertising_peer_address_type_t::PUBLIC_ADDRESS),
peer_identity_address,
ediv,
rand,
ltk,
irk,
csrk
);
eventHandler->signingKey(
connection,
csrk,
entry->csrk_mitm_protected
);
}
void GenericSecurityManager::on_keys_distributed_ltk( void GenericSecurityManager::on_keys_distributed_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) { ) {
SecurityEntry_t *entry = _db.get_entry(connection); SecurityEntry_t *entry = _db.get_entry(connection);
if (!entry) { if (!entry) {
@ -1074,30 +1042,30 @@ void GenericSecurityManager::on_keys_distributed_ltk(
void GenericSecurityManager::on_keys_distributed_ediv_rand( void GenericSecurityManager::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
) { ) {
_db.set_entry_peer_ediv_rand(connection, ediv, rand); _db.set_entry_peer_ediv_rand(connection, ediv, rand);
} }
void GenericSecurityManager::on_keys_distributed_local_ltk( void GenericSecurityManager::on_keys_distributed_local_ltk(
connection_handle_t connection, connection_handle_t connection,
const ltk_t *ltk const ltk_t &ltk
) { ) {
_db.set_entry_local_ltk(connection, ltk); _db.set_entry_local_ltk(connection, ltk);
} }
void GenericSecurityManager::on_keys_distributed_local_ediv_rand( void GenericSecurityManager::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
) { ) {
_db.set_entry_local_ediv_rand(connection, ediv, rand); _db.set_entry_local_ediv_rand(connection, ediv, rand);
} }
void GenericSecurityManager::on_keys_distributed_irk( void GenericSecurityManager::on_keys_distributed_irk(
connection_handle_t connection, connection_handle_t connection,
const irk_t *irk const irk_t &irk
) { ) {
_db.set_entry_peer_irk(connection, irk); _db.set_entry_peer_irk(connection, irk);
} }
@ -1116,7 +1084,7 @@ void GenericSecurityManager::on_keys_distributed_bdaddr(
void GenericSecurityManager::on_keys_distributed_csrk( void GenericSecurityManager::on_keys_distributed_csrk(
connection_handle_t connection, connection_handle_t connection,
const csrk_t *csrk const csrk_t &csrk
) { ) {
SecurityEntry_t *entry = _db.get_entry(connection); SecurityEntry_t *entry = _db.get_entry(connection);
if (!entry) { if (!entry) {
@ -1129,15 +1097,15 @@ void GenericSecurityManager::on_keys_distributed_csrk(
eventHandler->signingKey( eventHandler->signingKey(
connection, connection,
csrk, &csrk,
entry->csrk_mitm_protected entry->csrk_mitm_protected
); );
} }
void GenericSecurityManager::on_ltk_request( void GenericSecurityManager::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
) { ) {
_db.get_entry_local_keys( _db.get_entry_local_keys(
mbed::callback(this, &GenericSecurityManager::set_ltk_cb), mbed::callback(this, &GenericSecurityManager::set_ltk_cb),
@ -1147,5 +1115,14 @@ void GenericSecurityManager::on_ltk_request(
); );
} }
void GenericSecurityManager::on_ltk_request(
connection_handle_t connection
) {
_db.get_entry_local_keys(
mbed::callback(this, &GenericSecurityManager::set_ltk_cb),
connection
);
}
} /* namespace generic */ } /* namespace generic */
} /* namespace ble */ } /* namespace ble */