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

Commit e13700eb authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Explicitly initialize union'ed structures" am: 830f5297

Original change: https://android-review.googlesource.com/c/platform/system/bt/+/1736367

Change-Id: I52a263a7c9e01f03a8e3c43954ace60b1fdffe68
parents 64216ddc 830f5297
Loading
Loading
Loading
Loading
+15 −10
Original line number Original line Diff line number Diff line
@@ -1976,8 +1976,6 @@ static void bta_dm_pinname_cback(void* p_data) {
 ******************************************************************************/
 ******************************************************************************/
static uint8_t bta_dm_pin_cback(const RawAddress& bd_addr, DEV_CLASS dev_class,
static uint8_t bta_dm_pin_cback(const RawAddress& bd_addr, DEV_CLASS dev_class,
                                BD_NAME bd_name, bool min_16_digit) {
                                BD_NAME bd_name, bool min_16_digit) {
  tBTA_DM_SEC sec_event;

  if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED;
  if (!bta_dm_cb.p_sec_cback) return BTM_NOT_AUTHORIZED;


  /* If the device name is not known, save bdaddr and devclass and initiate a
  /* If the device name is not known, save bdaddr and devclass and initiate a
@@ -1994,7 +1992,9 @@ static uint8_t bta_dm_pin_cback(const RawAddress& bd_addr, DEV_CLASS dev_class,
        " bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
        " bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
  }
  }


  sec_event.pin_req.bd_addr = bd_addr;
  tBTA_DM_SEC sec_event = {.pin_req = {
                               .bd_addr = bd_addr,
                           }};
  BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
  BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
  strlcpy((char*)sec_event.pin_req.bd_name, (char*)bd_name, BD_NAME_LEN + 1);
  strlcpy((char*)sec_event.pin_req.bd_name, (char*)bd_name, BD_NAME_LEN + 1);
  sec_event.pin_req.min_16_digit = min_16_digit;
  sec_event.pin_req.min_16_digit = min_16_digit;
@@ -3524,16 +3524,17 @@ static uint8_t bta_dm_ble_smp_cback(tBTM_LE_EVT event, const RawAddress& bda,
 ******************************************************************************/
 ******************************************************************************/
static void bta_dm_ble_id_key_cback(uint8_t key_type,
static void bta_dm_ble_id_key_cback(uint8_t key_type,
                                    tBTM_BLE_LOCAL_KEYS* p_key) {
                                    tBTM_BLE_LOCAL_KEYS* p_key) {
  uint8_t evt;
  tBTA_DM_SEC dm_key;

  switch (key_type) {
  switch (key_type) {
    case BTM_BLE_KEY_TYPE_ID:
    case BTM_BLE_KEY_TYPE_ID:
    case BTM_BLE_KEY_TYPE_ER:
    case BTM_BLE_KEY_TYPE_ER:
      if (bta_dm_cb.p_sec_cback) {
      if (bta_dm_cb.p_sec_cback) {
        tBTA_DM_SEC dm_key = {
            .ble_id_keys{},
        };
        memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
        memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));


        evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT
        uint8_t evt = (key_type == BTM_BLE_KEY_TYPE_ID)
                          ? BTA_DM_BLE_LOCAL_IR_EVT
                          : BTA_DM_BLE_LOCAL_ER_EVT;
                          : BTA_DM_BLE_LOCAL_ER_EVT;
        bta_dm_cb.p_sec_cback(evt, &dm_key);
        bta_dm_cb.p_sec_cback(evt, &dm_key);
      }
      }
@@ -3650,10 +3651,14 @@ void bta_dm_ble_observe(bool start, uint8_t duration,
  tBTM_STATUS status = BTM_BleObserve(true, duration, bta_dm_observe_results_cb,
  tBTM_STATUS status = BTM_BleObserve(true, duration, bta_dm_observe_results_cb,
                                      bta_dm_observe_cmpl_cb);
                                      bta_dm_observe_cmpl_cb);
  if (status != BTM_CMD_STARTED) {
  if (status != BTM_CMD_STARTED) {
    tBTA_DM_SEARCH data;
    APPL_TRACE_WARNING(" %s BTM_BleObserve  failed. status %d", __func__,
    APPL_TRACE_WARNING(" %s BTM_BleObserve  failed. status %d", __func__,
                       status);
                       status);
    data.inq_cmpl.num_resps = 0;
    tBTA_DM_SEARCH data = {
        .inq_cmpl =
            {
                .num_resps = 0,
            },
    };
    if (bta_dm_search_cb.p_scan_cback) {
    if (bta_dm_search_cb.p_scan_cback) {
      bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
      bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
    }
    }
+32 −16
Original line number Original line Diff line number Diff line
@@ -355,7 +355,6 @@ void smp_send_keypress_notification(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
 * Description  send encryption information command.
 * Description  send encryption information command.
 ******************************************************************************/
 ******************************************************************************/
void smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
void smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  tBTM_LE_KEY_VALUE le_key;


  SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
  SMP_TRACE_DEBUG("%s: p_cb->loc_enc_size = %d", __func__, p_cb->loc_enc_size);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, false);
@@ -364,10 +363,15 @@ void smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  smp_send_cmd(SMP_OPCODE_CENTRAL_ID, p_cb);
  smp_send_cmd(SMP_OPCODE_CENTRAL_ID, p_cb);


  /* save the DIV and key size information when acting as peripheral device */
  /* save the DIV and key size information when acting as peripheral device */
  le_key.lenc_key.ltk = p_cb->ltk;
  tBTM_LE_KEY_VALUE le_key = {
  le_key.lenc_key.div = p_cb->div;
      .lenc_key =
  le_key.lenc_key.key_size = p_cb->loc_enc_size;
          {
  le_key.lenc_key.sec_level = p_cb->sec_level;
              .ltk = p_cb->ltk,
              .div = p_cb->div,
              .key_size = p_cb->loc_enc_size,
              .sec_level = p_cb->sec_level,
          },
  };


  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
      (p_cb->loc_auth_req & SMP_AUTH_BOND))
      (p_cb->loc_auth_req & SMP_AUTH_BOND))
@@ -383,7 +387,6 @@ void smp_send_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
 * Description  send ID information command.
 * Description  send ID information command.
 ******************************************************************************/
 ******************************************************************************/
void smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
void smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  tBTM_LE_KEY_VALUE le_key;
  SMP_TRACE_DEBUG("%s", __func__);
  SMP_TRACE_DEBUG("%s", __func__);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, false);


@@ -392,22 +395,26 @@ void smp_send_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {


  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
  if ((p_cb->peer_auth_req & SMP_AUTH_BOND) &&
      (p_cb->loc_auth_req & SMP_AUTH_BOND))
      (p_cb->loc_auth_req & SMP_AUTH_BOND))
    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID, &le_key, true);
    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LID, nullptr, true);


  smp_key_distribution_by_transport(p_cb, NULL);
  smp_key_distribution_by_transport(p_cb, NULL);
}
}


/**  send CSRK command. */
/**  send CSRK command. */
void smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
void smp_send_csrk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  tBTM_LE_KEY_VALUE key;
  SMP_TRACE_DEBUG("%s", __func__);
  SMP_TRACE_DEBUG("%s", __func__);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, false);


  if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
  if (smp_send_cmd(SMP_OPCODE_SIGN_INFO, p_cb)) {
    key.lcsrk_key.div = p_cb->div;
    tBTM_LE_KEY_VALUE key = {
    key.lcsrk_key.sec_level = p_cb->sec_level;
        .lcsrk_key =
    key.lcsrk_key.counter = 0; /* initialize the local counter */
            {
    key.lcsrk_key.csrk = p_cb->csrk;
                .div = p_cb->div,
                .sec_level = p_cb->sec_level,
                .counter = 0, /* initialize the local counter */
                .csrk = p_cb->csrk,
            },
    };
    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, &key, true);
    btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LCSRK, &key, true);
  }
  }


