From 9283413c4c9327196f03f0716a2948ef954ba0c8 Mon Sep 17 00:00:00 2001 From: paul-szczepanek-arm <33840200+paul-szczepanek-arm@users.noreply.github.com> Date: Thu, 29 Mar 2018 15:44:15 +0100 Subject: [PATCH] count failures, trigger reparing when verification fails --- .../ble/generic/GenericSecurityManager.h | 4 +++- .../FEATURE_BLE/ble/pal/PalSecurityManager.h | 4 ++-- .../source/generic/GenericSecurityManager.cpp | 21 +++++++++++++++---- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/features/FEATURE_BLE/ble/generic/GenericSecurityManager.h b/features/FEATURE_BLE/ble/generic/GenericSecurityManager.h index a8a82a7a77..211e97ad6a 100644 --- a/features/FEATURE_BLE/ble/generic/GenericSecurityManager.h +++ b/features/FEATURE_BLE/ble/generic/GenericSecurityManager.h @@ -454,6 +454,8 @@ private: uint8_t oob_mitm_protection:1; uint8_t oob_present:1; uint8_t legacy_pairing_oob_request_pending:1; + + uint8_t mic_failures:2; }; pal::SecurityManager &_pal; @@ -526,7 +528,7 @@ public: /** @copydoc ble::pal::SecurityManager::on_invalid_mic */ - virtual void on_invalid_mic( + virtual void on_signature_verification_failure( connection_handle_t connection ); diff --git a/features/FEATURE_BLE/ble/pal/PalSecurityManager.h b/features/FEATURE_BLE/ble/pal/PalSecurityManager.h index dcdc194e51..9b98f8e3b7 100644 --- a/features/FEATURE_BLE/ble/pal/PalSecurityManager.h +++ b/features/FEATURE_BLE/ble/pal/PalSecurityManager.h @@ -281,12 +281,12 @@ public: ) = 0; /** - * Indicate that the MIC verification has failed. This could + * Indicate that signed data was rejected due to verification failure. This could * be due to an invalid CSRK key. * * @param[in] connection connection handle */ - virtual void on_invalid_mic( + virtual void on_signature_verification_failure( connection_handle_t connection ) = 0; diff --git a/features/FEATURE_BLE/source/generic/GenericSecurityManager.cpp b/features/FEATURE_BLE/source/generic/GenericSecurityManager.cpp index 3f5bf678f2..801569e4a3 100644 --- a/features/FEATURE_BLE/source/generic/GenericSecurityManager.cpp +++ b/features/FEATURE_BLE/source/generic/GenericSecurityManager.cpp @@ -942,9 +942,21 @@ void GenericSecurityManager::on_valid_mic_timeout(connection_handle_t connection (void)connection; } -void GenericSecurityManager::on_invalid_mic(connection_handle_t connection) { - (void)connection; - /* TODO: count and re-pair when threshold reached */ +void GenericSecurityManager::on_signature_verification_failure(connection_handle_t connection) { + ControlBlock_t *cb = get_control_block(connection); + if (!cb) { + return; + } + + cb->mic_failures++; + if (cb->mic_failures == 3) { + cb->mic_failures = 0; + if (cb->is_master) { + requestPairing(connection); + } else { + slave_security_request(connection); + } + } } void GenericSecurityManager::on_slave_security_request( @@ -1263,7 +1275,8 @@ GenericSecurityManager::ControlBlock_t::ControlBlock_t() : attempt_oob(false), oob_mitm_protection(false), oob_present(false), - legacy_pairing_oob_request_pending(false) { } + legacy_pairing_oob_request_pending(false), + mic_failures(0) { } void GenericSecurityManager::on_ltk_request(connection_handle_t connection) {