| // Copyright 2024 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "runtime_probe/functions/tpm.h" | |
| #include <cstddef> | |
| #include <string> | |
| #include <utility> | |
| #include <base/functional/bind.h> | |
| #include <base/no_destructor.h> | |
| #include <base/strings/stringprintf.h> | |
| #include <base/values.h> | |
| #include <diagnostics/mojom/public/cros_healthd.mojom.h> | |
| #include <diagnostics/mojom/public/cros_healthd_probe.mojom.h> | |
| #include "runtime_probe/system/context.h" | |
| namespace runtime_probe { | |
| namespace cros_healthd_mojom = ::ash::cros_healthd::mojom; | |
| namespace { | |
| constexpr char kUnknownVendorSpecific[] = "unknown"; | |
| // Simulator Vendor ID ("SIMU"). | |
| constexpr uint32_t kVendorIdSimulator = 0x53494d55; | |
| // Callback function to convert the telemetry info to |probe_result|. | |
| void ProbeTpmTelemetryInfoCallback( | |
| base::OnceCallback<void(TpmFunction::DataType)> callback, | |
| cros_healthd_mojom::TelemetryInfoPtr telemetry_info_ptr) { | |
| const auto& tpm_result = telemetry_info_ptr->tpm_result; | |
| if (tpm_result.is_null()) { | |
| LOG(ERROR) << "No TPM result from cros_healthd."; | |
| std::move(callback).Run(TpmFunction::DataType{}); | |
| } | |
| TpmFunction::DataType probe_result; | |
| if (tpm_result->is_error()) { | |
| const auto& error = tpm_result->get_error(); | |
| LOG(ERROR) << "Got an error when fetching TPM info: " << error->type | |
| << "::" << error->msg; | |
| } else { | |
| const auto& tpm_version = tpm_result->get_tpm_info()->version; | |
| // Filter TPM2 simulator | |
| if (!tpm_version.is_null() && | |
| tpm_version->manufacturer != kVendorIdSimulator) { | |
| probe_result.Append( | |
| base::Value::Dict() | |
| .Set("spec_level", std::to_string(tpm_version->spec_level)) | |
| .Set("vendor_specific", tpm_version->vendor_specific.value_or( | |
| kUnknownVendorSpecific)) | |
| .Set("manufacturer", | |
| base::StringPrintf("0x%x", tpm_version->manufacturer))); | |
| } | |
| } | |
| std::move(callback).Run(std::move(probe_result)); | |
| } | |
| } // namespace | |
| void TpmFunction::EvalAsyncImpl( | |
| base::OnceCallback<void(TpmFunction::DataType)> callback) const { | |
| Context::Get()->GetCrosHealthdProbeServiceProxy()->ProbeTelemetryInfo( | |
| {cros_healthd_mojom::ProbeCategoryEnum::kTpm}, | |
| base::BindOnce(&ProbeTpmTelemetryInfoCallback, std::move(callback))); | |
| } | |
| } // namespace runtime_probe |