# In Samsung Ukraine R&D Center (SRK) under a contract between
# LLC "Samsung Electronics Ukraine Company" (Kyiv, Ukraine)
# and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
# Copyright: (c) Samsung Electronics Co, Ltd 2021. All rights reserved.

###########################
# WSM Trusted Application
###########################

# WSM custom config. 
# It can be set as (32 or 64) (armeabi-v7a/arm64-v8a) to use for other configuration below.
CONFIG_TA_ARCH=32
CONFIG_TA_EABI=armeabi-v7a
ifneq ($(filter $(TEEGRIS_BUILD_MODEL), s5e9925 s5e8825 MT6768 MT6853 MT6877),)
    CONFIG_TA_ARCH=64
    CONFIG_TA_EABI=arm64-v8a
endif

include ../../build/teegris_config.mk
TARGET_TA_NAME    = ffffffff-0000-0000-0000-000000000030
OUT_DIR           = $(CURRENT_PATH)/dist/obj
OS_TYPE           = android

UNSIGNED_TA := $(OUT_DIR)/unsigned_TA
STRIPPED_TA := $(OUT_DIR)/stripped_TA
SIGNED_TA   := $(OUT_DIR)/$(TARGET_TA_NAME)

TRUSTLET_DIR = .

# parsing version file
CONFIG_BASELINE_CL := $(shell head -n 2 $(TRUSTLET_DIR)/version_ta | tail -n 1 $(TRUSTLET_DIR)/version_ta)
CONFIG_WSM_VERSION := $(shell head -n 1 $(TRUSTLET_DIR)/version_ta)
CONFIG_WSM_VERSION_MAJOR := $(shell head -n 1 $(TRUSTLET_DIR)/version_ta | cut -d "." -f 1)
CONFIG_WSM_VERSION_MINOR := $(shell head -n 1 $(TRUSTLET_DIR)/version_ta | cut -d "." -f 2)
CONFIG_WSM_VERSION_PATCH := $(shell head -n 1 $(TRUSTLET_DIR)/version_ta | cut -d "." -f 3)

$(info =======================================)
$(info [WSM] - Used TEEGRIS MAJOR ver   = $(TEEGRIS_PLATFORM_VERSION_MAJOR))
$(info [WSM] - Used TEEGRIS MINOR ver   = $(TEEGRIS_PLATFORM_VERSION_MINOR))
$(info [WSM] - PLATFORM_ROOT            = $(PLATFORM_ROOT))
$(info [WSM] - CONFIG_SW_TOOLCHAIN_ROOT = $(CONFIG_SW_TOOLCHAIN_ROOT))
$(info [WSM] - PROCA_ENABLE             = $(PROCA_ENABLE))
$(info [WSM] - TZ_PROCA_HEADER_PATH     = $(TZ_PROCA_HEADER_PATH))
$(info [WSM] - OUT_DIR                  = $(OUT_DIR))
$(info [WSM] - CONFIG_SW_SYSROOT        = $(CONFIG_SW_SYSROOT))
$(info [WSM] - TEEGRIS_BUILD_MODEL      = $(TEEGRIS_BUILD_MODEL))
$(info [WSM] - TZ_SCRYPTO_VERSION       = $(TZ_SCRYPTO_VERSION))
$(info [WSM] - WSM_CONFIG_VERSION       = $(CONFIG_WSM_VERSION_MAJOR).$(CONFIG_WSM_VERSION_MINOR).$(CONFIG_WSM_VERSION_PATCH).$(CONFIG_BASELINE_CL))
$(info =======================================)

# Set Teegris Version
ifeq ($(strip $(TEEGRIS_PLATFORM_VERSION_MAJOR)),)
    TEEGRIS_PLATFORM_VERSION_MAJOR=2
    $(warning [WSM] - TEEGRIS_PLATFORM_VERSION_MAJOR is not specified, USED default version '2')
endif

ifeq ($(strip $(TEEGRIS_PLATFORM_VERSION_MINOR)),)
    TEEGRIS_PLATFORM_VERSION_MINOR=0
    $(warning [WSM] - TEEGRIS_PLATFORM_VERSION_MINOR is not specified)
endif

CFLAGS += -DTEEGRIS_SDK_VER_MAJOR=$(strip $(TEEGRIS_PLATFORM_VERSION_MAJOR))
CFLAGS += -DTEEGRIS_SDK_VER_MINOR=$(strip $(TEEGRIS_PLATFORM_VERSION_MINOR))

#
ifneq ($(filter $(TEEGRIS_BUILD_MODEL), exynos2100),)
    CFLAGS += -DCRYPTO_VERSION=\"2.6\"
else
    CFLAGS += -DCRYPTO_VERSION=\"2.5\"
endif

CFLAGS += \
    -Wall \
    -Werror \
    -Wshadow \
    -Wswitch \
    -Wpointer-arith \
    -Wbad-function-cast
    -Wextra \
    -Wno-unused \
    -fstack-protector-all \
    -D_FORTIFY_SOURCE=2	\
    -O0 \
    -fpie

ifeq ($(USE_MTK),true)
    CFLAGS += -DUSE_MTK
