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_status_impl.h"
18
19 #include <base/logging.h>
20 #include <trunks/error_codes.h>
21 #include <trunks/tpm_generated.h>
22 #include <trunks/trunks_factory_impl.h>
23
24 using trunks::TPM_RC;
25 using trunks::TPM_RC_SUCCESS;
26
27 namespace tpm_manager {
28
Tpm2StatusImpl(const trunks::TrunksFactory & factory)29 Tpm2StatusImpl::Tpm2StatusImpl(const trunks::TrunksFactory& factory)
30 : trunks_factory_(factory),
31 trunks_tpm_state_(trunks_factory_.GetTpmState()) {}
32
IsTpmEnabled()33 bool Tpm2StatusImpl::IsTpmEnabled() {
34 if (!initialized_) {
35 Refresh();
36 }
37 return trunks_tpm_state_->IsEnabled();
38 }
39
IsTpmOwned()40 bool Tpm2StatusImpl::IsTpmOwned() {
41 if (!is_owned_) {
42 Refresh();
43 }
44 is_owned_ = trunks_tpm_state_->IsOwned();
45 return is_owned_;
46 }
47
GetDictionaryAttackInfo(int * counter,int * threshold,bool * lockout,int * seconds_remaining)48 bool Tpm2StatusImpl::GetDictionaryAttackInfo(int* counter,
49 int* threshold,
50 bool* lockout,
51 int* seconds_remaining) {
52 if (!Refresh()) {
53 return false;
54 }
55 if (counter) {
56 *counter = trunks_tpm_state_->GetLockoutCounter();
57 }
58 if (threshold) {
59 *threshold = trunks_tpm_state_->GetLockoutThreshold();
60 }
61 if (lockout) {
62 *lockout = trunks_tpm_state_->IsInLockout();
63 }
64 if (seconds_remaining) {
65 *seconds_remaining = trunks_tpm_state_->GetLockoutCounter() *
66 trunks_tpm_state_->GetLockoutInterval();
67 }
68 return true;
69 }
70
Refresh()71 bool Tpm2StatusImpl::Refresh() {
72 TPM_RC result = trunks_tpm_state_->Initialize();
73 if (result != TPM_RC_SUCCESS) {
74 LOG(WARNING) << "Error initializing trunks tpm state: "
75 << trunks::GetErrorString(result);
76 return false;
77 }
78 initialized_ = true;
79 return true;
80 }
81
82 } // namespace tpm_manager
83