| // 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. |
| |
| #ifndef VTPM_COMMANDS_VIRTUALIZER_H_ |
| #define VTPM_COMMANDS_VIRTUALIZER_H_ |
| |
| #include "vtpm/commands/command.h" |
| |
| #include <memory> |
| #include <string> |
| #include <unordered_map> |
| #include <vector> |
| |
| #include <attestation/proto_bindings/attestation_ca.pb.h> |
| #include <attestation/proto_bindings/interface.pb.h> |
| #include <base/functional/callback.h> |
| #include <brillo/dbus/dbus_connection.h> |
| #include <brillo/errors/error.h> |
| #include <trunks/command_parser.h> |
| #include <trunks/real_command_parser.h> |
| #include <trunks/real_response_serializer.h> |
| #include <trunks/response_serializer.h> |
| #include <trunks/tpm_generated.h> |
| #include <trunks/trunks_factory_impl.h> |
| |
| // Requires proto_bindings `attestation`. |
| #include <attestation-client/attestation/dbus-proxies.h> |
| |
| #include "vtpm/backends/attested_virtual_endorsement.h" |
| #include "vtpm/backends/cacheable_blob.h" |
| #include "vtpm/backends/disk_cache_blob.h" |
| #include "vtpm/backends/endorsement_password_changer.h" |
| #include "vtpm/backends/real_static_analyzer.h" |
| #include "vtpm/backends/real_tpm_handle_manager.h" |
| #include "vtpm/backends/real_tpm_property_manager.h" |
| #include "vtpm/backends/vek.h" |
| #include "vtpm/backends/vek_cert.h" |
| #include "vtpm/backends/vek_cert_manager.h" |
| #include "vtpm/backends/vsrk.h" |
| #include "vtpm/commands/direct_forward_command.h" |
| #include "vtpm/commands/self_test_command.h" |
| |
| namespace vtpm { |
| |
| // `Virtualizer` implements the very top level of the TPM commands execution. it |
| // is designed to be configurable, and determines how to execute an incoming TPM |
| // command request with minimalist TPM-specifics. All the definition of the way |
| // a virtualized TPM works is abstracted into the implementation of those |
| // delegated objects. |
| class Virtualizer : public Command { |
| public: |
| enum Profile { |
| kGLinux, |
| }; |
| static std::unique_ptr<Virtualizer> Create(Profile profile); |
| Virtualizer(trunks::CommandParser* parser, |
| trunks::ResponseSerializer* serializer, |
| std::unordered_map<trunks::TPM_CC, Command*> table, |
| Command* fallback_command); |
| void Run(const std::string& command, |
| CommandResponseCallback callback) override; |
| |
| private: |
| Virtualizer() = default; |
| |
| // Adds support for `cc` with `command` as the handler. |
| void AddCommandSupport(trunks::TPM_CC cc, Command* command); |
| |
| // Functional object candidates for all profiles. |
| RealTpmPropertyManager real_tpm_property_manager_; |
| trunks::RealResponseSerializer real_response_serializer_; |
| trunks::RealCommandParser real_command_parser_; |
| RealStaticAnalyzer real_static_analyzer_; |
| SelfTestCommand self_test_command_{&real_response_serializer_}; |
| brillo::DBusConnection system_bus_connection_; |
| std::unique_ptr<org::chromium::AttestationProxy> attestation_proxy_; |
| std::unique_ptr<org::chromium::TpmManagerProxy> tpm_manager_proxy_; |
| std::unique_ptr<AttestedVirtualEndorsement> attested_virtual_endorsement_; |
| std::unique_ptr<EndorsementPasswordChanger> endorsement_password_changer_; |
| |
| // NOTE: This factory might be limited to used on the `Create()`-calling |
| // thread. |
| trunks::TrunksFactoryImpl trunks_factory_; |
| Vsrk vsrk_{&trunks_factory_}; |
| std::unique_ptr<Vek> vek_; |
| std::unique_ptr<VekCert> vek_cert_; |
| DirectForwardCommand direct_forwarder_{&trunks_factory_}; |
| |
| // Functional object candidates dynamically determined by profile. |
| std::unique_ptr<DiskCacheBlob> vsrk_cache_; |
| std::unique_ptr<DiskCacheBlob> vek_cache_; |
| std::unique_ptr<DiskCacheBlob> vek_cert_cache_; |
| std::unique_ptr<CacheableBlob> cacheable_vsrk_; |
| std::unique_ptr<CacheableBlob> cacheable_vek_; |
| std::unique_ptr<CacheableBlob> cacheable_vek_cert_; |
| std::unique_ptr<VekCertManager> vek_cert_manager_; |
| std::unique_ptr<RealTpmHandleManager> real_tpm_handle_manager_; |
| |
| std::vector<std::unique_ptr<Command>> commands_; |
| |
| // Functional objects used to execute the vtpm functions. The ownership of |
| // the pointees of these are owned the Virtualizer w/ the fields above |
| trunks::CommandParser* command_parser_ = nullptr; |
| trunks::ResponseSerializer* response_serializer_ = nullptr; |
| // The command table of which entries are the objects `this` delegates a TPM |
| // command to. |
| std::unordered_map<trunks::TPM_CC, Command*> command_table_; |
| // The command object that handles TPM commands that are not supported by |
| // `this`. |
| Command* fallback_command_ = nullptr; |
| }; |
| |
| } // namespace vtpm |
| |
| #endif // VTPM_COMMANDS_VIRTUALIZER_H_ |