else
    CFLAGS += -DUSE_EXYNOS
endif

# Debug / Release mode
ifneq (,$(filter $(strip $(TARGET_BUILD_VARIANT)), eng userdebug))
    CFLAGS += -DENABLE_DEBUGGING -g
    CFLAGS += -D__FILENAME__=__FILE__ -DDEBUG
else
    CFLAGS += -s
    CFLAGS += -D__FILENAME__=\"\" -DRELEASE
endif

#PROCA
ifeq ($(PROCA_ENABLE),TRUE)
    $(info [WSM] PROCA library included to WSM TA build)
    CFLAGS   += -DPROCA_FEATURE_ENABLED
    LIB_DIRS += -L$(TZ_PROCA_LIB_PATH)
    LIBS     += -l:./$(CONFIG_TA_EABI)/pa_tz_api.a
endif

CFLAGS += \
    -DWSM_BLOWFISH \
    -DTA_BUILD \
    -DUSE_SCRYPTO \
    -DENABLE_BF_LOGGING \
    -DBF \
    -DGP_API \
    	\
    -DVERSION_NUMBER=\"$(CONFIG_WSM_VERSION)\" \
    -DBASELINE_CL=\"$(CONFIG_BASELINE_CL)\" \
    -DVERSION_NUMBER_MAJOR=$(CONFIG_WSM_VERSION_MAJOR) \
    -DVERSION_NUMBER_MINOR=$(CONFIG_WSM_VERSION_MINOR) \
    -DVERSION_NUMBER_PATCH=$(CONFIG_WSM_VERSION_PATCH)

LIBS += -ltzsl -lgcc -lpthread

INCLUDE_DIRS += -I$(CONFIG_SW_SYSROOT)/usr/include \
                -I$(TRUSTLET_DIR)/src \
                -I$(TRUSTLET_DIR)/src/common/include \
                -I$(TRUSTLET_DIR)/src/common/log/inc \
                -I$(TRUSTLET_DIR)/src/common/list/inc \
                -I$(TRUSTLET_DIR)/include \
                -I$(TRUSTLET_DIR)/src/common/random \
                -I$(TRUSTLET_DIR)/src/common/malloc_wrapper/inc \
                -I$(TRUSTLET_DIR)/src/common/utilities/inc \
                -I$(TRUSTLET_DIR)/src/crypto/src_v2/inc \
                -I$(TRUSTLET_DIR)/src/crypto/src/crypto_impl \
                -I$(TRUSTLET_DIR)/src/crypto/src/ta_cmd \
                -I$(TRUSTLET_DIR)/src/crypto/src/openssl_impl \
                -I$(TRUSTLET_DIR)/src/common/performance/inc \
                -I$(TRUSTLET_DIR)/src/authentication/inc/private \
                -I$(TRUSTLET_DIR)/src/daemon/inc \
                -I$(TRUSTLET_DIR)/src/common/version \
                -I$(TRUSTLET_DIR)/src/key_manager/inc/ta_cmd \
                -I$(TRUSTLET_DIR)/src/key_manager/inc/private \
                -I$(TRUSTLET_DIR)/src/key_manager/inc \
                -I$(TRUSTLET_DIR)/src/common/pbkdf/ta_cmd \
                -I$(TRUSTLET_DIR)/src/common/pbkdf/inc \
                -I$(TRUSTLET_DIR)/src/authentication/inc \
                -I$(TRUSTLET_DIR)/src/common/crc32 \
                -I$(TRUSTLET_DIR)/src/key_storage/inc \
                -I$(TRUSTLET_DIR)/src/crypto/inc \
                -I$(TRUSTLET_DIR)/src/crypto/inc/private \
                -I$(TRUSTLET_DIR)/swd/common/libc_functions/inc \
                -I$(TRUSTLET_DIR)/swd/common \
                -I$(TZ_PROCA_HEADER_PATH) \
                -I$(CONFIG_SW_SYSROOT)/usr/include

LIBS += -lscrypto
LIB_DIRS += -L$(CONFIG_SW_SYSROOT)/usr/lib/

