# 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")
import("mbedtls.gni")

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}\"" ]
    }

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

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

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