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_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 
     29 Tpm2StatusImpl::Tpm2StatusImpl(const trunks::TrunksFactory& factory)
     30     : trunks_factory_(factory),
     31       trunks_tpm_state_(trunks_factory_.GetTpmState()) {}
     32 
     33 bool Tpm2StatusImpl::IsTpmEnabled() {
     34   if (!initialized_) {
     35     Refresh();
     36   }
     37   return trunks_tpm_state_->IsEnabled();
     38 }
     39 
     40 bool Tpm2StatusImpl::IsTpmOwned() {
     41   if (!is_owned_) {
     42     Refresh();
     43   }
     44   is_owned_ = trunks_tpm_state_->IsOwned();
     45   return is_owned_;
     46 }
     47 
     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 
     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