# Copyright 2018 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.

import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":libtrunks",
    ":pinweaver_client",
    ":pinweaver_provision",
    ":tpm_tunneld",
    ":trunks",
    ":trunks_client",
    ":trunks_send",
    ":trunksd",
  ]
  if (use.test) {
    deps += [ ":trunks_testrunner" ]
  }
  if (use.fuzzer) {
    deps += [
      ":trunks_creation_blob_fuzzer",
      ":trunks_hmac_authorization_delegate_fuzzer",
      ":trunks_key_blob_fuzzer",
      ":trunks_password_authorization_delegate_fuzzer",
      ":trunks_resource_manager_fuzzer",
      ":trunks_tpm_pinweaver_fuzzer",
    ]
  }
}

pkg_config("target_default_pkg_deps") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",
    "openssl",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

config("target_defaults") {
  configs = [ ":target_default_pkg_deps" ]
  defines = [ "USE_GENERIC_TPM2=${use.generic_tpm2}" ]
  if (use.tpm2_simulator) {
    defines += [ "USE_SIMULATOR=1" ]
  }
}

proto_library("interface_proto") {
  proto_in_dir = "."
  proto_out_dir = "include/trunks"
  sources = [ "${proto_in_dir}/trunks_interface.proto" ]

  # Use -fPIC so this code can be linked into a shared library.
  use_pic = true
  standalone = true
}

proto_library("pinweaver_proto") {
  proto_in_dir = "."
  proto_out_dir = "include/trunks"
  sources = [ "${proto_in_dir}/pinweaver.proto" ]

  # Use -fPIC so this code can be linked into a shared library.
  use_pic = true
  standalone = true
}

shared_library("trunks") {
  sources = [
    "background_command_transceiver.cc",
    "blob_parser.cc",
    "csme/mei_client_char_device.cc",
    "csme/mei_client_factory.cc",
    "csme/mei_client_socket.cc",
    "csme/pinweaver_core_client.cc",
    "csme/pinweaver_provision_client.cc",
    "error_codes.cc",
    "hmac_authorization_delegate.cc",
    "hmac_session_impl.cc",
    "openssl_utility.cc",
    "password_authorization_delegate.cc",
    "policy_session_impl.cc",
    "scoped_key_handle.cc",
    "session_manager_impl.cc",
    "tpm_cache_impl.cc",
    "tpm_extended.cc",
    "tpm_generated.cc",
    "tpm_pinweaver.cc",
    "tpm_state_impl.cc",
    "tpm_utility_impl.cc",
    "trunks_dbus_proxy.cc",
    "trunks_factory_impl.cc",
  ]
  configs += [ ":target_defaults" ]
  libs = [ "hwsec-foundation" ]
  defines = [ "USE_CSME_EMULATOR=${use.csme_emulator}" ]
  if (use.ftdi_tpm) {
    sources += [
      "ftdi/mpsse.c",
      "ftdi/support.c",
      "trunks_ftdi_spi.cc",
    ]
    libs += [ "ftdi1" ]
    defines += [ "SPI_OVER_FTDI=1" ]
  }
  deps = [
    ":interface_proto",
    ":pinweaver_proto",
  ]
}

