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

Commit 79ae1efe authored by Myles Watson's avatar Myles Watson
Browse files

Security: Move parsing to HCI: SP events

The security code should not have to parse packets.

Bug: 301661850
Test: mma -j32
Change-Id: If5e5cbd5e3ea487719785ec5571a3fcc3ce5fb37
parent 84ff0696
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -2842,15 +2842,14 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data) {
 * Returns          void
 *
 ******************************************************************************/
void btm_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p) {
void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda,
                         const uint32_t value) {
  tBTM_STATUS status = BTM_ERR_PROCESSING;
  tBTM_SP_EVT_DATA evt_data;
  RawAddress& p_bda = evt_data.cfm_req.bd_addr;
  tBTM_SEC_DEV_REC* p_dev_rec;

  /* All events start with bd_addr */
  STREAM_TO_BDADDR(p_bda, p);

  p_bda = bda;
  VLOG(2) << " BDA: " << ADDRESS_TO_LOGGABLE_STR(p_bda) << " event: 0x"
          << std::hex << +event
          << " State: " << btm_pair_state_descr(btm_sec_cb.pairing_state);
@@ -2871,7 +2870,7 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p) {
        btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM);

        /* The device record must be allocated in the "IO cap exchange" step */
        STREAM_TO_UINT32(evt_data.cfm_req.num_val, p);
        evt_data.cfm_req.num_val = value;
        LOG_VERBOSE("BTM_SP_CFM_REQ_EVT:  num_val: %u",
                    evt_data.cfm_req.num_val);

@@ -2917,7 +2916,7 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p) {

      case BTM_SP_KEY_NOTIF_EVT:
        /* Passkey notification (other side is a keyboard) */
        STREAM_TO_UINT32(evt_data.key_notif.passkey, p);
        evt_data.key_notif.passkey = value;
        LOG_VERBOSE("BTM_SP_KEY_NOTIF_EVT:  passkey: %u",
                    evt_data.key_notif.passkey);

+2 −1
Original line number Diff line number Diff line
@@ -558,7 +558,8 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data);
 * Returns          void
 *
 ******************************************************************************/
void btm_proc_sp_req_evt(tBTM_SP_EVT event, uint8_t* p);
void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda,
                         uint32_t value);

/*******************************************************************************
 *
+21 −3
Original line number Diff line number Diff line
@@ -99,6 +99,7 @@ static void btu_hcif_sec_pin_code_request(const uint8_t* p);
static void btu_hcif_sec_link_key_request(const uint8_t* p);
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_proc_sp_req_evt(const tBTM_SP_EVT event, 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,
@@ -309,10 +310,10 @@ void btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id,
      btu_hcif_io_cap_response_evt(p);
      break;
    case HCI_USER_CONFIRMATION_REQUEST_EVT:
      btm_proc_sp_req_evt(BTM_SP_CFM_REQ_EVT, p);
      btu_hcif_proc_sp_req_evt(BTM_SP_CFM_REQ_EVT, p);
      break;
    case HCI_USER_PASSKEY_REQUEST_EVT:
      btm_proc_sp_req_evt(BTM_SP_KEY_REQ_EVT, p);
      btu_hcif_proc_sp_req_evt(BTM_SP_KEY_REQ_EVT, p);
      break;
    case HCI_REMOTE_OOB_DATA_REQUEST_EVT:
      btu_hcif_rem_oob_req(p);
@@ -321,7 +322,7 @@ void btu_hcif_process_event(UNUSED_ATTR uint8_t controller_id,
      btu_hcif_simple_pair_complete(p);
      break;
    case HCI_USER_PASSKEY_NOTIFY_EVT:
      btm_proc_sp_req_evt(BTM_SP_KEY_NOTIF_EVT, p);
      btu_hcif_proc_sp_req_evt(BTM_SP_KEY_NOTIF_EVT, p);
      break;

    case HCI_BLE_EVENT: {
@@ -1449,6 +1450,23 @@ void btu_hcif_simple_pair_complete(const uint8_t* p) {
  STREAM_TO_BDADDR(bd_addr, p);
  btm_simple_pair_complete(bd_addr, status);
}
void btu_hcif_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p) {
  RawAddress bda;
  uint32_t value = 0;

  /* All events start with bd_addr */
  STREAM_TO_BDADDR(bda, p);
  switch (event) {
    case BTM_SP_CFM_REQ_EVT:
    case BTM_SP_KEY_NOTIF_EVT:
      STREAM_TO_UINT32(value, p);
      break;
    case BTM_SP_KEY_REQ_EVT:
      // No value needed.
      break;
  }
  btm_proc_sp_req_evt(event, bda, value);
}
void btu_hcif_create_conn_cancel_complete(const uint8_t* p, uint16_t evt_len) {
  uint8_t status;

+2 −1
Original line number Diff line number Diff line
@@ -28,7 +28,8 @@
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_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda,
                         uint32_t value);
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);
+3 −2
Original line number Diff line number Diff line
@@ -312,9 +312,10 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data) {
  inc_func_call_count(__func__);
  test::mock::stack_btm_sec::btm_io_capabilities_rsp(evt_data);
}
void btm_proc_sp_req_evt(tBTM_SP_EVT event, const uint8_t* p) {
void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bd_addr,
                         uint32_t value) {
  inc_func_call_count(__func__);
  test::mock::stack_btm_sec::btm_proc_sp_req_evt(event, p);
  test::mock::stack_btm_sec::btm_proc_sp_req_evt(event, bd_addr, value);
}
void btm_read_local_oob_complete(const tBTM_SP_LOC_OOB evt_data) {
  inc_func_call_count(__func__);
Loading