/****************************************************************************** * * Copyright 2023 The Android Open Source Project * * 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. * ******************************************************************************/ /****************************************************************************** * * This is the API implementation file for the BTA device manager. * ******************************************************************************/ #include #include #include #include "bta/dm/bta_dm_sec_int.h" #include "stack/btm/btm_sec.h" #include "stack/include/bt_octets.h" #include "stack/include/btm_ble_sec_api.h" #include "stack/include/btm_client_interface.h" #include "stack/include/btm_status.h" #include "stack/include/main_thread.h" #include "types/raw_address.h" using namespace bluetooth; /** This function initiates a bonding procedure with a peer device */ void BTA_DmBond(const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type, tBT_TRANSPORT transport, tBT_DEVICE_TYPE device_type) { bta_dm_bond(bd_addr, addr_type, transport, device_type); } /** This function cancels the bonding procedure with a peer device */ void BTA_DmBondCancel(const RawAddress& bd_addr) { bta_dm_bond_cancel(bd_addr); } /******************************************************************************* * * Function BTA_DmPinReply * * Description This function provides a pincode for a remote device when * one is requested by DM through BTA_DM_PIN_REQ_EVT * * * Returns void * ******************************************************************************/ void BTA_DmPinReply(const RawAddress& bd_addr, bool accept, uint8_t pin_len, uint8_t* p_pin) { std::unique_ptr msg = std::make_unique(); msg->bd_addr = bd_addr; msg->accept = accept; if (accept) { msg->pin_len = pin_len; memcpy(msg->p_pin, p_pin, pin_len); } bta_dm_pin_reply(std::move(msg)); } /******************************************************************************* * * Function BTA_DmLocalOob * * Description This function retrieves the OOB data from local controller. * The result is reported by: * - bta_dm_co_loc_oob_ext() if device supports secure * connections (SC) * - bta_dm_co_loc_oob() if device doesn't support SC * * Returns void * ******************************************************************************/ void BTA_DmLocalOob(void) { BTM_ReadLocalOobData(); } /******************************************************************************* * * Function BTA_DmConfirm * * Description This function accepts or rejects the numerical value of the * Simple Pairing process on BTA_DM_SP_CFM_REQ_EVT * * Returns void * ******************************************************************************/ void BTA_DmConfirm(const RawAddress& bd_addr, bool accept) { bta_dm_confirm(bd_addr, accept); } /******************************************************************************* * * Function BTA_DmAddDevice * * Description This function adds a device to the security database list of * peer device * * Returns void * ******************************************************************************/ void BTA_DmAddDevice(RawAddress bd_addr, DEV_CLASS dev_class, LinkKey link_key, uint8_t key_type, uint8_t pin_length) { auto closure = base::Bind(get_btm_client_interface().security.BTM_SecAddDevice, bd_addr, dev_class, link_key, key_type, pin_length); closure.Run(); } /** This function removes a device from the security database list of peer * device. It manages unpairing even while connected */ tBTA_STATUS BTA_DmRemoveDevice(const RawAddress& bd_addr) { if (!com::android::bluetooth::flags::remove_device_in_main_thread()) { bta_dm_remove_device(bd_addr); return BTA_SUCCESS; } do_in_main_thread(base::BindOnce(bta_dm_remove_device, bd_addr)); return BTA_SUCCESS; } /******************************************************************************* * * Function BTA_DmAddBleKey * * Description Add/modify LE device information. This function will be * normally called during host startup to restore all required * information stored in the NVRAM. * * Parameters: bd_addr - BD address of the peer * p_le_key - LE key values. * key_type - LE SMP key type. * * Returns BTA_SUCCESS if successful * BTA_FAIL if operation failed. * ******************************************************************************/ void BTA_DmAddBleKey(const RawAddress& bd_addr, tBTA_LE_KEY_VALUE* p_le_key, tBTM_LE_KEY_TYPE key_type) { bta_dm_add_blekey(bd_addr, *p_le_key, key_type); } /******************************************************************************* * * Function BTA_DmAddBleDevice * * Description Add a BLE device. This function will be normally called * during host startup to restore all required information * for a LE device stored in the NVRAM. * * Parameters: bd_addr - BD address of the peer * dev_type - Remote device's device type. * addr_type - LE device address type. * * Returns void * ******************************************************************************/ void BTA_DmAddBleDevice(const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type, tBT_DEVICE_TYPE dev_type) { bta_dm_add_ble_device(bd_addr, addr_type, dev_type); } /******************************************************************************* * * Function BTA_DmBlePasskeyReply * * Description Send BLE SMP passkey reply. * * Parameters: bd_addr - BD address of the peer * accept - passkey entry successful or declined. * passkey - passkey value, must be a 6 digit number, * can be lead by 0. * * Returns void * ******************************************************************************/ void BTA_DmBlePasskeyReply(const RawAddress& bd_addr, bool accept, uint32_t passkey) { bta_dm_ble_passkey_reply(bd_addr, accept, accept ? passkey : 0); } /******************************************************************************* * * Function BTA_DmBleConfirmReply * * Description Send BLE SMP SC user confirmation reply. * * Parameters: bd_addr - BD address of the peer * accept - numbers to compare are the same or * different. * * Returns void * ******************************************************************************/ void BTA_DmBleConfirmReply(const RawAddress& bd_addr, bool accept) { bta_dm_ble_confirm_reply(bd_addr, accept); } /******************************************************************************* * * Function BTA_DmBleSecurityGrant * * Description Grant security request access. * * Parameters: bd_addr - BD address of the peer * res - security grant status. * * Returns void * ******************************************************************************/ void BTA_DmBleSecurityGrant(const RawAddress& bd_addr, tBTA_DM_BLE_SEC_GRANT res) { const tBTM_STATUS btm_status = [](const tBTA_DM_BLE_SEC_GRANT res) -> tBTM_STATUS { switch (res) { case tBTA_DM_BLE_SEC_GRANT::BTA_DM_SEC_GRANTED: return tBTM_STATUS::BTM_SUCCESS; case tBTA_DM_BLE_SEC_GRANT::BTA_DM_SEC_PAIR_NOT_SPT: return static_cast(BTA_DM_AUTH_FAIL_BASE + SMP_PAIR_NOT_SUPPORT); } }(res); BTM_SecurityGrant(bd_addr, btm_status); } /******************************************************************************* * * Function BTA_DmSetEncryption * * Description This function is called to ensure that connection is * encrypted. Should be called only on an open connection. * Typically only needed for connections that first want to * bring up unencrypted links, then later encrypt them. * * Parameters: bd_addr - Address of the peer device * transport - transport of the link to be encruypted * p_callback - Pointer to callback function to indicat the * link encryption status * sec_act - This is the security action to indicate * what kind of BLE security level is required * for the BLE link if BLE is supported. * Note: This parameter is ignored for the * BR/EDR or if BLE is not supported. * * Returns void * ******************************************************************************/ void BTA_DmSetEncryption(const RawAddress& bd_addr, tBT_TRANSPORT transport, tBTA_DM_ENCRYPT_CBACK* p_callback, tBTM_BLE_SEC_ACT sec_act) { log::verbose(""); bta_dm_set_encryption(bd_addr, transport, p_callback, sec_act); } /******************************************************************************* * * Function BTA_DmSirkSecCbRegister * * Description This procedure registeres in requested a callback for * verification by CSIP potential set member. * * Parameters p_cback - callback to member verificator * * Returns void * ******************************************************************************/ void BTA_DmSirkSecCbRegister(tBTA_DM_SEC_CBACK* p_cback) { log::debug(""); bta_dm_ble_sirk_sec_cb_register(p_cback); } /******************************************************************************* * * Function BTA_DmSirkConfirmDeviceReply * * Description This procedure confirms requested to validate set device. * * Parameters bd_addr - BD address of the peer * accept - True if device is authorized by CSIP, false * otherwise. * * Returns void * ******************************************************************************/ void BTA_DmSirkConfirmDeviceReply(const RawAddress& bd_addr, bool accept) { log::debug(""); bta_dm_ble_sirk_confirm_device_reply(bd_addr, accept); }