# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")
import("$dir_pw_build/target_types.gni")

declare_args() {
  # If compiling backends with mbedtls, this variable is set to the path to the
  # mbedtls source code. When set, a pw_source_set for the mbedtls library is
  # created at "$dir_pw_third_party/mbedtls".
  dir_pw_third_party_mbedtls = ""

  # configuration for mbedtls. Can be one of |mbedtls_configs|
  pw_third_party_mbedtls_CONFIG = "default"
}

if (dir_pw_third_party_mbedtls != "") {
  # The list currently includes all source files for build.
  mbedtls_sources = [
    "library/aes.c",
    "library/aesni.c",
    "library/arc4.c",
    "library/aria.c",
    "library/asn1parse.c",
    "library/asn1write.c",
    "library/base64.c",
    "library/bignum.c",
    "library/blowfish.c",
    "library/camellia.c",
    "library/ccm.c",
    "library/certs.c",
    "library/chacha20.c",
    "library/chachapoly.c",
    "library/cipher.c",
    "library/cipher_wrap.c",
    "library/cmac.c",
    "library/ctr_drbg.c",
    "library/debug.c",
    "library/des.c",
    "library/dhm.c",
    "library/ecdh.c",
    "library/ecdsa.c",
    "library/ecjpake.c",
    "library/ecp.c",
    "library/ecp_curves.c",
    "library/entropy.c",
    "library/entropy_poll.c",
    "library/error.c",
    "library/gcm.c",
    "library/havege.c",
    "library/hkdf.c",
    "library/hmac_drbg.c",
    "library/md.c",
    "library/md2.c",
    "library/md4.c",
    "library/md5.c",
    "library/memory_buffer_alloc.c",
    "library/net_sockets.c",
    "library/nist_kw.c",
    "library/oid.c",
    "library/padlock.c",
    "library/pem.c",
    "library/pk.c",
    "library/pk_wrap.c",
    "library/pkcs11.c",
    "library/pkcs12.c",
    "library/pkcs5.c",
    "library/pkparse.c",
    "library/pkwrite.c",
    "library/platform.c",
    "library/platform_util.c",
    "library/poly1305.c",
    "library/psa_crypto.c",
    "library/psa_crypto_driver_wrappers.c",
    "library/psa_crypto_se.c",
    "library/psa_crypto_slot_management.c",
    "library/psa_crypto_storage.c",
    "library/psa_its_file.c",
    "library/ripemd160.c",
    "library/rsa.c",
    "library/rsa_internal.c",
    "library/sha1.c",
    "library/sha256.c",
    "library/sha512.c",
    "library/ssl_cache.c",
    "library/ssl_ciphersuites.c",
    "library/ssl_cli.c",
    "library/ssl_cookie.c",
    "library/ssl_msg.c",
    "library/ssl_srv.c",
    "library/ssl_ticket.c",
    "library/ssl_tls.c",
    "library/ssl_tls13_keys.c",
    "library/threading.c",
    "library/timing.c",
    "library/version.c",
    "library/version_features.c",
    "library/x509.c",
    "library/x509_create.c",
    "library/x509_crl.c",
    "library/x509_crt.c",
    "library/x509_csr.c",
    "library/x509write_crt.c",
    "library/x509write_csr.c",
    "library/xtea.c",
  ]

  mbedtls_configs = [
    {
      name = "default"
      config_header = "configs/config_default.h"
    },
    # TODO(zyecheng): Add more working configs for code-size optimization.
  ]

  foreach(ele, mbedtls_configs) {
    config_name = ele.name + "_config"
    config(config_name) {
      # Custom config file is specified by macro MBEDTLS_CONFIG_FILE
      # for MbedTLS
      defines = [ "MBEDTLS_CONFIG_FILE=\"${ele.config_header}\"" ]
      include_dirs = [ "." ]
    }

    pw_source_set(ele.name) {
      public = [
        "configs/config_pigweed_common.h",
        ele.config_header,
      ]
      public_configs = [ ":${config_name}" ]
    }
  }

  config("mbedtls_common_config") {
    include_dirs = [
      "$dir_pw_third_party_mbedtls",
      "$dir_pw_third_party_mbedtls/include",
    ]
    cflags = [
      "-Wno-error=cast-qual",
      "-Wno-error=redundant-decls",
    ]
  }

  pw_source_set("mbedtls") {
    sources = []
    foreach(source, mbedtls_sources) {
      sources += [ "$dir_pw_third_party_mbedtls/" + source ]
    }
    public_configs = [ ":mbedtls_common_config" ]
    public_deps = [
      ":$pw_third_party_mbedtls_CONFIG",
      "$dir_pw_tls_client:time",
    ]
  }
} else {
  group("mbedtls") {
  }
}
