$(info ******** DRK SKM MakeFile ********)
ifeq ($(DEVELOPER_LOCAL_BUILD), True)
CONFIG_SW_SYSROOT=${BLOWFISH_SDK_ROOT}/platforms/${BF_PLATFORM}/swd/${BF_SWD_TYPE}
CONFIG_CC_SW=${BLOWFISH_SDK_ROOT}/toolchains/${BF_TOOLCHAIN}/bin/${COMPILER_PREFIX}-gcc
CONFIG_STRIP_SW=${BLOWFISH_SDK_ROOT}/toolchains/${BF_TOOLCHAIN}/bin/${COMPILER_PREFIX}-strip
CONFIG_CFLAGS_SW=-O2 --sysroot=$(CONFIG_SW_SYSROOT) -Wall -Wextra -fPIE -pie -fstack-protector-all -DUSE_BLOWFISH
CONFIG_LDFLAGS_SW= -Wl,-z,relro,-z,now
else
ifneq ($(CONFIG_SUPPORT_64ONLY), y)
$(info [DeviceRootKey] SKM TA Build 32bit)
CONFIG_TA_ARCH=32
endif	# CONFIG_SUPPORT_64ONLY
include ../../build/teegris_config.mk
TARGET_TA_NAME = 00000000-0000-0000-0000-000000534b4d
OS_TYPE        = android
USE_SCRYPTO    = FALSE
OUT_DIR        = ./bin/swd
endif

DRKVAR_USE_HWVAULT=False
ifeq ($(TARGET_SOC), $(filter $(TARGET_SOC), s5e9925 exynos2100))
    DRKVAR_USE_HWVAULT=True
    DRKVAR_HAVAULT_PATH=../../../hwvault
    ifeq ("$(wildcard $(DRKVAR_HAVAULT_PATH))","")
        DRKVAR_HAVAULT_PATH=../../../../../external/vendor/hwvault
    endif
endif

UNSIGNED_TA=$(OUT_DIR)/unsigned_TA
SIGNED_TA := $(OUT_DIR)/signed/$(TARGET_TA_NAME)

TRUSTLET_DIR = .
INC_DIR := $(TRUSTLET_DIR)/include
SRC_DIR := $(TRUSTLET_DIR)/src
COMMON_INC_DIR := $(INC_DIR)/common
CRYPTO_INC_DIR := $(INC_DIR)/crypto
LOG_ENCRYPTOR_INC_DIR := $(INC_DIR)/logEncryptor
TRUSTLET_INC_DIR := $(INC_DIR)/skm
COMMON_SRC_DIR := $(SRC_DIR)/common
CRYPTO_SRC_DIR := $(SRC_DIR)/crypto
LOG_ENCRYPTOR_SRC_DIR := $(SRC_DIR)/logEncryptor
TRUSTLET_DIR := $(SRC_DIR)/skm

INCLUDE_DIRS := \
	$(COMMON_INC_DIR) \
	$(COMMON_INC_DIR)/platform/bf \
	$(COMMON_INC_DIR)/platform/$(OS_TYPE) \
	$(CRYPTO_INC_DIR) \
	$(CRYPTO_INC_DIR)/pbkdf \
	$(CRYPTO_INC_DIR)/x509 \
	$(TRUSTLET_INC_DIR) \
	$(TRUSTLET_INC_DIR)/bf \
	$(LOG_ENCRYPTOR_INC_DIR)

SRC_C := \
	$(TRUSTLET_DIR)/cryptoPlatform.c \
	$(TRUSTLET_DIR)/keyManager.c \
	$(TRUSTLET_DIR)/log.c \
	$(TRUSTLET_DIR)/teeCmdExecuter.c \
	$(TRUSTLET_DIR)/bf/bfAppMain.c \
	$(TRUSTLET_DIR)/bf/bfCryptoApi.c \
	$(TRUSTLET_DIR)/bf/bfExtApi.c \
	$(TRUSTLET_DIR)/bf/qsort.c \
	$(CRYPTO_SRC_DIR)/cryptoEngine.c \
	$(CRYPTO_SRC_DIR)/secMemoryManager.c \
	$(CRYPTO_SRC_DIR)/sha_256_hash.c \
	$(CRYPTO_SRC_DIR)/pbkdf/hmac_sha256.c \
	$(CRYPTO_SRC_DIR)/pbkdf/pbkdf2.c \
	$(CRYPTO_SRC_DIR)/x509/asn1build.c \
	$(CRYPTO_SRC_DIR)/x509/asn1build_ec.c \
	$(CRYPTO_SRC_DIR)/x509/asn1build_rsa.c \
	$(CRYPTO_SRC_DIR)/x509/asn1.c \
	$(CRYPTO_SRC_DIR)/x509/asn1ec.c \
	$(CRYPTO_SRC_DIR)/x509/asn1gen.c \
	$(CRYPTO_SRC_DIR)/x509/asn1rsa.c \
	$(CRYPTO_SRC_DIR)/x509/certGenerator.c \
	$(CRYPTO_SRC_DIR)/x509/certParser.c \
	$(CRYPTO_SRC_DIR)/x509/x509v3.c \
	$(COMMON_SRC_DIR)/TLV.c \
	$(COMMON_SRC_DIR)/ServiceName.c \
	$(LOG_ENCRYPTOR_SRC_DIR)/circularQueue.c \
	$(LOG_ENCRYPTOR_SRC_DIR)/logEncryptor.c

CFLAGS = $(CONFIG_CFLAGS_SW)
LDFLAGS = $(CONFIG_LDFLAGS_SW)

