# Copyright 2017 The Fuchsia 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("//build/fuzzing/fuzzer.gni")
import("//build/package.gni")
import("//build/test/test_package.gni")
import("BUILD.generated.gni")
import("BUILD.generated_tests.gni")

################################################################################
# Public targets

group("boringssl") {
  public_deps = [
    ":crypto",
    ":ssl",
  ]
}

if (current_cpu == "arm64" && (is_fuchsia || is_linux)) {
  crypto_sources += crypto_sources_linux_aarch64
} else if (current_cpu == "x64" && (is_fuchsia || is_linux)) {
  crypto_sources += crypto_sources_linux_x86_64
} else if (current_cpu == "x64" && is_mac) {
  crypto_sources += crypto_sources_mac_x86_64
} else {
  assert(false, "unsupported OS or CPU: $current_os/$current_cpu")
}

# TODO(46139): remove this added source.
crypto_sources += [ "src/decrepit/xts/xts.c" ]

################
# libcrypto.so #
################

target(default_library_type, "crypto") {
  sources = crypto_sources
  public = crypto_headers
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]

  # TODO(46910): UBSan has found an instance of undefined behavior in this target.
  # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
  configs += [ "//build/config:temporarily_disable_ubsan_do_not_use" ]

  # boringssl should always be optimized for speed because otherwise performance is significantly
  # worse, impacting pave and boot times on debug builds (fxb/55456)
  configs -= [ "//build/config:default_optimize" ]
  configs += [ "//build/config:optimize_speed" ]
}

target(default_library_type, "ssl") {
  sources = ssl_sources
  public = ssl_headers
  public_configs = [ ":boringssl_config" ]
  configs += [ ":internal_config" ]
  deps = [ ":crypto" ]

  # boringssl should always be optimized for speed because otherwise performance is significantly
  # worse, impacting pave and boot times on debug builds (fxb/55456)
  configs -= [ "//build/config:default_optimize" ]
  configs += [ "//build/config:optimize_speed" ]
}

source_set("crypto_unsafe") {
  testonly = true
  visibility = [ ":*" ]
  sources = crypto_sources
  public = crypto_headers
  configs += [ ":fuzz_config" ]

  # TODO(46910): UBSan has found an instance of undefined behavior in this target.
  # Disable UBSan for this target temporarily until it is migrated into CI/CQ.
  configs += [ "//build/config:temporarily_disable_ubsan_do_not_use" ]
}

source_set("ssl_unsafe") {
  testonly = true
  visibility = [ ":*" ]
  sources = ssl_sources
  public = ssl_headers
  configs += [ ":fuzz_config" ]
  deps = [ ":crypto_unsafe" ]
}

##########################
# bssl command line tool #
##########################
if (is_fuchsia) {
  package("boringssl_tool") {
    deps = [ ":bssl" ]
    binaries = [
      {
        name = "bssl"
        shell = true
      },
    ]
  }
} else {
  group("boringssl_tool") {
    deps = [ ":bssl" ]
  }
}

# See //third_party/boringssl/tool/CMakeLists.txt
executable("bssl") {
  visibility = [ ":*" ]
  sources = [
    "src/tool/args.cc",
    "src/tool/ciphers.cc",
    "src/tool/client.cc",
    "src/tool/const.cc",
    "src/tool/digest.cc",
    "src/tool/file.cc",
    "src/tool/generate_ed25519.cc",
    "src/tool/genrsa.cc",
    "src/tool/pkcs12.cc",
    "src/tool/rand.cc",
    "src/tool/server.cc",
    "src/tool/sign.cc",
    "src/tool/speed.cc",
    "src/tool/tool.cc",
    "src/tool/transport_common.cc",
  ]
  configs += [ "//third_party/boringssl:internal_config" ]
  deps = [
    ":crypto",
    ":ssl",
  ]
}

##############
# Unit tests #
##############
unittest_package("boringssl_tests") {
  deps = [
    ":crypto_test",
    ":ssl_test",
  ]
  tests = [
    {
      name = "crypto_test"

      # This test takes a long time to run, and it is included in every subset
      # of the Fuchsia build.
      # TODO(bgoldman): Find a way to skip this test when runtests is set to
      # skip "large" tests.
      disabled = true
    },
    {
      name = "ssl_test"
    },
  ]
}

group("tests") {
  testonly = true
  if (is_fuchsia) {
    deps = [ ":boringssl_tests" ]
  } else {
    deps = [
      ":crypto_test",
      ":ssl_test",
    ]
  }
}

executable("crypto_test") {
  testonly = true
  visibility = [ ":*" ]
  sources = crypto_test_sources + test_support_sources
  configs += [ ":test_config" ]
  deps = [
    ":crypto",
    "//third_party/googletest:gtest",
  ]
}

executable("ssl_test") {
  testonly = true
  visibility = [ ":*" ]
  sources = ssl_test_sources + test_support_sources
  configs += [ ":test_config" ]
  deps = [
    ":crypto",
    ":ssl",
    "//third_party/googletest:gtest",
  ]
}

################################################################################
# Fuzzers

# Upstream BoringSSL defines a `fuzzers` global variable in the generated
# GNI files; we rename it to avoid colliding with the similarly-named parameter
# on the fuzzers_package.
fuzzer_names = fuzzers

# Explicitly remove the arm_cpuinfo fuzzer, which tests Linux-specific routines
if (is_fuchsia) {
  fuzzer_names -= [ "arm_cpuinfo" ]
}

foreach(name, fuzzer_names) {
  fuzzer("${name}_fuzzer") {
    visibility = [ ":*" ]
    sources = [ "src/fuzz/${name}.cc" ]
    configs += [ ":fuzz_config" ]
    deps = [
      ":crypto_unsafe",
      ":ssl_unsafe",
    ]
  }
}

fuzzers_package("boringssl_fuzzers") {
  fuzzers = []
  foreach(name, fuzzer_names) {
    fuzzers += [ ":${name}_fuzzer" ]
  }
}

################################################################################
# Configs
config("boringssl_config") {
  include_dirs = [ "src/include" ]
  if (is_fuchsia) {
    # rand_fuchsia uses a system call
    libs = [ "zircon" ]
  }
}

config("internal_config") {
  visibility = [ ":*" ]
  defines = [
    "BORINGSSL_ALLOW_CXX_RUNTIME",
    "BORINGSSL_IMPLEMENTATION",
    "BORINGSSL_NO_STATIC_INITIALIZER",
    "BORINGSSL_SHARED_LIBRARY",
    "OPENSSL_SMALL",
  ]
  if (!is_fuchsia) {
    # pthread_rwlock_t on host requires a feature flag.
    defines += [ "_XOPEN_SOURCE=700" ]
  }
  cflags = [ "-Wno-unused-function" ]
  configs = [
    ":boringssl_config",
    "//build/config:shared_library_config",
  ]
  if (is_fuchsia) {
    configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
  }
}

config("test_config") {
  visibility = [ ":*" ]
  include_dirs = [
    "src/crypto/test",
    "src/ssl/test",
  ]
  configs = [ ":internal_config" ]

  # TODO(INTK-682): Newer googletest's are spamming about an API rename, but
  # BoringSSL hasn't updated yet.
  cflags = [ "-Wno-deprecated-declarations" ]
}

config("fuzz_config") {
  visibility = [ ":*" ]

  # BoringSSL explicitly decided against using the common LLVM fuzzing macro:
  # https://boringssl-review.googlesource.com/c/boringssl/+/31244
  defines = [ "BORINGSSL_UNSAFE_DETERMINISTIC_MODE" ]
  configs = [ ":internal_config" ]
}
