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

Commit 18e0f981 authored by Myles Watson's avatar Myles Watson
Browse files

Security: Move parsing to HCI: local OOB

The security code should not have to parse packets.

Bug: 301661850
Test: mma -j32
Change-Id: I6da2007d4af48ca9180ffbd0e9ea411d21c15580
parent 16a237e7
Loading
Loading
Loading
Loading
+2 −26
Original line number Diff line number Diff line
@@ -3088,38 +3088,14 @@ void btm_rem_oob_req(const RawAddress bd_addr) {
 * Returns          void
 *
 ******************************************************************************/
void btm_read_local_oob_complete(uint8_t* p, uint16_t evt_len) {
  tBTM_SP_LOC_OOB evt_data;
  uint8_t status;
  if (evt_len < 1) {
    goto err_out;
  }

  STREAM_TO_UINT8(status, p);

  LOG_VERBOSE("btm_read_local_oob_complete:%d", status);
  if (status == HCI_SUCCESS) {
    evt_data.status = BTM_SUCCESS;

    if (evt_len < 32 + 1) {
      goto err_out;
    }

    STREAM_TO_ARRAY16(evt_data.c.data(), p);
    STREAM_TO_ARRAY16(evt_data.r.data(), p);
  } else
    evt_data.status = BTM_ERR_PROCESSING;
void btm_read_local_oob_complete(const tBTM_SP_LOC_OOB evt_data) {
  LOG_VERBOSE("btm_read_local_oob_complete:%d", evt_data.status);

  if (btm_sec_cb.api.p_sp_callback) {
    tBTM_SP_EVT_DATA btm_sp_evt_data;
    btm_sp_evt_data.loc_oob = evt_data;
    (*btm_sec_cb.api.p_sp_callback)(BTM_SP_LOC_OOB_EVT, &btm_sp_evt_data);
  }

  return;

err_out:
  LOG_ERROR("%s: bogus event packet, too short", __func__);
}

/*******************************************************************************
+1 −1
Original line number Diff line number Diff line
@@ -594,7 +594,7 @@ void btm_rem_oob_req(const RawAddress bd_addr);
 * Returns          void
 *
 ******************************************************************************/
void btm_read_local_oob_complete(uint8_t* p, uint16_t evt_len);
void btm_read_local_oob_complete(const tBTM_SP_LOC_OOB evt_data);

/*******************************************************************************
 *
+26 −1
Original line number Diff line number Diff line
@@ -99,6 +99,8 @@ static void btu_hcif_rem_oob_req(const uint8_t* p);
static void btu_hcif_simple_pair_complete(const uint8_t* p);
static void btu_hcif_create_conn_cancel_complete(const uint8_t* p,
                                                 uint16_t evt_len);
static void btu_hcif_read_local_oob_complete(const uint8_t* p,
                                             uint16_t evt_len);

/* Simple Pairing Events */
static void btu_hcif_io_cap_request_evt(const uint8_t* p);
@@ -1119,7 +1121,7 @@ static void btu_hcif_hdl_command_complete(uint16_t opcode, uint8_t* p,
      break;

    case HCI_READ_LOCAL_OOB_DATA:
      btm_read_local_oob_complete(p, evt_len);
      btu_hcif_read_local_oob_complete(p, evt_len);
      break;

    case HCI_READ_INQ_TX_POWER_LEVEL:
@@ -1447,6 +1449,29 @@ void btu_hcif_create_conn_cancel_complete(const uint8_t* p, uint16_t evt_len) {
  STREAM_TO_BDADDR(bd_addr, p);
  btm_create_conn_cancel_complete(status, bd_addr);
}
void btu_hcif_read_local_oob_complete(const uint8_t* p, uint16_t evt_len) {
  tBTM_SP_LOC_OOB evt_data;
  uint8_t status;
  if (evt_len < 1) {
    goto err_out;
  }
  STREAM_TO_UINT8(status, p);
  if (status == HCI_SUCCESS) {
    evt_data.status = BTM_SUCCESS;
  } else {
    evt_data.status = BTM_ERR_PROCESSING;
  }
  if (evt_len < 32 + 1) {
    goto err_out;
  }
  STREAM_TO_ARRAY16(evt_data.c.data(), p);
  STREAM_TO_ARRAY16(evt_data.r.data(), p);
  btm_read_local_oob_complete(evt_data);
  return;

err_out:
  LOG_ERROR("%s: bogus event packet, too short", __func__);
}

/*******************************************************************************
 *
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ void btm_create_conn_cancel_complete(uint8_t status, const RawAddress bd_addr);
void btm_io_capabilities_req(RawAddress p);
void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data);
void btm_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p);
void btm_read_local_oob_complete(uint8_t* p, uint16_t evt_len);
void btm_read_local_oob_complete(const tBTM_SP_LOC_OOB evt_data);
void btm_rem_oob_req(const RawAddress bd_addr);
void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status);
void btm_sec_disconnected(uint16_t handle, tHCI_STATUS reason, std::string);
+2 −2
Original line number Diff line number Diff line
@@ -316,9 +316,9 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p) {
  inc_func_call_count(__func__);
  test::mock::stack_btm_sec::btm_proc_sp_req_evt(event, p);
}
void btm_read_local_oob_complete(uint8_t* p, uint16_t evt_len) {
void btm_read_local_oob_complete(const tBTM_SP_LOC_OOB evt_data) {
  inc_func_call_count(__func__);
  test::mock::stack_btm_sec::btm_read_local_oob_complete(p, evt_len);
  test::mock::stack_btm_sec::btm_read_local_oob_complete(evt_data);
}
void btm_rem_oob_req(const RawAddress bd_addr) {
  inc_func_call_count(__func__);
Loading