blob: f9bd96fe1604ab72ef8980abf7ebf87e15352a5a [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/cryptohome_client_impl.h"
#include <memory>
#include <utility>
#include <base/logging.h>
#include <base/memory/scoped_refptr.h>
#include <cryptohome/proto_bindings/rpc.pb.h>
#include <cryptohome/proto_bindings/UserDataAuth.pb.h>
#include <dbus/bus.h>
#include <user_data_auth-client/user_data_auth/dbus-proxies.h>
namespace rmad {
CryptohomeClientImpl::CryptohomeClientImpl(
const scoped_refptr<dbus::Bus>& bus) {
install_attributes_proxy_ =
std::make_unique<org::chromium::InstallAttributesInterfaceProxy>(bus);
}
CryptohomeClientImpl::CryptohomeClientImpl(
std::unique_ptr<org::chromium::InstallAttributesInterfaceProxyInterface>
install_attributes_proxy)
: install_attributes_proxy_(std::move(install_attributes_proxy)) {}
bool CryptohomeClientImpl::HasFwmp() {
return GetFwmp(nullptr);
}
bool CryptohomeClientImpl::IsEnrolled() {
uint32_t fwmp_flags;
if (!GetFwmp(&fwmp_flags)) {
return false;
}
return (fwmp_flags & cryptohome::DEVELOPER_DISABLE_BOOT) != 0;
}
bool CryptohomeClientImpl::GetFwmp(uint32_t* flags) {
user_data_auth::GetFirmwareManagementParametersRequest request;
user_data_auth::GetFirmwareManagementParametersReply reply;
brillo::ErrorPtr error;
if (!install_attributes_proxy_->GetFirmwareManagementParameters(
request, &reply, &error) ||
error) {
LOG(ERROR) << "Failed to call GetFirmwareManagementParameters from "
<< "cryptohome proxy";
return false;
}
// This can be expected when the device doesn't have FWMP.
if (reply.error() != user_data_auth::CRYPTOHOME_ERROR_NOT_SET) {
VLOG(1) << "Failed to get FWMP. Error code " << reply.error();
return false;
}
VLOG(1) << "Get FWMP flags: " << reply.fwmp().flags();
if (flags) {
*flags = reply.fwmp().flags();
}
return true;
}
} // namespace rmad