| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CRYPTOHOME_MOUNT_ENCRYPTED_TLCL_STUB_H_ |
| #define CRYPTOHOME_MOUNT_ENCRYPTED_TLCL_STUB_H_ |
| |
| #include <stdint.h> |
| |
| #include <map> |
| #include <vector> |
| |
| #include <base/macros.h> |
| |
| #include <vboot/tlcl.h> |
| |
| namespace mount_encrypted { |
| |
| class TlclStub { |
| public: |
| struct NvramSpaceData { |
| uint32_t attributes = 0; |
| std::vector<uint8_t> policy; |
| std::vector<uint8_t> contents; |
| bool write_locked = false; |
| bool read_locked = false; |
| }; |
| |
| TlclStub(); |
| ~TlclStub(); |
| |
| // Get the space data for |index|. |
| NvramSpaceData* GetSpace(uint32_t index); |
| |
| // Put the TPM into owned state with the specified owner auth secret. |
| void SetOwned(const std::vector<uint8_t>& owner_auth); |
| |
| // Returns the ownership flag. |
| bool IsOwned(); |
| |
| // Clear the TPM owner. |
| void Clear(); |
| |
| // Reset the TPM (i.e. what happens at reboot). |
| void Reset(); |
| |
| // Configure a PCR to contain the specified value. |
| void SetPCRValue(uint32_t index, const uint8_t value[TPM_PCR_DIGEST]); |
| |
| // This is used to obtain the current stub instance for servicing Tlcl calls. |
| // Do not call directly in tests, but construct your own TlclStub instance |
| // which will then be returned by Get(). |
| static TlclStub* Get(); |
| |
| // Service functions to handle Tlcl invocations follow. |
| uint32_t GetOwnership(uint8_t* owned); |
| |
| uint32_t GetRandom(uint8_t* data, uint32_t length, uint32_t* size); |
| |
| uint32_t DefineSpace(uint32_t index, uint32_t perm, uint32_t size); |
| uint32_t DefineSpaceEx(const uint8_t* owner_auth, |
| uint32_t owner_auth_size, |
| uint32_t index, |
| uint32_t perm, |
| uint32_t size, |
| const void* auth_policy, |
| uint32_t auth_policy_size); |
| uint32_t GetPermissions(uint32_t index, uint32_t* permissions); |
| uint32_t GetSpaceInfo(uint32_t index, |
| uint32_t* permissions, |
| uint32_t* size, |
| void* auth_policy, |
| uint32_t* auth_policy_size); |
| uint32_t Write(uint32_t index, const void* data, uint32_t length); |
| uint32_t Read(uint32_t index, void* data, uint32_t length); |
| uint32_t WriteLock(uint32_t index); |
| uint32_t ReadLock(uint32_t index); |
| |
| uint32_t PCRRead(uint32_t index, void* data, uint32_t length); |
| |
| uint32_t GetVersion(uint32_t* vendor, |
| uint64_t* firmware_version, |
| uint8_t* vendor_specific_buf, |
| size_t* vendor_specific_buf_size); |
| |
| uint32_t IFXFieldUpgradeInfo(TPM_IFX_FIELDUPGRADEINFO* info); |
| |
| #if !USE_TPM2 |
| uint32_t ReadPubek(uint32_t* public_exponent, |
| uint8_t* modulus, |
| uint32_t* modulus_size); |
| uint32_t TakeOwnership(uint8_t enc_owner_auth[TPM_RSA_2048_LEN], |
| uint8_t enc_srk_auth[TPM_RSA_2048_LEN], |
| uint8_t owner_auth[TPM_AUTH_DATA_LEN]); |
| |
| uint32_t CreateDelegationFamily(uint8_t family_label); |
| uint32_t ReadDelegationFamilyTable(TPM_FAMILY_TABLE_ENTRY* table, |
| uint32_t* table_size); |
| #endif // !USE_TPM2 |
| |
| private: |
| bool is_owned() const { return !owner_auth_.empty(); } |
| |
| template <typename Action> |
| uint32_t WithSpace(uint32_t index, Action action); |
| |
| std::vector<uint8_t> owner_auth_; |
| std::map<uint32_t, NvramSpaceData> nvram_spaces_; |
| std::map<uint32_t, uint8_t[TPM_PCR_DIGEST]> pcr_values_; |
| |
| #if !USE_TPM2 |
| uint32_t delegation_family_id_ = 0; |
| std::vector<TPM_FAMILY_TABLE_ENTRY> delegation_family_table_; |
| #endif // !USE_TPM2 |
| |
| // The static instance pointer return by Get(). Points at the most recently |
| // constructed TlclStub instance. |
| static TlclStub* g_instance; |
| |
| DISALLOW_COPY_AND_ASSIGN(TlclStub); |
| }; |
| |
| } // namespace mount_encrypted |
| |
| #endif // CRYPTOHOME_MOUNT_ENCRYPTED_TLCL_STUB_H_ |