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

# Stop linter from complaining XXX_unittest.cc naming.
# TODO(cylai): rename all the unittest files and enable this linting option.
# gnlint: disable=GnLintSourceFileNames

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

group("all") {
  deps = [
    ":cryptohome",
    ":cryptohome-namespace-mounter",
    ":cryptohome-path",
    ":cryptohome-proxy",
    ":cryptohomed",
    ":encrypted-reboot-vault",
    ":homedirs_initializer",
    ":lockbox-cache",
    ":mount-encrypted",
    ":mount_encrypted_lib",
    ":tpm-manager",
  ]
  if (use.cert_provision) {
    deps += [
      ":cert_provision",
      ":cert_provision-proto",
      ":cert_provision-static",
      ":cert_provision_client",
    ]
  }
  if (use.test) {
    deps += [
      ":boot_lockbox_unittests",
      ":cryptohome_testrunner",
      ":mount_encrypted_unittests",
    ]
  }
  if (use.fuzzer) {
    deps += [
      ":cryptohome_cryptolib_blob_to_hex_fuzzer",
      ":cryptohome_cryptolib_rsa_oaep_decrypt_fuzzer",
    ]
  }
  if (use.tpm2) {
    deps += [
      ":bootlockboxd",
      ":bootlockboxtool",
    ]
  }
}

# Main programs.
executable("cryptohome") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "cryptohome.cc",
  ]
  libs = [
    "chaps",
    "keyutils",
    "policy",
    "pthread",
    "scrypt",
  ]
  deps = [
    "libs:cryptohome-dbus-client",
    "libs:cryptohome-proto",
    "libs:cryptohome-proto-external",
    "libs:libcrostpm",
    "libs:libcryptohome",
  ]
  pkg_deps = [
    "dbus-1",
    "dbus-glib-1",
    "glib-2.0",
    "libbrillo",
    "libbrillo-glib",
    "libchrome-${libbase_ver}",
    "libecryptfs",
    "libmetrics-${libbase_ver}",
    "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",
    "protobuf",
    "vboot_host",
  ]
}

executable("cryptohome-path") {
  sources = [
    "cryptohome-path.cc",
  ]
  deps = [
    "libs:libcrostpm",
    "libs:libcryptohome",
  ]
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
  ]
}

executable("cryptohomed") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "cryptohomed.cc",
  ]
  libs = [
    "chaps",
    "keyutils",
    "policy",
    "pthread",
    "scrypt",
  ]
  deps = [
    "libs:libcrostpm",
    "libs:libcryptohome",
  ]
  pkg_deps = [
    "dbus-1",
    "dbus-glib-1",
    "glib-2.0",
    "libbrillo",
    "libbrillo-glib",
    "libchrome-${libbase_ver}",
    "libecryptfs",
    "libmetrics-${libbase_ver}",
    "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",
    "protobuf",
    "vboot_host",
  ]
}

# This executable is used to mount cryptohomes.
executable("cryptohome-namespace-mounter") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "cryptohome_namespace_mounter/cryptohome_namespace_mounter.cc",
  ]
  deps = [
    "libs:libcryptohome",
    "libs:namespace-mounter-ipc-proto",
  ]
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",

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

# This executable is used for the transition between old DBus interface
# and the new DBus interface.
executable("cryptohome-proxy") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "platform.cc",
    "proxy/cryptohome_proxy.cc",
    "proxy/dbus_proxy_service.cc",
    "proxy/legacy_cryptohome_interface_adaptor.cc",
  ]
  deps = [
    "libs:cryptohome-proto-external",
    "libs:cryptohome_adaptors",
    "libs:libcryptohome",
    "libs:userdataauth-client-headers",
  ]
  pkg_deps = [
    "dbus-1",
    "libattestation-client",
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libtpm_manager-client",

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

executable("lockbox-cache") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "crc32.c",
    "dircrypto_util.cc",
    "lockbox-cache-main.cc",
    "lockbox-cache.cc",
    "lockbox.cc",
    "platform.cc",
  ]
  libs = [
    "keyutils",
    "secure_erase_file",
  ]
  deps = [
    "libs:cryptohome-proto",
    "libs:libcrostpm",
  ]
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libecryptfs",
    "libmetrics-${libbase_ver}",
    "openssl",
    "vboot_host",
  ]
}

