# Copyright (c) 2020 Project CHIP 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
#
# http://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/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/nlassert.gni")

import("${chip_root}/build/chip/buildconfig_header.gni")

import("crypto.gni")

buildconfig_header("crypto_buildconfig") {
  header = "CryptoBuildConfig.h"
  header_dir = "crypto"

  chip_crypto_mbedtls = chip_crypto == "mbedtls"
  chip_crypto_openssl = chip_crypto == "openssl"
  chip_crypto_boringssl = chip_crypto == "boringssl"

  defines = [
    "CHIP_CRYPTO_MBEDTLS=${chip_crypto_mbedtls}",
    "CHIP_CRYPTO_OPENSSL=${chip_crypto_openssl}",
    "CHIP_CRYPTO_BORINGSSL=${chip_crypto_boringssl}",
  ]

  if (chip_with_se05x == 1) {
    defines += [ "CHIP_CRYPTO_HSM=1" ]
    defines += [ "CHIP_CRYPTO_HSM_NXP=1" ]
  } else {
    defines += [ "CHIP_CRYPTO_HSM=0" ]
    defines += [ "CHIP_CRYPTO_HSM_NXP=0" ]
  }

  if (chip_with_se05x_da == 1) {
    defines += [ "ENABLE_HSM_DEVICE_ATTESTATION=1" ]
  }
}

if (chip_crypto == "openssl") {
  import("${build_root}/config/linux/pkg_config.gni")

  pkg_config("openssl_config") {
    packages = [ "openssl" ]
  }
} else if (chip_crypto == "boringssl") {
  import("//build_overrides/boringssl.gni")
} else if (chip_crypto == "mbedtls") {
  import("//build_overrides/mbedtls.gni")
} else if (chip_crypto == "tinycrypt") {
  import("//build_overrides/mbedtls.gni")
}

static_library("crypto") {
  output_name = "libChipCrypto"

  sources = [
    "CHIPCryptoPAL.cpp",
    "CHIPCryptoPAL.h",
    "OperationalKeystore.h",
    "PersistentStorageOperationalKeystore.cpp",
    "PersistentStorageOperationalKeystore.h",
    "RandUtils.cpp",
    "RandUtils.h",
  ]

  public_configs = []

  cflags = [ "-Wconversion" ]

  public_deps = [
    ":crypto_buildconfig",
    "${chip_root}/src/lib/asn1",
    "${chip_root}/src/lib/core",
    "${chip_root}/src/lib/support",
    "${nlassert_root}:nlassert",
  ]

  if (chip_crypto == "mbedtls") {
    sources += [ "CHIPCryptoPALmbedTLS.cpp" ]

    external_mbedtls = current_os == "zephyr"

    if (!external_mbedtls) {
      public_deps += [ "${mbedtls_root}:mbedtls" ]
    }
  } else if (chip_crypto == "openssl") {
    sources += [ "CHIPCryptoPALOpenSSL.cpp" ]
    public_configs += [ ":openssl_config" ]
  } else if (chip_crypto == "boringssl") {
    # BoringSSL is close enough to OpenSSL that isd uses same PAL, with minor #ifdef differences
    sources += [ "CHIPCryptoPALOpenSSL.cpp" ]
    public_deps += [ "${boringssl_root}:boringssl" ]
  } else if (chip_crypto == "tinycrypt") {
    sources += [ "CHIPCryptoPALTinyCrypt.cpp" ]
    public_deps += [ "${mbedtls_root}:mbedtls" ]
  } else {
    assert(false, "Invalid CHIP crypto")
  }

  if (chip_with_se05x == 1) {
    sources += [
      "hsm/nxp/CHIPCryptoPALHsm_SE05X_HKDF.cpp",
      "hsm/nxp/CHIPCryptoPALHsm_SE05X_HMAC.cpp",
      "hsm/nxp/CHIPCryptoPALHsm_SE05X_P256.cpp",
      "hsm/nxp/CHIPCryptoPALHsm_SE05X_PBKDF.cpp",
      "hsm/nxp/CHIPCryptoPALHsm_SE05X_Spake2p.cpp",
      "hsm/nxp/CHIPCryptoPALHsm_SE05X_utils.cpp",
    ]
    public_deps += [ "${chip_root}/third_party/simw-top-mini:se05x" ]
    public_configs += [ "${chip_root}/third_party/simw-top-mini:se05x_config" ]
  }
}
