// 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