@@ -973,7 +980,6 @@ void smp_proc_enc_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
/** process central ID from peripheral device */
/** process central ID from peripheral device */
void smp_proc_central_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
void smp_proc_central_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  uint8_t* p = p_data->p_data;
  uint8_t* p = p_data->p_data;
  tBTM_LE_KEY_VALUE le_key;


  SMP_TRACE_DEBUG("%s", __func__);
  SMP_TRACE_DEBUG("%s", __func__);


@@ -986,6 +992,9 @@ void smp_proc_central_id(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {


  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ENC, true);


  tBTM_LE_KEY_VALUE le_key = {
      .penc_key = {},
  };
  STREAM_TO_UINT16(le_key.penc_key.ediv, p);
  STREAM_TO_UINT16(le_key.penc_key.ediv, p);
  STREAM_TO_ARRAY(le_key.penc_key.rand, p, BT_OCTET8_LEN);
  STREAM_TO_ARRAY(le_key.penc_key.rand, p, BT_OCTET8_LEN);


@@ -1022,7 +1031,6 @@ void smp_proc_id_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
/** process identity address from peer device */
/** process identity address from peer device */
void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  uint8_t* p = p_data->p_data;
  uint8_t* p = p_data->p_data;
  tBTM_LE_KEY_VALUE pid_key;


  SMP_TRACE_DEBUG("%s", __func__);
  SMP_TRACE_DEBUG("%s", __func__);


@@ -1036,6 +1044,10 @@ void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {


  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_ID, true);


  tBTM_LE_KEY_VALUE pid_key = {
      .pid_key = {},
  };
  ;
  STREAM_TO_UINT8(pid_key.pid_key.identity_addr_type, p);
  STREAM_TO_UINT8(pid_key.pid_key.identity_addr_type, p);
  STREAM_TO_BDADDR(pid_key.pid_key.identity_addr, p);
  STREAM_TO_BDADDR(pid_key.pid_key.identity_addr, p);
  pid_key.pid_key.irk = p_cb->tk;
  pid_key.pid_key.irk = p_cb->tk;
@@ -1054,7 +1066,6 @@ void smp_proc_id_addr(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {


/* process security information from peer device */
/* process security information from peer device */
void smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
void smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  tBTM_LE_KEY_VALUE le_key;


  SMP_TRACE_DEBUG("%s", __func__);
  SMP_TRACE_DEBUG("%s", __func__);


@@ -1069,7 +1080,12 @@ void smp_proc_srk_info(tSMP_CB* p_cb, tSMP_INT_DATA* p_data) {
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);
  smp_update_key_mask(p_cb, SMP_SEC_KEY_TYPE_CSRK, true);


  /* save CSRK to security record */
  /* save CSRK to security record */
  le_key.pcsrk_key.sec_level = p_cb->sec_level;
  tBTM_LE_KEY_VALUE le_key = {
      .pcsrk_key =
          {
              .sec_level = p_cb->sec_level,
          },
  };


  /* get peer CSRK */
  /* get peer CSRK */
  maybe_non_aligned_memcpy(le_key.pcsrk_key.csrk.data(), p_data->p_data,
  maybe_non_aligned_memcpy(le_key.pcsrk_key.csrk.data(), p_data->p_data,
+3 −2
Original line number Original line Diff line number Diff line
@@ -88,8 +88,9 @@ void smp_proc_passkey(tSMP_CB* p_cb, BT_OCTET8 rand) {
  UINT32_TO_STREAM(tt, passkey);
  UINT32_TO_STREAM(tt, passkey);


  if (p_cb->p_callback) {
  if (p_cb->p_callback) {
    tSMP_EVT_DATA smp_evt_data;
    tSMP_EVT_DATA smp_evt_data = {
    smp_evt_data.passkey = passkey;
        .passkey = passkey,
    };
    (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda,
    (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda,
                        &smp_evt_data);
                        &smp_evt_data);
  }
  }
+18 −10
Original line number Original line Diff line number Diff line
@@ -1463,22 +1463,30 @@ bool smp_check_commitment(tSMP_CB* p_cb) {
 *
 *
 ******************************************************************************/
 ******************************************************************************/
void smp_save_secure_connections_long_term_key(tSMP_CB* p_cb) {
void smp_save_secure_connections_long_term_key(tSMP_CB* p_cb) {
  tBTM_LE_KEY_VALUE lle_key;
  tBTM_LE_KEY_VALUE ple_key;


  SMP_TRACE_DEBUG("%s-Save LTK as local LTK key", __func__);
  SMP_TRACE_DEBUG("%s-Save LTK as local LTK key", __func__);
  lle_key.lenc_key.ltk = p_cb->ltk;
  tBTM_LE_KEY_VALUE lle_key = {
  lle_key.lenc_key.div = 0;
      .lenc_key =
  lle_key.lenc_key.key_size = p_cb->loc_enc_size;
          {
  lle_key.lenc_key.sec_level = p_cb->sec_level;
              .ltk = p_cb->ltk,
              .div = 0,
              .key_size = p_cb->loc_enc_size,
              .sec_level = p_cb->sec_level,
          },
  };
  btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, &lle_key, true);
  btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, &lle_key, true);


  SMP_TRACE_DEBUG("%s-Save LTK as peer LTK key", __func__);
  SMP_TRACE_DEBUG("%s-Save LTK as peer LTK key", __func__);
  ple_key.penc_key.ediv = 0;
  tBTM_LE_KEY_VALUE ple_key = {
      .penc_key =
          {
              .ltk = p_cb->ltk,
              .sec_level = p_cb->sec_level,
              .key_size = p_cb->loc_enc_size,
              .ediv = 0,
          },
  };
  memset(ple_key.penc_key.rand, 0, BT_OCTET8_LEN);
  memset(ple_key.penc_key.rand, 0, BT_OCTET8_LEN);
  ple_key.penc_key.ltk = p_cb->ltk;
  ple_key.penc_key.sec_level = p_cb->sec_level;
  ple_key.penc_key.key_size = p_cb->loc_enc_size;
  btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, &ple_key, true);
  btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, &ple_key, true);
}
}