blob: 4db6b2bd5862b8d0ae0abe51f337762f8e882642 [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 "hardware_verifier/hw_verification_report_getter_impl.h"
#include <memory>
#include <optional>
#include <utility>
#include <base/files/file_path.h>
#include <base/logging.h>
#include "hardware_verifier/hardware_verifier.pb.h"
#include "hardware_verifier/hw_verification_spec_getter_impl.h"
#include "hardware_verifier/observer.h"
#include "hardware_verifier/probe_result_getter_impl.h"
#include "hardware_verifier/verifier_impl.h"
namespace hardware_verifier {
HwVerificationReportGetterImpl::HwVerificationReportGetterImpl()
: pr_getter_(std::make_unique<ProbeResultGetterImpl>()),
vs_getter_(std::make_unique<HwVerificationSpecGetterImpl>()),
verifier_(std::make_unique<VerifierImpl>()) {}
std::optional<HwVerificationReport> HwVerificationReportGetterImpl::Get(
const base::StringPiece& probe_result_file,
const base::StringPiece& hw_verification_spec_file,
ErrorCode* out_error_code) const {
DVLOG(1) << "Get the verification payload.";
std::optional<HwVerificationSpec> hw_verification_spec;
if (hw_verification_spec_file.empty()) {
hw_verification_spec = vs_getter_->GetDefault();
if (!hw_verification_spec) {
if (out_error_code)
*out_error_code =
ErrorCode::kErrorCodeMissingDefaultHwVerificationSpecFile;
return std::nullopt;
}
} else {
hw_verification_spec =
vs_getter_->GetFromFile(base::FilePath(hw_verification_spec_file));
if (!hw_verification_spec) {
if (out_error_code)
*out_error_code = ErrorCode::kErrorCodeInvalidHwVerificationSpecFile;
return std::nullopt;
}
}
DVLOG(1) << "Get the probe result.";
std::optional<runtime_probe::ProbeResult> probe_result;
if (probe_result_file.empty()) {
auto observer = Observer::GetInstance();
observer->StartTimer(hardware_verifier::kMetricTimeToProbe);
probe_result = pr_getter_->GetFromRuntimeProbe();
observer->StopTimer(hardware_verifier::kMetricTimeToProbe);
if (!probe_result) {
if (out_error_code)
*out_error_code = ErrorCode::kErrorCodeProbeFail;
return std::nullopt;
}
} else {
probe_result = pr_getter_->GetFromFile(base::FilePath(probe_result_file));
if (!probe_result) {
if (out_error_code)
*out_error_code = ErrorCode::kErrorCodeInvalidProbeResultFile;
return std::nullopt;
}
}
DVLOG(1) << "Verify the probe result by the verification payload.";
const auto verifier_result =
verifier_->Verify(probe_result.value(), hw_verification_spec.value());
if (out_error_code) {
if (!verifier_result)
*out_error_code =
ErrorCode::kErrorCodeProbeResultHwVerificationSpecMisalignment;
else
*out_error_code = ErrorCode::kErrorCodeNoError;
}
return verifier_result;
}
} // namespace hardware_verifier