From 6aa3d35d827b3025d281d777751bbc2e2b500181 Mon Sep 17 00:00:00 2001
From: Vincent Coubard <vincent.coubard@arm.com>
Date: Tue, 16 Jan 2018 17:18:49 +0000
Subject: [PATCH 1/5] Set virtual specifier to on_keys_distributed .

---
 features/FEATURE_BLE/ble/pal/PalSecurityManager.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/features/FEATURE_BLE/ble/pal/PalSecurityManager.h b/features/FEATURE_BLE/ble/pal/PalSecurityManager.h
index b3b656c752..cdc097b785 100644
--- a/features/FEATURE_BLE/ble/pal/PalSecurityManager.h
+++ b/features/FEATURE_BLE/ble/pal/PalSecurityManager.h
@@ -222,7 +222,7 @@ public:
      */
     virtual void on_confirmation_request(connection_handle_t connection) = 0;
 
-    void on_keys_distributed(
+    virtual void on_keys_distributed(
         connection_handle_t handle,
         advertising_peer_address_type_t peer_address_type,
         address_t &peer_address,

From 0cd4f93041cd15335e043ef7fe893634419f792c Mon Sep 17 00:00:00 2001
From: Vincent Coubard <vincent.coubard@arm.com>
Date: Tue, 16 Jan 2018 17:19:26 +0000
Subject: [PATCH 2/5] Add skeleton of the PalSecurityManager for the Cordio
 Stack.

---
 .../TARGET_CORDIO/CordioPalSecurityManager.h  | 276 ++++++++++++++++++
 .../source/CordioPalSecurityManager.cpp       | 261 +++++++++++++++++
 2 files changed, 537 insertions(+)
 create mode 100644 features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h
 create mode 100644 features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp

diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h b/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h
new file mode 100644
index 0000000000..7dd1198378
--- /dev/null
+++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h
@@ -0,0 +1,276 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018-2018 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CORDIO_PAL_SECURITY_MANAGER_
+#define CORDIO_PAL_SECURITY_MANAGER_
+
+#include "ble/pal/PalSecurityManager.h"
+
+namespace ble {
+namespace pal {
+namespace vendor {
+namespace cordio {
+
+class CordioSecurityManager : public ::ble::pal::SecurityManager {
+public:
+    CordioSecurityManager();
+
+    virtual ~CordioSecurityManager();
+
+    ////////////////////////////////////////////////////////////////////////////
+    // SM lifecycle management
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::initialize
+     */
+    virtual ble_error_t initialize();
+
+    /**
+     * @see ::ble::pal::SecurityManager::terminate
+     */
+    virtual ble_error_t terminate();
+
+    /**
+     * @see ::ble::pal::SecurityManager::reset
+     */
+    virtual ble_error_t reset() ;
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Resolving list management
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::read_resolving_list_capacity
+     */
+    virtual uint8_t read_resolving_list_capacity();
+
+    /**
+     * @see ::ble::pal::SecurityManager::add_device_to_resolving_list
+     */
+    virtual ble_error_t add_device_to_resolving_list(
+        advertising_peer_address_type_t peer_identity_address_type,
+        address_t peer_identity_address,
+        irk_t peer_irk,
+        irk_t local_irk
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::remove_device_from_resolving_list
+     */
+    virtual ble_error_t remove_device_from_resolving_list(
+        advertising_peer_address_type_t peer_identity_address_type,
+        address_t peer_identity_address
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::clear_resolving_list
+     */
+    virtual ble_error_t clear_resolving_list();
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Feature support
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::set_secure_connections_support
+     */
+    virtual ble_error_t set_secure_connections_support(
+        bool enabled, bool secure_connections_only = false
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::get_secure_connections_support
+     */
+    virtual ble_error_t get_secure_connections_support(
+        bool &enabled, bool &secure_connections_only
+    );
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Security settings
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::set_authentication_timeout
+     */
+    virtual ble_error_t set_authentication_timeout(
+        connection_handle_t, uint16_t timeout_in_10ms
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::get_authentication_timeout
+     */
+    virtual ble_error_t get_authentication_timeout(
+        connection_handle_t, uint16_t &timeout_in_10ms
+    );
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Encryption
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::enable_encryption
+     */
+    virtual ble_error_t enable_encryption(connection_handle_t connection);
+
+    /**
+     * @see ::ble::pal::SecurityManager::disable_encryption
+     */
+    virtual ble_error_t disable_encryption(connection_handle_t connection);
+
+    /**
+     * @see ::ble::pal::SecurityManager::get_encryption_status
+     */
+    virtual ble_error_t get_encryption_status(
+        connection_handle_t connection, LinkSecurityStatus_t &status
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::get_encryption_key_size
+     */
+    virtual ble_error_t get_encryption_key_size(
+        connection_handle_t, uint8_t &bitsize
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::refresh_encryption_key
+     */
+    virtual ble_error_t refresh_encryption_key(connection_handle_t connection);
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Privacy
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::set_private_address_timeout
+     */
+    virtual ble_error_t set_private_address_timeout(uint16_t timeout_in_seconds);
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Keys
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::set_ltk
+     */
+    virtual ble_error_t set_ltk(connection_handle_t connection, ltk_t ltk);
+
+    /**
+     * @see ::ble::pal::SecurityManager::set_irk
+     */
+    virtual ble_error_t set_irk(const irk_t& irk);
+
+    /**
+     * @see ::ble::pal::SecurityManager::set_csrk
+     */
+    virtual ble_error_t set_csrk(const csrk_t& csrk);
+
+    /**
+     * @see ::ble::pal::SecurityManager::generate_irk
+     */
+    virtual ble_error_t generate_irk();
+
+    /**
+     * @see ::ble::pal::SecurityManager::generate_csrk
+     */
+    virtual ble_error_t generate_csrk();
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Authentication
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::send_pairing_request
+     */
+    virtual ble_error_t send_pairing_request(
+        connection_handle_t connection,
+        io_capability_t io_capability,
+        bool oob_data_flag,
+        authentication_t authentication_requirements,
+        uint8_t maximum_encryption_key_size,
+        key_distribution_t initiator_dist,
+        key_distribution_t responder_dist
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::send_pairing_response
+     */
+    virtual ble_error_t send_pairing_response(
+        connection_handle_t connection,
+        io_capability_t io_capability,
+        bool oob_data_flag,
+        authentication_t authentication_requirements,
+        uint8_t maximum_encryption_key_size,
+        key_distribution_t initiator_dist,
+        key_distribution_t responder_dist
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::cancel_pairing
+     */
+    virtual ble_error_t cancel_pairing(
+        connection_handle_t connection, pairing_failure_t reason
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::request_authentication
+     */
+    virtual ble_error_t request_authentication(connection_handle_t connection);
+
+    /**
+     * @see ::ble::pal::SecurityManager::get_random_data
+     */
+    virtual ble_error_t get_random_data(random_data_t &random_data);
+
+    ////////////////////////////////////////////////////////////////////////////
+    // MITM
+    //
+
+    /**
+     * @see ::ble::pal::SecurityManager::passkey_request_reply
+     */
+    virtual ble_error_t passkey_request_reply(
+        connection_handle_t connection, const passkey_num_t passkey
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::oob_data_request_reply
+     */
+    virtual ble_error_t oob_data_request_reply(
+        connection_handle_t connection, const oob_data_t& oob_data
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::confirmation_entered
+     */
+    virtual ble_error_t confirmation_entered(
+        connection_handle_t connection, bool confirmation
+    );
+
+    /**
+     * @see ::ble::pal::SecurityManager::send_keypress_notification
+     */
+    virtual ble_error_t send_keypress_notification(
+        connection_handle_t connection, Keypress_t keypress
+    );
+};
+
+} // cordio
+} // vendor
+} // pal
+} // ble
+
+#endif /* CORDIO_PAL_SECURITY_MANAGER_ */
diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
new file mode 100644
index 0000000000..de61d897f0
--- /dev/null
+++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
@@ -0,0 +1,261 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018-2018 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "CordioPalSecurityManager.h"
+
+namespace ble {
+namespace pal {
+namespace vendor {
+namespace cordio {
+
+CordioSecurityManager::CordioSecurityManager() : ::ble::pal::SecurityManager()
+{
+
+}
+
+CordioSecurityManager::~CordioSecurityManager()
+{
+
+}
+
+////////////////////////////////////////////////////////////////////////////
+// SM lifecycle management
+//
+
+ble_error_t CordioSecurityManager::initialize()
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::terminate()
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::reset()
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Resolving list management
+//
+
+uint8_t read_resolving_list_capacity()
+{
+    // FIXME: implement
+    return 0;
+}
+
+ble_error_t CordioSecurityManager::add_device_to_resolving_list(
+    advertising_peer_address_type_t peer_identity_address_type,
+    address_t peer_identity_address,
+    irk_t peer_irk,
+    irk_t local_irk
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::remove_device_from_resolving_list(
+    advertising_peer_address_type_t peer_identity_address_type,
+    address_t peer_identity_address
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::clear_resolving_list()
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Feature support
+//
+
+ble_error_t CordioSecurityManager::set_secure_connections_support(
+    bool enabled, bool secure_connections_only
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::get_secure_connections_support(
+    bool &enabled, bool &secure_connections_only
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Security settings
+//
+
+ble_error_t CordioSecurityManager::set_authentication_timeout(
+    connection_handle_t, uint16_t timeout_in_10ms
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::get_authentication_timeout(
+    connection_handle_t, uint16_t &timeout_in_10ms
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Encryption
+//
+
+ble_error_t CordioSecurityManager::enable_encryption(connection_handle_t connection)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::disable_encryption(connection_handle_t connection)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::get_encryption_status(
+    connection_handle_t connection, LinkSecurityStatus_t &status
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::get_encryption_key_size(
+    connection_handle_t, uint8_t &bitsize
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::refresh_encryption_key(connection_handle_t connection)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Privacy
+//
+
+ble_error_t CordioSecurityManager::set_private_address_timeout(uint16_t timeout_in_seconds)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Keys
+//
+
+ble_error_t CordioSecurityManager::set_ltk(connection_handle_t connection, ltk_t ltk)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::set_irk(const irk_t& irk)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::set_csrk(const csrk_t& csrk)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::generate_irk()
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::generate_csrk()
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// Authentication
+//
+
+ble_error_t CordioSecurityManager::send_pairing_request(
+    connection_handle_t connection,
+    io_capability_t io_capability,
+    bool oob_data_flag,
+    authentication_t authentication_requirements,
+    uint8_t maximum_encryption_key_size,
+    key_distribution_t initiator_dist,
+    key_distribution_t responder_dist
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::send_pairing_response(
+    connection_handle_t connection,
+    io_capability_t io_capability,
+    bool oob_data_flag,
+    authentication_t authentication_requirements,
+    uint8_t maximum_encryption_key_size,
+    key_distribution_t initiator_dist,
+    key_distribution_t responder_dist
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::cancel_pairing(
+    connection_handle_t connection, pairing_failure_t reason
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::request_authentication(connection_handle_t connection)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::get_random_data(random_data_t &random_data)
+{
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+////////////////////////////////////////////////////////////////////////////
+// MITM
+//
+
+ble_error_t CordioSecurityManager::passkey_request_reply(
+    connection_handle_t connection, const passkey_num_t passkey
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::oob_data_request_reply(
+    connection_handle_t connection, const oob_data_t& oob_data
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::confirmation_entered(
+    connection_handle_t connection, bool confirmation
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+ble_error_t CordioSecurityManager::send_keypress_notification(
+    connection_handle_t connection, Keypress_t keypress
+) {
+    return BLE_ERROR_NOT_IMPLEMENTED;
+}
+
+} // cordio
+} // vendor
+} // pal
+} // ble
+

From c3c24d86412d2b997a0d72635ab8621ff4ebd5f0 Mon Sep 17 00:00:00 2001
From: Vincent Coubard <vincent.coubard@arm.com>
Date: Tue, 16 Jan 2018 18:04:40 +0000
Subject: [PATCH 3/5] Cordio: Implementation of base functions necessary for
 legacy pairing.

---
 .../source/CordioPalSecurityManager.cpp       | 79 ++++++++++++++++---
 1 file changed, 66 insertions(+), 13 deletions(-)

diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
index de61d897f0..9a5b45012a 100644
--- a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
+++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
@@ -15,6 +15,8 @@
  */
 
 #include "CordioPalSecurityManager.h"
+#include "dm_api.h"
+#include "smp_api.h"
 
 namespace ble {
 namespace pal {
@@ -54,7 +56,7 @@ ble_error_t CordioSecurityManager::reset()
 // Resolving list management
 //
 
-uint8_t read_resolving_list_capacity()
+uint8_t CordioSecurityManager::read_resolving_list_capacity()
 {
     // FIXME: implement
     return 0;
@@ -148,28 +150,33 @@ ble_error_t CordioSecurityManager::refresh_encryption_key(connection_handle_t co
 // Privacy
 //
 
-ble_error_t CordioSecurityManager::set_private_address_timeout(uint16_t timeout_in_seconds)
-{
-    return BLE_ERROR_NOT_IMPLEMENTED;
+ble_error_t CordioSecurityManager::set_private_address_timeout(
+    uint16_t timeout_in_seconds
+) {
+    DmPrivSetResolvablePrivateAddrTimeout(timeout_in_seconds);
+    return BLE_ERROR_NONE;
 }
 
 ////////////////////////////////////////////////////////////////////////////
 // Keys
 //
 
-ble_error_t CordioSecurityManager::set_ltk(connection_handle_t connection, ltk_t ltk)
-{
+ble_error_t CordioSecurityManager::set_ltk(
+    connection_handle_t connection, ltk_t ltk
+) {
     return BLE_ERROR_NOT_IMPLEMENTED;
 }
 
 ble_error_t CordioSecurityManager::set_irk(const irk_t& irk)
 {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+    DmSecSetLocalIrk(const_cast<uint8_t*>(irk));
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::set_csrk(const csrk_t& csrk)
 {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+    DmSecSetLocalCsrk(const_cast<uint8_t*>(csrk));
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::generate_irk()
@@ -195,7 +202,23 @@ ble_error_t CordioSecurityManager::send_pairing_request(
     key_distribution_t initiator_dist,
     key_distribution_t responder_dist
 ) {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+    if ((maximum_encryption_key_size > 16) ||
+        (maximum_encryption_key_size < pSmpCfg->minKeyLen)) {
+        return BLE_ERROR_INVALID_PARAM;
+    }
+
+    pSmpCfg->maxKeyLen = maximum_encryption_key_size;
+    pSmpCfg->ioCap = io_capability.value;
+
+    DmSecPairReq(
+        connection,
+        oob_data_flag,
+        authentication_requirements,
+        initiator_dist,
+        responder_dist
+    );
+
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::send_pairing_response(
@@ -207,13 +230,31 @@ ble_error_t CordioSecurityManager::send_pairing_response(
     key_distribution_t initiator_dist,
     key_distribution_t responder_dist
 ) {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+
+    if ((maximum_encryption_key_size > 16) ||
+        (maximum_encryption_key_size < pSmpCfg->minKeyLen)) {
+        return BLE_ERROR_INVALID_PARAM;
+    }
+
+    pSmpCfg->maxKeyLen = maximum_encryption_key_size;
+    pSmpCfg->ioCap = io_capability.value;
+
+    DmSecPairRsp(
+        connection,
+        oob_data_flag,
+        authentication_requirements,
+        initiator_dist,
+        responder_dist
+    );
+
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::cancel_pairing(
     connection_handle_t connection, pairing_failure_t reason
 ) {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+    DmSecCancelReq(connection, reason.value);
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::request_authentication(connection_handle_t connection)
@@ -233,13 +274,25 @@ ble_error_t CordioSecurityManager::get_random_data(random_data_t &random_data)
 ble_error_t CordioSecurityManager::passkey_request_reply(
     connection_handle_t connection, const passkey_num_t passkey
 ) {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+    DmSecAuthRsp(
+        connection,
+        3,
+        reinterpret_cast<uint8_t*>(const_cast<passkey_num_t*>(&passkey))
+    );
+
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::oob_data_request_reply(
     connection_handle_t connection, const oob_data_t& oob_data
 ) {
-    return BLE_ERROR_NOT_IMPLEMENTED;
+    DmSecAuthRsp(
+        connection,
+        16,
+        const_cast<uint8_t*>(oob_data)
+    );
+
+    return BLE_ERROR_NONE;
 }
 
 ble_error_t CordioSecurityManager::confirmation_entered(

From e4b56815638317a2a31ca14423d851b0369943dd Mon Sep 17 00:00:00 2001
From: Vincent Coubard <vincent.coubard@arm.com>
Date: Tue, 16 Jan 2018 18:09:35 +0000
Subject: [PATCH 4/5] Cordio: Add SecurityManager singleton

---
 .../targets/TARGET_CORDIO/CordioPalSecurityManager.h        | 3 +++
 .../TARGET_CORDIO/source/CordioPalSecurityManager.cpp       | 6 ++++++
 2 files changed, 9 insertions(+)

diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h b/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h
index 7dd1198378..878fe63e72 100644
--- a/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h
+++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/CordioPalSecurityManager.h
@@ -266,6 +266,9 @@ public:
     virtual ble_error_t send_keypress_notification(
         connection_handle_t connection, Keypress_t keypress
     );
+
+    // singleton of the ARM Cordio Security Manager
+    static CordioSecurityManager& get_security_manager();
 };
 
 } // cordio
diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
index 9a5b45012a..375044d778 100644
--- a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
+++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
@@ -307,6 +307,12 @@ ble_error_t CordioSecurityManager::send_keypress_notification(
     return BLE_ERROR_NOT_IMPLEMENTED;
 }
 
+CordioSecurityManager& CordioSecurityManager::get_security_manager()
+{
+    static CordioSecurityManager _security_manager;
+    return _security_manager;
+}
+
 } // cordio
 } // vendor
 } // pal

From 9bd0fa5708b685934b695bc0444089995a9ce43d Mon Sep 17 00:00:00 2001
From: Vincent Coubard <vincent.coubard@arm.com>
Date: Tue, 16 Jan 2018 18:11:38 +0000
Subject: [PATCH 5/5] BLE Cordio: Fix call to SafeEnum<>::value()

---
 .../TARGET_CORDIO/source/CordioPalSecurityManager.cpp       | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
index 375044d778..4b387ce162 100644
--- a/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
+++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/source/CordioPalSecurityManager.cpp
@@ -208,7 +208,7 @@ ble_error_t CordioSecurityManager::send_pairing_request(
     }
 
     pSmpCfg->maxKeyLen = maximum_encryption_key_size;
-    pSmpCfg->ioCap = io_capability.value;
+    pSmpCfg->ioCap = io_capability.value();
 
     DmSecPairReq(
         connection,
@@ -237,7 +237,7 @@ ble_error_t CordioSecurityManager::send_pairing_response(
     }
 
     pSmpCfg->maxKeyLen = maximum_encryption_key_size;
-    pSmpCfg->ioCap = io_capability.value;
+    pSmpCfg->ioCap = io_capability.value();
 
     DmSecPairRsp(
         connection,
@@ -253,7 +253,7 @@ ble_error_t CordioSecurityManager::send_pairing_response(
 ble_error_t CordioSecurityManager::cancel_pairing(
     connection_handle_t connection, pairing_failure_t reason
 ) {
-    DmSecCancelReq(connection, reason.value);
+    DmSecCancelReq(connection, reason.value());
     return BLE_ERROR_NONE;
 }