blob: da4f92be2292cb4b214694edfc5640b7c7a3f5b6 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/cryptauth/ble/ble_advertisement_generator.h"
#include <vector>
#include "base/memory/ptr_util.h"
#include "components/cryptauth/local_device_data_provider.h"
#include "components/cryptauth/remote_beacon_seed_fetcher.h"
#include "components/cryptauth/remote_device.h"
#include "components/proximity_auth/logging/logging.h"
namespace cryptauth {
// static
BleAdvertisementGenerator* BleAdvertisementGenerator::instance_ = nullptr;
// static
std::unique_ptr<DataWithTimestamp>
BleAdvertisementGenerator::GenerateBleAdvertisement(
const std::string& device_id,
LocalDeviceDataProvider* local_device_data_provider,
RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher) {
if (!instance_)
instance_ = new BleAdvertisementGenerator();
return instance_->GenerateBleAdvertisementInternal(
device_id, local_device_data_provider, remote_beacon_seed_fetcher);
}
// static
void BleAdvertisementGenerator::SetInstanceForTesting(
BleAdvertisementGenerator* test_generator) {
instance_ = test_generator;
}
BleAdvertisementGenerator::BleAdvertisementGenerator()
: eid_generator_(base::MakeUnique<cryptauth::ForegroundEidGenerator>()) {}
BleAdvertisementGenerator::~BleAdvertisementGenerator() {}
std::unique_ptr<DataWithTimestamp>
BleAdvertisementGenerator::GenerateBleAdvertisementInternal(
const std::string& device_id,
LocalDeviceDataProvider* local_device_data_provider,
RemoteBeaconSeedFetcher* remote_beacon_seed_fetcher) {
std::string local_device_public_key;
if (!local_device_data_provider->GetLocalDeviceData(&local_device_public_key,
nullptr)) {
PA_LOG(WARNING) << "Error fetching the local device's public key. Cannot "
<< "advertise without the public key.";
return nullptr;
}
if (local_device_public_key.empty()) {
PA_LOG(WARNING) << "Local device's public key is empty. Cannot advertise "
<< "with an invalid key.";
return nullptr;
}
std::vector<BeaconSeed> remote_beacon_seeds;
if (!remote_beacon_seed_fetcher->FetchSeedsForDeviceId(
device_id, &remote_beacon_seeds)) {
PA_LOG(WARNING) << "Error fetching beacon seeds for device with ID "
<< RemoteDevice::TruncateDeviceIdForLogs(device_id) << ". "
<< "Cannot advertise without seeds.";
return nullptr;
}
if (remote_beacon_seeds.empty()) {
PA_LOG(WARNING) << "No synced seeds exist for device with ID "
<< RemoteDevice::TruncateDeviceIdForLogs(device_id) << ". "
<< "Cannot advertise without seeds.";
return nullptr;
}
std::unique_ptr<DataWithTimestamp> service_data =
eid_generator_->GenerateAdvertisement(local_device_public_key,
remote_beacon_seeds);
if (!service_data) {
PA_LOG(WARNING) << "Error generating advertisement for device with ID "
<< RemoteDevice::TruncateDeviceIdForLogs(device_id) << ". "
<< "Cannot advertise.";
return nullptr;
}
return service_data;
}
void BleAdvertisementGenerator::SetEidGeneratorForTesting(
std::unique_ptr<ForegroundEidGenerator> test_eid_generator) {
eid_generator_ = std::move(test_eid_generator);
}
} // namespace cryptauth