include ../../configs/config.mk
TARGET_TA_NAME    = 00000000-0000-0000-0000-000000000046
OUT_DIR           = $(CURRENT_PATH)/dist/obj
OS_TYPE           = android
USE_SCRYPTO       = FALSE
CONFIG_SW_SYSROOT = $(PLATFORM_ROOT)/swd/arch-arm
CONFIG_CC_SW      = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86/bin/arm*-secureos-gnueabi-gcc
CONFIG_STRIP_SW   = ${CONFIG_SW_TOOLCHAIN_ROOT}/toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86/bin/arm*-secureos-gnueabi-strip


UNSIGNED_TA := $(OUT_DIR)/unsigned_TA
STRIPPED_TA := $(OUT_DIR)/stripped_TA
SIGNED_TA   := $(OUT_DIR)/$(TARGET_TA_NAME)

TRUSTLET_DIR = .
CONFIG_LDFLAGS_SW = 

$(info Used TEEGRIS ver $(TEEGRIS_PLATFORM_VERSION_MAJOR))
ifneq ($(filter $(TEEGRIS_PLATFORM_VERSION_MAJOR), 3 4),)
    CFLAGS += -DTEEGRIS_SDK_VER=$(TEEGRIS_PLATFORM_VERSION_MAJOR)
    ifneq ($(filter $(TEEGRIS_PLATFORM_VERSION_MAJOR), 4),)
        CONFIG_LDFLAGS_SW := -Wl,-z,relro,-z,now
    endif
    CONFIG_SIGN_TYPE = ss_teegris_ta
    ifneq ($(filter $(TEEGRIS_BUILD_MODEL), exynos9820 exynos9610 exynos9630 exynos9830),)
        ifeq ($(CONFIG_MODEL_NAME),)
    CONFIG_MODEL_NAME = TEEGRIS_$(shell echo $(TEEGRIS_BUILD_MODEL) | tr [a-z] [A-Z])_SAMSUNG_TA
        endif
    endif
else 
    CFLAGS += -DTEEGRIS_SDK_VER=2
    CONFIG_SIGN_TYPE = ss_bf_ta
    CONFIG_MODEL_NAME = BF_SAMSUNG_TA
endif

CFLAGS += -g -DSWD -DUSE_BLOWFISH
CFLAGS += -fstack-protector -fstack-protector-all

ifneq (,$(filter $(strip $(TEEGRIS_BUILD_MODEL)), exynos9820 exynos9830 exynos9610 exynos9630))
CFLAGS += -DUSE_NEW_STACK -DUSE_DRKV2
endif

ifeq ($(TARGET_BUILD_VARIANT),eng)
CFLAGS += -DSWD_DEBUG
else
CFLAGS += -s
endif

INCLUDE_DIRS += \
    -I$(TRUSTLET_DIR) \
    -I$(TRUSTLET_DIR)/crypto/include \
    -I$(TRUSTLET_DIR)/x509 \
    -I$(TRUSTLET_DIR)/include \
    -I$(TRUSTLET_DIR)/base64 

SRC += \
    $(TRUSTLET_DIR)/blowfish_agent_main.c \
    $(TRUSTLET_DIR)/blowfish_utils.c \
    $(TRUSTLET_DIR)/CryptoPlatformBF.c \
    $(TRUSTLET_DIR)/CryptoPlatform.c \
    $(TRUSTLET_DIR)/CommandHandler.c \
    $(TRUSTLET_DIR)/x509/asn1.c \
    $(TRUSTLET_DIR)/x509/asn1gen.c \
    $(TRUSTLET_DIR)/x509/asn1rsa.c \
    $(TRUSTLET_DIR)/x509/asn1ec.c \
    $(TRUSTLET_DIR)/x509/da_cert_gencer.c \
    $(TRUSTLET_DIR)/x509/da_cert_parcer.c \
    $(TRUSTLET_DIR)/x509/x509v3.c \
    $(TRUSTLET_DIR)/crypto/sec_alloc.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_wrapper.c \
    $(TRUSTLET_DIR)/crypto/rsa/rsa_wrapper.c \
    $(TRUSTLET_DIR)/crypto/mem_clr.c \
    $(TRUSTLET_DIR)/ServiceName.c \
    $(TRUSTLET_DIR)/DebugPrint.c \
    $(TRUSTLET_DIR)/TLV.c \
    $(TRUSTLET_DIR)/base64/base64.c\
    $(TRUSTLET_DIR)/crypto/rsa/rsa_gen.c \
    $(TRUSTLET_DIR)/crypto/rsa/rsa.c \
    $(TRUSTLET_DIR)/crypto/ec/ec_key.c \
    $(TRUSTLET_DIR)/crypto/ec/ec_lib.c \
    $(TRUSTLET_DIR)/crypto/ec/ec_curve.c \
    $(TRUSTLET_DIR)/crypto/ec/ec_cvt.c \
    $(TRUSTLET_DIR)/crypto/ec/ec_mult.c \
    $(TRUSTLET_DIR)/crypto/ec/ecp_mont.c \
    $(TRUSTLET_DIR)/crypto/ec/ecp_smpl.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_ctx.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_prime.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_lib.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_add.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_mul.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_gcd.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_word.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_asm.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_shift.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_mod.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_div.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_rand.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_exp.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_mont.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_sqr.c \
    $(TRUSTLET_DIR)/crypto/bn/bn_recp.c \
    $(TRUSTLET_DIR)/crypto/rand/rand_lib.c \
    $(TRUSTLET_DIR)/crypto/hash/sha512.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 Building TA: $(TARGET_TA_NAME) ; $(CFLAGS))

.PHONY: clean
clean:
	@$(RM) $(OUT_DIR)
	@$(RM) $(DIST_DIR)
	@echo 'Clean Done.'
