# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/android/config.gni")
import("//build/config/arm.gni")
import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build_overrides/build.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("BUILD.generated.gni")
import("BUILD.generated_tests.gni")

# Config for us and everybody else depending on BoringSSL.
config("external_config") {
  include_dirs = [ "src/include" ]
  if (is_component_build) {
    defines = [ "BORINGSSL_SHARED_LIBRARY" ]
  }
  if (use_cobalt_customizations) {
    if (is_starboard) {
      include_dirs += [ "src/config/starboard" ]
    } else if (is_native_target_build) {
      include_dirs += [ "src/config/native_target" ]
    }
  }
}

# The config used by the :boringssl component itself, and the fuzzer copies.
config("component_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  configs = [ ":internal_config" ]
  defines = [ "BORINGSSL_IMPLEMENTATION" ]
}

# This config is used by anything that consumes internal headers. Tests consume
# this rather than :component_config.
config("internal_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  defines = [
    "BORINGSSL_ALLOW_CXX_RUNTIME",
    "BORINGSSL_NO_STATIC_INITIALIZER",
    "OPENSSL_SMALL",
  ]
  if (is_starboard) {
    defines += [
      "NO_SYS_PARAM_H",
      "NO_SYS_UN_H",
      "NO_SYSLOG",
      "OPENSSL_NO_CAMELLIA",
      "OPENSSL_NO_CAPIENG",
      "OPENSSL_NO_CAST",
      "OPENSSL_NO_CMS",
      "OPENSSL_NO_DYNAMIC_ENGINE",
      "OPENSSL_NO_EC_NISTP_64_GCC_128",
      "OPENSSL_NO_GMP",
      "OPENSSL_NO_IDEA",
      "OPENSSL_NO_JPAKE",
      "OPENSSL_NO_KRB5",
      "OPENSSL_NO_MDC2",
      "OPENSSL_NO_OCSP",
      "OPENSSL_NO_RC5",
      "OPENSSL_NO_RFC3779",
      "OPENSSL_NO_SCTP",
      "OPENSSL_NO_SEED",
      "OPENSSL_NO_STORE",
      "OPENSSL_NO_SOCK",  # Added by Cobalt to remove unused socket code.
      "OPENSSL_NO_WHIRLPOOL",
      "OPENSSL_NO_POSIX_IO",
    ]
  }
}

config("no_asm_config") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  defines = [ "OPENSSL_NO_ASM" ]
}

all_sources = crypto_sources + ssl_sources
all_headers = crypto_headers + ssl_headers

if (!use_cobalt_customizations) {
# Windows' assembly is built with NASM. The other platforms use the platform
# assembler. Exclude Windows ARM64 because NASM targets x86 and x64 only.
if (is_win && !is_msan && current_cpu != "arm64") {
  import("//third_party/nasm/nasm_assemble.gni")
  nasm_assemble("boringssl_asm") {
    if (current_cpu == "x64") {
      sources = crypto_sources_win_x86_64
    } else if (current_cpu == "x86") {
      sources = crypto_sources_win_x86
    }
  }
} else {
  # This has no sources on some platforms so must be a source_set.
  source_set("boringssl_asm") {
    visibility = [ ":*" ]  # Only targets in this file can depend on this.

    sources = []
    asmflags = []
    include_dirs = [ "src/include" ]

    if (is_msan) {
      public_configs = [ ":no_asm_config" ]
    } else if (current_cpu == "x64") {
      if (is_apple) {
        sources += crypto_sources_apple_x86_64
      } else if (is_linux || is_chromeos || is_android) {
        sources += crypto_sources_linux_x86_64
      } else {
        public_configs = [ ":no_asm_config" ]
      }
    } else if (current_cpu == "x86") {
      if (is_apple) {
        sources += crypto_sources_apple_x86
      } else if (is_linux || is_chromeos || is_android) {
        sources += crypto_sources_linux_x86
      } else {
        public_configs = [ ":no_asm_config" ]
      }
    } else if (current_cpu == "arm") {
      if (is_linux || is_chromeos || is_android) {
        sources += crypto_sources_linux_arm
      } else if (is_apple) {
        sources += crypto_sources_apple_arm
      } else {
        public_configs = [ ":no_asm_config" ]
      }
    } else if (current_cpu == "arm64") {
      if (is_linux || is_chromeos || is_android) {
        sources += crypto_sources_linux_aarch64
      } else if (is_apple) {
        sources += crypto_sources_apple_aarch64
      } else if (is_win) {
        sources += crypto_sources_win_aarch64
      } else {
        public_configs = [ ":no_asm_config" ]
      }
    } else {
      public_configs = [ ":no_asm_config" ]
    }
  }
}
}

