# 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",
    ":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" ]
  if (use.tpm2_simulator) {
    defines = [ "USE_SIMULATOR=1" ]
  }
}

proto_library("interface_proto") {
  proto_in_dir = "."
  proto_out_dir = "include/trunks"
  sources = [ "${proto_in_dir}/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") {
  configs += [ ":target_defaults" ]
  sources = [
    "background_command_transceiver.cc",
    "blob_parser.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",
  ]
  deps = [
    ":interface_proto",
    ":pinweaver_proto",
  ]
  libs = [ "hwsec" ]
  if (use.ftdi_tpm) {
    sources += [
      "ftdi/mpsse.c",
      "ftdi/support.c",
      "trunks_ftdi_spi.cc",
    ]
    libs += [ "ftdi1" ]
    defines = [ "SPI_OVER_FTDI=1" ]
  }
}

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

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

executable("trunks_send") {
  configs += [ ":target_defaults" ]
  sources = [ "trunks_send.cc" ]
  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") {
  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",
  ]
  sources = [
    "power_manager.cc",
    "resource_manager.cc",
    "tpm_handle.cc",
    "tpm_simulator_handle.cc",
    "trunks_dbus_service.cc",
    "trunks_metrics.cc",
  ]
  deps = [ ":trunks" ]
}

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

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

static_library("trunks_test") {
  configs -= [ "//common-mk:use_thin_archive" ]
  configs += [
    "//common-mk:nouse_thin_archive",
    ":target_defaults",
  ]
  sources = [
    "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",
  ]
}

if (use.test) {
  pkg_config("trunks_testrunner_pkg_deps") {
    pkg_deps = [
      "libchrome-test",
      "libpower_manager-client-test",
    ]
  }
  executable("trunks_testrunner") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":trunks_testrunner_pkg_deps",
    ]
    sources = [
      "background_command_transceiver_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",
    ]
    deps = [
      ":trunks",
      ":trunks_test",
      ":trunksd_lib",
    ]
  }
}

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

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

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

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

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

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

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

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