From 643da6155aa7a4afe801dd63d60bf59a94fca334 Mon Sep 17 00:00:00 2001 From: Martin Brabham Date: Wed, 14 Apr 2021 13:10:45 -0700 Subject: [PATCH] OOB: generateLocalOobdata() Implement generation of LE OOB Data - Remove GD flag to NOP for OobDataReply. GD Stack is only up to ACL, so Legacy SM needs to properly function. Bug: 184377951 Tag: #feature Test: Manual implementation from p/a/Settings Change-Id: I6072c70f5e6707eb8f3a6126ffa1edbb5cba5aa4 --- bta/dm/bta_dm_act.cc | 3 ++- bta/test/common/mock_btif_dm.cc | 4 +++- btif/include/btif_dm.h | 3 ++- btif/src/btif_dm.cc | 10 +++++----- include/hardware/bluetooth.h | 7 ------- stack/include/smp_api.h | 17 +++++++++++++++++ stack/smp/smp_api.cc | 24 +++++++++++++++++++++--- stack/smp/smp_keys.cc | 7 +++---- stack/test/common/mock_btif_dm.cc | 6 ++++++ stack/test/common/mock_smp_smp_api.cc | 8 ++++++++ test/mock/mock_btif_dm.cc | 4 +++- test/mock/mock_stack_smp_api.cc | 8 ++++++++ 12 files changed, 78 insertions(+), 23 deletions(-) diff --git a/bta/dm/bta_dm_act.cc b/bta/dm/bta_dm_act.cc index 7979d66854..688b3d6146 100644 --- a/bta/dm/bta_dm_act.cc +++ b/bta/dm/bta_dm_act.cc @@ -2220,7 +2220,8 @@ static tBTM_STATUS bta_dm_sp_cback(tBTM_SP_EVT event, case BTM_SP_LOC_OOB_EVT: #ifdef BTIF_DM_OOB_TEST - btif_dm_proc_loc_oob((bool)(p_data->loc_oob.status == BTM_SUCCESS), + btif_dm_proc_loc_oob(BT_TRANSPORT_BR_EDR, + (bool)(p_data->loc_oob.status == BTM_SUCCESS), p_data->loc_oob.c, p_data->loc_oob.r); #endif break; diff --git a/bta/test/common/mock_btif_dm.cc b/bta/test/common/mock_btif_dm.cc index e2fbc322de..f65fba00f6 100644 --- a/bta/test/common/mock_btif_dm.cc +++ b/bta/test/common/mock_btif_dm.cc @@ -28,6 +28,7 @@ extern std::map mock_function_count_map; #include "bta/include/bta_api.h" #include "include/hardware/bluetooth.h" #include "internal_include/bte_appl.h" +#include "types/bt_transport.h" #include "types/raw_address.h" struct uid_set_t; @@ -168,6 +169,7 @@ bool btif_dm_proc_rmt_oob(const RawAddress& bd_addr, Octet16* p_c, return false; } -void btif_dm_proc_loc_oob(bool valid, const Octet16& c, const Octet16& r) { +void btif_dm_proc_loc_oob(tBT_TRANSPORT transport, bool is_valid, + const Octet16& c, const Octet16& r) { mock_function_count_map[__func__]++; } diff --git a/btif/include/btif_dm.h b/btif/include/btif_dm.h index 98ff8d0dad..6c2a5947f0 100644 --- a/btif/include/btif_dm.h +++ b/btif/include/btif_dm.h @@ -59,7 +59,8 @@ void btif_dm_set_oob_for_le_io_req(const RawAddress& bd_addr, tBTM_LE_AUTH_REQ* p_auth_req); #ifdef BTIF_DM_OOB_TEST void btif_dm_load_local_oob(void); -void btif_dm_proc_loc_oob(bool valid, const Octet16& c, const Octet16& r); +void btif_dm_proc_loc_oob(tBT_TRANSPORT transport, bool is_valid, + const Octet16& c, const Octet16& r); bool btif_dm_proc_rmt_oob(const RawAddress& bd_addr, Octet16* p_c, Octet16* p_r); void btif_dm_generate_local_oob_data(tBT_TRANSPORT transport); diff --git a/btif/src/btif_dm.cc b/btif/src/btif_dm.cc index 3cf10a482c..2b07fd1963 100644 --- a/btif/src/btif_dm.cc +++ b/btif/src/btif_dm.cc @@ -2273,17 +2273,17 @@ void btif_dm_load_local_oob(void) { * ******************************************************************************/ void btif_dm_generate_local_oob_data(tBT_TRANSPORT transport) { + LOG_DEBUG("Transport %s", bt_transport_text(transport).c_str()); if (transport == BT_TRANSPORT_BR_EDR) { BTM_ReadLocalOobData(); } else if (transport == BT_TRANSPORT_LE) { - // TODO(184377951): Call LE Implementation (not yet implemented?) - } else { - BTIF_TRACE_ERROR("Bad transport type! %d", transport); + SMP_CrLocScOobData(base::BindOnce(&btif_dm_proc_loc_oob)); } } -void btif_dm_proc_loc_oob(bool valid, const Octet16& c, const Octet16& r) { - invoke_oob_data_request_cb(BT_TRANSPORT_BR_EDR, valid, c, r); +void btif_dm_proc_loc_oob(tBT_TRANSPORT transport, bool is_valid, + const Octet16& c, const Octet16& r) { + invoke_oob_data_request_cb(transport, is_valid, c, r); } /******************************************************************************* diff --git a/include/hardware/bluetooth.h b/include/hardware/bluetooth.h index dc9dff4d41..63f47e265a 100644 --- a/include/hardware/bluetooth.h +++ b/include/hardware/bluetooth.h @@ -355,13 +355,6 @@ typedef struct { uint8_t le_appearance[2]; /* For the appearance of the device */ } bt_oob_data_t; -/** Bundle that can contain 1 or both of P192 and P256 */ -// typedef struct { -// uint8_t address[7]; /* Bluetooth Device Address (6) plus Address Type -// (1) */ bt_oob_data_t p192_data; /* P192 Data or NULL */ bt_oob_data_t -// p256_data; /* P256 Data or NULL */ -//} bt_oob_data_bundle_t; - /** Bluetooth Device Type */ typedef enum { BT_DEVICE_DEVTYPE_BREDR = 0x1, diff --git a/stack/include/smp_api.h b/stack/include/smp_api.h index 4108c373fa..bc4060cdc5 100644 --- a/stack/include/smp_api.h +++ b/stack/include/smp_api.h @@ -26,6 +26,7 @@ #include "bt_target.h" #include "smp_api_types.h" +#include "types/bt_transport.h" /***************************************************************************** * External Function Declarations @@ -174,6 +175,22 @@ extern void SMP_OobDataReply(const RawAddress& bd_addr, tSMP_STATUS res, ******************************************************************************/ extern void SMP_SecureConnectionOobDataReply(uint8_t* p_data); +/******************************************************************************* + * + * Function SMP_CrLocScOobData + * + * Description This function is called to generate a public key to be + * passed to a remote device via an Out of Band transport + * + * Parameters: callback - receive the data + * + ******************************************************************************/ +extern void SMP_CrLocScOobData( + base::OnceCallback&, + const std::array&)> + callback); + // Called when LTK request is received from controller. extern bool smp_proc_ltk_request(const RawAddress& bda); diff --git a/stack/smp/smp_api.cc b/stack/smp/smp_api.cc index 7cef82fca3..2d14ba4997 100644 --- a/stack/smp/smp_api.cc +++ b/stack/smp/smp_api.cc @@ -498,9 +498,6 @@ void SMP_OobDataReply(const RawAddress& bd_addr, tSMP_STATUS res, uint8_t len, * ******************************************************************************/ void SMP_SecureConnectionOobDataReply(uint8_t* p_data) { - LOG_ASSERT(!bluetooth::shim::is_gd_shim_enabled()) - << "Legacy SMP API should not be invoked when GD Security is used"; - tSMP_CB* p_cb = &smp_cb; tSMP_SC_OOB_DATA* p_oob = (tSMP_SC_OOB_DATA*)p_data; @@ -552,3 +549,24 @@ void SMP_SecureConnectionOobDataReply(uint8_t* p_data) { smp_int_data.p_data = p_data; smp_sm_event(&smp_cb, SMP_SC_OOB_DATA_EVT, &smp_int_data); } + +/******************************************************************************* + * + * Function SMP_CrLocScOobData + * + * Description This function is called to generate a public key to be + * passed to a remote device via Out of Band transport + * + * Parameters: callback - receive the data + * + ******************************************************************************/ +void SMP_CrLocScOobData( + base::OnceCallback&, + const std::array&)> + callback) { + smp_cb.selected_association_model = SMP_MODEL_SEC_CONN_OOB; + smp_calculate_local_commitment(&smp_cb); + std::move(callback).Run(BT_TRANSPORT_LE, true, smp_cb.commitment, + smp_cb.local_random); +} diff --git a/stack/smp/smp_keys.cc b/stack/smp/smp_keys.cc index 1a8a3a51e4..2d7419c139 100644 --- a/stack/smp/smp_keys.cc +++ b/stack/smp/smp_keys.cc @@ -614,19 +614,18 @@ void smp_create_private_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { * ******************************************************************************/ void smp_use_oob_private_key(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) { - SMP_TRACE_DEBUG("%s req_oob_type: %d, role: %d", __func__, p_cb->req_oob_type, - p_cb->role); + LOG_INFO("req_oob_type: %d, role: %d", p_cb->req_oob_type, p_cb->role); switch (p_cb->req_oob_type) { case SMP_OOB_BOTH: case SMP_OOB_LOCAL: - SMP_TRACE_DEBUG("%s restore secret key", __func__) + LOG_INFO("restore secret key"); memcpy(p_cb->private_key, p_cb->sc_oob_data.loc_oob_data.private_key_used, BT_OCTET32_LEN); smp_process_private_key(p_cb); break; default: - SMP_TRACE_DEBUG("%s create secret key anew", __func__); + LOG_INFO("create secret key anew"); smp_set_state(SMP_STATE_PAIR_REQ_RSP); smp_decide_association_model(p_cb, NULL); break; diff --git a/stack/test/common/mock_btif_dm.cc b/stack/test/common/mock_btif_dm.cc index 1f2b2fbff2..d783ceada3 100644 --- a/stack/test/common/mock_btif_dm.cc +++ b/stack/test/common/mock_btif_dm.cc @@ -27,6 +27,7 @@ extern std::map mock_function_count_map; #include #include "bta/include/bta_api.h" #include "include/hardware/bluetooth.h" +#include "types/bt_transport.h" #include "types/raw_address.h" struct uid_set_t; @@ -155,3 +156,8 @@ void btif_dm_update_ble_remote_properties(const RawAddress& bd_addr, tBT_DEVICE_TYPE dev_type) { mock_function_count_map[__func__]++; } + +void btif_dm_proc_loc_oob(tBT_TRANSPORT transport, bool is_valid, + const Octet16& c, const Octet16& r) { + mock_function_count_map[__func__]++; +} diff --git a/stack/test/common/mock_smp_smp_api.cc b/stack/test/common/mock_smp_smp_api.cc index ad0b68f3bf..1fd8fe69ce 100644 --- a/stack/test/common/mock_smp_smp_api.cc +++ b/stack/test/common/mock_smp_smp_api.cc @@ -78,3 +78,11 @@ void SMP_SecureConnectionOobDataReply(uint8_t* p_data) { void SMP_SecurityGrant(const RawAddress& bd_addr, tSMP_STATUS res) { mock_function_count_map[__func__]++; } + +void SMP_CrLocScOobData( + base::OnceCallback&, + const std::array&)> + callback) { + mock_function_count_map[__func__]++; +} diff --git a/test/mock/mock_btif_dm.cc b/test/mock/mock_btif_dm.cc index 0e986b581d..f65fba00f6 100644 --- a/test/mock/mock_btif_dm.cc +++ b/test/mock/mock_btif_dm.cc @@ -28,6 +28,7 @@ extern std::map mock_function_count_map; #include "bta/include/bta_api.h" #include "include/hardware/bluetooth.h" #include "internal_include/bte_appl.h" +#include "types/bt_transport.h" #include "types/raw_address.h" struct uid_set_t; @@ -168,6 +169,7 @@ bool btif_dm_proc_rmt_oob(const RawAddress& bd_addr, Octet16* p_c, return false; } -void btif_dm_proc_loc_oob(const Octet16& c, const Octet16& r) { +void btif_dm_proc_loc_oob(tBT_TRANSPORT transport, bool is_valid, + const Octet16& c, const Octet16& r) { mock_function_count_map[__func__]++; } diff --git a/test/mock/mock_stack_smp_api.cc b/test/mock/mock_stack_smp_api.cc index 58cf1deee0..ae48e423d8 100644 --- a/test/mock/mock_stack_smp_api.cc +++ b/test/mock/mock_stack_smp_api.cc @@ -78,3 +78,11 @@ void SMP_SecureConnectionOobDataReply(uint8_t* p_data) { void SMP_SecurityGrant(const RawAddress& bd_addr, tSMP_STATUS res) { mock_function_count_map[__func__]++; } + +void SMP_CrLocScOobData( + base::OnceCallback&, + const std::array&)> + callback) { + mock_function_count_map[__func__]++; +}