# 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-${libbase_ver}",
    "libmojo-${libbase_ver}",
  ]
  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/context_adaptor.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",
  ]
  pkg_deps = [ "libchrome-${libbase_ver}" ]
  deps = [
    ":context_proto",
    ":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-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]
  }
  executable("arc-keymasterd_testrunner") {
    sources = [
      "context/arc_keymaster_context_test.cc",
      "context/chaps_client_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-${libbase_ver}" ]
  }
  executable("arc_keymasterd_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer:common_fuzzer",
      ":arc_keymasterd_fuzzer_config",
    ]
    sources = [
      "conversion.cc",
      "conversion_fuzzer.cc",
    ]
    deps = [
      ":keymaster_mojo_bindings",
      ":libarckeymaster_context",
      ":libkeymaster",
    ]
  }
}
