// Copyright 2014 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 <utility>

#include "trunks/mock_tpm.h"
#include "trunks/tpm_utility.h"

using testing::_;
using testing::DoAll;
using testing::Return;
using testing::SetArgPointee;

namespace trunks {

MockTpm::MockTpm(CommandTransceiver* transceiver) : Tpm(transceiver) {
  ON_CALL(*this, PCR_AllocateSync(_, _, _, _, _, _, _, _))
      .WillByDefault(DoAll(SetArgPointee<3>(YES), Return(TPM_RC_SUCCESS)));
  TPMT_PUBLIC fake_public = {};
  ON_CALL(*this, ReadPublicSync(_, _, _, _, _, _))
      .WillByDefault(DoAll(SetArgPointee<2>(Make_TPM2B_PUBLIC(fake_public)),
                           Return(TPM_RC_SUCCESS)));
}

MockTpm::~MockTpm() {}

void MockTpm::StartAuthSession(const TPMI_DH_OBJECT& tpm_key,
                               const std::string& tpm_key_name,
                               const TPMI_DH_ENTITY& bind,
                               const std::string& bind_name,
                               const TPM2B_NONCE& nonce_caller,
                               const TPM2B_ENCRYPTED_SECRET& encrypted_salt,
                               const TPM_SE& session_type,
                               const TPMT_SYM_DEF& symmetric,
                               const TPMI_ALG_HASH& auth_hash,
                               AuthorizationDelegate* authorization_delegate,
                               StartAuthSessionResponse callback) {
  StartAuthSessionShort(tpm_key, bind, nonce_caller, encrypted_salt,
                        session_type, symmetric, auth_hash,
                        authorization_delegate, std::move(callback));
}

TPM_RC MockTpm::StartAuthSessionSync(
    const TPMI_DH_OBJECT& tpm_key,
    const std::string& tpm_key_name,
    const TPMI_DH_ENTITY& bind,
    const std::string& bind_name,
    const TPM2B_NONCE& nonce_caller,
    const TPM2B_ENCRYPTED_SECRET& encrypted_salt,
    const TPM_SE& session_type,
    const TPMT_SYM_DEF& symmetric,
    const TPMI_ALG_HASH& auth_hash,
    TPMI_SH_AUTH_SESSION* session_handle,
    TPM2B_NONCE* nonce_tpm,
    AuthorizationDelegate* authorization_delegate) {
  return StartAuthSessionSyncShort(
      tpm_key, bind, nonce_caller, encrypted_salt, session_type, symmetric,
      auth_hash, session_handle, nonce_tpm, authorization_delegate);
}
TPM_RC MockTpm::CreateSync(const TPMI_DH_OBJECT& parent_handle,
                           const std::string& parent_handle_name,
                           const TPM2B_SENSITIVE_CREATE& in_sensitive,
                           const TPM2B_PUBLIC& in_public,
                           const TPM2B_DATA& outside_info,
                           const TPML_PCR_SELECTION& creation_pcr,
                           TPM2B_PRIVATE* out_private,
                           TPM2B_PUBLIC* out_public,
                           TPM2B_CREATION_DATA* creation_data,
                           TPM2B_DIGEST* creation_hash,
                           TPMT_TK_CREATION* creation_ticket,
                           AuthorizationDelegate* authorization_delegate) {
  return CreateSyncShort(parent_handle, in_sensitive, in_public, creation_pcr,
                         out_private, out_public, creation_data, creation_hash,
                         creation_ticket, authorization_delegate);
}
TPM_RC MockTpm::CertifyCreationSync(
    const TPMI_DH_OBJECT& sign_handle,
    const std::string& sign_handle_name,
    const TPMI_DH_OBJECT& object_handle,
    const std::string& object_handle_name,
    const TPM2B_DATA& qualifying_data,
    const TPM2B_DIGEST& creation_hash,
    const TPMT_SIG_SCHEME& in_scheme,
    const TPMT_TK_CREATION& creation_ticket,
    TPM2B_ATTEST* certify_info,
    TPMT_SIGNATURE* signature,
    AuthorizationDelegate* authorization_delegate) {
  return CertifyCreationSyncShort(
      sign_handle, object_handle, qualifying_data, creation_hash, in_scheme,
      creation_ticket, certify_info, signature, authorization_delegate);
}
TPM_RC MockTpm::GetSessionAuditDigestSync(
    const TPMI_RH_ENDORSEMENT& privacy_admin_handle,
    const std::string& privacy_admin_handle_name,
    const TPMI_DH_OBJECT& sign_handle,
    const std::string& sign_handle_name,
    const TPMI_SH_HMAC& session_handle,
    const std::string& session_handle_name,
    const TPM2B_DATA& qualifying_data,
    const TPMT_SIG_SCHEME& in_scheme,
    TPM2B_ATTEST* audit_info,
    TPMT_SIGNATURE* signature,
    AuthorizationDelegate* authorization_delegate) {
  return GetSessionAuditDigestSyncShort(
      privacy_admin_handle, sign_handle, session_handle, qualifying_data,
      in_scheme, audit_info, signature, authorization_delegate);
}
TPM_RC MockTpm::CommitSync(const TPMI_DH_OBJECT& sign_handle,
                           const std::string& sign_handle_name,
                           const UINT32& param_size,
                           const TPM2B_ECC_POINT& p1,
                           const TPM2B_SENSITIVE_DATA& s2,
                           const TPM2B_ECC_PARAMETER& y2,
                           UINT32* param_size_out,
                           TPM2B_ECC_POINT* k,
                           TPM2B_ECC_POINT* l,
                           TPM2B_ECC_POINT* e,
                           UINT16* counter,
                           AuthorizationDelegate* authorization_delegate) {
  return CommitSyncShort(sign_handle, param_size, p1, y2, param_size_out, k, l,
                         e, counter, authorization_delegate);
}
void MockTpm::PolicySigned(const TPMI_DH_OBJECT& auth_object,
                           const std::string& auth_object_name,
                           const TPMI_SH_POLICY& policy_session,
                           const std::string& policy_session_name,
                           const TPM2B_NONCE& nonce_tpm,
                           const TPM2B_DIGEST& cp_hash_a,
                           const TPM2B_NONCE& policy_ref,
                           const INT32& expiration,
                           const TPMT_SIGNATURE& auth,
                           AuthorizationDelegate* authorization_delegate,
                           PolicySignedResponse callback) {
  PolicySignedShort(auth_object, policy_session, nonce_tpm, cp_hash_a,
                    policy_ref, expiration, auth, authorization_delegate,
                    std::move(callback));
}
TPM_RC MockTpm::PolicySignedSync(
    const TPMI_DH_OBJECT& auth_object,
    const std::string& auth_object_name,
    const TPMI_SH_POLICY& policy_session,
    const std::string& policy_session_name,
    const TPM2B_NONCE& nonce_tpm,
    const TPM2B_DIGEST& cp_hash_a,
    const TPM2B_NONCE& policy_ref,
    const INT32& expiration,
    const TPMT_SIGNATURE& auth,
    TPM2B_TIMEOUT* timeout,
    TPMT_TK_AUTH* policy_ticket,
    AuthorizationDelegate* authorization_delegate) {
  return PolicySignedSyncShort(auth_object, policy_session, nonce_tpm,
                               cp_hash_a, policy_ref, expiration, auth, timeout,
                               policy_ticket, authorization_delegate);
}
TPM_RC MockTpm::PolicySecretSync(
    const TPMI_DH_ENTITY& auth_handle,
    const std::string& auth_handle_name,
    const TPMI_SH_POLICY& policy_session,
    const std::string& policy_session_name,
    const TPM2B_NONCE& nonce_tpm,
    const TPM2B_DIGEST& cp_hash_a,
    const TPM2B_NONCE& policy_ref,
    const INT32& expiration,
    TPM2B_TIMEOUT* timeout,
    TPMT_TK_AUTH* policy_ticket,
    AuthorizationDelegate* authorization_delegate) {
  return PolicySecretSyncShort(auth_handle, policy_session, nonce_tpm,
                               cp_hash_a, policy_ref, expiration, timeout,
                               policy_ticket, authorization_delegate);
}
void MockTpm::PolicyNV(const TPMI_RH_NV_AUTH& auth_handle,
                       const std::string& auth_handle_name,
                       const TPMI_RH_NV_INDEX& nv_index,
                       const std::string& nv_index_name,
                       const TPMI_SH_POLICY& policy_session,
                       const std::string& policy_session_name,
                       const TPM2B_OPERAND& operand_b,
                       const UINT16& offset,
                       const TPM_EO& operation,
                       AuthorizationDelegate* authorization_delegate,
                       PolicyNVResponse callback) {
  PolicyNVShort(auth_handle, nv_index, policy_session, operand_b, offset,
                operation, authorization_delegate, std::move(callback));
}
TPM_RC MockTpm::CreatePrimarySync(
    const TPMI_RH_HIERARCHY& primary_handle,
    const std::string& primary_handle_name,
    const TPM2B_SENSITIVE_CREATE& in_sensitive,
    const TPM2B_PUBLIC& in_public,
    const TPM2B_DATA& outside_info,
    const TPML_PCR_SELECTION& creation_pcr,
    TPM_HANDLE* object_handle,
    TPM2B_PUBLIC* out_public,
    TPM2B_CREATION_DATA* creation_data,
    TPM2B_DIGEST* creation_hash,
    TPMT_TK_CREATION* creation_ticket,
    TPM2B_NAME* name,
    AuthorizationDelegate* authorization_delegate) {
  return CreatePrimarySyncShort(primary_handle, in_public, creation_pcr,
                                object_handle, out_public, creation_data,
                                creation_hash, creation_ticket, name,
                                authorization_delegate);
}
void MockTpm::NV_Certify(const TPMI_DH_OBJECT& sign_handle,
                         const std::string& sign_handle_name,
                         const TPMI_RH_NV_AUTH& auth_handle,
                         const std::string& auth_handle_name,
                         const TPMI_RH_NV_INDEX& nv_index,
                         const std::string& nv_index_name,
                         const TPM2B_DATA& qualifying_data,
                         const TPMT_SIG_SCHEME& in_scheme,
                         const UINT16& size,
                         const UINT16& offset,
                         AuthorizationDelegate* authorization_delegate,
                         NV_CertifyResponse callback) {
  NV_CertifyShort(sign_handle, auth_handle, nv_index, qualifying_data,
                  in_scheme, size, offset, authorization_delegate,
                  std::move(callback));
}
TPM_RC MockTpm::NV_CertifySync(const TPMI_DH_OBJECT& sign_handle,
                               const std::string& sign_handle_name,
                               const TPMI_RH_NV_AUTH& auth_handle,
                               const std::string& auth_handle_name,
                               const TPMI_RH_NV_INDEX& nv_index,
                               const std::string& nv_index_name,
                               const TPM2B_DATA& qualifying_data,
                               const TPMT_SIG_SCHEME& in_scheme,
                               const UINT16& size,
                               const UINT16& offset,
                               TPM2B_ATTEST* certify_info,
                               TPMT_SIGNATURE* signature,
                               AuthorizationDelegate* authorization_delegate) {
  return NV_CertifySyncShort(sign_handle, auth_handle, nv_index,
                             qualifying_data, in_scheme, size, offset,
                             certify_info, signature, authorization_delegate);
}

}  // namespace trunks
