1259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
2259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project
3259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
4259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
5259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// you may not use this file except in compliance with the License.
6259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// You may obtain a copy of the License at
7259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
8259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//      http://www.apache.org/licenses/LICENSE-2.0
9259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
10259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
11259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
12259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// See the License for the specific language governing permissions and
14259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// limitations under the License.
15259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi//
16c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
17c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi#include "tpm_manager/server/tpm2_status_impl.h"
18c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
19c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi#include <memory>
20c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
21c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi#include <gmock/gmock.h>
22c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi#include <gtest/gtest.h>
23c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi#include <trunks/mock_tpm_state.h>
24c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi#include <trunks/trunks_factory_for_test.h>
25c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
26c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghiusing testing::NiceMock;
27c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghiusing testing::Return;
28c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghiusing trunks::TPM_RC_FAILURE;
29c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghiusing trunks::TPM_RC_SUCCESS;
30c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
31c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghinamespace tpm_manager {
32c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
33c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghiclass Tpm2StatusTest : public testing::Test {
34c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi public:
35a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  Tpm2StatusTest() = default;
36c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  virtual ~Tpm2StatusTest() = default;
37c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
38c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  void SetUp() {
39a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    factory_.set_tpm_state(&mock_tpm_state_);
40a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn    tpm_status_.reset(new Tpm2StatusImpl(factory_));
41c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  }
42c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
43c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi protected:
44c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  NiceMock<trunks::MockTpmState> mock_tpm_state_;
45a94133441da308b30c6fe18cc4e2b866498ee401Darren Krahn  trunks::TrunksFactoryForTest factory_;
46c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  std::unique_ptr<TpmStatus> tpm_status_;
47c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi};
48c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
49c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsEnabledSuccess) {
50c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, Initialize())
51c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
524dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsEnabled()).WillRepeatedly(Return(true));
53c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmEnabled());
54c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
55c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
56c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsEnabledFailure) {
574dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsEnabled()).WillRepeatedly(Return(false));
58c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_FALSE(tpm_status_->IsTpmEnabled());
59c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
60c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
61c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsEnabledNoRepeatedInitialization) {
624dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, Initialize()).WillOnce(Return(TPM_RC_SUCCESS));
63c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmEnabled());
64c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmEnabled());
65c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
66c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
67c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsOwnedSuccess) {
68c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, Initialize())
69c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
704dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwned()).WillRepeatedly(Return(true));
71c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmOwned());
72c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
73c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
74c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsOwnedFailure) {
754dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwned()).WillRepeatedly(Return(false));
76c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_FALSE(tpm_status_->IsTpmOwned());
77c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
78c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
79c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsOwnedRepeatedInitializationOnFalse) {
80c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, Initialize())
81c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .Times(2)
82c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
834dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwned()).WillOnce(Return(false));
84c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_FALSE(tpm_status_->IsTpmOwned());
854dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwned()).WillRepeatedly(Return(true));
86c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmOwned());
87c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
88c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
89c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, IsOwnedNoRepeatedInitializationOnTrue) {
904dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, Initialize()).WillOnce(Return(TPM_RC_SUCCESS));
914dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsOwned()).WillRepeatedly(Return(true));
92c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmOwned());
93c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_TRUE(tpm_status_->IsTpmOwned());
94c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
95c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
96c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, GetDictionaryAttackInfoInitializeFailure) {
97c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, Initialize())
98c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_FAILURE));
99c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int count;
100c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int threshold;
101c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  bool lockout;
102c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int seconds_remaining;
1034dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_FALSE(tpm_status_->GetDictionaryAttackInfo(
1044dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      &count, &threshold, &lockout, &seconds_remaining));
105c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
106c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
107c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, GetDictionaryAttackInfoForwarding) {
108c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int lockout_count = 3;
109c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int lockout_threshold = 16;
110c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  bool is_locked = true;
111c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int lockout_interval = 3600;
112c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, GetLockoutCounter())
113c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(lockout_count));
114c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, GetLockoutThreshold())
115c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(lockout_threshold));
1164dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_CALL(mock_tpm_state_, IsInLockout()).WillRepeatedly(Return(is_locked));
117c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, GetLockoutInterval())
118c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(lockout_interval));
119c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int count;
120c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int threshold;
121c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  bool lockout;
122c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int seconds_remaining;
1234dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_TRUE(tpm_status_->GetDictionaryAttackInfo(&count, &threshold, &lockout,
124c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi                                                   &seconds_remaining));
125c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_EQ(count, lockout_count);
126c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_EQ(threshold, lockout_threshold);
127c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_EQ(lockout, is_locked);
128c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_EQ(seconds_remaining, lockout_count * lockout_interval);
129c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
130c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
131c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh SanghiTEST_F(Tpm2StatusTest, GetDictionaryAttackInfoAlwaysRefresh) {
132c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_state_, Initialize())
133c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi      .WillRepeatedly(Return(TPM_RC_SUCCESS));
134c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int count;
135c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int threshold;
136c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  bool lockout;
137c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi  int seconds_remaining;
1384dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  EXPECT_TRUE(tpm_status_->GetDictionaryAttackInfo(&count, &threshold, &lockout,
139c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi                                                   &seconds_remaining));
140c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}
141c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi
142c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi}  // namespace tpm_manager
143