# 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" ]
  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}/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",
    "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" ]
  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("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" ]
  }
}

static_library("trunks_test") {
  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",
  ]
  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",
      "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 = [
      "fuzzed_command_transceiver.cc",
      "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" ]
}