static_library("mount_encrypted_lib") {
  configs += [
    # for USE_TPM2
    "libs:target_defaults",
  ]
  sources = [
    "mount_encrypted/encrypted_fs.cc",
    "mount_encrypted/encryption_key.cc",
    "mount_encrypted/tpm.cc",
  ]
  defines = [ "CHROMEOS_ENVIRONMENT=1" ]
  deps = [
    "libs:cryptohome-proto",
  ]
  pkg_deps = [
    "glib-2.0",
    "libbrillo",
    "libchrome-${libbase_ver}",
    "openssl",
    "vboot_host",
  ]

  if (use.tpm2) {
    sources += [ "mount_encrypted/tpm2.cc" ]

    # This selects TPM2 code in vboot_host headers.
    defines += [ "TPM2_MODE=1" ]
  } else {
    sources += [ "mount_encrypted/tpm1.cc" ]
  }
}

executable("encrypted-reboot-vault") {
  sources = [
    "encrypted_reboot_vault/encrypted_reboot_vault.cc",
    "encrypted_reboot_vault/encrypted_reboot_vault_main.cc",
  ]
  deps = [
    "libs:libcrostpm",
  ]
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
  ]
}

executable("mount-encrypted") {
  sources = [
    "mount_encrypted/mount_encrypted.cc",
  ]
  deps = [
    ":mount_encrypted_lib",
    "libs:libcrostpm",
  ]
  pkg_deps = [
    "glib-2.0",
    "libbrillo",
    "libchrome-${libbase_ver}",
    "openssl",
    "vboot_host",
  ]
}

executable("tpm-manager") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "tpm_manager.cc",
  ]
  deps = [
    "libs:libcrostpm",
  ]
  pkg_deps = [
    "glib-2.0",
    "libbrillo",
    "libbrillo-glib",
    "libchrome-${libbase_ver}",
    "libecryptfs",
    "libmetrics-${libbase_ver}",
    "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",
    "protobuf",
  ]

  if (use.tpm2) {
    sources += [ "tpm_manager_v2.cc" ]
    libs = [
      "trunks",
      "tpm_manager",
      "attestation",
    ]
  } else {
    sources += [ "tpm_manager_v1.cc" ]
    libs = [
      "chaps",
      "scrypt",
    ]
    pkg_deps += [ "vboot_host" ]
  }
}

executable("homedirs_initializer") {
  configs += [ "libs:target_defaults" ]
  sources = [
    "homedirs_initializer.cc",
  ]
  deps = [
    "libs:libcrostpm",
    "libs:libcryptohome",
  ]
  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "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",
    "protobuf",
  ]
}

if (use.cert_provision) {
  # TODO(hidehiko): Support pkg_deps in proto_library.
  pkg_config("cert_provision-proto_config") {
    pkg_deps = [ "protobuf" ]
  }

  proto_library("cert_provision-proto") {
    proto_in_dir = "./cert"
    proto_out_dir = "include/cert"
    use_pic = true
    sources = [
      "cert/cert_provision.proto",
    ]

    # libcert_provision-proto.a is used by a shared_libary
    all_dependent_configs = [ ":cert_provision-proto_config" ]
  }

  shared_library("cert_provision") {
    deps = [
      ":cert_provision-static",
    ]
  }

  static_library("cert_provision-static") {
    configs += [ ":cert_provision-proto_config" ]
    sources = [
      "cert/cert_provision.cc",
      "cert/cert_provision_cryptohome.cc",
      "cert/cert_provision_keystore.cc",
      "cert/cert_provision_pca.cc",
      "cert/cert_provision_util.cc",
    ]

    # libcert_provision-static.a is used by a shared_libary
    # object, so we need to build it with '-fPIC' instead of '-fPIE'.
    configs -= [ "//common-mk:pie" ]
    configs += [ "//common-mk:pic" ]
    libs = [
      "chaps",
      "pthread",
    ]
    public_pkg_deps = [
      "dbus-glib-1",
      "libbrillo",
      "libbrillo-glib",
      "libchrome-${libbase_ver}",
      "openssl",
      "protobuf",
    ]

    deps = [
      ":cert_provision-proto",
      "libs:cryptohome-dbus-client",
      "libs:cryptohome-proto",
    ]
  }

  executable("cert_provision_client") {
    sources = [
      "cert/cert_provision_client.cc",
    ]
    deps = [
      ":cert_provision",
    ]
    pkg_deps = [
      "libbrillo",
      "libchrome-${libbase_ver}",
    ]
  }
}