CFLAGS += -fvisibility=hidden
CFLAGS += -DUSE_BLOWFISH

$(info "Used TEEGRIS ver " $(TEEGRIS_PLATFORM_VERSION_MAJOR))
ifneq ($(filter $(TEEGRIS_PLATFORM_VERSION_MAJOR), 3 4),)
    CFLAGS += -DTEEGRIS_SDK_VER=$(TEEGRIS_PLATFORM_VERSION_MAJOR)
else
    CFLAGS += -DTEEGRIS_SDK_VER=2
endif

ifeq ($(SYSTEM_HIDL_ENABLED), true)
CFLAGS += -DSYSTEM_ROOT_IMAGE_ENABLED
endif   #End of BOARD_BUILD_SYSTEM_ROOT_IMAGE

ifeq ($(TARGET_BUILD_VARIANT), eng)
CFLAGS += -DDRK_TEST_API_ENABLED
endif

$(info "[DeviceRootKey]DRKVAR_USE_HWVAULT " $(DRKVAR_USE_HWVAULT))
ifeq ($(DRKVAR_USE_HWVAULT), True)
INCLUDE_DIRS += $(DRKVAR_HAVAULT_PATH)/export/include
SRC_C += $(DRKVAR_HAVAULT_PATH)/export/src/HwVaultHal_api.c
CFLAGS += -DDRKFEATURE_HWVAULT_ENABLE
endif

ifeq ($(MODE), Debug)
CFLAGS += -DDEBUG
endif

ifeq ($(OS_TYPE), android)
CFLAGS += -DUSE_ANDROID
endif

ifeq ($(OS_TYPE), tizen)
CFLAGS += -DUSE_TIZEN
endif

$(info "Used MODEL ver " $(TEEGRIS_BUILD_MODEL))
ifneq ($(filter $(TEEGRIS_BUILD_MODEL), MT6739),)
$(info "Disabled log encryption")
CFLAGS += -DDISABLE_LOG_ENCRYPTION
endif

ifeq ($(USE_SCRYPTO), TRUE)
$(info "Used USE_SCRYPTO Crypto engine")
TRUSTLET_OPTS +=
	-DUSE_SCRYPTO \
	-DOPENSSL_FIPS

INCLUDE_DIRS += \
	$(TRUSTLET_DIR)/../../../tools/scrypto/fips/include/openssl \
	$(TRUSTLET_DIR)/../../common/include/scrypto \
	$(TRUSTLET_DIR)/../../common/src/scrypto \
	$(TRUSTLET_DIR)/../../common/src/scrypto/openssl

SRC_C += \
	$(TRUSTLET_DIR)/../../common/src/crypto/crypto_core/rsa.c \
	$(TRUSTLET_DIR)/../../common/src/crypto/crypto_core/ec.c \
	$(TRUSTLET_DIR)/../../../tools/scrypto/fips/lib/fips_premain.c \
	$(TRUSTLET_DIR)/../../../tools/scrypto/fips/lib/fips_static_hmac.c

else
$(info "Used default Crypto engine")
INCLUDE_DIRS += \
	$(CRYPTO_INC_DIR)/openssl

SRC_C += \
	$(CRYPTO_SRC_DIR)/openssl_mini/ex_data.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/mem_clr.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/memmgrs.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/aes/aes_core.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/aes/aes_gcm.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/aes/gcm128.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/a_int.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/a_bitstr.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/asn1_lib.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/a_type.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/tasn_dec.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/tasn_enc.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/tasn_fre.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/tasn_new.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/tasn_typ.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/tasn_utl.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/asn1/x_bignum.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_add.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_asm.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_ctx.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_div.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_gcd.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_exp.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_kron.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_lib.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_mod.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_mont.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_mul.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_prime.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_rand.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_recp.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_shift.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_sqr.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_sqrt.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/bn/bn_word.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec_curve.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec_cvt.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec_key.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec_lib.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec_mult.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ec_oct.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ecp_mont.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ecp_oct.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ec/ecp_smpl.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ecdsa/ecs_asn1.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ecdsa/ecs_lib.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ecdsa/ecs_ossl.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ecdsa/ecs_sign.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/ecdsa/ecs_vrf.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/lhash/lhash.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/rsa/rsa.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/rsa/rsa_lib.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/rsa/rsa_gen.c \
	$(CRYPTO_SRC_DIR)/openssl_mini/stack/stack.c

endif

CFLAGS := $(filter-out -Werror,$(CFLAGS))

$(warning CFLAGS : $(CFLAGS))
$(warning LDFLAGS : $(LDFLAGS))

OBJS := $(patsubst %.c,%.o,$(SRC_C))

# Prepare Includes
INC := $(INCLUDE_DIRS:%=-I%)

.PHONY:all

all: make_dist $(SIGNED_TA)

.PHONY: make_dist
make_dist:
	@-mkdir -p $(OUT_DIR)
	@-mkdir -p $(OUT_DIR)/signed

$(UNSIGNED_TA): $(OBJS)
	@$(CONFIG_CC_SW) $(LDFLAGS) -o $(UNSIGNED_TA) $^ $(INC)
	@rm -f $(OBJS)

$(SIGNED_TA): $(UNSIGNED_TA)
	@$(CONFIG_STRIP_SW) $(UNSIGNED_TA)
	@$(signing_command)

%.o: %.c
	@echo Compiling: $@
	@$(CONFIG_CC_SW) -c -o $*.o $(CFLAGS) $(INC) $<

clean:
	@echo "Cleaning $(BIN)..."
	@rm -f $(OBJS) $(BIN) .depend
