Home | History | Annotate | Download | only in server
      1 //
      2 // Copyright (C) 2015 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #include "tpm_manager/server/tpm2_nvram_impl.h"
     18 
     19 #include <gmock/gmock.h>
     20 #include <gtest/gtest.h>
     21 #include <trunks/mock_hmac_session.h>
     22 #include <trunks/mock_tpm_utility.h>
     23 #include <trunks/tpm_constants.h>
     24 #include <trunks/trunks_factory_for_test.h>
     25 
     26 #include "tpm_manager/server/mock_local_data_store.h"
     27 
     28 namespace {
     29 const char kTestOwnerPassword[] = "owner";
     30 }  // namespace
     31 
     32 namespace tpm_manager {
     33 
     34 using testing::_;
     35 using testing::DoAll;
     36 using testing::Mock;
     37 using testing::NiceMock;
     38 using testing::Return;
     39 using testing::SetArgPointee;
     40 using trunks::TPM_RC_SUCCESS;
     41 using trunks::TPM_RC_FAILURE;
     42 
     43 class Tpm2NvramTest : public testing::Test {
     44  public:
     45   Tpm2NvramTest() = default;
     46   virtual ~Tpm2NvramTest() = default;
     47 
     48   void SetUp() {
     49     trunks::TrunksFactoryForTest* factory = new trunks::TrunksFactoryForTest();
     50     factory->set_hmac_session(&mock_hmac_session_);
     51     factory->set_tpm_utility(&mock_tpm_utility_);
     52     tpm_nvram_.reset(new Tpm2NvramImpl(
     53         std::unique_ptr<trunks::TrunksFactory>(factory),
     54         &mock_data_store_));
     55   }
     56 
     57   void InitializeNvram(const std::string& owner_password) {
     58     LocalData local_data;
     59     local_data.set_owner_password(owner_password);
     60     ON_CALL(mock_data_store_, Read(_))
     61         .WillByDefault(DoAll(SetArgPointee<0>(local_data),
     62                              Return(true)));
     63     tpm_nvram_->Initialize();
     64     Mock::VerifyAndClearExpectations(&mock_data_store_);
     65     Mock::VerifyAndClearExpectations(&mock_hmac_session_);
     66     Mock::VerifyAndClearExpectations(&mock_tpm_utility_);
     67   }
     68 
     69  protected:
     70   NiceMock<trunks::MockHmacSession> mock_hmac_session_;
     71   NiceMock<MockLocalDataStore> mock_data_store_;
     72   NiceMock<trunks::MockTpmUtility> mock_tpm_utility_;
     73   std::unique_ptr<Tpm2NvramImpl> tpm_nvram_;
     74 };
     75 
     76 TEST_F(Tpm2NvramTest, NvramNoOwnerFailure) {
     77   uint32_t index = 42;
     78   EXPECT_FALSE(tpm_nvram_->DefineNvram(index, 5));
     79   EXPECT_FALSE(tpm_nvram_->DestroyNvram(index));
     80   EXPECT_FALSE(tpm_nvram_->WriteNvram(index, "data"));
     81 }
     82 
     83 TEST_F(Tpm2NvramTest, DefineNvramSuccess) {
     84   InitializeNvram(kTestOwnerPassword);
     85   EXPECT_CALL(mock_hmac_session_,
     86               SetEntityAuthorizationValue(kTestOwnerPassword));
     87   uint32_t index = 42;
     88   size_t length = 20;
     89   EXPECT_CALL(mock_tpm_utility_, DefineNVSpace(index, length, _))
     90       .WillOnce(Return(TPM_RC_SUCCESS));
     91   EXPECT_TRUE(tpm_nvram_->DefineNvram(index, length));
     92 }
     93 
     94 TEST_F(Tpm2NvramTest, DefineNvramFailure) {
     95   InitializeNvram(kTestOwnerPassword);
     96   uint32_t index = 42;
     97   size_t length = 20;
     98   EXPECT_CALL(mock_tpm_utility_, DefineNVSpace(index, length, _))
     99       .WillOnce(Return(TPM_RC_FAILURE));
    100   EXPECT_FALSE(tpm_nvram_->DefineNvram(index, length));
    101 }
    102 
    103 TEST_F(Tpm2NvramTest, DestroyNvramSuccess) {
    104   InitializeNvram(kTestOwnerPassword);
    105   EXPECT_CALL(mock_hmac_session_,
    106               SetEntityAuthorizationValue(kTestOwnerPassword));
    107   uint32_t index = 42;
    108   EXPECT_CALL(mock_tpm_utility_, DestroyNVSpace(index, _))
    109       .WillOnce(Return(TPM_RC_SUCCESS));
    110   EXPECT_TRUE(tpm_nvram_->DestroyNvram(index));
    111 }
    112 
    113 TEST_F(Tpm2NvramTest, DestroyNvramFailure) {
    114   InitializeNvram(kTestOwnerPassword);
    115   uint32_t index = 42;
    116   EXPECT_CALL(mock_tpm_utility_, DestroyNVSpace(index, _))
    117       .WillOnce(Return(TPM_RC_FAILURE));
    118   EXPECT_FALSE(tpm_nvram_->DestroyNvram(index));
    119 }
    120 
    121 TEST_F(Tpm2NvramTest, WriteNvramSuccess) {
    122   InitializeNvram(kTestOwnerPassword);
    123   EXPECT_CALL(mock_hmac_session_,
    124               SetEntityAuthorizationValue(kTestOwnerPassword));
    125   uint32_t index = 42;
    126   std::string data("data");
    127   EXPECT_CALL(mock_tpm_utility_, WriteNVSpace(index, 0, data, _))
    128       .WillOnce(Return(TPM_RC_SUCCESS));
    129   EXPECT_CALL(mock_hmac_session_, SetEntityAuthorizationValue(""));
    130   EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, _))
    131       .WillOnce(Return(TPM_RC_SUCCESS));
    132   EXPECT_TRUE(tpm_nvram_->WriteNvram(index, data));
    133 }
    134 
    135 TEST_F(Tpm2NvramTest, WriteNvramLockError) {
    136   InitializeNvram(kTestOwnerPassword);
    137   uint32_t index = 42;
    138   EXPECT_CALL(mock_tpm_utility_, WriteNVSpace(index, _, _, _))
    139       .WillOnce(Return(TPM_RC_SUCCESS));
    140   EXPECT_CALL(mock_tpm_utility_, LockNVSpace(index, _))
    141       .WillOnce(Return(TPM_RC_FAILURE));
    142   EXPECT_FALSE(tpm_nvram_->WriteNvram(index, "data"));
    143 }
    144 
    145 TEST_F(Tpm2NvramTest, WriteNvramFailure) {
    146   InitializeNvram(kTestOwnerPassword);
    147   uint32_t index = 42;
    148   EXPECT_CALL(mock_tpm_utility_, WriteNVSpace(index, _, _, _))
    149       .WillOnce(Return(TPM_RC_FAILURE));
    150   EXPECT_FALSE(tpm_nvram_->WriteNvram(index, "data"));
    151 }
    152 
    153 TEST_F(Tpm2NvramTest, ReadNvramSuccess) {
    154   uint32_t index = 42;
    155   std::string tpm_data("data");
    156   size_t size = tpm_data.size();
    157   trunks::TPMS_NV_PUBLIC nvram_public;
    158   nvram_public.data_size = size;
    159   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(_, _))
    160       .WillOnce(DoAll(SetArgPointee<1>(nvram_public),
    161                       Return(TPM_RC_SUCCESS)));
    162 
    163   EXPECT_CALL(mock_hmac_session_, SetEntityAuthorizationValue(""));
    164   EXPECT_CALL(mock_tpm_utility_, ReadNVSpace(index, 0, size, _, _))
    165       .WillOnce(DoAll(SetArgPointee<3>(tpm_data),
    166                       Return(TPM_RC_SUCCESS)));
    167   std::string read_data;
    168   EXPECT_TRUE(tpm_nvram_->ReadNvram(index, &read_data));
    169   EXPECT_EQ(read_data, tpm_data);
    170 }
    171 
    172 TEST_F(Tpm2NvramTest, ReadNvramNonexistant) {
    173   uint32_t index = 42;
    174   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    175       .WillOnce(Return(TPM_RC_FAILURE));
    176   std::string read_data;
    177   EXPECT_FALSE(tpm_nvram_->ReadNvram(index, &read_data));
    178 }
    179 
    180 TEST_F(Tpm2NvramTest, ReadNvramFailure) {
    181   uint32_t index = 42;
    182   trunks::TPMS_NV_PUBLIC nvram_public;
    183   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    184       .WillOnce(DoAll(SetArgPointee<1>(nvram_public),
    185                       Return(TPM_RC_SUCCESS)));
    186   EXPECT_CALL(mock_tpm_utility_, ReadNVSpace(index, _, _, _, _))
    187       .WillOnce(Return(TPM_RC_FAILURE));
    188   std::string read_data;
    189   EXPECT_FALSE(tpm_nvram_->ReadNvram(index, &read_data));
    190 }
    191 
    192 TEST_F(Tpm2NvramTest, IsNvramDefinedSuccess) {
    193   uint32_t index = 42;
    194   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    195       .WillOnce(Return(TPM_RC_SUCCESS));
    196   bool defined;
    197   EXPECT_TRUE(tpm_nvram_->IsNvramDefined(index, &defined));
    198   EXPECT_TRUE(defined);
    199 }
    200 
    201 TEST_F(Tpm2NvramTest, IsNvramDefinedNonexistant) {
    202   uint32_t index = 42;
    203   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    204       .WillOnce(Return(trunks::TPM_RC_HANDLE));
    205   bool defined;
    206   EXPECT_TRUE(tpm_nvram_->IsNvramDefined(index, &defined));
    207   EXPECT_FALSE(defined);
    208 }
    209 
    210 TEST_F(Tpm2NvramTest, IsNvramDefinedFailure) {
    211   uint32_t index = 42;
    212   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    213       .WillOnce(Return(TPM_RC_FAILURE));
    214   bool defined;
    215   EXPECT_FALSE(tpm_nvram_->IsNvramDefined(index, &defined));
    216 }
    217 
    218 TEST_F(Tpm2NvramTest, IsNvramLockedSuccess) {
    219   uint32_t index = 42;
    220   trunks::TPMS_NV_PUBLIC nvram_public;
    221   nvram_public.attributes = trunks::TPMA_NV_WRITELOCKED;
    222   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    223       .WillOnce(DoAll(SetArgPointee<1>(nvram_public),
    224                       Return(TPM_RC_SUCCESS)));
    225   bool locked;
    226   EXPECT_TRUE(tpm_nvram_->IsNvramLocked(index, &locked));
    227   EXPECT_TRUE(locked);
    228 }
    229 
    230 TEST_F(Tpm2NvramTest, IsNvramLockedUnlocked) {
    231   uint32_t index = 42;
    232   trunks::TPMS_NV_PUBLIC nvram_public;
    233   nvram_public.attributes = 0;
    234   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    235       .WillOnce(DoAll(SetArgPointee<1>(nvram_public),
    236                       Return(TPM_RC_SUCCESS)));
    237   bool locked;
    238   EXPECT_TRUE(tpm_nvram_->IsNvramLocked(index, &locked));
    239   EXPECT_FALSE(locked);
    240 }
    241 
    242 TEST_F(Tpm2NvramTest, IsNvramLockedFailure) {
    243   uint32_t index = 42;
    244   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    245       .WillOnce(Return(TPM_RC_FAILURE));
    246   bool locked;
    247   EXPECT_FALSE(tpm_nvram_->IsNvramLocked(index, &locked));
    248 }
    249 
    250 TEST_F(Tpm2NvramTest, GetNvramSizeSuccess) {
    251   uint32_t index = 42;
    252   size_t nvram_size = 20;
    253   trunks::TPMS_NV_PUBLIC nvram_public;
    254   nvram_public.data_size = nvram_size;
    255   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    256       .WillOnce(DoAll(SetArgPointee<1>(nvram_public),
    257                       Return(TPM_RC_SUCCESS)));
    258   size_t size;
    259   EXPECT_TRUE(tpm_nvram_->GetNvramSize(index, &size));
    260   EXPECT_EQ(size, nvram_size);
    261 }
    262 
    263 TEST_F(Tpm2NvramTest, GetNvramSizeFailure) {
    264   uint32_t index = 42;
    265   EXPECT_CALL(mock_tpm_utility_, GetNVSpacePublicArea(index, _))
    266       .WillOnce(Return(TPM_RC_FAILURE));
    267   size_t size;
    268   EXPECT_FALSE(tpm_nvram_->GetNvramSize(index, &size));
    269 }
    270 
    271 }  // namespace tpm_manager
    272