if (use.test) {
  executable("cryptohome_testrunner") {
    configs += [
      "//common-mk:test",
      "libs:target_defaults",
    ]
    sources = [
      "arc_disk_quota_unittest.cc",
      "attestation_unittest.cc",
      "auth_block_unittest.cc",
      "boot_attributes_unittest.cc",
      "bootlockbox/boot_lockbox_unittest.cc",
      "challenge_credentials/challenge_credentials_helper_impl_unittest.cc",
      "challenge_credentials/challenge_credentials_test_utils.cc",
      "credentials_unittest.cc",
      "crypto_unittest.cc",
      "cryptohome_event_source_unittest.cc",
      "cryptolib_unittest.cc",
      "dircrypto_data_migrator/migration_helper_unittest.cc",
      "fake_le_credential_backend.cc",
      "firmware_management_parameters_unittest.cc",
      "homedirs_unittest.cc",
      "install_attributes_unittest.cc",
      "le_credential_manager_impl_unittest.cc",
      "lockbox-cache-unittest.cc",
      "lockbox_unittest.cc",
      "make_tests.cc",
      "mock_chaps_client_factory.cc",
      "mock_firmware_management_parameters.cc",
      "mock_homedirs.cc",
      "mock_install_attributes.cc",
      "mock_key_challenge_service.cc",
      "mock_keystore.cc",
      "mock_lockbox.cc",
      "mock_mount.cc",
      "mock_pkcs11_init.cc",
      "mock_platform.cc",
      "mock_service.cc",
      "mock_signature_sealing_backend.cc",
      "mock_tpm.cc",
      "mock_tpm_init.cc",
      "mock_user_oldest_activity_timestamp_cache.cc",
      "mock_user_session.cc",
      "mock_vault_keyset.cc",
      "mount_stack_unittest.cc",
      "mount_task_unittest.cc",
      "mount_unittest.cc",
      "obfuscated_username_unittest.cc",
      "out_of_process_mount_helper_test.cc",
      "persistent_lookup_table_unittest.cc",
      "pkcs11_keystore_unittest.cc",
      "platform_unittest.cc",
      "proxy/legacy_cryptohome_interface_adaptor.cc",
      "proxy/legacy_cryptohome_interface_adaptor_test.cc",
      "service_unittest.cc",
      "sign_in_hash_tree_unittest.cc",
      "signature_sealing_backend_test_utils.cc",
      "stateful_recovery_unittest.cc",
      "tpm_init_unittest.cc",
      "tpm_persistent_state_unittest.cc",
      "user_oldest_activity_timestamp_cache_unittest.cc",
      "user_session_unittest.cc",
      "vault_keyset_unittest.cc",
    ]
    libs = [
      "chaps",
      "keyutils",
      "policy",
      "pthread",
      "scrypt",
    ]
    deps = [
      "libs:bootlockbox-client-headers",
      "libs:cryptohome-proto",
      "libs:libcrostpm",
      "libs:libcryptohome",
      "//common-mk/testrunner",
    ]
    pkg_deps = [
      "dbus-1",
      "dbus-glib-1",
      "glib-2.0",
      "libattestation-client",
      "libattestation-client-test",
      "libbrillo",
      "libbrillo-glib",
      "libbrillo-test",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
      "libecryptfs",
      "libmetrics-${libbase_ver}",
      "libtpm_manager-client",
      "libtpm_manager-client-test",
      "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",
      "protobuf",
      "vboot_host",
    ]

    if (use.tpm2) {
      sources += [
        "pinweaver_le_credential_backend_unittest.cc",
        "tpm2_test.cc",
      ]
      libs += [
        "trunks_test",
        "tpm_manager_test",
      ]
    } else {
      libs += [ "hwsec_test" ]
      sources += [
        "tpm1_static_utils_unittest.cc",
        "tpm1_test.cc",
        "tpm_new_impl_test.cc",
      ]
    }

    if (use.cert_provision) {
      sources += [
        "cert/cert_provision_keystore_unittest.cc",
        "cert/cert_provision_unittest.cc",
      ]
      deps += [ ":cert_provision-static" ]
    }

    if (use.cryptohome_userdataauth_interface) {
      sources += [ "userdataauth_unittest.cc" ]
    }
  }

  executable("mount_encrypted_unittests") {
    configs += [
      "//common-mk:test",
      "libs:target_defaults",
    ]
    sources = [
      "mock_platform.cc",
      "mount_encrypted/encrypted_fs_unittest.cc",
      "mount_encrypted/encryption_key_unittest.cc",
      "mount_encrypted/tlcl_stub.cc",
    ]
    deps = [
      ":mount_encrypted_lib",
      "libs:libcrostpm",
      "//common-mk/testrunner",
    ]
    pkg_deps = [
      "glib-2.0",
      "libbrillo",
      "libbrillo-test",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]

    if (use.tpm2) {
      defines = [ "TPM2_MODE=1" ]
    }
  }

  executable("boot_lockbox_unittests") {
    configs += [
      "//common-mk:test",
      "libs:target_defaults",
    ]
    deps = [
      "//common-mk/testrunner",
    ]
    pkg_deps = [
      "glib-2.0",
      "libbrillo",
      "libbrillo-test",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
      "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",
      "protobuf",
    ]

    if (use.tpm2) {
      sources = [
        "bootlockbox/boot_lockbox_dbus_adaptor.cc",
        "bootlockbox/boot_lockbox_service_unittest.cc",
        "bootlockbox/fake_tpm_nvspace_utility.cc",
        "bootlockbox/nvram_boot_lockbox_unittest.cc",
        "bootlockbox/tpm2_nvspace_utility_unittest.cc",
        "mock_tpm_init.cc",
      ]
      defines = [ "TPM2_MODE=1" ]
      libs = [
        "tpm_manager",
        "tpm_manager_test",
        "trunks",
        "trunks_test",
      ]
      deps += [
        ":tpm-manager",
        "libs:bootlockbox-proto",
        "libs:libcrostpm",
        "libs:libnvram-boot-lockbox",
      ]
    }
  }
}

