| // 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 |