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

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libsession_manager-client",
  ]
}

pkg_config("u2fd_config") {
  # NOSORT
  pkg_deps = [
    "libattestation-client",
    "libmetrics",
    "libpower_manager-client",
    "libtrunks",
    "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.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

static_library("libu2fd") {
  sources = [
    "allowlisting_util.cc",
    "tpm_vendor_cmd.cc",
    "u2f_apdu.cc",
    "u2f_command_processor_gsc.cc",
    "u2f_daemon.cc",
    "u2f_msg_handler.cc",
    "u2fhid.cc",
    "uhid_device.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",
  ]
}

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" ]
}

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"
}

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

if (use.test) {
  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",
      "u2f_command_processor_gsc_test.cc",
      "u2f_msg_handler_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.fuzzer) {
  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" ]
  }
}