if (use.tpm2) {
  executable("bootlockboxtool") {
    defines = [ "USE_TPM2=${use.tpm2}" ]
    deps = [
      "libs:bootlockbox-client-headers",
      "libs:bootlockbox-proto",
      "libs:libnvram-boot-lockbox",
      "libs:libnvram-boot-lockbox-client",
    ]
    sources = [
      "bootlockbox/boot_lockbox_tool.cc",
    ]
    pkg_deps = [
      "libchrome-${libbase_ver}",
      "libbrillo",
      "protobuf",
    ]
  }

  executable("bootlockboxd") {
    deps = [
      "libs:bootlockbox-adaptors",
      "libs:bootlockbox-proto",
      "libs:libcrostpm",
      "libs:libnvram-boot-lockbox",
    ]
    defines = [ "USE_TPM2=${use.tpm2}" ]
    libs = [
      "scrypt",
      "chaps",
      "keyutils",
      "tpm_manager",
      "trunks",
    ]
    sources = [
      "bootlockbox/boot_lockbox_dbus_adaptor.cc",
      "bootlockbox/boot_lockbox_service.cc",
      "bootlockbox/boot_lockboxd.cc",
    ]
    pkg_deps = [
      "libbrillo",
      "libchrome-${libbase_ver}",
      "libmetrics-${libbase_ver}",
      "libecryptfs",
      "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",
      "protobuf",
      "vboot_host",
    ]
  }
}

if (use.fuzzer) {
  executable("cryptohome_cryptolib_rsa_oaep_decrypt_fuzzer") {
    configs += [ "//common-mk/common_fuzzer" ]
    sources = [
      "fuzzers/cryptolib_rsa_oaep_decrypt_fuzzer.cc",
    ]
    deps = [
      "libs:libcrosplatform",
    ]
    libs = [ "scrypt" ]
    pkg_deps = [
      "libbrillo",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
      "openssl",
    ]
  }

  executable("cryptohome_cryptolib_blob_to_hex_fuzzer") {
    configs += [ "//common-mk/common_fuzzer" ]
    sources = [
      "fuzzers/cryptolib_blob_to_hex_fuzzer.cc",
    ]
    deps = [
      "libs:libcrosplatform",
    ]
    libs = [ "scrypt" ]
  }
}
