Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e495a1a authored by Chris Manton's avatar Chris Manton Committed by Automerger Merge Worker
Browse files

btm_log-history: Surface security API and callbacks am: 29c18c72

parents b6ffcb1b 29c18c72
Loading
Loading
Loading
Loading
+66 −6
Original line number Diff line number Diff line
@@ -98,6 +98,8 @@ bool btif_get_device_type(const RawAddress& bda, int* p_device_type);
using bluetooth::Uuid;

namespace {
constexpr char kBtmLogTag[] = "API";
constexpr char kBtmLogTagCallback[] = "CBACK";
constexpr char kBtmLogTagSdp[] = "SDP";
}

@@ -141,12 +143,6 @@ const Uuid UUID_A2DP_SINK = Uuid::FromString("110B");
#define ENCRYPTED_BREDR 2
#define ENCRYPTED_LE 4

namespace {

constexpr char kBtmLogTag[] = "API";

}

struct btif_dm_pairing_cb_t {
  bt_bond_state_t state;
  RawAddress static_bdaddr;
@@ -551,6 +547,13 @@ static void bond_state_changed(bt_status_t status, const RawAddress& bd_addr,
  if ((pairing_cb.state == state) && (state == BT_BOND_STATE_BONDING)) {
    // Cross key pairing so send callback for static address
    if (!pairing_cb.static_bdaddr.IsEmpty()) {
      BTM_LogHistory(
          kBtmLogTagCallback, bd_addr, "Bond state changed",
          base::StringPrintf(
              "Crosskey bt_status:%s bond_state:%u reason:%s",
              bt_status_text(status).c_str(), state,
              hci_reason_code_text(to_hci_reason_code(pairing_cb.fail_reason))
                  .c_str()));
      GetInterfaceToProfiles()->events->invoke_bond_state_changed_cb(
          status, bd_addr, state, pairing_cb.fail_reason);
    }
@@ -582,6 +585,13 @@ static void bond_state_changed(bt_status_t status, const RawAddress& bd_addr,
                 << bd_addr;
    }
  }
  BTM_LogHistory(
      kBtmLogTagCallback, bd_addr, "Bond state changed",
      base::StringPrintf(
          "bt_status:%s bond_state:%u reason:%s",
          bt_status_text(status).c_str(), state,
          hci_reason_code_text(to_hci_reason_code(pairing_cb.fail_reason))
              .c_str()));
  GetInterfaceToProfiles()->events->invoke_bond_state_changed_cb(
      status, bd_addr, state, pairing_cb.fail_reason);

@@ -947,6 +957,10 @@ static void btif_dm_pin_req_evt(tBTA_DM_PIN_REQ* p_pin_req) {
      }
    }
  }
  BTM_LogHistory(
      kBtmLogTagCallback, bd_addr, "Pin request",
      base::StringPrintf("name:\"%s\" min16:%c", PRIVATE_NAME(bd_name.name),
                         (p_pin_req->min_16_digit) ? 'T' : 'F'));
  GetInterfaceToProfiles()->events->invoke_pin_request_cb(
      bd_addr, bd_name, cod, p_pin_req->min_16_digit);
}
@@ -1034,6 +1048,11 @@ static void btif_dm_ssp_cfm_req_evt(tBTA_DM_SP_CFM_REQ* p_ssp_cfm_req) {
  }

  pairing_cb.sdp_attempts = 0;
  BTM_LogHistory(kBtmLogTagCallback, bd_addr, "Ssp request",
                 base::StringPrintf("name:\"%s\" just_works:%c pin:%u",
                                    PRIVATE_NAME(bd_name.name),
                                    (p_ssp_cfm_req->just_works) ? 'T' : 'F',
                                    p_ssp_cfm_req->num_val));
  GetInterfaceToProfiles()->events->invoke_ssp_request_cb(
      bd_addr, bd_name, cod,
      (p_ssp_cfm_req->just_works ? BT_SSP_VARIANT_CONSENT
@@ -1073,6 +1092,10 @@ static void btif_dm_ssp_key_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif) {
    cod = COD_UNCLASSIFIED;
  }

  BTM_LogHistory(
      kBtmLogTagCallback, bd_addr, "Ssp request",
      base::StringPrintf("name:\"%s\" passkey:%u", PRIVATE_NAME(bd_name.name),
                         p_ssp_key_notif->passkey));
  GetInterfaceToProfiles()->events->invoke_ssp_request_cb(
      bd_addr, bd_name, cod, BT_SSP_VARIANT_PASSKEY_NOTIFICATION,
      p_ssp_key_notif->passkey);
@@ -1212,6 +1235,10 @@ static void btif_dm_auth_cmpl_evt(tBTA_DM_AUTH_CMPL* p_auth_cmpl) {
        if (is_crosskey) {
          // If bonding occurred due to cross-key pairing, send address
          // consolidate callback
          BTM_LogHistory(
              kBtmLogTagCallback, bd_addr, "Consolidate",
              base::StringPrintf(" <=> %s",
                                 ADDRESS_TO_LOGGABLE_CSTR(pairing_cb.bd_addr)));
          GetInterfaceToProfiles()->events->invoke_address_consolidate_cb(
              pairing_cb.bd_addr, bd_addr);
        } else {
@@ -2443,6 +2470,15 @@ void btif_dm_create_bond_le(const RawAddress bd_addr,
                            tBLE_ADDR_TYPE addr_type) {
  BTIF_TRACE_EVENT("%s: bd_addr=%s, addr_type=%d, transport=%d", __func__,
                   ADDRESS_TO_LOGGABLE_CSTR(bd_addr), addr_type);
  const tBLE_BD_ADDR ble_bd_addr{
      .type = addr_type,
      .bda = bd_addr,
  };
  BTM_LogHistory(
      kBtmLogTag, ble_bd_addr, "Create bond",
      base::StringPrintf("transport:%s",
                         bt_transport_text(BT_TRANSPORT_LE).c_str()));

  btif_stats_add_bond_event(bd_addr, BTIF_DM_FUNC_CREATE_BOND,
                            pairing_cb.state);

@@ -2690,6 +2726,13 @@ void btif_dm_pin_reply(const RawAddress bd_addr, uint8_t accept,
void btif_dm_ssp_reply(const RawAddress bd_addr, bt_ssp_variant_t variant,
                       uint8_t accept) {
  BTIF_TRACE_EVENT("%s: accept=%d", __func__, accept);
  BTM_LogHistory(
      kBtmLogTag, bd_addr, "Ssp reply",
      base::StringPrintf(
          "originator:%s variant:%d accept:%c le:%c numeric_comparison:%c",
          (pairing_cb.is_local_initiated) ? "local" : "remote", variant,
          (accept) ? 'Y' : 'N', (pairing_cb.is_le_only) ? 'T' : 'F',
          (pairing_cb.is_le_nc) ? 'T' : 'F'));
  if (pairing_cb.is_le_only) {
    if (pairing_cb.is_le_nc) {
      BTA_DmBleConfirmReply(bd_addr, accept);
@@ -3310,6 +3353,11 @@ static void btif_dm_ble_key_notif_evt(tBTA_DM_SP_KEY_NOTIF* p_ssp_key_notif) {
  pairing_cb.is_ssp = false;
  cod = COD_UNCLASSIFIED;

  BTM_LogHistory(
      kBtmLogTagCallback, bd_addr, "Ssp request",
      base::StringPrintf("name:\"%s\" passkey:%u", PRIVATE_NAME(bd_name.name),
                         p_ssp_key_notif->passkey));

  GetInterfaceToProfiles()->events->invoke_ssp_request_cb(
      bd_addr, bd_name, cod, BT_SSP_VARIANT_PASSKEY_NOTIFICATION,
      p_ssp_key_notif->passkey);
@@ -3554,6 +3602,10 @@ static void btif_dm_ble_sec_req_evt(tBTA_DM_BLE_SEC_REQ* p_ble_req,

  cod = COD_UNCLASSIFIED;

  BTM_LogHistory(kBtmLogTagCallback, bd_addr, "SSP ble request",
                 base::StringPrintf("name:\"%s\" BT_SSP_VARIANT_CONSENT",
                                    PRIVATE_NAME(bd_name.name)));

  GetInterfaceToProfiles()->events->invoke_ssp_request_cb(
      bd_addr, bd_name, cod, BT_SSP_VARIANT_CONSENT, 0);
}
@@ -3589,6 +3641,9 @@ static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ* p_pin_req) {

  cod = COD_UNCLASSIFIED;

  BTM_LogHistory(kBtmLogTagCallback, bd_addr, "PIN request",
                 base::StringPrintf("name:\"%s\"", PRIVATE_NAME(bd_name.name)));

  GetInterfaceToProfiles()->events->invoke_pin_request_cb(bd_addr, bd_name, cod,
                                                          false);
}
@@ -3611,6 +3666,11 @@ static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF* p_notif_req) {
  pairing_cb.is_le_only = true;
  pairing_cb.is_le_nc = true;

  BTM_LogHistory(
      kBtmLogTagCallback, bd_addr, "Ssp request",
      base::StringPrintf("name:\"%s\" passkey:%u", PRIVATE_NAME(bd_name.name),
                         p_notif_req->passkey));

  GetInterfaceToProfiles()->events->invoke_ssp_request_cb(
      bd_addr, bd_name, COD_UNCLASSIFIED, BT_SSP_VARIANT_PASSKEY_CONFIRMATION,
      p_notif_req->passkey);
+37 −14
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#define LOG_TAG "bt_btm_ble"

#include <base/logging.h>
#include <base/strings/stringprintf.h>

#include <cstdint>

@@ -45,6 +46,7 @@
#include "stack/include/bt_octets.h"
#include "stack/include/bt_types.h"
#include "stack/include/btm_api.h"
#include "stack/include/btm_log_history.h"
#include "stack/include/btu.h"
#include "stack/include/gatt_api.h"
#include "stack/include/l2cap_security_interface.h"
@@ -64,6 +66,10 @@ void gatt_notify_phy_updated(tGATT_STATUS status, uint16_t handle,
#define PROPERTY_BLE_PRIVACY_ENABLED "bluetooth.core.gap.le.privacy.enabled"
#endif

namespace {
constexpr char kBtmLogTag[] = "SEC";
}

// Pairing parameters defined in Vol 3, Part H, Chapter 3.5.1 - 3.5.2
// All present in the exact decimal values, not hex
// Ex: bluetooth.core.smp.le.ctkd.initiator_key_distribution 15(0x0f)
@@ -251,8 +257,12 @@ const Octet16& BTM_GetDeviceDHK() { return btm_cb.devcb.id_keys.dhk; }
 *
 ******************************************************************************/
void BTM_SecurityGrant(const RawAddress& bd_addr, uint8_t res) {
  tSMP_STATUS res_smp =
  const tSMP_STATUS res_smp =
      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_REPEATED_ATTEMPTS;
  BTM_LogHistory(kBtmLogTag, bd_addr, "Granted",
                 base::StringPrintf("passkey_status:%s",
                                    smp_status_text(res_smp).c_str()));

  BTM_TRACE_DEBUG("BTM_SecurityGrant");
  SMP_SecurityGrant(bd_addr, res_smp);
}
@@ -274,14 +284,18 @@ void BTM_SecurityGrant(const RawAddress& bd_addr, uint8_t res) {
void BTM_BlePasskeyReply(const RawAddress& bd_addr, uint8_t res,
                         uint32_t passkey) {
  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
  tSMP_STATUS res_smp =
      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;

  if (p_dev_rec == NULL) {
    BTM_TRACE_ERROR("Passkey reply to Unknown device");
    return;
  }

  const tSMP_STATUS res_smp =
      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;
  BTM_LogHistory(kBtmLogTag, bd_addr, "Passkey reply",
                 base::StringPrintf("transport:%s authenticate_status:%s",
                                    bt_transport_text(BT_TRANSPORT_LE).c_str(),
                                    smp_status_text(res_smp).c_str()));

  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
  BTM_TRACE_DEBUG("BTM_BlePasskeyReply");
  SMP_PasskeyReply(bd_addr, res_smp, passkey);
@@ -301,13 +315,18 @@ void BTM_BlePasskeyReply(const RawAddress& bd_addr, uint8_t res,
 ******************************************************************************/
void BTM_BleConfirmReply(const RawAddress& bd_addr, uint8_t res) {
  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);
  tSMP_STATUS res_smp =
      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;

  if (p_dev_rec == NULL) {
    BTM_TRACE_ERROR("Passkey reply to Unknown device");
    return;
  }
  const tSMP_STATUS res_smp =
      (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_PASSKEY_ENTRY_FAIL;

  BTM_LogHistory(kBtmLogTag, bd_addr, "Confirm reply",
                 base::StringPrintf(
                     "transport:%s numeric_comparison_authenticate_status:%s",
                     bt_transport_text(BT_TRANSPORT_LE).c_str(),
                     smp_status_text(res_smp).c_str()));

  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
  BTM_TRACE_DEBUG("%s", __func__);
@@ -331,16 +350,18 @@ void BTM_BleConfirmReply(const RawAddress& bd_addr, uint8_t res) {
 ******************************************************************************/
void BTM_BleOobDataReply(const RawAddress& bd_addr, uint8_t res, uint8_t len,
                         uint8_t* p_data) {
  tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);

  BTM_TRACE_DEBUG("%s:", __func__);

  if (p_dev_rec == NULL) {
    BTM_TRACE_ERROR("%s: Unknown device", __func__);
    return;
  }

  const tSMP_STATUS res_smp = (res == BTM_SUCCESS) ? SMP_SUCCESS : SMP_OOB_FAIL;
  BTM_LogHistory(kBtmLogTag, bd_addr, "Oob data reply",
                 base::StringPrintf("transport:%s authenticate_status:%s",
                                    bt_transport_text(BT_TRANSPORT_LE).c_str(),
                                    smp_status_text(res_smp).c_str()));

  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;
  SMP_OobDataReply(bd_addr, res_smp, len, p_data);
}
@@ -361,14 +382,16 @@ void BTM_BleOobDataReply(const RawAddress& bd_addr, uint8_t res, uint8_t len,
void BTM_BleSecureConnectionOobDataReply(const RawAddress& bd_addr,
                                         uint8_t* p_c, uint8_t* p_r) {
  tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev(bd_addr);

  BTM_TRACE_DEBUG("%s:", __func__);

  if (p_dev_rec == NULL) {
    BTM_TRACE_ERROR("%s: Unknown device", __func__);
    return;
  }

  BTM_LogHistory(
      kBtmLogTag, bd_addr, "Oob data reply",
      base::StringPrintf("transport:%s",
                         bt_transport_text(BT_TRANSPORT_LE).c_str()));

  p_dev_rec->sec_flags |= BTM_SEC_LE_AUTHENTICATED;

  tSMP_SC_OOB_DATA oob;
+8 −1
Original line number Diff line number Diff line
@@ -1267,8 +1267,15 @@ void BTM_ConfirmReqReply(tBTM_STATUS res, const RawAddress& bd_addr) {

  /* If timeout already expired or has been canceled, ignore the reply */
  if ((btm_cb.pairing_state != BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM) ||
      (btm_cb.pairing_bda != bd_addr))
      (btm_cb.pairing_bda != bd_addr)) {
    LOG_WARN(
        "Ignore confirm request reply as bonding has been canceled or timer "
        "expired");
    return;
  }

  BTM_LogHistory(kBtmLogTag, bd_addr, "Confirm reply",
                 base::StringPrintf("status:%s", btm_status_text(res).c_str()));

  btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE);