# Copyright 2019 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/mojom_bindings_generator.gni")
import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

keymaster_src = "../../../aosp/system/keymaster"

group("all") {
  deps = [ ":arc-keymasterd" ]
  if (use.test) {
    deps += [ ":arc-keymasterd_testrunner" ]
  }
  if (use.fuzzer) {
    deps += [ ":arc_keymasterd_fuzzer" ]
  }
}

# Binary
executable("arc-keymasterd") {
  sources = [
    "cert_store_instance.cc",
    "conversion.cc",
    "daemon.cc",
    "keymaster_server.cc",
    "main.cc",
  ]
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmojo",
  ]
  deps = [
    ":keymaster_mojo_bindings",
    ":libarckeymaster_context",
    ":libkeymaster",
  ]
}

# Mojo bindings
generate_mojom_bindings("keymaster_mojo_bindings") {
  sources = [
    "mojo/cert_store.mojom",
    "mojo/keymaster.mojom",
  ]
}

# BoringSSL
config("boringssl_config") {
  libs = [
    "boringcrypto",
    "pthread",
  ]
}

# Keymaster context
pkg_config("libarckeymaster_context_config") {
  pkg_deps = [ "libsession_manager-client" ]
  libs = [ "chaps" ]
}

shared_library("libarckeymaster_context") {
  sources = [
    "${keymaster_src}/android_keymaster/logger.cpp",
    "${keymaster_src}/contexts/pure_soft_keymaster_context.cpp",
    "${keymaster_src}/contexts/soft_attestation_cert.cpp",
    "${keymaster_src}/km_openssl/attestation_utils.cpp",
    "${keymaster_src}/km_openssl/soft_keymaster_enforcement.cpp",
    "context/arc_keymaster_context.cc",
    "context/chaps_client.cc",
    "context/chaps_crypto_operation.cc",
    "context/context_adaptor.cc",
    "context/cros_key.cc",
    "context/crypto_operation.cc",
    "context/openssl_utils.cc",
    "keymaster_logger.cc",
  ]
  public_configs = [ ":libarckeymaster_context_config" ]
  configs += [
    # Needed since the keymaster context doesn't follow CrOS's guidelines.
    # gnlint: disable=GnLintVisibilityFlags
    "//common-mk:visibility_default",
    ":boringssl_config",
  ]

  # NOSORT
  pkg_deps = [
    "libchrome",

    # system_api depends on protobuf. It must appear before protobuf here so the
    # linker flags are in the right order.
    "system_api",
    "protobuf",
  ]
  deps = [
    ":context_proto",
    ":keymaster_mojo_bindings",
    ":libkeymaster",
  ]
}

# Keymaster
config("libkeymaster_config") {
  include_dirs = [ "${keymaster_src}/include" ]
  cflags = [
    "-Wno-defaulted-function-deleted",
    "-Wno-format-nonliteral",
    "-Wno-implicit-fallthrough",
  ]
}

