// 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,
    const OwnershipTakenCallBack& ownership_taken_callback)
    : trunks_factory_(factory),
      openssl_util_(new OpensslCryptoUtilImpl()),
      local_data_store_(local_data_store),
      tpm_status_(tpm_status),
      ownership_taken_callback_(ownership_taken_callback) {}

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

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_->CheckAndNotifyIfTpmOwned(&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;
  }

  if (!ownership_taken_callback_.is_null()) {
    ownership_taken_callback_.Run();
  }
  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
