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

Commit b6f137cf authored by Łukasz Rymanowski's avatar Łukasz Rymanowski
Browse files

has_client: Improve encryption handling

When enabling encryption, rely on the BTA_GATTC_ENC_CMPL_CB_EVT.
Bug: 278192118
Test: atest BluetoothInstrumenatationTests
Tag: #feature

Change-Id: I6ec4610b4aa52c810f9c28cda8f0dfaf87f00c05
parent e4ea7512
Loading
Loading
Loading
Loading
+4 −16
Original line number Diff line number Diff line
@@ -1874,25 +1874,13 @@ class HasClientImpl : public HasClient {
    /* verify bond */
    if (BTM_IsEncrypted(device->addr, BT_TRANSPORT_LE)) {
      /* if link has been encrypted */
      if (device->isGattServiceValid()) {
        instance->OnEncrypted(*device);
      } else {
        BTA_GATTC_ServiceSearchRequest(device->conn_id,
                                       &kUuidHearingAccessService);
      }
      OnEncrypted(*device);
      return;
    }

    int result = BTM_SetEncryption(
        evt.remote_bda, BT_TRANSPORT_LE,
        [](const RawAddress* bd_addr, tBT_TRANSPORT transport, void* p_ref_data,
           tBTM_STATUS status) {
          if (instance)
            instance->OnLeEncryptionComplete(*bd_addr, status == BTM_SUCCESS);
        },
    int result = BTM_SetEncryption(device->addr, BT_TRANSPORT_LE, nullptr,
                                   nullptr, BTM_BLE_SEC_ENCRYPT);

    DLOG(INFO) << __func__ << ": Encryption request result: " << result;
    LOG_INFO("Encryption required. Request result: 0x%02x", result);
  }

  void OnGattDisconnected(const tBTA_GATTC_CLOSE& evt) {
+20 −17
Original line number Diff line number Diff line
@@ -654,6 +654,15 @@ class HasClientTestBase : public ::testing::Test {

    encryption_result = true;

    ON_CALL(btm_interface, SetEncryption(_, _, _, _, _))
        .WillByDefault(
            Invoke([this](const RawAddress& bd_addr, tBT_TRANSPORT transport,
                          tBTM_SEC_CALLBACK* p_callback, void* p_ref_data,
                          tBTM_BLE_SEC_ACT sec_act) -> tBTM_STATUS {
              InjectEncryptionEvent(bd_addr);
              return BTM_SUCCESS;
            }));

    MockCsisClient::SetMockInstanceForTesting(&mock_csis_client_module_);
    ON_CALL(mock_csis_client_module_, Get())
        .WillByDefault(Return(&mock_csis_client_module_));
@@ -868,26 +877,20 @@ class HasClientTestBase : public ::testing::Test {
    gatt_callback(BTA_GATTC_NOTIF_EVT, (tBTA_GATTC*)&event_data);
  }

  void InjectEncryptionEvent(const RawAddress& test_address) {
    tBTA_GATTC_ENC_CMPL_CB event_data = {
        .client_if = static_cast<tGATT_IF>(GetTestConnId(test_address)),
        .remote_bda = test_address,
    };

    gatt_callback(BTA_GATTC_ENC_CMPL_CB_EVT, (tBTA_GATTC*)&event_data);
  }

  void SetEncryptionResult(const RawAddress& address, bool success) {
    encryption_result = success;

    ON_CALL(btm_interface, BTM_IsEncrypted(address, _))
        .WillByDefault(Return(success));
    ON_CALL(btm_interface, GetSecurityFlagsByTransport(address, NotNull(), _))
        .WillByDefault(
            DoAll(SetArgPointee<1>(success ? BTM_SEC_FLAG_ENCRYPTED : 0),
                  Return(true)));
    if (!success) {
      EXPECT_CALL(btm_interface,
                  SetEncryption(address, _, NotNull(), _, BTM_BLE_SEC_ENCRYPT))
          .WillOnce(Invoke(
              [success](const RawAddress& bd_addr, tBT_TRANSPORT transport,
                        tBTM_SEC_CALLBACK* p_callback, void* p_ref_data,
                        tBTM_BLE_SEC_ACT sec_act) -> tBTM_STATUS {
                p_callback(&bd_addr, transport, p_ref_data,
                           success ? BTM_SUCCESS : BTM_FAILED_ON_SECURITY);
                return BTM_SUCCESS;
              }));
    }
        .WillByDefault(DoAll(Return(encryption_result)));
  }

  void InjectNotifyReadPresetResponse(uint16_t conn_id,