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_initializer_impl.h"
     18 
     19 #include <memory>
     20 
     21 #include <gmock/gmock.h>
     22 #include <gtest/gtest.h>
     23 #include <trunks/mock_tpm_utility.h>
     24 #include <trunks/trunks_factory_for_test.h>
     25 
     26 #include "tpm_manager/common/tpm_manager_constants.h"
     27 #include "tpm_manager/server/mock_local_data_store.h"
     28 #include "tpm_manager/server/mock_openssl_crypto_util.h"
     29 #include "tpm_manager/server/mock_tpm_status.h"
     30 
     31 using testing::_;
     32 using testing::DoAll;
     33 using testing::NiceMock;
     34 using testing::Return;
     35 using testing::SaveArg;
     36 using testing::SetArgPointee;
     37 
     38 namespace tpm_manager {
     39 
     40 class Tpm2InitializerTest : public testing::Test {
     41  public:
     42   Tpm2InitializerTest() = default;
     43   virtual ~Tpm2InitializerTest() = default;
     44 
     45   void SetUp() {
     46     trunks::TrunksFactoryForTest* factory = new trunks::TrunksFactoryForTest();
     47     factory->set_tpm_utility(&mock_tpm_utility_);
     48     tpm_initializer_.reset(new Tpm2InitializerImpl(factory,
     49                                                    &mock_openssl_util_,
     50                                                    &mock_data_store_,
     51                                                    &mock_tpm_status_));
     52   }
     53 
     54  protected:
     55   NiceMock<MockOpensslCryptoUtil> mock_openssl_util_;
     56   NiceMock<MockLocalDataStore> mock_data_store_;
     57   NiceMock<MockTpmStatus> mock_tpm_status_;
     58   NiceMock<trunks::MockTpmUtility> mock_tpm_utility_;
     59   std::unique_ptr<TpmInitializer> tpm_initializer_;
     60 };
     61 
     62 TEST_F(Tpm2InitializerTest, InitializeTpmNoSeedTpm) {
     63   EXPECT_CALL(mock_tpm_utility_, StirRandom(_, _))
     64       .WillRepeatedly(Return(trunks::TPM_RC_FAILURE));
     65   EXPECT_FALSE(tpm_initializer_->InitializeTpm());
     66 }
     67 
     68 TEST_F(Tpm2InitializerTest, InitializeTpmAlreadyOwned) {
     69   EXPECT_CALL(mock_tpm_status_, IsTpmOwned())
     70       .WillRepeatedly(Return(true));
     71   EXPECT_CALL(mock_tpm_utility_, TakeOwnership(_, _, _))
     72       .Times(0);
     73   EXPECT_TRUE(tpm_initializer_->InitializeTpm());
     74 }
     75 
     76 TEST_F(Tpm2InitializerTest, InitializeTpmLocalDataReadError) {
     77   EXPECT_CALL(mock_tpm_status_, IsTpmOwned())
     78       .WillRepeatedly(Return(false));
     79   EXPECT_CALL(mock_data_store_, Read(_))
     80       .WillRepeatedly(Return(false));
     81   EXPECT_CALL(mock_tpm_utility_, TakeOwnership(_, _, _))
     82       .Times(0);
     83   EXPECT_FALSE(tpm_initializer_->InitializeTpm());
     84 }
     85 
     86 TEST_F(Tpm2InitializerTest, InitializeTpmLocalDataWriteError) {
     87   EXPECT_CALL(mock_tpm_status_, IsTpmOwned())
     88       .WillRepeatedly(Return(false));
     89   EXPECT_CALL(mock_data_store_, Write(_))
     90       .WillRepeatedly(Return(false));
     91   EXPECT_CALL(mock_tpm_utility_, TakeOwnership(_, _, _))
     92       .Times(0);
     93   EXPECT_FALSE(tpm_initializer_->InitializeTpm());
     94 }
     95 
     96 TEST_F(Tpm2InitializerTest, InitializeTpmOwnershipError) {
     97   EXPECT_CALL(mock_tpm_status_, IsTpmOwned())
     98       .WillOnce(Return(false));
     99   EXPECT_CALL(mock_tpm_utility_, TakeOwnership(_, _, _))
    100       .WillRepeatedly(Return(trunks::TPM_RC_FAILURE));
    101   EXPECT_FALSE(tpm_initializer_->InitializeTpm());
    102 }
    103 
    104 TEST_F(Tpm2InitializerTest, InitializeTpmSuccess) {
    105   EXPECT_CALL(mock_tpm_status_, IsTpmOwned())
    106       .WillOnce(Return(false));
    107   std::string owner_password;
    108   std::string endorsement_password;
    109   std::string lockout_password;
    110   LocalData local_data;
    111   EXPECT_CALL(mock_data_store_, Read(_))
    112       .WillOnce(DoAll(SetArgPointee<0>(local_data),
    113                       Return(true)));
    114   EXPECT_CALL(mock_tpm_utility_, GenerateRandom(_, _, _))
    115       .Times(3)  // Once for owner, endorsement and lockout passwords
    116       .WillRepeatedly(Return(trunks::TPM_RC_SUCCESS));
    117   EXPECT_CALL(mock_tpm_utility_, TakeOwnership(_, _, _))
    118       .WillOnce(Return(trunks::TPM_RC_SUCCESS));
    119   EXPECT_TRUE(tpm_initializer_->InitializeTpm());
    120 }
    121 
    122 TEST_F(Tpm2InitializerTest, InitializeTpmSuccessAfterError) {
    123   EXPECT_CALL(mock_tpm_status_, IsTpmOwned())
    124       .WillOnce(Return(false));
    125   std::string owner_password("owner");
    126   std::string endorsement_password("endorsement");
    127   std::string lockout_password("lockout");
    128   LocalData local_data;
    129   local_data.add_owner_dependency(kTestDependency);
    130   local_data.set_owner_password(owner_password);
    131   local_data.set_endorsement_password(endorsement_password);
    132   local_data.set_lockout_password(lockout_password);
    133   EXPECT_CALL(mock_data_store_, Read(_))
    134       .WillOnce(DoAll(SetArgPointee<0>(local_data),
    135                       Return(true)));
    136   EXPECT_CALL(mock_data_store_, Write(_))
    137       .WillOnce(DoAll(SaveArg<0>(&local_data),
    138                       Return(true)));
    139   EXPECT_EQ(1, local_data.owner_dependency_size());
    140   EXPECT_EQ(kTestDependency, local_data.owner_dependency(0));
    141   EXPECT_EQ(owner_password, local_data.owner_password());
    142   EXPECT_EQ(endorsement_password, local_data.endorsement_password());
    143   EXPECT_EQ(lockout_password, local_data.lockout_password());
    144   EXPECT_CALL(mock_tpm_utility_, TakeOwnership(owner_password,
    145                                                endorsement_password,
    146                                                lockout_password))
    147       .WillOnce(Return(trunks::TPM_RC_SUCCESS));
    148   EXPECT_TRUE(tpm_initializer_->InitializeTpm());
    149 }
    150 
    151 }  // namespace tpm_manager
    152