# 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",
  ]

  config("public_config") {
    include_dirs = [ "$dir_pw_third_party_mbedtls/include" ]
  }

  config("internal_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",
    ]
    config_header_file = rebase_path(pw_third_party_mbedtls_CONFIG_HEADER,
                                     get_label_info(":mbedtls", "dir"))
    defines = [ "MBEDTLS_CONFIG_FILE=\"$config_header_file\"" ]
  }

  pw_source_set("mbedtls") {
    sources = []
    foreach(source, mbedtls_sources) {
      sources += [ "$dir_pw_third_party_mbedtls/" + source ]
    }

    public = [
      "configs/config_default.h",
      "configs/config_pigweed_common.h",
    ]

    public_deps = [ "$dir_pw_tls_client:time" ]
    public_configs = [ ":public_config" ]
    configs = [ ":internal_config" ]
  }
} else {
  group("mbedtls") {
  }
}
