// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/dbus/tpm_manager/fake_tpm_manager_client.h"
#include <utility>
#include "base/functional/bind.h"
#include "base/location.h"
#include "base/notreached.h"
#include "base/task/single_thread_task_runner.h"
namespace chromeos {
namespace {
// Posts `callback` on the current thread's task runner, passing it the
// `reply` message.
template <class ReplyType>
void PostProtoResponse(base::OnceCallback<void(const ReplyType&)> callback,
const ReplyType& reply) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), reply));
}
} // namespace
FakeTpmManagerClient::FakeTpmManagerClient() {
// By design, TPM is configured as "enabled" and "owned" for backward
// compatibility of what fake cryptohome client used to do.
nonsensitive_status_reply_.set_is_enabled(true);
nonsensitive_status_reply_.set_is_owned(true);
}
FakeTpmManagerClient::~FakeTpmManagerClient() = default;
void FakeTpmManagerClient::GetTpmNonsensitiveStatus(
const ::tpm_manager::GetTpmNonsensitiveStatusRequest& request,
GetTpmNonsensitiveStatusCallback callback) {
::tpm_manager::GetTpmNonsensitiveStatusReply reply;
if (nonsensitive_status_dbus_error_count_ != 0) {
--nonsensitive_status_dbus_error_count_;
reply.set_status(::tpm_manager::STATUS_DBUS_ERROR);
} else {
reply = nonsensitive_status_reply_;
}
PostProtoResponse(std::move(callback), reply);
}
void FakeTpmManagerClient::GetVersionInfo(
const ::tpm_manager::GetVersionInfoRequest& request,
GetVersionInfoCallback callback) {
PostProtoResponse(std::move(callback), version_info_reply_);
}
void FakeTpmManagerClient::GetSupportedFeatures(
const ::tpm_manager::GetSupportedFeaturesRequest& request,
GetSupportedFeaturesCallback callback) {
PostProtoResponse(std::move(callback), supported_features_reply_);
}
void FakeTpmManagerClient::GetDictionaryAttackInfo(
const ::tpm_manager::GetDictionaryAttackInfoRequest& request,
GetDictionaryAttackInfoCallback callback) {
PostProtoResponse(std::move(callback), dictionary_attack_info_reply_);
}
void FakeTpmManagerClient::TakeOwnership(
const ::tpm_manager::TakeOwnershipRequest& request,
TakeOwnershipCallback callback) {
++take_ownership_count_;
PostProtoResponse(std::move(callback), ::tpm_manager::TakeOwnershipReply());
}
void FakeTpmManagerClient::ClearStoredOwnerPassword(
const ::tpm_manager::ClearStoredOwnerPasswordRequest& request,
ClearStoredOwnerPasswordCallback callback) {
++clear_stored_owner_password_count_;
PostProtoResponse(std::move(callback),
::tpm_manager::ClearStoredOwnerPasswordReply());
}
void FakeTpmManagerClient::ClearTpm(
const ::tpm_manager::ClearTpmRequest& request,
ClearTpmCallback callback) {
++clear_tpm_count_;
PostProtoResponse(std::move(callback), ::tpm_manager::ClearTpmReply());
}
void FakeTpmManagerClient::AddObserver(Observer* observer) {
observer_list_.AddObserver(observer);
}
void FakeTpmManagerClient::RemoveObserver(Observer* observer) {
observer_list_.RemoveObserver(observer);
}
TpmManagerClient::TestInterface* FakeTpmManagerClient::GetTestInterface() {
return this;
}
::tpm_manager::GetTpmNonsensitiveStatusReply*
FakeTpmManagerClient::mutable_nonsensitive_status_reply() {
return &nonsensitive_status_reply_;
}
void FakeTpmManagerClient::set_non_nonsensitive_status_dbus_error_count(
int count) {
nonsensitive_status_dbus_error_count_ = count;
}
::tpm_manager::GetVersionInfoReply*
FakeTpmManagerClient::mutable_version_info_reply() {
return &version_info_reply_;
}
::tpm_manager::GetSupportedFeaturesReply*
FakeTpmManagerClient::mutable_supported_features_reply() {
return &supported_features_reply_;
}
::tpm_manager::GetDictionaryAttackInfoReply*
FakeTpmManagerClient::mutable_dictionary_attack_info_reply() {
return &dictionary_attack_info_reply_;
}
int FakeTpmManagerClient::take_ownership_count() const {
return take_ownership_count_;
}
int FakeTpmManagerClient::clear_stored_owner_password_count() const {
return clear_stored_owner_password_count_;
}
int FakeTpmManagerClient::clear_tpm_count() const {
return clear_tpm_count_;
}
void FakeTpmManagerClient::EmitOwnershipTakenSignal() {
for (auto& observer : observer_list_) {
observer.OnOwnershipTaken();
}
}
} // namespace chromeos