blob: cf986f2e687c67b72ff726ea2f99db93601b062a [file] [log] [blame] [edit]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "libhwsec/backend/tpm1/da_mitigation.h"
#include <utility>
#include <base/time/time.h>
#include <libhwsec-foundation/status/status_chain_macros.h>
#include <tpm_manager/proto_bindings/tpm_manager.pb.h>
#include <tpm_manager-client/tpm_manager/dbus-proxies.h>
#include "libhwsec/error/tpm_manager_error.h"
using hwsec_foundation::status::MakeStatus;
namespace hwsec {
StatusOr<bool> DAMitigationTpm1::IsReady() {
tpm_manager::GetTpmNonsensitiveStatusRequest request;
tpm_manager::GetTpmNonsensitiveStatusReply reply;
if (brillo::ErrorPtr err; !tpm_manager_.GetTpmNonsensitiveStatus(
request, &reply, &err, Proxy::kDefaultDBusTimeoutMs)) {
return MakeStatus<TPMError>(TPMRetryAction::kCommunication)
.Wrap(std::move(err));
}
RETURN_IF_ERROR(MakeStatus<TPMManagerError>(reply.status()));
return reply.has_reset_lock_permissions();
}
StatusOr<DAMitigationTpm1::DAMitigationStatus> DAMitigationTpm1::GetStatus() {
tpm_manager::GetDictionaryAttackInfoRequest request;
tpm_manager::GetDictionaryAttackInfoReply reply;
if (brillo::ErrorPtr err; !tpm_manager_.GetDictionaryAttackInfo(
request, &reply, &err, Proxy::kDefaultDBusTimeoutMs)) {
return MakeStatus<TPMError>(TPMRetryAction::kCommunication)
.Wrap(std::move(err));
}
RETURN_IF_ERROR(MakeStatus<TPMManagerError>(reply.status()));
return DAMitigationStatus{
.lockout = reply.dictionary_attack_lockout_in_effect(),
.remaining =
base::Seconds(reply.dictionary_attack_lockout_seconds_remaining()),
};
}
Status DAMitigationTpm1::Mitigate() {
tpm_manager::ResetDictionaryAttackLockRequest request;
tpm_manager::ResetDictionaryAttackLockReply reply;
if (brillo::ErrorPtr err; !tpm_manager_.ResetDictionaryAttackLock(
request, &reply, &err, Proxy::kDefaultDBusTimeoutMs)) {
return MakeStatus<TPMError>(TPMRetryAction::kCommunication)
.Wrap(std::move(err));
}
return MakeStatus<TPMManagerError>(reply.status());
}
} // namespace hwsec