# 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 = [
    ":u2fd",
    ":webauthntool",
  ]
  if (use.cr50_onboard || use.ti50_onboard) {
    deps += [ ":g2ftool" ]
  }
  if (use.test) {
    if (use.cr50_onboard || use.ti50_onboard) {
      deps += [ ":g2f_client_test" ]
    }
    deps += [ ":u2fd_test_runner" ]
  }
  if (use.fuzzer && (use.cr50_onboard || use.ti50_onboard)) {
    deps += [
      ":u2f_apdu_fuzzer",
      ":u2f_msg_handler_fuzzer",
      ":u2f_webauthn_fuzzer",
      ":u2fhid_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libsession_manager-client",
  ]
  defines = [
    "USE_TPM1=${use.tpm}",
    "USE_GSC=${use.cr50_onboard} || ${use.ti50_onboard}",
  ]
}

pkg_config("u2fd_config") {
  # NOSORT
  pkg_deps = [
    "libattestation-client",
    "libmetrics",
    "libpower_manager-client",
    "libuser_data_auth-client",
    "openssl",

    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
  ]
  if (use.cr50_onboard || use.ti50_onboard) {
    pkg_deps += [ "libtrunks" ]
  }
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

static_library("libu2fd") {
  sources = [
    "allowlisting_util.cc",
    "u2f_daemon.cc",
    "user_state.cc",
    "util.cc",
    "webauthn_handler.cc",
    "webauthn_storage.cc",
  ]
  configs += [
    ":target_defaults",
    ":u2fd_config",
  ]
  libs = [
    "policy",
    "cbor",
  ]
  deps = [
    ":user_state_proto",
    "//common-mk/external_dependencies:policy-protos",
  ]
  if (use.tpm) {
    sources += [
      "sign_manager/sign_manager_tpm_v1.cc",
      "u2f_command_processor_generic.cc",
    ]
    libs += [
      "tspi",
      "tpm_manager",
    ]
  }
  if (use.cr50_onboard || use.ti50_onboard) {
    sources += [
      "tpm_vendor_cmd.cc",
      "u2f_apdu.cc",
      "u2f_command_processor_gsc.cc",
      "u2f_msg_handler.cc",
      "u2fhid.cc",
      "u2fhid_service_impl.cc",
      "uhid_device.cc",
    ]
  }
}

executable("u2fd") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  libs = [ "policy" ]
  deps = [ ":libu2fd" ]
}

proto_library("user_state_proto") {
  proto_in_dir = "."
  proto_out_dir = "include/u2fd"
  sources = [ "user_state.proto" ]
}

if (use.cr50_onboard || use.ti50_onboard) {
  executable("g2ftool") {
    sources = [ "g2f_tools/g2ftool.cc" ]
    configs += [ ":target_defaults" ]
    install_path = "bin"
    deps = [ ":libg2fclient" ]
  }
}

pkg_config("webauthntool_config") {
  # NOSORT
  pkg_deps = [
    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won't be in the right
    # order.
    "system_api",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

executable("webauthntool") {
  sources = [ "g2f_tools/webauthntool.cc" ]
  configs += [
    ":target_defaults",
    ":webauthntool_config",
  ]
  install_path = "bin"
}

if (use.cr50_onboard || use.ti50_onboard) {
  static_library("libg2fclient") {
    sources = [ "g2f_tools/g2f_client.cc" ]
    configs += [ ":target_defaults" ]
    libs = [ "hidapi-hidraw" ]
  }
}

if (use.test) {
  if (use.cr50_onboard || use.ti50_onboard) {
    pkg_config("g2f_client_test_config") {
      pkg_deps = [ "libchrome-test" ]
    }

    executable("g2f_client_test") {
      sources = [
        "g2f_tools/g2f_client.cc",
        "g2f_tools/g2f_client_test.cc",
      ]
      configs += [
        "//common-mk:test",
        ":target_defaults",
        ":g2f_client_test_config",
      ]
      run_test = true
      deps = [ "//common-mk/testrunner" ]
    }
  }

  pkg_config("u2fd_test_config") {
    pkg_deps = [
      "libbrillo-test",
      "libchrome-test",
      "libuser_data_auth-client-test",
    ]
  }

  executable("u2fd_test_runner") {
    sources = [
      "allowlisting_util_test.cc",
      "webauthn_handler_test.cc",
      "webauthn_storage_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":u2fd_config",
      ":u2fd_test_config",
    ]
    deps = [
      ":libu2fd",
      "//common-mk/testrunner",
    ]
    if (use.tpm) {
      sources += [ "u2f_command_processor_generic_test.cc" ]
    }
    if (use.cr50_onboard || use.ti50_onboard) {
      sources += [
        "u2f_command_processor_gsc_test.cc",
        "u2f_msg_handler_test.cc",
      ]
    }
  }
}

if (use.fuzzer && (use.cr50_onboard || use.ti50_onboard)) {
  executable("u2f_apdu_fuzzer") {
    sources = [
      "fuzzers/u2f_apdu_fuzzer.cc",
      "tpm_vendor_cmd.cc",
      "u2f_apdu.cc",
      "util.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    pkg_deps = [
      "libtrunks",
      "openssl",
    ]
  }

  executable("u2fhid_fuzzer") {
    sources = [
      "fuzzers/fake_u2f_msg_handler.cc",
      "fuzzers/fake_uhid_device.cc",
      "fuzzers/u2fhid_fuzzer.cc",
      "tpm_vendor_cmd.cc",
      "u2f_apdu.cc",
      "u2fhid.cc",
      "util.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":target_defaults",
    ]
    pkg_deps = [
      "libtrunks",
      "openssl",
    ]
  }

  executable("u2f_msg_handler_fuzzer") {
    sources = [
      "fuzzers/fuzzed_allowlisting_util_factory.cc",
      "fuzzers/fuzzed_user_state.cc",
      "fuzzers/u2f_msg_handler_fuzzer.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      "//common-mk:test",
      ":target_defaults",
    ]
    libs = [ "trunks_test" ]
    deps = [ ":libu2fd" ]
  }

  executable("u2f_webauthn_fuzzer") {
    sources = [
      "fuzzers/fuzzed_allowlisting_util_factory.cc",
      "fuzzers/fuzzed_user_state.cc",
      "fuzzers/webauthn_fuzzer.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      "//common-mk:test",
      ":target_defaults",
      ":u2fd_config",
      ":local_proto_include",
    ]
    libs = [ "trunks_test" ]
    deps = [
      ":libu2fd",
      ":webauthn_fuzzer_data_proto",
    ]
    pkg_deps = [
      "libchrome-test",
      "libprotobuf-mutator",
      "libuser_data_auth-client-test",
    ]
  }
  config("local_proto_include") {
    include_dirs = [ "${sysroot}/usr/include/u2f/proto_bindings/" ]
  }
  proto_library("webauthn_fuzzer_data_proto") {
    proto_in_dir = "fuzzers"
    proto_out_dir = "include/u2fd/fuzzers"
    proto_lib_dirs = [ "${sysroot}/usr/include/chromeos/dbus/u2f" ]
    configs = [ ":local_proto_include" ]
    sources = [ "${proto_in_dir}/webauthn_fuzzer_data.proto" ]
  }
}
