blob: 9c589384f00d0ad12a61aacf6819e904fad5d099 [file] [log] [blame]
// Copyright 2021 The Chromium OS 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 "rmad/system/tpm_manager_client_impl.h"
#include <memory>
#include <utility>
#include <base/memory/scoped_refptr.h>
#include <base/notreached.h>
#include <dbus/bus.h>
#include <tpm_manager/proto_bindings/tpm_manager.pb.h>
#include <tpm_manager-client/tpm_manager/dbus-proxies.h>
namespace rmad {
namespace {
RoVerificationStatus TpmManagerRoStatusToRmadRoStatus(
tpm_manager::RoVerificationStatus status) {
switch (status) {
case tpm_manager::RO_STATUS_NOT_TRIGGERED:
return RoVerificationStatus::NOT_TRIGGERED;
case tpm_manager::RO_STATUS_PASS:
return RoVerificationStatus::PASS;
case tpm_manager::RO_STATUS_FAIL:
return RoVerificationStatus::FAIL;
case tpm_manager::RO_STATUS_UNSUPPORTED:
return RoVerificationStatus::UNSUPPORTED;
default:
break;
}
NOTREACHED();
return RoVerificationStatus::UNSUPPORTED;
}
} // namespace
TpmManagerClientImpl::TpmManagerClientImpl(
const scoped_refptr<dbus::Bus>& bus) {
tpm_manager_proxy_ = std::make_unique<org::chromium::TpmManagerProxy>(bus);
}
TpmManagerClientImpl::TpmManagerClientImpl(
std::unique_ptr<org::chromium::TpmManagerProxyInterface> tpm_manager_proxy)
: tpm_manager_proxy_(std::move(tpm_manager_proxy)) {}
bool TpmManagerClientImpl::GetRoVerificationStatus(
RoVerificationStatus* ro_verification_status) {
tpm_manager::GetRoVerificationStatusRequest request;
tpm_manager::GetRoVerificationStatusReply reply;
brillo::ErrorPtr error;
if (!tpm_manager_proxy_->GetRoVerificationStatus(request, &reply, &error) ||
error) {
LOG(ERROR)
<< "Failed to call GetRoVerificationStatus from tpm_manager proxy";
return false;
}
if (reply.status() != tpm_manager::STATUS_SUCCESS) {
LOG(ERROR) << "Failed to get RO verification status. Error code "
<< reply.status();
return false;
}
VLOG(1) << "Get RO verification status: " << reply.ro_verification_status();
if (ro_verification_status) {
*ro_verification_status =
TpmManagerRoStatusToRmadRoStatus(reply.ro_verification_status());
}
return true;
}
} // namespace rmad