139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// you may not use this file except in compliance with the License.
639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// You may obtain a copy of the License at
739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
1039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
1139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
1239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// See the License for the specific language governing permissions and
1439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi// limitations under the License.
1539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi//
1639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
1739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include "tpm_manager/server/tpm2_nvram_impl.h"
1839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
1939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <gmock/gmock.h>
2039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <gtest/gtest.h>
2139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <trunks/mock_hmac_session.h>
22a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn#include <trunks/mock_policy_session.h>
2339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <trunks/mock_tpm_utility.h>
2439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <trunks/tpm_constants.h>
2539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include <trunks/trunks_factory_for_test.h>
2639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
2739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi#include "tpm_manager/server/mock_local_data_store.h"
2839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
2939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghinamespace {
30a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
31a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnconstexpr char kTestOwnerPassword[] = "owner";
32a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnconstexpr char kFakePolicyDigest[] = "fake_policy_digest";
33a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnconstexpr char kFakePCRValue[] = "fake_pcr_value";
34a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnconstexpr char kFakeAuthorizationValue[] = "fake_authorization";
35a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahntrunks::AuthorizationDelegate* const kHMACAuth =
36a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reinterpret_cast<trunks::AuthorizationDelegate*>(1ull);
37a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahntrunks::AuthorizationDelegate* const kPolicyAuth =
38a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    reinterpret_cast<trunks::AuthorizationDelegate*>(2ull);
39a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnconstexpr trunks::TPMA_NV kNoExtraAttributes = 0;
40a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
4139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}  // namespace
4239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
4339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghinamespace tpm_manager {
4439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
4539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing testing::_;
46a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnusing testing::AnyNumber;
47a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnusing testing::AtLeast;
4839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing testing::DoAll;
4939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing testing::Mock;
5039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing testing::NiceMock;
5139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing testing::Return;
5239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing testing::SetArgPointee;
5339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing trunks::TPM_RC_SUCCESS;
5439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiusing trunks::TPM_RC_FAILURE;
55a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahnusing trunks::TPM_RC_HANDLE;
5639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
5739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghiclass Tpm2NvramTest : public testing::Test {
5839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi public:
5939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  Tpm2NvramTest() = default;
6039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  virtual ~Tpm2NvramTest() = default;
6139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
6239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  void SetUp() {
63a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    factory_.set_hmac_session(&mock_hmac_session_);
64a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    factory_.set_policy_session(&mock_policy_session_);
65a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    factory_.set_trial_session(&mock_trial_session_);
66a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    factory_.set_tpm_utility(&mock_tpm_utility_);
67a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    tpm_nvram_.reset(new Tpm2NvramImpl(factory_, &mock_data_store_));
68a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ON_CALL(mock_hmac_session_, GetDelegate()).WillByDefault(Return(kHMACAuth));
69a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ON_CALL(mock_policy_session_, GetDelegate())
70a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        .WillByDefault(Return(kPolicyAuth));
71a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ON_CALL(mock_policy_session_, GetDigest(_))
72a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        .WillByDefault(
73a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            DoAll(SetArgPointee<0>(kFakePolicyDigest), Return(TPM_RC_SUCCESS)));
74a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ON_CALL(mock_trial_session_, GetDigest(_))
75a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        .WillByDefault(
76a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            DoAll(SetArgPointee<0>(kFakePolicyDigest), Return(TPM_RC_SUCCESS)));
7739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  }
7839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
79a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  void SetupOwnerPassword() {
80a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    LocalData& local_data = mock_data_store_.GetMutableFakeData();
81a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    local_data.set_owner_password(kTestOwnerPassword);
82a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  }
83a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
84a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  enum ExpectAuth { NO_EXPECT_AUTH, EXPECT_AUTH };
85a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  enum AuthType { NORMAL_AUTH, POLICY_AUTH, OWNER_AUTH };
86a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  void SetupExistingSpace(uint32_t index,
87a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                          uint32_t size,
88a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                          trunks::TPMA_NV extra_attributes,
89a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                          ExpectAuth expect_auth,
90a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                          AuthType auth_type) {
91a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    trunks::TPMS_NV_PUBLIC public_data;
92a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    public_data.nv_index = index;
93a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    public_data.data_size = size;
94a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    public_data.attributes = trunks::TPMA_NV_READ_STCLEAR |
95a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                             trunks::TPMA_NV_WRITE_STCLEAR | extra_attributes;
96a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    switch (auth_type) {
97a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      case NORMAL_AUTH:
98a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        public_data.attributes |=
99a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            trunks::TPMA_NV_AUTHREAD | trunks::TPMA_NV_AUTHWRITE;
100a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        break;
101a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      case POLICY_AUTH:
102a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        public_data.attributes |=
103a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            trunks::TPMA_NV_POLICYREAD | trunks::TPMA_NV_POLICYWRITE;
104a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        break;
105a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      case OWNER_AUTH:
106a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        public_data.attributes |=
107a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            trunks::TPMA_NV_OWNERREAD | trunks::TPMA_NV_OWNERWRITE;
108a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        break;
109a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    }
110a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    ON_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
111a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn        .WillByDefault(
112a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            DoAll(SetArgPointee<1>(public_data), Return(TPM_RC_SUCCESS)));
113a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    LocalData& local_data = mock_data_store_.GetMutableFakeData();
114a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    NvramPolicyRecord& policy_record = *local_data.add_nvram_policy();
115a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    policy_record.set_index(index);
116a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    if (auth_type == POLICY_AUTH) {
117a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      policy_record.set_policy(NVRAM_POLICY_PCR0);
118a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    }
119a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    if (!expect_auth) {
120a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_hmac_session_, SetEntityAuthorizationValue(_)).Times(0);
121a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_policy_session_, SetEntityAuthorizationValue(_))
122a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .Times(0);
123a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_policy_session_, PolicyAuthValue()).Times(0);
124a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    } else if (auth_type == NORMAL_AUTH) {
125a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_hmac_session_,
126a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                  SetEntityAuthorizationValue(kFakeAuthorizationValue))
127a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .Times(AtLeast(1));
128a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_hmac_session_, SetEntityAuthorizationValue("")).Times(0);
129a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    } else if (auth_type == OWNER_AUTH) {
130a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_hmac_session_,
131a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                  SetEntityAuthorizationValue(kTestOwnerPassword))
132a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .Times(AtLeast(1));
133a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_hmac_session_, SetEntityAuthorizationValue("")).Times(0);
134a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    } else {
135a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_policy_session_,
136a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                  SetEntityAuthorizationValue(kFakeAuthorizationValue))
137a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .Times(AtLeast(1));
138a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_hmac_session_, SetEntityAuthorizationValue("")).Times(0);
139a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_tpm_utility_, ReadPCR(0, _))
140a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .Times(AtLeast(1))
141a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .WillRepeatedly(
142a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              DoAll(SetArgPointee<1>(kFakePCRValue), Return(TPM_RC_SUCCESS)));
143a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_policy_session_, PolicyAuthValue()).Times(AtLeast(1));
144a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      EXPECT_CALL(mock_policy_session_, PolicyPCR(0, kFakePCRValue))
145a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          .Times(AtLeast(1));
146a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    }
14739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  }
14839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
14939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi protected:
150a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  trunks::TrunksFactoryForTest factory_;
15139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  NiceMock<trunks::MockHmacSession> mock_hmac_session_;
152a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  NiceMock<trunks::MockPolicySession> mock_policy_session_;
153a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  NiceMock<trunks::MockPolicySession> mock_trial_session_;
15439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  NiceMock<MockLocalDataStore> mock_data_store_;
15539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  NiceMock<trunks::MockTpmUtility> mock_tpm_utility_;
15639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::unique_ptr<Tpm2NvramImpl> tpm_nvram_;
15739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi};
15839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
159a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, NoOwnerFailure) {
160a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_OPERATION_DISABLED,
161a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->DefineSpace(0, 0, {}, "", NVRAM_POLICY_NONE));
162a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_OPERATION_DISABLED, tpm_nvram_->DestroySpace(0));
16339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
16439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
165a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, SessionFailure) {
166a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_hmac_session_, StartUnboundSession(_))
167a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
168a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS,
169a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->DefineSpace(0, 0, {}, "", NVRAM_POLICY_NONE));
170a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS, tpm_nvram_->DestroySpace(0));
171a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS, tpm_nvram_->WriteSpace(0, "", ""));
172a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS, tpm_nvram_->ReadSpace(0, nullptr, ""));
173a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS, tpm_nvram_->LockSpace(0, false, false, ""));
174a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
175a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
176a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DefineSpaceSuccess) {
177a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
17839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_CALL(mock_hmac_session_,
179a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              SetEntityAuthorizationValue(kTestOwnerPassword))
180a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
181a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_trial_session_, PolicyAuthValue()).Times(0);
182a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_trial_session_, PolicyPCR(_, _)).Times(0);
18339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
184a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  size_t size = 20;
185a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<NvramSpaceAttribute> attributes{NVRAM_PERSISTENT_WRITE_LOCK};
186a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(
187a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      mock_tpm_utility_,
188a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      DefineNVSpace(index, size,
189a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                    trunks::TPMA_NV_WRITEDEFINE | trunks::TPMA_NV_POLICYWRITE |
190a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                        trunks::TPMA_NV_POLICYREAD,
191a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                    kFakeAuthorizationValue, kFakePolicyDigest, kHMACAuth))
19239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
193a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(
194a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      NVRAM_RESULT_SUCCESS,
195a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      tpm_nvram_->DefineSpace(index, size, attributes, kFakeAuthorizationValue,
196a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                              NVRAM_POLICY_NONE));
197a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  const LocalData& local_data = mock_data_store_.GetFakeData();
198a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(1, local_data.nvram_policy_size());
199a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(index, local_data.nvram_policy(0).index());
200a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_POLICY_NONE, local_data.nvram_policy(0).policy());
20139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
20239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
203a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DefineSpaceFailure) {
204a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
20539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
206a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  size_t size = 20;
207a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<NvramSpaceAttribute> attributes{NVRAM_PERSISTENT_WRITE_LOCK};
208a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, DefineNVSpace(_, _, _, _, _, _))
209a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
210a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(
211a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      NVRAM_RESULT_SUCCESS,
212a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      tpm_nvram_->DefineSpace(index, size, attributes, "", NVRAM_POLICY_NONE));
213a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
214a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
215a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DefineSpaceNoClobberOnError) {
216a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
217a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, DefineNVSpace(_, _, _, _, _, _))
218a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(Return(TPM_RC_SUCCESS))
219a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
220a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
221a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->DefineSpace(0, 32, {}, "", NVRAM_POLICY_NONE));
222a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS,
223a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->DefineSpace(0, 32, {}, "", NVRAM_POLICY_PCR0));
224a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  const LocalData& local_data = mock_data_store_.GetFakeData();
225a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(1, local_data.nvram_policy_size());
226a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(0, local_data.nvram_policy(0).index());
227a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_POLICY_NONE, local_data.nvram_policy(0).policy());
22839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
22939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
230a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DefineSpaceWithPolicy) {
231a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
23239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_CALL(mock_hmac_session_,
233a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              SetEntityAuthorizationValue(kTestOwnerPassword))
234a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
235a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_trial_session_, PolicyAuthValue()).Times(AtLeast(1));
236a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, ReadPCR(0, _))
237a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(
238a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          DoAll(SetArgPointee<1>(kFakePCRValue), Return(TPM_RC_SUCCESS)));
239a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_trial_session_, PolicyPCR(0, kFakePCRValue))
240a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
24139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
242a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  size_t size = 20;
243a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<NvramSpaceAttribute> attributes{NVRAM_WRITE_AUTHORIZATION};
244a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(
245a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      mock_tpm_utility_,
246a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      DefineNVSpace(index, size,
247a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                    trunks::TPMA_NV_POLICYWRITE | trunks::TPMA_NV_POLICYREAD,
248a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                    kFakeAuthorizationValue, kFakePolicyDigest, kHMACAuth))
24939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
250a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(
251a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      NVRAM_RESULT_SUCCESS,
252a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      tpm_nvram_->DefineSpace(index, size, attributes, kFakeAuthorizationValue,
253a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                              NVRAM_POLICY_PCR0));
254a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
255a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
256a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DefineSpaceWithExistingLocalData) {
257a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
258a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  LocalData& local_data = mock_data_store_.GetMutableFakeData();
259a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(0);
260a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(4);
261a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(1);
262a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
263a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->DefineSpace(5, 32, {}, "", NVRAM_POLICY_NONE));
264a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(4, local_data.nvram_policy_size());
265a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(5, local_data.nvram_policy(3).index());
266a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
267a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
268a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DefineSpaceClobberExistingLocalData) {
269a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
270a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  LocalData& local_data = mock_data_store_.GetMutableFakeData();
271a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(0);
272a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(4);
273a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(1);
274a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
275a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->DefineSpace(4, 32, {}, "", NVRAM_POLICY_NONE));
276a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(3, local_data.nvram_policy_size());
277a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(local_data.nvram_policy(0).index(),
278a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            local_data.nvram_policy(1).index());
279a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(local_data.nvram_policy(0).index(),
280a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            local_data.nvram_policy(2).index());
281a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(local_data.nvram_policy(1).index(),
282a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            local_data.nvram_policy(2).index());
28339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
28439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
285a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DestroySpaceSuccess) {
286a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
287a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  LocalData& local_data = mock_data_store_.GetMutableFakeData();
28839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
289a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(index);
290a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_hmac_session_,
291a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              SetEntityAuthorizationValue(kTestOwnerPassword))
292a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
293a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, DestroyNVSpace(index, kHMACAuth))
294a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(Return(TPM_RC_SUCCESS));
295a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS, tpm_nvram_->DestroySpace(index));
296a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(0, local_data.nvram_policy_size());
297a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
298a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
299a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DestroySpaceFailure) {
300a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
301a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
302a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  LocalData& local_data = mock_data_store_.GetMutableFakeData();
303a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(index);
30439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_CALL(mock_tpm_utility_, DestroyNVSpace(index, _))
305a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
306a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS, tpm_nvram_->DestroySpace(index));
307a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(1, local_data.nvram_policy_size());
30839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
30939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
310a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, DestroySpaceWithExistingLocalData) {
311a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
312a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  LocalData& local_data = mock_data_store_.GetMutableFakeData();
313a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(0);
314a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(1);
315a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  local_data.add_nvram_policy()->set_index(2);
316a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, DestroyNVSpace(1, kHMACAuth))
317a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(Return(TPM_RC_SUCCESS));
318a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS, tpm_nvram_->DestroySpace(1));
319a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(2, local_data.nvram_policy_size());
320a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(1, local_data.nvram_policy(0).index());
321a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(1, local_data.nvram_policy(1).index());
322a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
323a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
324a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, WriteSpaceSuccess) {
32539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
326a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 20, kNoExtraAttributes, EXPECT_AUTH, NORMAL_AUTH);
32739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::string data("data");
328a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
329a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              WriteNVSpace(index, 0, data, false, false, kHMACAuth))
33039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
331a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
332a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->WriteSpace(index, data, kFakeAuthorizationValue));
333a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
334a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
335a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, WriteSpaceExtend) {
336a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
337a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 20, trunks::TPMA_NV_EXTEND, EXPECT_AUTH,
338a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     NORMAL_AUTH);
339a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string data("data");
340a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
341a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              WriteNVSpace(index, 0, data, false, true, kHMACAuth))
34239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
343a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
344a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->WriteSpace(index, data, kFakeAuthorizationValue));
345a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
346a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
347a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, WriteSpaceNonexistant) {
348a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
349a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
350a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_HANDLE));
351a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string read_data;
352a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SPACE_DOES_NOT_EXIST,
353a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->WriteSpace(index, "data", kFakeAuthorizationValue));
354a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
355a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
356a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, WriteSpaceFailure) {
357a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
358a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 20, kNoExtraAttributes, EXPECT_AUTH, NORMAL_AUTH);
359a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, WriteNVSpace(index, _, _, _, _, _))
360a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
361a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS,
362a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->WriteSpace(index, "data", kFakeAuthorizationValue));
36339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
36439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
365a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, WriteSpacePolicy) {
36639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
367a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 20, kNoExtraAttributes, EXPECT_AUTH, POLICY_AUTH);
368a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string data("data");
369a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
370a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              WriteNVSpace(index, 0, data, false, false, kPolicyAuth))
37139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
372a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
373a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->WriteSpace(index, data, kFakeAuthorizationValue));
37439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
37539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
376a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, WriteSpaceOwner) {
37739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
378a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
379a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 20, kNoExtraAttributes, EXPECT_AUTH, OWNER_AUTH);
380a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string data("data");
381a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
382a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              WriteNVSpace(index, 0, data, true, false, kHMACAuth))
383a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(Return(TPM_RC_SUCCESS));
384a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
385a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->WriteSpace(index, data, kFakeAuthorizationValue));
38639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
38739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
388a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ReadSpaceSuccess) {
38939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
390a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, trunks::TPMA_NV_WRITTEN, EXPECT_AUTH,
391a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     NORMAL_AUTH);
39239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::string tpm_data("data");
393a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, ReadNVSpace(index, 0, 32, false, _, kHMACAuth))
394a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(DoAll(SetArgPointee<4>(tpm_data), Return(TPM_RC_SUCCESS)));
39539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::string read_data;
396a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
397a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->ReadSpace(index, &read_data, kFakeAuthorizationValue));
39839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_EQ(read_data, tpm_data);
39939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
40039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
401a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ReadSpaceNonexistant) {
40239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
40339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
404a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_HANDLE));
40539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::string read_data;
406a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SPACE_DOES_NOT_EXIST,
407a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->ReadSpace(index, &read_data, kFakeAuthorizationValue));
40839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
40939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
410a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ReadSpaceFailure) {
41139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
412a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, trunks::TPMA_NV_WRITTEN, EXPECT_AUTH,
413a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     NORMAL_AUTH);
414a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, ReadNVSpace(index, _, _, _, _, _))
415a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
41639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  std::string read_data;
417a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS,
418a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->ReadSpace(index, &read_data, kFakeAuthorizationValue));
41939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
42039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
421a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ReadSpacePolicy) {
42239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
423a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, trunks::TPMA_NV_WRITTEN, EXPECT_AUTH,
424a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     POLICY_AUTH);
425a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string tpm_data("data");
426a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
427a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              ReadNVSpace(index, 0, 32, false, _, kPolicyAuth))
428a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(DoAll(SetArgPointee<4>(tpm_data), Return(TPM_RC_SUCCESS)));
429a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string read_data;
430a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
431a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->ReadSpace(index, &read_data, kFakeAuthorizationValue));
432a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(read_data, tpm_data);
433a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
434a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
435a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ReadSpaceOwner) {
436a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
437a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
438a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, trunks::TPMA_NV_WRITTEN, EXPECT_AUTH,
439a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     OWNER_AUTH);
440a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string tpm_data("data");
441a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, ReadNVSpace(index, 0, 32, true, _, kHMACAuth))
442a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillOnce(DoAll(SetArgPointee<4>(tpm_data), Return(TPM_RC_SUCCESS)));
443a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::string read_data;
444a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
445a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->ReadSpace(index, &read_data, kFakeAuthorizationValue));
446a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(read_data, tpm_data);
44739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
44839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
449a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpaceSuccess) {
450a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
451a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, kNoExtraAttributes, EXPECT_AUTH, NORMAL_AUTH);
452a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, true, _, false, kHMACAuth))
453a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
454a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, _, true, false, kHMACAuth))
455a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
456a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
457a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, true, true, kFakeAuthorizationValue));
458a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
459a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
460a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpaceNonexistant) {
46139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
46239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
46339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(trunks::TPM_RC_HANDLE));
464a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SPACE_DOES_NOT_EXIST,
465a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, true, true, kFakeAuthorizationValue));
46639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
46739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
468a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpaceFailure) {
46939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
470a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, kNoExtraAttributes, EXPECT_AUTH, NORMAL_AUTH);
471a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(_, _, _, _, _))
472a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
473a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS,
474a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, true, true, kFakeAuthorizationValue));
47539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
47639074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
477a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpacePolicy) {
47839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
479a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, kNoExtraAttributes, EXPECT_AUTH, POLICY_AUTH);
480a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
481a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              LockNVSpace(index, true, _, false, kPolicyAuth))
482a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
483a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
484a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              LockNVSpace(index, _, true, false, kPolicyAuth))
485a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
486a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
487a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, true, true, kFakeAuthorizationValue));
48839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
48939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
490a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpaceOwner) {
49139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
492a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupOwnerPassword();
493a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, kNoExtraAttributes, EXPECT_AUTH, OWNER_AUTH);
494a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, true, _, true, kHMACAuth))
495a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
496a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, _, true, true, kHMACAuth))
497a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
498a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
499a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, true, true, kFakeAuthorizationValue));
50039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
50139074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
502a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpaceRead) {
50339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
504a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, kNoExtraAttributes, EXPECT_AUTH, NORMAL_AUTH);
505a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
506a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              LockNVSpace(index, true, false, false, kHMACAuth))
507a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
508a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, _, true, false, kHMACAuth))
509a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(0);
510a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
511a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, true, false, kFakeAuthorizationValue));
51239074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
51339074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
514a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, LockSpaceWrite) {
51539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
516a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 32, kNoExtraAttributes, EXPECT_AUTH, NORMAL_AUTH);
517a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_,
518a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn              LockNVSpace(index, false, true, false, kHMACAuth))
519a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1));
520a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, true, _, false, kHMACAuth))
521a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(0);
522a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
523a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->LockSpace(index, false, true, kFakeAuthorizationValue));
524a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
525a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
526a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ListSpacesSuccess) {
527a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<uint32_t> expected_spaces{1, 5, 42};
528a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<uint32_t> spaces;
529a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, ListNVSpaces(_))
530a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .Times(AtLeast(1))
531a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(
532a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn          DoAll(SetArgPointee<0>(expected_spaces), Return(TPM_RC_SUCCESS)));
533a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS, tpm_nvram_->ListSpaces(&spaces));
534a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(spaces, expected_spaces);
535a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
536a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
537a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, ListSpacesFailure) {
538a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<uint32_t> spaces;
539a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_CALL(mock_tpm_utility_, ListNVSpaces(_))
540a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn      .WillRepeatedly(Return(TPM_RC_FAILURE));
541a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS, tpm_nvram_->ListSpaces(&spaces));
542a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn}
543a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn
544a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, GetSpaceInfoSuccess) {
545a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  uint32_t index = 42;
546a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  SetupExistingSpace(index, 100,
547a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     trunks::TPMA_NV_READLOCKED | trunks::TPMA_NV_WRITELOCKED,
548a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                     NO_EXPECT_AUTH, POLICY_AUTH);
54939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  size_t size;
550a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  bool is_read_locked;
551a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  bool is_write_locked;
552a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<NvramSpaceAttribute> attributes;
553a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  NvramSpacePolicy policy;
554a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_RESULT_SUCCESS,
555a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->GetSpaceInfo(index, &size, &is_write_locked,
556a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                                     &is_read_locked, &attributes, &policy));
557a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(size, 100);
558a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_TRUE(is_read_locked);
559a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_TRUE(is_write_locked);
560a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_GE(attributes.size(), 1);
561a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(1, std::count(attributes.begin(), attributes.end(),
562a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                          NVRAM_WRITE_AUTHORIZATION));
563a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_EQ(NVRAM_POLICY_PCR0, policy);
56439074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
56539074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
566a94133441da308b30c6fe18cc4e2b866498ee401Darren KrahnTEST_F(Tpm2NvramTest, GetSpaceInfoFailure) {
56739074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  uint32_t index = 42;
56839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
56939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
57039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi  size_t size;
571a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  bool is_read_locked;
572a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  bool is_write_locked;
573a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  std::vector<NvramSpaceAttribute> attributes;
574a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  NvramSpacePolicy policy;
575a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  EXPECT_NE(NVRAM_RESULT_SUCCESS,
576a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn            tpm_nvram_->GetSpaceInfo(index, &size, &is_write_locked,
577a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn                                     &is_read_locked, &attributes, &policy));
57839074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}
57939074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi
58039074f04aec7466722271d1484ff75f48a77f93cUtkarsh Sanghi}  // namespace tpm_manager
581