// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "tpm_manager/server/tpm2_initializer_impl.h"

#include <string>

#include <base/logging.h>
#include <base/strings/string_number_conversions.h>
#include <tpm_manager/proto_bindings/tpm_manager.pb.h>
#include <tpm_manager-client/tpm_manager/dbus-constants.h>
#include <trunks/error_codes.h>
#include <trunks/tpm_state.h>
#include <trunks/tpm_utility.h>
#include <trunks/trunks_factory_impl.h>

#include "tpm_manager/common/tpm_ownership_dbus_interface.h"
#include "tpm_manager/server/openssl_crypto_util_impl.h"

using trunks::TPM_RC;
using trunks::TPM_RC_SUCCESS;

namespace {
// Owner password is human-readable, so produce N random bytes and then
// hexdump them into N*2 password characters. For other passwords, just
// generate N*2 random bytes.
const size_t kOwnerPasswordRandomBytes = 10;
const size_t kDefaultPasswordSize = kOwnerPasswordRandomBytes * 2;
}  // namespace

namespace tpm_manager {

Tpm2InitializerImpl::Tpm2InitializerImpl(const trunks::TrunksFactory& factory,
                                         LocalDataStore* local_data_store,
                                         TpmStatus* tpm_status)
    : trunks_factory_(factory),
      openssl_util_(new OpensslCryptoUtilImpl()),
      local_data_store_(local_data_store),
      tpm_status_(tpm_status) {}

Tpm2InitializerImpl::Tpm2InitializerImpl(const trunks::TrunksFactory& factory,
                                         OpensslCryptoUtil* openssl_util,
                                         LocalDataStore* local_data_store,
                                         TpmStatus* tpm_status)
    : trunks_factory_(factory),
      openssl_util_(openssl_util),
      local_data_store_(local_data_store),
      tpm_status_(tpm_status) {}

bool Tpm2InitializerImpl::PreInitializeTpm() {
  TPM_RC result = trunks_factory_.GetTpmUtility()->PrepareForOwnership();
  if (result != TPM_RC_SUCCESS) {
    LOG(WARNING) << "Pre-initializing TPM2.0 failed.";
    return false;
  }

  return true;
}

bool Tpm2InitializerImpl::InitializeTpm() {
  if (!SeedTpmRng()) {
    return false;
  }

  TpmStatus::TpmOwnershipStatus ownership_status;
  if (!tpm_status_->GetTpmOwned(&ownership_status)) {
    LOG(ERROR) << __func__ << ": failed to get tpm ownership status";
    return false;
  }
  if (ownership_status == TpmStatus::kTpmOwned) {
    // Tpm is already owned, so we do not need to do anything.
    VLOG(1) << "Tpm already owned.";
    return true;
  }
  // First we read the local data. If we did not finish removing owner
  // dependencies or if TakeOwnership failed, we want to retake ownership
  // with the same passwords.
  LocalData local_data;
  if (!local_data_store_->Read(&local_data)) {
    LOG(ERROR) << "Error reading local data.";
    return false;
  }
  std::string owner_password;
  std::string endorsement_password;
  std::string lockout_password;
  // If there are valid owner dependencies, we need to reuse the old passwords.
  if (local_data.owner_dependency_size() > 0) {
    owner_password.assign(local_data.owner_password());
    endorsement_password.assign(local_data.endorsement_password());
    lockout_password.assign(local_data.lockout_password());
  } else {
    // Generate a human-readable owner password as a hexdump of random bytes.
    std::string random_bytes;
    if (!GetTpmRandomData(kOwnerPasswordRandomBytes, &random_bytes)) {
      LOG(ERROR) << "Error generating a random owner password.";
      return false;
    }
    owner_password = base::HexEncode(random_bytes.data(), random_bytes.size());
    // Other passwords don't have to be printable.
    if (!GetTpmRandomData(kDefaultPasswordSize, &endorsement_password)) {
      LOG(ERROR) << "Error generating a random endorsement password.";
      return false;
    }
    if (!GetTpmRandomData(kDefaultPasswordSize, &lockout_password)) {
      LOG(ERROR) << "Error generating a random lockout password.";
      return false;
    }
  }
  // We write the passwords to disk, in case there is an error while taking
  // ownership.
  local_data.clear_owner_dependency();
  for (auto dependency : kInitialTpmOwnerDependencies) {
    local_data.add_owner_dependency(dependency);
  }
  local_data.set_owner_password(owner_password);
  local_data.set_endorsement_password(endorsement_password);
  local_data.set_lockout_password(lockout_password);
  if (!local_data_store_->Write(local_data)) {
    LOG(ERROR) << "Error saving local data.";
    return false;
  }
  TPM_RC result = trunks_factory_.GetTpmUtility()->TakeOwnership(
      owner_password, endorsement_password, lockout_password);
  if (result != TPM_RC_SUCCESS) {
    LOG(ERROR) << "Error taking ownership of TPM2.0";
    return false;
  }

  return true;
}

void Tpm2InitializerImpl::VerifiedBootHelper() {
// TODO(http://crosbug.com/p/59837): restore when TPM_RC_PCR_CHANGED is
// properly handled.
#if 0
  constexpr char kVerifiedBootLateStageTag[] = "BOOT_PCR_LATE_STAGE";
#endif
  std::unique_ptr<trunks::TpmUtility> tpm_utility =
      trunks_factory_.GetTpmUtility();
  // Make sure PCRs 0-3 can't be spoofed from this point forward.
  for (int pcr : {0, 1, 2, 3}) {
    std::string value;
    TPM_RC result = tpm_utility->ReadPCR(pcr, &value);
    if (result) {
      LOG(ERROR) << "Failed to read PCR " << pcr << ": "
                 << trunks::GetErrorString(result);
      continue;
    }
    if (value == std::string(32, 0)) {
      LOG(WARNING) << "WARNING: Verified boot PCR " << pcr
                   << " is not initialized.";
// TODO(http://crosbug.com/p/59837): restore when TPM_RC_PCR_CHANGED is
// properly handled.
#if 0
      result = tpm_utility->ExtendPCR(pcr, kVerifiedBootLateStageTag, nullptr);
      if (result) {
        LOG(ERROR) << "Failed to extend PCR " << pcr << ": "
                   << trunks::GetErrorString(result);
      }
#endif
    }
  }
}

DictionaryAttackResetStatus Tpm2InitializerImpl::ResetDictionaryAttackLock() {
  LocalData local_data;
  if (!local_data_store_->Read(&local_data)) {
    LOG(ERROR) << __func__ << ": Error reading local data.";
    return DictionaryAttackResetStatus::kResetAttemptFailed;
  }
  if (!local_data.has_lockout_password()) {
    LOG(ERROR) << __func__ << ": Lockout password not available.";
    return DictionaryAttackResetStatus::kResetAttemptFailed;
  }
  std::unique_ptr<trunks::HmacSession> session =
      trunks_factory_.GetHmacSession();
  TPM_RC result = session->StartUnboundSession(true, false);
  if (result != TPM_RC_SUCCESS) {
    LOG(ERROR) << __func__ << ": Error initializing AuthorizationSession: "
               << trunks::GetErrorString(result);
    return DictionaryAttackResetStatus::kResetAttemptFailed;
  }
  session->SetEntityAuthorizationValue(local_data.lockout_password());
  std::unique_ptr<trunks::TpmUtility> tpm_utility =
      trunks_factory_.GetTpmUtility();
  result = tpm_utility->ResetDictionaryAttackLock(session->GetDelegate());
  if (result != TPM_RC_SUCCESS) {
    LOG(ERROR) << __func__
               << ": Error resetting lock: " << trunks::GetErrorString(result);
    return DictionaryAttackResetStatus::kResetAttemptFailed;
  }
  return DictionaryAttackResetStatus::kResetAttemptSucceeded;
}

void Tpm2InitializerImpl::PruneStoredPasswords() {
  std::unique_ptr<trunks::TpmState> trunks_tpm_state =
      trunks_factory_.GetTpmState();
  if (trunks_tpm_state->Initialize() != trunks::TPM_RC_SUCCESS) {
    LOG(ERROR) << __func__ << ": failed to refresh trunks tpm state";
    return;
  }

  if (trunks_tpm_state->IsEndorsementPasswordSet()) {
    LOG(WARNING) << __func__ << ": take ownership already started. "
                 << "Local data won't be touched.";
    return;
  }

  LocalData local_data;
  if (!local_data_store_->Read(&local_data)) {
    LOG(ERROR) << __func__ << ": failed to read local data.";
    return;
  }

  local_data.clear_owner_password();
  local_data.clear_lockout_password();
  local_data.clear_endorsement_password();
  local_data.clear_owner_dependency();

  if (!local_data_store_->Write(local_data)) {
    LOG(ERROR) << __func__ << ": failed to write local data.";
  }
}

bool Tpm2InitializerImpl::SeedTpmRng() {
  std::string random_bytes;
  if (!openssl_util_->GetRandomBytes(kDefaultPasswordSize, &random_bytes)) {
    return false;
  }
  TPM_RC result = trunks_factory_.GetTpmUtility()->StirRandom(
      random_bytes, nullptr /* No Authorization */);
  if (result != TPM_RC_SUCCESS) {
    return false;
  }
  return true;
}

bool Tpm2InitializerImpl::GetTpmRandomData(size_t num_bytes,
                                           std::string* random_data) {
  TPM_RC result = trunks_factory_.GetTpmUtility()->GenerateRandom(
      num_bytes, nullptr /* No Authorization */, random_data);
  if (result != TPM_RC_SUCCESS) {
    return false;
  }
  return true;
}

bool Tpm2InitializerImpl::EnsurePersistentOwnerDelegate() {
  return true;
}

}  // namespace tpm_manager