SRC += \
    $(TRUSTLET_DIR)/swd/bf/bfAgentMain.c \
    $(TRUSTLET_DIR)/swd/common/libc_functions/src/libc_functions.c \
    $(TRUSTLET_DIR)/swd/common/libc_functions/src/memmgrs.c \
    $(TRUSTLET_DIR)/swd/common/custom_so.c \
    $(TRUSTLET_DIR)/swd/common/deleg_wrap_unwrap.c \
    $(TRUSTLET_DIR)/swd/common/tl_handler.c \
    $(TRUSTLET_DIR)/swd/common/tz_proca_handler.c \
    \
    $(TRUSTLET_DIR)/src/common/crc32/crc32.c \
    $(TRUSTLET_DIR)/src/common/list/src/wsm_list.c \
    $(TRUSTLET_DIR)/src/common/list/src/wsm_protected_list.c \
    $(TRUSTLET_DIR)/src/common/log/src/wsm_log.c \
    $(TRUSTLET_DIR)/src/common/malloc_wrapper/src/malloc_wrapper.c \
    $(TRUSTLET_DIR)/src/common/pbkdf/src/pbkdf_hmac_sha256.c \
    $(TRUSTLET_DIR)/src/common/random/wsm_rand.c \
    $(TRUSTLET_DIR)/src/common/utilities/src/memory_utilities.c \
    $(TRUSTLET_DIR)/src/common/utilities/src/string_utilities.c \
    $(TRUSTLET_DIR)/src/common/utilities/src/utilities.c \
    $(TRUSTLET_DIR)/src/common/version/version_info.c \
    \
    $(TRUSTLET_DIR)/src/authentication/src/esap_v1/esap_v1.c \
    $(TRUSTLET_DIR)/src/authentication/src/esap_v1/ta_esap_v1_cmd.c \
    $(TRUSTLET_DIR)/src/authentication/src/esap_v1/wsm_v1_auth_utilities.c \
    $(TRUSTLET_DIR)/src/authentication/src/protocol_v2/protocol_v2.c \
    $(TRUSTLET_DIR)/src/authentication/src/protocol_v2/ta_protocol_v2_cmd.c \
    $(TRUSTLET_DIR)/src/authentication/src/protocol_v2/wsm_v2_auth_utilities.c \
    $(TRUSTLET_DIR)/src/authentication/src/auth_utilities.c \
    \
    $(TRUSTLET_DIR)/src/crypto/src/crypto_impl/wsm_crypto_common.c \
    $(TRUSTLET_DIR)/src/crypto/src/crypto_impl/wsm_v1_crypto.c \
    $(TRUSTLET_DIR)/src/crypto/src/crypto_impl/wsm_v2_crypto.c \
    $(TRUSTLET_DIR)/src/crypto/src/crypto_impl/wsm_v3_crypto.c \
    $(TRUSTLET_DIR)/src/crypto/src/openssl_impl/openssl_aes_core.c \
    $(TRUSTLET_DIR)/src/crypto/src/openssl_impl/wsm_openssl_util.c \
    $(TRUSTLET_DIR)/src/crypto/src/ta_cmd/cm_ta_cmd.c \
    $(TRUSTLET_DIR)/src/crypto/src_v2/src/psk.c \
    $(TRUSTLET_DIR)/src/crypto/src_v2/src/wsm_v1.c \
    $(TRUSTLET_DIR)/src/crypto/src_v2/src/wsm_v2.c \
    \
    $(TRUSTLET_DIR)/src/key_manager/src/ta_cmd/km_ta_cmd.c \
    $(TRUSTLET_DIR)/src/key_manager/src/appskey_type_aes.c \
    $(TRUSTLET_DIR)/src/key_manager/src/km_impl.c \
    $(TRUSTLET_DIR)/src/key_storage/src/key_storage.c \
    $(TRUSTLET_DIR)/src/key_storage/src/key_storage_impl.c \
    $(TRUSTLET_DIR)/src/key_storage/src/key_storage_wrapper.c \
    $(TRUSTLET_DIR)/src/key_storage/src/key_storage_eeal.c \
    $(TRUSTLET_DIR)/src/key_storage/src/key_storage_stub_eeal.c

OBJS := $(patsubst %.c,%.o,$(SRC))

# Prepare Includes
ifeq ($(TEEGRIS_TA_DIST_PATH),)
	TEEGRIS_TA_DIST_PATH := dist
endif

.PHONY:all
all : info_ta make_dist $(STRIPPED_TA) $(SIGNED_TA) copy_dist build_done

.PHONY: build_done
build_done: make_dist $(SIGNED_TA) copy_dist
	$(info Build Done.)

$(STRIPPED_TA): $(UNSIGNED_TA) make_dist
	@$(CONFIG_STRIP_SW) $(STRIP_FLAGS_SW) $(UNSIGNED_TA) -o $(STRIPPED_TA)

$(SIGNED_TA): $(STRIPPED_TA) make_dist $(test_TA_with_keys)
	@$(signing_command)

$(UNSIGNED_TA): $(OBJS)
	@$(CONFIG_CC_SW) $(CFLAGS) $(CONFIG_LDFLAGS_SW) -o $(UNSIGNED_TA) $(OBJS) $(LIBS) $(INCLUDE_DIRS) $(LIB_DIRS)

%.o: %.c
	@echo Compiling: $@
	@$(CONFIG_CC_SW) -c -o $*.o $(CFLAGS) $(INCLUDE_DIRS) $<

.PHONY: make_dist
make_dist:
	@$(MKDIR) $(OUT_DIR)

.PHONY: copy_dist
copy_dist: make_dist $(SIGNED_TA)
	@echo Copy $(SIGNED_TA) $(TEEGRIS_TA_DIST_PATH)
	@$(CP) $(SIGNED_TA) $(TEEGRIS_TA_DIST_PATH)

.PHONY: info_ta
info_ta:
	$(info [wsm] Building TA: $(TARGET_TA_NAME) ; $(CFLAGS))

.PHONY: clean
clean:
	@$(RM) $(OUT_DIR)
	@$(RM) $(DIST_DIR)
	@echo 'Clean Done.'