executable("pinweaver_client") {
  sources = [ "pinweaver_client.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":trunks" ]
}

executable("pinweaver_provision") {
  sources = [
    "csme/pinweaver_provision_impl.cc",
    "csme/pinweaver_provision_main.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":trunks" ]
}

executable("trunks_client") {
  sources = [
    "trunks_client.cc",
    "trunks_client_test.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":trunks" ]
}

executable("trunks_send") {
  sources = [ "trunks_send.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":trunks" ]
}

pkg_config("trunksd_lib_config") {
  pkg_deps = [ "libpower_manager-client" ]
}

config("trunksd_lib_all_dependent_configs") {
  libs = [ "system_api-power_manager-protos" ]
}

pkg_config("trunksd_lib_all_dependent_pkg_deps") {
  pkg_deps = [ "libpower_manager-client" ]
}

static_library("trunksd_lib") {
  sources = [
    "power_manager.cc",
    "resource_manager.cc",
    "tpm_handle.cc",
    "tpm_simulator_handle.cc",
    "trunks_dbus_service.cc",
    "trunks_metrics.cc",
  ]
  all_dependent_configs = [
    ":trunksd_lib_all_dependent_configs",
    ":trunksd_lib_all_dependent_pkg_deps",
  ]
  configs += [
    ":target_defaults",
    ":trunksd_lib_all_dependent_pkg_deps",
    ":trunksd_lib_config",
  ]
  deps = [ ":trunks" ]
}

pkg_config("trunksd_pkg_deps") {
  pkg_deps = [ "libminijail" ]
}

executable("trunksd") {
  sources = [ "trunksd.cc" ]
  configs += [
    ":target_defaults",
    ":trunksd_pkg_deps",
  ]
  deps = [
    ":trunks",
    ":trunksd_lib",
  ]
  if (use.ftdi_tpm) {
    defines = [ "SPI_OVER_FTDI=1" ]
  }
  if (use.tpm2_simulator) {
    libs = [ "tpm2" ]
  }
}

executable("tpm_tunneld") {
  sources = [
    "csme/tpm_tunnel_service.cc",
    "csme/tpm_tunneld.cc",
  ]
  pkg_deps = [ "libminijail" ]
  configs += [ ":target_defaults" ]
  deps = [ ":trunks" ]
}

static_library("trunks_test") {
  sources = [
    "fuzzed_command_transceiver.cc",
    "mock_authorization_delegate.cc",
    "mock_blob_parser.cc",
    "mock_command_transceiver.cc",
    "mock_hmac_session.cc",
    "mock_policy_session.cc",
    "mock_session_manager.cc",
    "mock_tpm.cc",
    "mock_tpm_cache.cc",
    "mock_tpm_state.cc",
    "mock_tpm_utility.cc",
    "trunks_factory_for_test.cc",
  ]
  configs -= [ "//common-mk:use_thin_archive" ]
  configs += [
    "//common-mk:nouse_thin_archive",
    ":target_defaults",
  ]
  deps = [ ":trunks" ]
}

if (use.test) {
  pkg_config("trunks_testrunner_pkg_deps") {
    pkg_deps = [
      "libchrome-test",
      "libpower_manager-client-test",
    ]
  }
  executable("trunks_testrunner") {
    sources = [
      "background_command_transceiver_test.cc",
      "csme/mei_client_char_device_test.cc",
      "hmac_authorization_delegate_test.cc",
      "hmac_session_test.cc",
      "openssl_utility_test.cc",
      "password_authorization_delegate_test.cc",
      "policy_session_test.cc",
      "power_manager_test.cc",
      "resource_manager_test.cc",
      "scoped_global_session_test.cc",
      "scoped_key_handle_test.cc",
      "session_manager_test.cc",
      "tpm_cache_test.cc",
      "tpm_generated_test.cc",
      "tpm_state_test.cc",
      "tpm_utility_test.cc",
      "trunks_dbus_proxy_test.cc",
      "trunks_factory_test.cc",
      "trunks_testrunner.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":trunks_testrunner_pkg_deps",
    ]
    deps = [
      ":trunks",
      ":trunks_test",
      ":trunksd_lib",
    ]
  }
}

if (use.fuzzer) {
  executable("trunks_key_blob_fuzzer") {
    sources = [ "key_blob_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":trunks" ]
  }

  executable("trunks_creation_blob_fuzzer") {
    sources = [ "creation_blob_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":trunks" ]
  }

  executable("trunks_hmac_authorization_delegate_fuzzer") {
    sources = [ "hmac_authorization_delegate_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":trunks" ]
  }

  pkg_config("trunks_resource_manager_fuzzer_pkg_deps") {
    pkg_deps = [ "libchrome-test" ]  # For FuzzedDataProvider
  }

  executable("trunks_resource_manager_fuzzer") {
    sources = [ "resource_manager_fuzzer.cc" ]
    configs += [
      "//common-mk:test",
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
      ":trunks_resource_manager_fuzzer_pkg_deps",
    ]
    deps = [
      ":trunks",
      ":trunks_test",
      ":trunksd_lib",
    ]
  }

  executable("trunks_password_authorization_delegate_fuzzer") {
    sources = [ "password_authorization_delegate_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":trunks" ]
  }

  executable("trunks_tpm_pinweaver_fuzzer") {
    sources = [ "tpm_pinweaver_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":trunks" ]
  }
}

generate_pkg_config("libtrunks") {
  version = getenv("PV")
  description = "Trunks shared library"
  cflags = [ "-I/usr/include/trunks" ]
  libs = [ "-ltrunks" ]
}
