// Copyright 2021 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.

#ifndef ATTESTATION_COMMON_TPM_UTILITY_STUB_H_
#define ATTESTATION_COMMON_TPM_UTILITY_STUB_H_

#include <string>

#include "attestation/common/tpm_utility.h"

namespace attestation {

// A stub TpmUtility implementation.
class TpmUtilityStub : public TpmUtility {
 public:
  TpmUtilityStub() = default;
  TpmUtilityStub(const TpmUtilityStub&) = delete;
  TpmUtilityStub& operator=(const TpmUtilityStub&) = delete;

  ~TpmUtilityStub() override = default;

  // TpmUtility methods.
  bool Initialize() override { return true; }
  bool IsTpmReady() override { return false; }
  bool RemoveOwnerDependency() override { return false; }
  bool IsPCR0Valid() override { return false; }
  TpmVersion GetVersion() override { return TPM_1_2; }
  bool ActivateIdentity(const std::string& identity_key_blob,
                        const std::string& asym_ca_contents,
                        const std::string& sym_ca_attestation,
                        std::string* credential) override {
    return false;
  }
  bool ActivateIdentityForTpm2(KeyType key_type,
                               const std::string& identity_key_blob,
                               const std::string& encrypted_seed,
                               const std::string& credential_mac,
                               const std::string& wrapped_credential,
                               std::string* credential) override {
    return false;
  }
  bool CreateCertifiedKey(KeyType key_type,
                          KeyUsage key_usage,
                          const std::string& identity_key_blob,
                          const std::string& external_data,
                          std::string* key_blob,
                          std::string* public_key_der,
                          std::string* public_key_tpm_format,
                          std::string* key_info,
                          std::string* proof) override {
    return false;
  }
  bool SealToPCR0(const std::string& data, std::string* sealed_data) override {
    return false;
  }
  bool Unseal(const std::string& sealed_data, std::string* data) override {
    return false;
  }
  bool GetEndorsementPublicKey(KeyType key_type,
                               std::string* public_key_der) override {
    return false;
  }
  bool GetEndorsementCertificate(KeyType key_type,
                                 std::string* certificate) override {
    return false;
  }
  bool Unbind(const std::string& key_blob,
              const std::string& bound_data,
              std::string* data) override {
    return false;
  }
  bool Sign(const std::string& key_blob,
            const std::string& data_to_sign,
            std::string* signature) override {
    return false;
  }
  bool QuotePCR(uint32_t pcr_index,
                const std::string& key_blob,
                std::string* quoted_pcr_value,
                std::string* quoted_data,
                std::string* quote) override {
    return false;
  }
  bool IsQuoteForPCR(const std::string& quoted_pcr_value,
                     const std::string& quoted_data,
                     const std::string& quote,
                     uint32_t pcr_index) const override {
    return false;
  }
  bool GetNVDataSize(uint32_t nv_index, uint16_t* nv_size) const override {
    return false;
  }
  bool CertifyNV(uint32_t nv_index,
                 int nv_size,
                 const std::string& key_blob,
                 std::string* quoted_data,
                 std::string* quote) override {
    return false;
  }
  bool ReadPCR(uint32_t pcr_index, std::string* pcr_value) override {
    return false;
  }
  bool GetEndorsementPublicKeyModulus(KeyType key_type,
                                      std::string* ekm) override {
    return false;
  }
  bool GetEndorsementPublicKeyBytes(KeyType key_type,
                                    std::string* ek_bytes) override {
    return false;
  }

  bool CreateIdentity(KeyType key_type,
                      AttestationDatabase::Identity* identity) override {
    return false;
  }

  bool GetRsuDeviceId(std::string* device_id) override { return false; }
};

}  // namespace attestation

#endif  // ATTESTATION_COMMON_TPM_UTILITY_STUB_H_
