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.
222 lines
9.8 KiB
222 lines
9.8 KiB
// |
|
// Copyright (C) 2014 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 TRUNKS_TPM_UTILITY_IMPL_H_ |
|
#define TRUNKS_TPM_UTILITY_IMPL_H_ |
|
|
|
#include "trunks/tpm_utility.h" |
|
|
|
#include <map> |
|
#include <string> |
|
#include <vector> |
|
|
|
#include <base/macros.h> |
|
#include <gtest/gtest_prod.h> |
|
|
|
#include "trunks/trunks_export.h" |
|
|
|
namespace trunks { |
|
|
|
class AuthorizationDelegate; |
|
class TrunksFactory; |
|
|
|
// A default implementation of TpmUtility. |
|
class TRUNKS_EXPORT TpmUtilityImpl : public TpmUtility { |
|
public: |
|
explicit TpmUtilityImpl(const TrunksFactory& factory); |
|
~TpmUtilityImpl() override; |
|
|
|
// TpmUtility methods. |
|
TPM_RC Startup() override; |
|
TPM_RC Clear() override; |
|
void Shutdown() override; |
|
TPM_RC InitializeTpm() override; |
|
TPM_RC AllocatePCR(const std::string& platform_password) override; |
|
TPM_RC TakeOwnership(const std::string& owner_password, |
|
const std::string& endorsement_password, |
|
const std::string& lockout_password) override; |
|
TPM_RC StirRandom(const std::string& entropy_data, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC GenerateRandom(size_t num_bytes, |
|
AuthorizationDelegate* delegate, |
|
std::string* random_data) override; |
|
TPM_RC ExtendPCR(int pcr_index, |
|
const std::string& extend_data, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC ReadPCR(int pcr_index, std::string* pcr_value) override; |
|
TPM_RC AsymmetricEncrypt(TPM_HANDLE key_handle, |
|
TPM_ALG_ID scheme, |
|
TPM_ALG_ID hash_alg, |
|
const std::string& plaintext, |
|
AuthorizationDelegate* delegate, |
|
std::string* ciphertext) override; |
|
TPM_RC AsymmetricDecrypt(TPM_HANDLE key_handle, |
|
TPM_ALG_ID scheme, |
|
TPM_ALG_ID hash_alg, |
|
const std::string& ciphertext, |
|
AuthorizationDelegate* delegate, |
|
std::string* plaintext) override; |
|
TPM_RC Sign(TPM_HANDLE key_handle, |
|
TPM_ALG_ID scheme, |
|
TPM_ALG_ID hash_alg, |
|
const std::string& plaintext, |
|
AuthorizationDelegate* delegate, |
|
std::string* signature) override; |
|
TPM_RC Verify(TPM_HANDLE key_handle, |
|
TPM_ALG_ID scheme, |
|
TPM_ALG_ID hash_alg, |
|
const std::string& plaintext, |
|
const std::string& signature, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC CertifyCreation(TPM_HANDLE key_handle, |
|
const std::string& creation_blob) override; |
|
TPM_RC ChangeKeyAuthorizationData(TPM_HANDLE key_handle, |
|
const std::string& new_password, |
|
AuthorizationDelegate* delegate, |
|
std::string* key_blob) override; |
|
TPM_RC ImportRSAKey(AsymmetricKeyUsage key_type, |
|
const std::string& modulus, |
|
uint32_t public_exponent, |
|
const std::string& prime_factor, |
|
const std::string& password, |
|
AuthorizationDelegate* delegate, |
|
std::string* key_blob) override; |
|
TPM_RC CreateRSAKeyPair(AsymmetricKeyUsage key_type, |
|
int modulus_bits, |
|
uint32_t public_exponent, |
|
const std::string& password, |
|
const std::string& policy_digest, |
|
bool use_only_policy_authorization, |
|
int creation_pcr_index, |
|
AuthorizationDelegate* delegate, |
|
std::string* key_blob, |
|
std::string* creation_blob) override; |
|
TPM_RC LoadKey(const std::string& key_blob, |
|
AuthorizationDelegate* delegate, |
|
TPM_HANDLE* key_handle) override; |
|
TPM_RC GetKeyName(TPM_HANDLE handle, std::string* name) override; |
|
TPM_RC GetKeyPublicArea(TPM_HANDLE handle, TPMT_PUBLIC* public_data) override; |
|
TPM_RC SealData(const std::string& data_to_seal, |
|
const std::string& policy_digest, |
|
AuthorizationDelegate* delegate, |
|
std::string* sealed_data) override; |
|
TPM_RC UnsealData(const std::string& sealed_data, |
|
AuthorizationDelegate* delegate, |
|
std::string* unsealed_data) override; |
|
TPM_RC StartSession(HmacSession* session) override; |
|
TPM_RC GetPolicyDigestForPcrValue(int pcr_index, |
|
const std::string& pcr_value, |
|
std::string* policy_digest) override; |
|
TPM_RC DefineNVSpace(uint32_t index, |
|
size_t num_bytes, |
|
TPMA_NV attributes, |
|
const std::string& authorization_value, |
|
const std::string& policy_digest, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC DestroyNVSpace(uint32_t index, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC LockNVSpace(uint32_t index, |
|
bool lock_read, |
|
bool lock_write, |
|
bool using_owner_authorization, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC WriteNVSpace(uint32_t index, |
|
uint32_t offset, |
|
const std::string& nvram_data, |
|
bool using_owner_authorization, |
|
bool extend, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC ReadNVSpace(uint32_t index, |
|
uint32_t offset, |
|
size_t num_bytes, |
|
bool using_owner_authorization, |
|
std::string* nvram_data, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC GetNVSpaceName(uint32_t index, std::string* name) override; |
|
TPM_RC GetNVSpacePublicArea(uint32_t index, |
|
TPMS_NV_PUBLIC* public_data) override; |
|
TPM_RC ListNVSpaces(std::vector<uint32_t>* index_list) override; |
|
TPM_RC SetDictionaryAttackParameters( |
|
uint32_t max_tries, |
|
uint32_t recovery_time, |
|
uint32_t lockout_recovery, |
|
AuthorizationDelegate* delegate) override; |
|
TPM_RC ResetDictionaryAttackLock(AuthorizationDelegate* delegate) override; |
|
|
|
private: |
|
friend class TpmUtilityTest; |
|
|
|
const TrunksFactory& factory_; |
|
std::map<uint32_t, TPMS_NV_PUBLIC> nvram_public_area_map_; |
|
|
|
// This method sets a known owner password in the TPM_RH_OWNER hierarchy. |
|
TPM_RC SetKnownOwnerPassword(const std::string& known_owner_password); |
|
|
|
// Synchronously derives storage root keys for RSA and ECC and persists the |
|
// keys in the TPM. This operation must be authorized by the |owner_password| |
|
// and, on success, KRSAStorageRootKey and kECCStorageRootKey can be used |
|
// with an empty authorization value until the TPM is cleared. |
|
TPM_RC CreateStorageRootKeys(const std::string& owner_password); |
|
|
|
// This method creates an RSA decryption key to be used for salting sessions. |
|
// This method also makes the salting key permanent under the storage |
|
// hierarchy. |
|
TPM_RC CreateSaltingKey(const std::string& owner_password); |
|
|
|
// This method returns a partially filled TPMT_PUBLIC strucutre, |
|
// which can then be modified by other methods to create the public |
|
// template for a key. It takes a valid |key_type| tp construct the |
|
// parameters. |
|
TPMT_PUBLIC CreateDefaultPublicArea(TPM_ALG_ID key_alg); |
|
|
|
// Sets TPM |hierarchy| authorization to |password| using |authorization|. |
|
TPM_RC SetHierarchyAuthorization(TPMI_RH_HIERARCHY_AUTH hierarchy, |
|
const std::string& password, |
|
AuthorizationDelegate* authorization); |
|
|
|
// Disables the TPM platform hierarchy until the next startup. This requires |
|
// platform |authorization|. |
|
TPM_RC DisablePlatformHierarchy(AuthorizationDelegate* authorization); |
|
|
|
// Given a public area, this method computes the object name. Following |
|
// TPM2.0 Specification Part 1 section 16, |
|
// object_name = HashAlg || Hash(public_area); |
|
TPM_RC ComputeKeyName(const TPMT_PUBLIC& public_area, |
|
std::string* object_name); |
|
|
|
// Given a public area, this method computers the NVSpace's name. |
|
// It follows TPM2.0 Specification Part 1 section 16, |
|
// nv_name = HashAlg || Hash(nv_public_area); |
|
TPM_RC ComputeNVSpaceName(const TPMS_NV_PUBLIC& nv_public_area, |
|
std::string* nv_name); |
|
|
|
// This encrypts the |sensitive_data| struct according to the specification |
|
// defined in TPM2.0 spec Part 1: Figure 19. |
|
TPM_RC EncryptPrivateData(const TPMT_SENSITIVE& sensitive_area, |
|
const TPMT_PUBLIC& public_area, |
|
TPM2B_PRIVATE* encrypted_private_data, |
|
TPM2B_DATA* encryption_key); |
|
|
|
// Looks for a given persistent |key_handle| and outputs whether or not it |
|
// |exists|. Returns TPM_RC_SUCCESS on success. |
|
TPM_RC DoesPersistentKeyExist(TPMI_DH_PERSISTENT key_handle, bool* exists); |
|
|
|
DISALLOW_COPY_AND_ASSIGN(TpmUtilityImpl); |
|
}; |
|
|
|
} // namespace trunks |
|
|
|
#endif // TRUNKS_TPM_UTILITY_IMPL_H_
|
|
|