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.
124 lines
4.7 KiB
124 lines
4.7 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_TPM2_NVRAM_IMPL_H_ |
|
#define TPM_MANAGER_SERVER_TPM2_NVRAM_IMPL_H_ |
|
|
|
#include "tpm_manager/server/tpm_nvram.h" |
|
|
|
#include <memory> |
|
#include <string> |
|
|
|
#include <base/macros.h> |
|
#include <trunks/trunks_factory.h> |
|
|
|
#include "tpm_manager/common/tpm_manager.pb.h" |
|
#include "tpm_manager/server/local_data_store.h" |
|
|
|
namespace tpm_manager { |
|
|
|
// A TpmNvram implementation backed by a TPM 2.0 device. All index values are |
|
// the 'index' portion of an NV handle and must fit in 24 bits. |
|
class Tpm2NvramImpl : public TpmNvram { |
|
public: |
|
// Does not take ownership of arguments. |
|
Tpm2NvramImpl(const trunks::TrunksFactory& factory, |
|
LocalDataStore* local_data_store); |
|
~Tpm2NvramImpl() override = default; |
|
|
|
// TpmNvram methods. |
|
NvramResult DefineSpace(uint32_t index, |
|
size_t size, |
|
const std::vector<NvramSpaceAttribute>& attributes, |
|
const std::string& authorization_value, |
|
NvramSpacePolicy policy) override; |
|
NvramResult DestroySpace(uint32_t index) override; |
|
NvramResult WriteSpace(uint32_t index, |
|
const std::string& data, |
|
const std::string& authorization_value) override; |
|
NvramResult ReadSpace(uint32_t index, |
|
std::string* data, |
|
const std::string& authorization_value) override; |
|
NvramResult LockSpace(uint32_t index, |
|
bool lock_read, |
|
bool lock_write, |
|
const std::string& authorization_value) override; |
|
NvramResult ListSpaces(std::vector<uint32_t>* index_list) override; |
|
NvramResult GetSpaceInfo( |
|
uint32_t index, |
|
size_t* size, |
|
bool* is_read_locked, |
|
bool* is_write_locked, |
|
std::vector<NvramSpaceAttribute>* attributes, |
|
NvramSpacePolicy* policy) override; |
|
|
|
private: |
|
// Must be called before using any data members. This may be called multiple |
|
// times and will be very fast if already initialized. |
|
bool Initialize(); |
|
|
|
// Gets the TPM owner password. Returns an empty string if not available. |
|
std::string GetOwnerPassword(); |
|
|
|
// Configures |trunks_session_| with owner authorization. Returns true on |
|
// success. |
|
bool SetupOwnerSession(); |
|
|
|
// Configures a new policy |session| for a given |policy_record|, |
|
// |authorization_value|, and |command_code|. Returns true on success. |
|
bool SetupPolicySession(const NvramPolicyRecord& policy_record, |
|
const std::string& authorization_value, |
|
trunks::TPM_CC command_code, |
|
trunks::PolicySession* session); |
|
|
|
// A helper to add policies to a |session| for a particular |command_code| and |
|
// |policy_record|. Returns true on success. |
|
bool AddPoliciesForCommand(const NvramPolicyRecord& policy_record, |
|
trunks::TPM_CC command_code, |
|
trunks::PolicySession* session); |
|
|
|
// A helper to add an OR policy to |session| based on |policy_record|. Returns |
|
// true on success. |
|
bool AddPolicyOR(const NvramPolicyRecord& policy_record, |
|
trunks::PolicySession* session); |
|
|
|
// Computes the policy |digest| for a given |policy_record| and fills the |
|
// policy_digests field in the |policy_record|. |
|
bool ComputePolicyDigest(NvramPolicyRecord* policy_record, |
|
std::string* digest); |
|
|
|
// Gets the policy |record| for the given |index|. Returns true on success. |
|
bool GetPolicyRecord(uint32_t index, NvramPolicyRecord* record); |
|
|
|
// Saves a policy |record| in the local_data_store_. |
|
bool SavePolicyRecord(const NvramPolicyRecord& record); |
|
|
|
// Best effort delete of the policy |record| for |index|. |
|
void DeletePolicyRecord(uint32_t index); |
|
|
|
const trunks::TrunksFactory& trunks_factory_; |
|
LocalDataStore* local_data_store_; |
|
bool initialized_; |
|
std::unique_ptr<trunks::HmacSession> trunks_session_; |
|
std::unique_ptr<trunks::TpmUtility> trunks_utility_; |
|
|
|
friend class Tpm2NvramTest; |
|
DISALLOW_COPY_AND_ASSIGN(Tpm2NvramImpl); |
|
}; |
|
|
|
} // namespace tpm_manager |
|
|
|
#endif // TPM_MANAGER_SERVER_TPM2_NVRAM_IMPL_H_
|
|
|