component("boringssl") {
  sources = all_sources
  public = all_headers
  friend = [ ":*" ]
  deps = [ "//third_party/boringssl/src/third_party/fiat:fiat_license" ]

if (!use_cobalt_customizations) {
  # Mark boringssl_asm as a public dependency so the OPENSSL_NO_ASM
  # config is forwarded to callers. In particular, boringssl_crypto_tests
  # requires it.
  public_deps = [ ":boringssl_asm" ]
}

  public_configs = [ ":external_config" ]
  configs += [ ":component_config" ]

if (use_cobalt_customizations) {
  all_dependent_configs = [ ":external_config" ]
} else {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
}

  if (is_nacl) {
    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
  }

if (!use_cobalt_customizations) {
  if (!is_debug && !optimize_for_size) {
    configs -= [ "//build/config/compiler:default_optimization" ]
    configs += [ "//build/config/compiler:optimize_max" ]
  }

  if (is_linux && is_component_build) {
    version_script = "boringssl.map"
    inputs = [ version_script ]
    ldflags = [ "-Wl,--version-script=" +
                rebase_path(version_script, root_build_dir) ]
  }
}

  if (is_starboard) {
    sources -= [
      "src/crypto/mem.c",
      "src/crypto/rand_extra/deterministic.c",
      "src/crypto/rand_extra/fuchsia.c",
      "src/crypto/rand_extra/windows.c",
    ]
    sources += [
      "src/crypto/cpu-starboard.c",
      "src/crypto/mem_starboard.c",
      "src/crypto/rand_extra/starboard.c",
      "src/crypto/refcount_starboard.c",
      "src/crypto/thread_starboard.cc",
    ]
    public -= [ "src/include/openssl/opensslconf.h" ]
    public_deps = [
      "//starboard:starboard_headers_only",
    ]
    configs -= [ "//starboard/build/config:size" ]
    configs += [ "//starboard/build/config:speed" ]

    if (sb_is_modular) {
      calling_convention = sabi_variables.calling_convention
      if ((calling_convention != "aarch64" && calling_convention != "eabi" &&
           calling_convention != "sysv" && calling_convention != "windows") ||
          (target_cpu != "x86" && target_cpu != "x64" &&
           target_cpu != "arm" && target_cpu != "arm64") || is_host_win) {  # is_host_win : windows host modular builds need OPENSSL_NO_ASM )
        defines = [ "OPENSSL_NO_ASM" ]
      } else {
        if (calling_convention == "aarch64" || calling_convention == "eabi" ||
            calling_convention == "sysv") {
          if (target_cpu == "x86") {
            sources += crypto_sources_linux_x86
          } else if (target_cpu == "x64") {
            sources += crypto_sources_linux_x86_64
          } else if (target_cpu == "arm") {
            sources += crypto_sources_linux_arm
          } else if (target_cpu == "arm64") {
            sources += crypto_sources_linux_aarch64
          } else if (calling_convention == "windows") {
            if (target_cpu == "x86") {
              sources += crypto_sources_win_x86
            } else if (target_cpu == "x64") {
              sources += crypto_sources_win_x86_64
            }
          }
        }
      }
    } else {
      if ((!is_linux && !is_android && !is_apple) ||
          (target_cpu != "x86" && target_cpu != "x64" &&
           target_cpu != "arm" && target_cpu != "arm64")) {
        defines = [ "OPENSSL_NO_ASM" ]
      } else if (is_linux || is_android) {
        if (target_cpu == "x86") {
          sources += crypto_sources_linux_x86
        } else if (target_cpu == "x64") {
          sources += crypto_sources_linux_x86_64
        } else if (target_cpu == "arm") {
          sources += crypto_sources_linux_arm
        } else if (target_cpu == "arm64") {
          sources += crypto_sources_linux_aarch64
        }
      } else if (is_apple) {
        if (target_cpu == "arm64") {
          sources += crypto_sources_apple_aarch64
        } else if (target_cpu == "x64") {
          defines = [ "OPENSSL_NO_ASM" ]
        }
      }
    }
  } else if (is_native_target_build)  {
    sources += [ "src/crypto/mem_native_target.c" ]
    public -= [ "src/include/openssl/opensslconf.h" ]
    if (is_linux || is_android) {
      if (target_cpu == "x64") {
        sources += crypto_sources_linux_x86_64
      } else if (target_cpu == "arm") {
        sources += crypto_sources_linux_arm
      } else {
        assert(false, "Unsupported Linux or Android arch for native build")
      }
    } else {
        assert(false, "Unsupported OS for native build")
    }
  }
}

