// 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/tpm_connection.h"

#include <string>
#include <vector>

#include <base/logging.h>
#include <base/stl_util.h>
#include <base/threading/platform_thread.h>
#include <base/time/time.h>
#include <libhwsec/overalls/overalls_api.h>

#include "tpm_manager/server/tpm_util.h"

using ::hwsec::overalls::GetOveralls;

namespace {

const int kTpmConnectRetries = 10;
const int kTpmConnectIntervalMs = 100;

}  // namespace

namespace tpm_manager {

TpmConnection::TpmConnection(): connection_type_(kConnectWithoutAuth) {}

TpmConnection::TpmConnection(const std::string& owner_password)
    : owner_password_(owner_password),
      connection_type_(kConnectWithPassword) {}

TpmConnection::TpmConnection(const AuthDelegate& owner_delegate)
    : owner_delegate_(owner_delegate),
      connection_type_(kConnectWithDelegate) {}

TSS_HCONTEXT TpmConnection::GetContext() {
  if (!ConnectContextIfNeeded()) {
    return 0;
  }
  return context_.value();
}

TSS_HTPM TpmConnection::GetTpm() {
  if (!ConnectContextIfNeeded()) {
    return 0;
  }
  TSS_RESULT result;
  TSS_HTPM tpm_handle;
  if (TPM_ERROR(result = GetOveralls()->Ospi_Context_GetTpmObject(
                    context_.value(), &tpm_handle))) {
    TPM_LOG(ERROR, result) << "Error getting a handle to the TPM.";
    return 0;
  }
  return tpm_handle;
}

bool TpmConnection::ConnectContextIfNeeded() {
  if (context_.value() != 0) {
    return true;
  }
  TSS_RESULT result;
  if (TPM_ERROR(result = GetOveralls()->Ospi_Context_Create(context_.ptr()))) {
    TPM_LOG(ERROR, result) << "Error connecting to TPM.";
    return false;
  }
  if (context_.value() == 0) {
    LOG(ERROR) << "Unexpected NULL context.";
    return false;
  }

  // We retry on failure. It might be that tcsd is starting up.
  int remaining_runs = kTpmConnectRetries;
  while (true) {
    result = GetOveralls()->Ospi_Context_Connect(context_, nullptr);
    if (result != TSP_ERROR(TSS_E_COMM_FAILURE) || --remaining_runs == 0) {
      break;
    }
    base::PlatformThread::Sleep(
        base::TimeDelta::FromMilliseconds(kTpmConnectIntervalMs));
  }
  if (TPM_ERROR(result)) {
    TPM_LOG(ERROR, result) << "Failed to connect context.";
    context_.reset();
    return false;
  }

  // If we don't need authorization, we're done.
  if (connection_type_ == kConnectWithoutAuth) {
    return true;
  }

  TSS_HTPM tpm_handle;
  if (TPM_ERROR(result = GetOveralls()->Ospi_Context_GetTpmObject(
                    context_.value(), &tpm_handle))) {
    TPM_LOG(ERROR, result) << "Error getting a handle to the TPM.";
    context_.reset();
    return false;
  }

  TSS_HPOLICY tpm_usage_policy;
  if (TPM_ERROR(result = GetOveralls()->Ospi_GetPolicyObject(
                    tpm_handle, TSS_POLICY_USAGE, &tpm_usage_policy))) {
    TPM_LOG(ERROR, result) << "Error calling Tspi_GetPolicyObject";
    context_.reset();
    return false;
  }

  const std::string& secret = connection_type_ == kConnectWithPassword ?
      owner_password_ : owner_delegate_.secret();
  std::vector<BYTE> secret_data(secret.begin(), secret.end());
  if (TPM_ERROR(result = GetOveralls()->Ospi_Policy_SetSecret(
                    tpm_usage_policy, TSS_SECRET_MODE_PLAIN, secret_data.size(),
                    secret_data.data()))) {
    TPM_LOG(ERROR, result) << "Error calling Tspi_Policy_SetSecret";
    context_.reset();
    return false;
  }

  if (connection_type_ == kConnectWithPassword) {
    return true;
  }

  // For connection with owner delegate, we also need to set attribute data.
  std::vector<BYTE> delegate_blob(owner_delegate_.blob().begin(),
                                  owner_delegate_.blob().end());
  if (TPM_ERROR(result = GetOveralls()->Ospi_SetAttribData(
                    tpm_usage_policy, TSS_TSPATTRIB_POLICY_DELEGATION_INFO,
                    TSS_TSPATTRIB_POLDEL_OWNERBLOB, delegate_blob.size(),
                    delegate_blob.data()))) {
    TPM_LOG(ERROR, result) << "Error calling Tspi_SetAttribData";
    return false;
  }

  return true;
}

}  // namespace tpm_manager
