| // 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 "vtpm/backends/real_static_analyzer.h" | |
| #include <string> | |
| #include <base/logging.h> | |
| #include <crypto/sha2.h> | |
| #include <trunks/command_parser.h> | |
| #include <trunks/tpm_generated.h> | |
| namespace vtpm { | |
| int RealStaticAnalyzer::GetCommandHandleCount(trunks::TPM_CC cc) { | |
| // The handle to be flushed is a parameter instead of a handle field. | |
| if (cc == trunks::TPM_CC_FlushContext) { | |
| return 1; | |
| } | |
| return trunks::GetNumberOfRequestHandles(cc); | |
| } | |
| int RealStaticAnalyzer::GetResponseHandleCount(trunks::TPM_CC cc) { | |
| return trunks::GetNumberOfResponseHandles(cc); | |
| } | |
| bool RealStaticAnalyzer::IsSuccessfulResponse(const std::string& response) { | |
| std::string serialized_rc = response.substr( | |
| trunks::kHeaderSize - sizeof(trunks::TPM_RC), sizeof(trunks::TPM_RC)); | |
| trunks::TPM_RC rc; | |
| if (trunks::Parse_TPM_RC(&serialized_rc, &rc, nullptr)) { | |
| return false; | |
| } | |
| return rc == trunks::TPM_RC_SUCCESS; | |
| } | |
| OperationContextType RealStaticAnalyzer::GetOperationContextType( | |
| trunks::TPM_CC cc) { | |
| if (cc == trunks::TPM_CC_Load) { | |
| return OperationContextType::kLoad; | |
| } | |
| if (cc == trunks::TPM_CC_FlushContext) { | |
| return OperationContextType::kUnload; | |
| } | |
| return OperationContextType::kNone; | |
| } | |
| trunks::TPM_RC RealStaticAnalyzer::ComputeNvName( | |
| const trunks::TPMS_NV_PUBLIC& nv_public, std::string& nv_name) { | |
| if (nv_public.name_alg != trunks::TPM_ALG_SHA256) { | |
| return trunks::TPM_RC_HASH; | |
| } | |
| std::string serialized_public_area; | |
| trunks::TPM_RC rc = | |
| trunks::Serialize_TPMS_NV_PUBLIC(nv_public, &serialized_public_area); | |
| if (rc) { | |
| return rc; | |
| } | |
| std::string serialized_name_alg; | |
| trunks::Serialize_TPM_ALG_ID(nv_public.name_alg, &serialized_name_alg); | |
| // Hardcode to sha256, the only supported name algorithm. | |
| nv_name = | |
| serialized_name_alg + crypto::SHA256HashString(serialized_public_area); | |
| return trunks::TPM_RC_SUCCESS; | |
| } | |
| } // namespace vtpm |