if (build_with_chromium) {
  # These targets are named "_tests" rather than "_test" to avoid colliding with
  # a historical "boringssl_ssl_test" target. This works around a bug with the
  # iOS build rules.

  bundle_data("boringssl_crypto_tests_bundle_data") {
    sources = crypto_test_data
    testonly = true
    outputs = [ "{{bundle_resources_dir}}/" +
                "{{source_root_relative_dir}}/{{source_file_part}}" ]
  }

  test("boringssl_crypto_tests") {
    sources = crypto_test_sources + test_support_sources
    data = crypto_test_data
    deps = [
      ":boringssl",
      ":boringssl_crypto_tests_bundle_data",
      "//testing/gtest",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      ":internal_config",
      "//build/config/compiler:no_chromium_code",
    ]

    # Chromium infrastructure does not support GTest, only the //base wrapper.
    sources -= [
      "src/crypto/test/gtest_main.cc",

      # //base includes its own conflicting malloc shim.
      "src/crypto/test/malloc.cc",
    ]
    sources += [
      "gtest_main_chromium.cc",
      "test_data_chromium.cc",
    ]
    deps += [ "//base/test:test_support" ]

    if (is_fuchsia) {
      additional_manifest_fragments =
          [ "//build/config/fuchsia/test/network.shard.test-cml" ]
    }
  }

  test("boringssl_ssl_tests") {
    sources = ssl_test_sources + test_support_sources
    deps = [
      ":boringssl",
      "//testing/gtest",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      ":internal_config",
      "//build/config/compiler:no_chromium_code",
    ]

    # Chromium infrastructure does not support GTest, only the //base wrapper.
    sources -= [
      "src/crypto/test/gtest_main.cc",

      # //base includes its own conflicting malloc shim.
      "src/crypto/test/malloc.cc",
    ]
    sources += [ "gtest_main_chromium.cc" ]
    deps += [ "//base/test:test_support" ]
  }

  config("fuzzer_config") {
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    defines = [
      "BORINGSSL_UNSAFE_FUZZER_MODE",
      "BORINGSSL_UNSAFE_DETERMINISTIC_MODE",
    ]
  }

  # The same as boringssl, but builds with BORINGSSL_UNSAFE_FUZZER_MODE.
  # TODO(https://crbug.com/boringssl/258): Fold this into the normal target.
  component("boringssl_fuzzer") {
    visibility = [ ":*" ]  # Only targets in this file can depend on this.

    sources = all_sources
    deps = [ "//third_party/boringssl/src/third_party/fiat:fiat_license" ]

    # Mark boringssl_asm as a public dependency so the OPENSSL_NO_ASM
    # config is forwarded to callers. In particular, boringssl_crypto_tests
    # requires it.
    public_deps = [ ":boringssl_asm" ]

    public_configs = [
      ":external_config",
      ":fuzzer_config",
    ]
    configs += [ ":component_config" ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]

    if (is_nacl) {
      deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
    }
  }

  foreach(fuzzer, fuzzers) {
    fuzzer_test("boringssl_${fuzzer}_fuzzer") {
      sources = [
        "src/fuzz/${fuzzer}.cc",
        "src/ssl/test/fuzzer.h",
        "src/ssl/test/fuzzer_tags.h",
      ]
      additional_configs = [ ":internal_config" ]
      deps = [ ":boringssl_fuzzer" ]
      seed_corpus = "src/fuzz/${fuzzer}_corpus"

      if ("cert" == fuzzer) {
        libfuzzer_options = [ "max_len=3072" ]
      } else if ("client" == fuzzer) {
        libfuzzer_options = [ "max_len=20000" ]
      } else if ("pkcs8" == fuzzer) {
        libfuzzer_options = [ "max_len=2048" ]
      } else if ("privkey" == fuzzer) {
        libfuzzer_options = [ "max_len=2048" ]
      } else if ("read_pem" == fuzzer) {
        libfuzzer_options = [ "max_len=512" ]
      } else if ("session" == fuzzer) {
        libfuzzer_options = [ "max_len=8192" ]
      } else if ("server" == fuzzer) {
        libfuzzer_options = [ "max_len=4096" ]
      } else if ("spki" == fuzzer) {
        libfuzzer_options = [ "max_len=1024" ]
      } else if ("ssl_ctx_api" == fuzzer) {
        libfuzzer_options = [ "max_len=256" ]
      }
    }
  }

  config("fuzzer_no_fuzzer_mode_config") {
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    defines = [ "BORINGSSL_UNSAFE_DETERMINISTIC_MODE" ]
  }

  # The same as boringssl, but builds with BORINGSSL_UNSAFE_DETERMINISTIC_MODE.
  # TODO(https://crbug.com/boringssl/258): Fold this into the normal target.
  component("boringssl_fuzzer_no_fuzzer_mode") {
    visibility = [ ":*" ]  # Only targets in this file can depend on this.

    sources = all_sources
    deps = [ "//third_party/boringssl/src/third_party/fiat:fiat_license" ]

    # Mark boringssl_asm as a public dependency so the OPENSSL_NO_ASM
    # config is forwarded to callers. In particular, boringssl_crypto_tests
    # requires it.
    public_deps = [ ":boringssl_asm" ]

    public_configs = [
      ":external_config",
      ":fuzzer_no_fuzzer_mode_config",
    ]
    configs += [ ":component_config" ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]

    if (is_nacl) {
      deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
    }
  }

  fuzzer_test("boringssl_client_no_fuzzer_mode_fuzzer") {
    sources = [
      "src/fuzz/client.cc",
      "src/ssl/test/fuzzer.h",
      "src/ssl/test/fuzzer_tags.h",
    ]
    additional_configs = [ ":internal_config" ]
    deps = [ ":boringssl_fuzzer_no_fuzzer_mode" ]
    seed_corpus = "src/fuzz/client_corpus_no_fuzzer_mode"
  }

  fuzzer_test("boringssl_server_no_fuzzer_mode_fuzzer") {
    sources = [
      "src/fuzz/server.cc",
      "src/ssl/test/fuzzer.h",
      "src/ssl/test/fuzzer_tags.h",
    ]
    additional_configs = [ ":internal_config" ]
    deps = [ ":boringssl_fuzzer_no_fuzzer_mode" ]
    seed_corpus = "src/fuzz/server_corpus_no_fuzzer_mode"
  }
}
