// // Copyright (C) 2015 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef TPM_MANAGER_SERVER_TPM_MANAGER_SERVICE_H_ #define TPM_MANAGER_SERVER_TPM_MANAGER_SERVICE_H_ #include #include #include #include #include #include #include "tpm_manager/common/tpm_nvram_interface.h" #include "tpm_manager/common/tpm_ownership_interface.h" #include "tpm_manager/server/local_data_store.h" #include "tpm_manager/server/tpm_initializer.h" #include "tpm_manager/server/tpm_nvram.h" #include "tpm_manager/server/tpm_status.h" #include "trunks/trunks_factory.h" namespace tpm_manager { // This class implements the core tpm_manager service. All Tpm access is // asynchronous, except for the initial setup in Initialize(). // Usage: // std::unique_ptr tpm_manager = new TpmManagerService(); // CHECK(tpm_manager->Initialize()); // tpm_manager->GetTpmStatus(...); // // THREADING NOTES: // This class runs a worker thread and delegates all calls to it. This keeps the // public methods non-blocking while allowing complex implementation details // with dependencies on the TPM, network, and filesystem to be coded in a more // readable way. It also serves to serialize method execution which reduces // complexity with TPM state. // // Tasks that run on the worker thread are bound with base::Unretained which is // safe because the thread is owned by this class (so it is guaranteed not to // process a task after destruction). Weak pointers are used to post replies // back to the main thread. class TpmManagerService : public TpmNvramInterface, public TpmOwnershipInterface { public: // If |wait_for_ownership| is set, TPM initialization will be postponed until // an explicit TakeOwnership request is received. Does not take ownership of // |local_data_store|, |tpm_status| or |tpm_initializer|. explicit TpmManagerService(bool wait_for_ownership, LocalDataStore* local_data_store, TpmStatus* tpm_status, TpmInitializer* tpm_initializer, TpmNvram* tpm_nvram); ~TpmManagerService() override = default; // Performs initialization tasks. This method must be called before calling // any other method in this class. Returns true on success. bool Initialize(); // TpmOwnershipInterface methods. void GetTpmStatus(const GetTpmStatusRequest& request, const GetTpmStatusCallback& callback) override; void TakeOwnership(const TakeOwnershipRequest& request, const TakeOwnershipCallback& callback) override; void RemoveOwnerDependency( const RemoveOwnerDependencyRequest& request, const RemoveOwnerDependencyCallback& callback) override; // TpmNvramInterface methods. void DefineSpace(const DefineSpaceRequest& request, const DefineSpaceCallback& callback) override; void DestroySpace(const DestroySpaceRequest& request, const DestroySpaceCallback& callback) override; void WriteSpace(const WriteSpaceRequest& request, const WriteSpaceCallback& callback) override; void ReadSpace(const ReadSpaceRequest& request, const ReadSpaceCallback& callback) override; void LockSpace(const LockSpaceRequest& request, const LockSpaceCallback& callback) override; void ListSpaces(const ListSpacesRequest& request, const ListSpacesCallback& callback) override; void GetSpaceInfo(const GetSpaceInfoRequest& request, const GetSpaceInfoCallback& callback) override; private: // A relay callback which allows the use of weak pointer semantics for a reply // to TaskRunner::PostTaskAndReply. template void TaskRelayCallback( const base::Callback callback, const std::shared_ptr& reply); // This templated method posts the provided |TaskType| to the background // thread with the provided |RequestProtobufType|. When |TaskType| finishes // executing, the |ReplyCallbackType| is called with the |ReplyProtobufType|. template void PostTaskToWorkerThread(RequestProtobufType& request, ReplyCallbackType& callback, TaskType task); // Synchronously initializes the TPM according to the current configuration. // If an initialization process was interrupted it will be continued. If the // TPM is already initialized or cannot yet be initialized, this method has no // effect. void InitializeTask(); // Blocking implementation of GetTpmStatus that can be executed on the // background worker thread. void GetTpmStatusTask(const GetTpmStatusRequest& request, const std::shared_ptr& result); // Blocking implementation of TakeOwnership that can be executed on the // background worker thread. void TakeOwnershipTask(const TakeOwnershipRequest& request, const std::shared_ptr& result); // Blocking implementation of RemoveOwnerDependency that can be executed on // the background worker thread. void RemoveOwnerDependencyTask( const RemoveOwnerDependencyRequest& request, const std::shared_ptr& result); // Removes a |owner_dependency| from the list of owner dependencies in // |local_data|. If |owner_dependency| is not present in |local_data|, // this method does nothing. static void RemoveOwnerDependency(const std::string& owner_dependency, LocalData* local_data); // Blocking implementation of DefineSpace that can be executed on the // background worker thread. void DefineSpaceTask(const DefineSpaceRequest& request, const std::shared_ptr& result); // Blocking implementation of DestroySpace that can be executed on the // background worker thread. void DestroySpaceTask(const DestroySpaceRequest& request, const std::shared_ptr& result); // Blocking implementation of WriteSpace that can be executed on the // background worker thread. void WriteSpaceTask(const WriteSpaceRequest& request, const std::shared_ptr& result); // Blocking implementation of ReadSpace that can be executed on the // background worker thread. void ReadSpaceTask(const ReadSpaceRequest& request, const std::shared_ptr& result); // Blocking implementation of LockSpace that can be executed on the // background worker thread. void LockSpaceTask(const LockSpaceRequest& request, const std::shared_ptr& result); // Blocking implementation of ListSpaces that can be executed on the // background worker thread. void ListSpacesTask(const ListSpacesRequest& request, const std::shared_ptr& result); // Blocking implementation of GetSpaceInfo that can be executed on the // background worker thread. void GetSpaceInfoTask(const GetSpaceInfoRequest& request, const std::shared_ptr& result); // Gets the owner password from local storage. Returns an empty string if the // owner password is not available. std::string GetOwnerPassword(); LocalDataStore* local_data_store_; TpmStatus* tpm_status_; TpmInitializer* tpm_initializer_; TpmNvram* tpm_nvram_; // Whether to wait for an explicit call to 'TakeOwnership' before initializing // the TPM. Normally tracks the --wait_for_ownership command line option. bool wait_for_ownership_; // Background thread to allow processing of potentially lengthy TPM requests // in the background. std::unique_ptr worker_thread_; // Declared last so any weak pointers are destroyed first. base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(TpmManagerService); }; } // namespace tpm_manager #endif // TPM_MANAGER_SERVER_TPM_MANAGER_SERVICE_H_