// Copyright 2020 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 "trunks/tpm_cache_impl.h"

#include <memory>

#include <base/logging.h>

#include "trunks/tpm_generated.h"
#include "trunks/tpm_state.h"
#include "trunks/tpm_utility.h"
#include "trunks/trunks_factory.h"

namespace trunks {

TpmCacheImpl::TpmCacheImpl(const TrunksFactory& factory): factory_(factory) {}

TPM_RC TpmCacheImpl::GetSaltingKeyPublicArea(TPMT_PUBLIC* public_area) {
  // sanity check
  if (!public_area) {
    LOG(ERROR) << __func__ << ": public_area is uninitialized.";
    return TPM_RC_FAILURE;
  }

  if (salting_key_pub_area_) {
    // return from cache
    *public_area = *salting_key_pub_area_;
    return TPM_RC_SUCCESS;
  }

  TPM2B_NAME unused_out_name;
  TPM2B_NAME unused_qualified_name;
  TPM2B_PUBLIC public_data;
  TPM_RC result = factory_.GetTpm()->ReadPublicSync(
      kSaltingKey,
      "" /* object_handle_name, not used */,
      &public_data,
      &unused_out_name,
      &unused_qualified_name,
      nullptr /* authorization_delegate */);

  if (result == TPM_RC_SUCCESS) {
    salting_key_pub_area_ = public_data.public_area;
    *public_area = *salting_key_pub_area_;
  }

  return result;
}

TPM_ALG_ID TpmCacheImpl::GetBestSupportedKeyType() {
  if (best_key_type_) {
    return *best_key_type_;
  }

  std::unique_ptr<TpmState> tpm_state = factory_.GetTpmState();
  if (tpm_state->Initialize() != TPM_RC_SUCCESS) {
    LOG(ERROR) << __func__ << ": Failed to refresh tpm state.";
    return TPM_ALG_ERROR;
  }

  // The if-else order below matters because ECC is preferable to RSA.
  if (tpm_state->IsECCSupported()) {
    best_key_type_ = TPM_ALG_ECC;
  } else if (tpm_state->IsRSASupported()) {
    best_key_type_ = TPM_ALG_RSA;
  }

  return best_key_type_ ? *best_key_type_ : TPM_ALG_ERROR;
}

}  // namespace trunks