shared_library("libkeymaster") {
  sources = [
    "${keymaster_src}/android_keymaster/android_keymaster.cpp",
    "${keymaster_src}/android_keymaster/android_keymaster_messages.cpp",
    "${keymaster_src}/android_keymaster/android_keymaster_utils.cpp",
    "${keymaster_src}/android_keymaster/authorization_set.cpp",
    "${keymaster_src}/android_keymaster/keymaster_enforcement.cpp",
    "${keymaster_src}/android_keymaster/keymaster_stl.cpp",
    "${keymaster_src}/android_keymaster/keymaster_tags.cpp",
    "${keymaster_src}/android_keymaster/operation.cpp",
    "${keymaster_src}/android_keymaster/operation_table.cpp",
    "${keymaster_src}/android_keymaster/serializable.cpp",
    "${keymaster_src}/key_blob_utils/auth_encrypted_key_blob.cpp",
    "${keymaster_src}/key_blob_utils/integrity_assured_key_blob.cpp",
    "${keymaster_src}/key_blob_utils/ocb.c",
    "${keymaster_src}/key_blob_utils/ocb_utils.cpp",
    "${keymaster_src}/key_blob_utils/software_keyblobs.cpp",
    "${keymaster_src}/km_openssl/aes_key.cpp",
    "${keymaster_src}/km_openssl/aes_operation.cpp",
    "${keymaster_src}/km_openssl/asymmetric_key.cpp",
    "${keymaster_src}/km_openssl/asymmetric_key_factory.cpp",
    "${keymaster_src}/km_openssl/attestation_record.cpp",
    "${keymaster_src}/km_openssl/block_cipher_operation.cpp",
    "${keymaster_src}/km_openssl/ckdf.cpp",
    "${keymaster_src}/km_openssl/ec_key.cpp",
    "${keymaster_src}/km_openssl/ec_key_factory.cpp",
    "${keymaster_src}/km_openssl/ecdsa_operation.cpp",
    "${keymaster_src}/km_openssl/ecies_kem.cpp",
    "${keymaster_src}/km_openssl/hkdf.cpp",
    "${keymaster_src}/km_openssl/hmac.cpp",
    "${keymaster_src}/km_openssl/hmac_key.cpp",
    "${keymaster_src}/km_openssl/hmac_operation.cpp",
    "${keymaster_src}/km_openssl/iso18033kdf.cpp",
    "${keymaster_src}/km_openssl/kdf.cpp",
    "${keymaster_src}/km_openssl/nist_curve_key_exchange.cpp",
    "${keymaster_src}/km_openssl/openssl_err.cpp",
    "${keymaster_src}/km_openssl/openssl_utils.cpp",
    "${keymaster_src}/km_openssl/rsa_key.cpp",
    "${keymaster_src}/km_openssl/rsa_key_factory.cpp",
    "${keymaster_src}/km_openssl/rsa_operation.cpp",
    "${keymaster_src}/km_openssl/software_random_source.cpp",
    "${keymaster_src}/km_openssl/symmetric_key.cpp",
    "${keymaster_src}/km_openssl/triple_des_key.cpp",
    "${keymaster_src}/km_openssl/triple_des_operation.cpp",
    "${keymaster_src}/km_openssl/wrapped_key.cpp",
  ]
  public_configs = [ ":libkeymaster_config" ]
  configs += [
    "//common-mk:visibility_default",
    ":boringssl_config",
  ]
}

# Key data protobuf
pkg_config("context_proto_config") {
  pkg_deps = [ "protobuf" ]
}

proto_library("context_proto") {
  proto_in_dir = "./proto"
  proto_out_dir = "include/arc/keymaster"
  use_pic = true
  standalone = true
  sources = [ "proto/key_data.proto" ]

  all_dependent_configs = [ ":context_proto_config" ]
}

# Test target
if (use.test) {
  pkg_config("arc-keymasterd_testrunner_config") {
    pkg_deps = [
      "libbrillo",
      "libchrome",
      "libchrome-test",
    ]
  }
  executable("arc-keymasterd_testrunner") {
    sources = [
      "context/arc_keymaster_context_test.cc",
      "context/chaps_client_test.cc",
      "context/chaps_crypto_operation_test.cc",
      "context/cros_key_test.cc",
      "context/crypto_operation_test.cc",
      "context/openssl_utils_test.cc",
      "conversion.cc",
      "conversion_test.cc",
      "keymaster_logger_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":arc-keymasterd_testrunner_config",
      ":boringssl_config",
    ]
    deps = [
      ":keymaster_mojo_bindings",
      ":libarckeymaster_context",
      ":libkeymaster",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

# Fuzzer target.
if (use.fuzzer) {
  pkg_config("arc_keymasterd_fuzzer_config") {
    pkg_deps = [ "libchrome" ]
  }
  executable("arc_keymasterd_fuzzer") {
    sources = [
      "conversion.cc",
      "conversion_fuzzer.cc",
    ]
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":arc_keymasterd_fuzzer_config",
    ]
    deps = [
      ":keymaster_mojo_bindings",
      ":libarckeymaster_context",
      ":libkeymaster",
    ]
  }
}
