# Copyright (c) 2022 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

if (CONFIG_UOSCORE OR CONFIG_UEDHOC)

  set(UOSCORE_UEDHOC_SRC_DIR ${ZEPHYR_CURRENT_MODULE_DIR}/src)
  set(UOSCORE_UEDHOC_INCLUDE_DIR ${ZEPHYR_CURRENT_MODULE_DIR}/inc)

  zephyr_include_directories(${UOSCORE_UEDHOC_INCLUDE_DIR})

# Common part used by both libraries

  zephyr_library_named(uoscore_uedhoc_common)

  zephyr_library_compile_definitions(MBEDTLS)

  if (CONFIG_UOSCORE_DEBUG OR CONFIG_UEDHOC_DEBUG)
    zephyr_library_compile_definitions(DEBUG_PRINT)
  endif()

  zephyr_library_sources(
    ${UOSCORE_UEDHOC_SRC_DIR}/common/byte_array.c
    ${UOSCORE_UEDHOC_SRC_DIR}/common/crypto_wrapper.c
    ${UOSCORE_UEDHOC_SRC_DIR}/common/memcpy_s.c
    ${UOSCORE_UEDHOC_SRC_DIR}/common/print_util.c
  )

  zephyr_library_link_libraries(mbedTLS)

  if (CONFIG_BUILD_WITH_TFM)
    zephyr_library_include_directories(
      $<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/api_ns/interface/include
    )
  endif()

# UOSCORE

  if (CONFIG_UOSCORE)

    zephyr_library_named(uoscore)

    zephyr_library_compile_definitions(MBEDTLS)

    if (CONFIG_UOSCORE_DEBUG)
      zephyr_library_compile_definitions(DEBUG_PRINT)
    endif()

    zephyr_library_sources(
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/aad.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/coap2oscore.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/nonce.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/nvm.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/option.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/oscore_coap.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/oscore_cose.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/oscore_hkdf_info.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/oscore_interactions.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/oscore2coap.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/replay_protection.c
      ${UOSCORE_UEDHOC_SRC_DIR}/oscore/security_context.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/oscore_aad_array.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/oscore_enc_structure.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/oscore_info.c
    )

    zephyr_library_link_libraries(mbedTLS)

  endif() # CONFIG_UOSCORE

# UEDHOC

  if (CONFIG_UEDHOC)

    zephyr_library_named(uedhoc)

    zephyr_library_compile_definitions(MBEDTLS)

    if (CONFIG_UEDHOC_DEBUG)
      zephyr_library_compile_definitions(DEBUG_PRINT)
    endif()

    zephyr_library_sources(
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/associated_data_encode.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/bstr_encode_decode.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/cert.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/ciphertext.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/edhoc_cose.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/edhoc_exporter.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/edhoc_method_type.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/hkdf_info.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/initiator.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/int_encode_decode.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/okm.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/plaintext_decode.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/plaintext_encode.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/prk.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/responder.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/retrieve_cred.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/runtime_context.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/signature_or_mac_msg.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/suites.c
      ${UOSCORE_UEDHOC_SRC_DIR}/edhoc/th.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_bstr_type.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_cert.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_id_cred_x.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_int_type.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_message_1.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_message_2.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_message_3.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_decode_plaintext.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_bstr_type.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_data_2.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_enc_structure.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_id_cred_x.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_info.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_int_type.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_message_1.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_message_2.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_message_3.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_message_error.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_sig_structure.c
      ${UOSCORE_UEDHOC_SRC_DIR}/cbor/edhoc_encode_th2.c
    )

    zephyr_library_link_libraries(mbedTLS)

  endif() # CONFIG_UEDHOC

endif() # CONFIG_UOSCORE OR CONFIG_UEDHOC
