You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
8.8 KiB
202 lines
8.8 KiB
// |
|
// 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 <memory> |
|
|
|
#include <base/callback.h> |
|
#include <base/macros.h> |
|
#include <base/memory/weak_ptr.h> |
|
#include <base/threading/thread.h> |
|
#include <brillo/bind_lambda.h> |
|
|
|
#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<TpmManagerService> 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 <typename ReplyProtobufType> |
|
void TaskRelayCallback( |
|
const base::Callback<void(const ReplyProtobufType&)> callback, |
|
const std::shared_ptr<ReplyProtobufType>& 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 <typename ReplyProtobufType, |
|
typename RequestProtobufType, |
|
typename ReplyCallbackType, |
|
typename TaskType> |
|
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<GetTpmStatusReply>& result); |
|
|
|
// Blocking implementation of TakeOwnership that can be executed on the |
|
// background worker thread. |
|
void TakeOwnershipTask(const TakeOwnershipRequest& request, |
|
const std::shared_ptr<TakeOwnershipReply>& result); |
|
|
|
// Blocking implementation of RemoveOwnerDependency that can be executed on |
|
// the background worker thread. |
|
void RemoveOwnerDependencyTask( |
|
const RemoveOwnerDependencyRequest& request, |
|
const std::shared_ptr<RemoveOwnerDependencyReply>& 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<DefineSpaceReply>& result); |
|
|
|
// Blocking implementation of DestroySpace that can be executed on the |
|
// background worker thread. |
|
void DestroySpaceTask(const DestroySpaceRequest& request, |
|
const std::shared_ptr<DestroySpaceReply>& result); |
|
|
|
// Blocking implementation of WriteSpace that can be executed on the |
|
// background worker thread. |
|
void WriteSpaceTask(const WriteSpaceRequest& request, |
|
const std::shared_ptr<WriteSpaceReply>& result); |
|
|
|
// Blocking implementation of ReadSpace that can be executed on the |
|
// background worker thread. |
|
void ReadSpaceTask(const ReadSpaceRequest& request, |
|
const std::shared_ptr<ReadSpaceReply>& result); |
|
|
|
// Blocking implementation of LockSpace that can be executed on the |
|
// background worker thread. |
|
void LockSpaceTask(const LockSpaceRequest& request, |
|
const std::shared_ptr<LockSpaceReply>& result); |
|
|
|
// Blocking implementation of ListSpaces that can be executed on the |
|
// background worker thread. |
|
void ListSpacesTask(const ListSpacesRequest& request, |
|
const std::shared_ptr<ListSpacesReply>& result); |
|
|
|
// Blocking implementation of GetSpaceInfo that can be executed on the |
|
// background worker thread. |
|
void GetSpaceInfoTask(const GetSpaceInfoRequest& request, |
|
const std::shared_ptr<GetSpaceInfoReply>& 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<base::Thread> worker_thread_; |
|
// Declared last so any weak pointers are destroyed first. |
|
base::WeakPtrFactory<TpmManagerService> weak_factory_; |
|
|
|
DISALLOW_COPY_AND_ASSIGN(TpmManagerService); |
|
}; |
|
|
|
} // namespace tpm_manager |
|
|
|
#endif // TPM_MANAGER_SERVER_TPM_MANAGER_SERVICE_H_
|
|
|