################################################################################
#
# TEEGRIS Makefile Template
#
################################################################################

PWD := $(shell pwd)

ifeq ($(SEC_SDK), sdk42)
TOOLCHAIN_PATH=$(PWD)/../teegris_sdk_4_2/tools

CFLAGS += -DSEC_SDK42
CFLAGS += -DSEC_SDK40
CONFIG_LDFLAGS_SECURITY := -Wl,-z,relro,-z,now

ifeq ($(SEC_PRODUCT), exynos2100)
CFLAGS += -DUSE_SPU
CFLAGS += -DUSE_BTS
endif

else ifeq ($(SEC_SDK), sdk40)
TOOLCHAIN_PATH=$(PWD)/../teegris_sdk_4/tools
CFLAGS += -DSEC_SDK40
CONFIG_LDFLAGS_SECURITY := -Wl,-z,relro,-z,now

ifeq ($(SEC_PRODUCT), exynos990)
CFLAGS += -DUSE_SPU
CFLAGS += -DUSE_BTS
endif

ifeq ($(SEC_PRODUCT), exynos980)
CFLAGS += -DUSE_BTS
endif

else ifeq ($(SEC_SDK), sdk30)
TOOLCHAIN_PATH=$(PWD)/../teegris_sdk/tools
CFLAGS += -DSEC_SDK30
ifeq ($(SEC_PRODUCT), exynos9610)
CFLAGS += -DUSE_BTS
endif

ifeq ($(USEBTS),true)
CFLAGS += -DUSE_BTS
endif

endif

TA_SIGN_CERT = $(TOOLCHAIN_PATH)/teegris_authority_scripts/ta_auth_dev_ta/cert.pem
TA_SIGN_KEY = $(TOOLCHAIN_PATH)/teegris_authority_scripts/ta_auth_dev_ta/private/key.pem

TA_AUTH_SCRIPTS_PATH := $(TOOLCHAIN_PATH)/teegris_authority_scripts/ta_auth_scripts
SIGN := $(TA_AUTH_SCRIPTS_PATH)/sign_file.sh -c $(TA_SIGN_CERT) -k $(TA_SIGN_KEY)

######################################## BUILD FLAG ########################################

CFLAGS += \
	-std=gnu11 \
	-O2 \
	-fpie \
	-fsigned-char \
	-fvisibility=hidden \
	-s

# Add build CL
CFLAGS += -DBUILD_CHANGELIST=\"CL:$(BUILD_CHANGELIST)_SCL:$(BUILD_SHELVED)\"
CFLAGS += -DTA_NAME=\"$(TA_NAME)\"

ifeq ($(USE_BF),true)
CFLAGS += -DUSE_BF
endif

CC  := $(TOOLCHAIN_PATH)/../toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86/bin/arm-secureos-gnueabi-gcc

ifeq ($(SEC_PRODUCT), exynos9820)
CFLAGS += -DEXYNOS9820
else ifeq ($(SEC_PRODUCT), exynos990)
CFLAGS += -DEXYNOS990
else ifeq ($(SEC_PRODUCT), exynos980)
CFLAGS += -DEXYNOS980
else ifeq ($(SEC_PRODUCT), exynos2100)
CFLAGS += -DEXYNOS2100
endif

ifeq ($(ENABLE_DBG_LOG),true)
    CFLAGS += -DENABLE_DBG_LOG
endif

CFLAGS += -DTA_VERSION=\"$(_VERSION_)\"
CFLAGS += -DENABLE_TA_ERR_MSG

ifeq ($(MODE_DEBUG),true)
   CFLAGS += -DDEBUG_COLDWALLET -DENABLE_DBG_LOG -DLOW_ENV
endif

ifeq ($(MOCK),true)
   CFLAGS += -DENABLE_MOCK
endif

ifeq ($(STAGING_ENV),true)
    CFLAGS += -DSTAGING_ENV
endif

ifeq ($(MODE_DEBUGTOOL),true)
   CFLAGS += -DDEBUG_COLDWALLET -DENABLE_DBG_LOG
endif

ifeq ($(MODE_PERF), true)
   CFLAGS += -DPERF_BC_CORE
endif

ifeq ($(LOW_ENV),true)
    CFLAGS += -DLOW_ENV
endif

ifeq ($(USE_SCRYPTO),true)
   CFLAGS += -DSCRYPTO -DENABLE_SC_IPC
endif

ifeq ($(USE_OPENSSL_DES),true)
    CFLAGS += -DUSE_OPENSSL_DES
endif

ifeq ($(BC_CORE),true)
    CFLAGS += -DCOLD_WALLET
    CFLAGS += -DuECC_SUPPORTS_secp256k1
endif

ifeq ($(ICCC_ENABLED),true)
CFLAGS += -DICCC_ENABLED
endif


CFLAGS += \
    -DOPENSSL_NO_DSA \
    -DOPENSSL_NO_DH \
    -DOPENSSL_NO_ENGINE \
    -DOPENSSL_NO_CMS \
    -DOPENSSL_NO_STDIO \
    -DOPENSSL_NO_LOCKING \
    -DOPENSSL_NO_BIO \
    -DOPENSSL_NO_PKCS7 \
    -DOPENSSL_NO_DEPRECATED \
    -DOPENSSL_NO_ERR \
    -DOPENSSL_NO_LHASH \
    -DOPENSSL_NO_EVP \
    -DOPENSSL_NO_ECDH \
    -DOPENSSL_NO_RSA \
    -DOPENSSL_NO_SHA \
    -DOPENSSL_NO_SHA0 \
    -DOPENSSL_NO_SHA1 \
    -DOPENSSL_NO_SHA256 \
    -DOPENSSL_NO_SHA384 \
    -DOPENSSL_NO_SHA512 \
    -DOPENSSL_EXPORT_VAR_AS_FUNCTION \
    -DGETPID_IS_MEANINGLESS \
    -DNO_SYS_TYPES_H \
    -DCUSTOM_LIBC
#   -DOPENSSL_NO_EC \
#   -DOPENSSL_NO_ECDSA \
#   -DOWN_ALLOCATOR \
#   -DSWD \

######################################## BUILD FLAG ########################################

ifeq ($(SEC_SDK), sdk42)
SW_LIB_PATH := $(PWD)/../teegris_sdk_4_2/platforms/TEEGRIS-4.2/swd/arch-arm/usr/lib
SW_LIB_INCLUDE := $(PWD)/../teegris_sdk_4_2/platforms/TEEGRIS-4.2/swd/arch-arm/usr/include
else ifeq ($(SEC_SDK), sdk40)
SW_LIB_PATH := $(PWD)/../teegris_sdk_4/platforms/TEEGRIS-4.1/swd/arch-arm/usr/lib
SW_LIB_INCLUDE := $(PWD)/../teegris_sdk_4/platforms/TEEGRIS-4.1/swd/arch-arm/usr/include
else ifeq ($(SEC_SDK), sdk30)
SW_LIB_PATH := $(PWD)/../teegris_sdk/platforms/TEEGRIS-3.0/swd/arch-arm/usr/lib
SW_LIB_INCLUDE := $(PWD)/../teegris_sdk/platforms/TEEGRIS-3.0/swd/arch-arm/usr/include
endif

BC_CORE_SRC = $(PWD)/src
BC_CORE_SRC_BASE = $(BC_CORE_SRC)/base
BC_CORE_SRC_ECDSA = $(BC_CORE_SRC)/ecdsa
BC_CORE_SRC_ED25519 = $(BC_CORE_SRC)/ed25519-donna
BC_CORE_SRC_LIBBTC = $(BC_CORE_SRC)/libbtc
BC_CORE_SRC_PROTO = $(BC_CORE_SRC)/proto
BC_CORE_SRC_PROTO_TRON = $(BC_CORE_SRC_PROTO)/tron/core
BC_CORE_SRC_PROTO_GOOGLE = $(BC_CORE_SRC_PROTO)/tron/google/protobuf
BC_CORE_INC = $(PWD)/inc
BC_CORE_MSG = $(PWD)/inc/msgs
BC_CORE_OUT = $(PWD)/Out

TZ_SPAY_COMMON_INC = $(PWD)/../tz_spay_common/public
TZ_PLATFORM_INC = $(PWD)/../tz_platform/public/tl
TZ_PLATFORM_VENDOR_INC = $(PWD)/../tz_platform/vendor/TEEGRIS/inc
TIMA_COMMON_INC = $(PWD)/../tima_common/inc
TZ_PLATFORM_ICCC_INC = $(PWD)/../tz_platform/vendor/iccc/inc

#        COMMON/bc_core/shared/libsodium/include
#        COMMON/bc_core/shared/libsodium/include/sodium

$(warning ######  Check BC_CORE_SRC:($(BC_CORE_SRC)))
$(warning ######  Check DID_INDY_INC:($(BC_CORE_SRC_DID_INDY_INC)))

CFLAGS += -I. \
    -I$(SW_LIB_INCLUDE) \
    -I$(BC_CORE_SRC) \
    -I$(BC_CORE_SRC_BASE) \
    -I$(BC_CORE_SRC_ECDSA) \
    -I$(BC_CORE_SRC_ED25519) \
    -I$(BC_CORE_SRC_LIBBTC) \
    -I$(BC_CORE_SRC_PROTO) \
    -I$(BC_CORE_SRC_PROTO_TRON) \
    -I$(BC_CORE_SRC_PROTO_GOOGLE) \
    -I$(BC_CORE_INC) \
    -I$(BC_CORE_SRC)/libsodium/include \
    -I$(BC_CORE_SRC)/libsodium/include/sodium \
    -I$(BC_CORE_SRC)/libsodium/crypto_generichash/blake2b/ref \
    -I$(BC_CORE_SRC)/libsodium/crypto_onetimeauth/poly1305 \
    -I$(BC_CORE_SRC)/libsodium/crypto_onetimeauth/poly1305/donna \
    -I$(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2 \
    -I$(BC_CORE_SRC)/libsodium/crypto_scalarmult/curve25519 \
    -I$(BC_CORE_SRC)/libsodium/crypto_scalarmult/curve25519/ref10 \
    -I$(BC_CORE_SRC)/libsodium/crypto_shorthash/siphash24/ref \
    -I$(BC_CORE_SRC)/libsodium/crypto_sign/ed25519/ref10 \
    -I$(BC_CORE_SRC)/libsodium/crypto_stream/chacha20 \
    -I$(BC_CORE_SRC)/libsodium/crypto_stream/chacha20/ref \
    -I$(BC_CORE_SRC)/libsodium/crypto_stream/salsa20 \
    -I$(BC_CORE_SRC)/libsodium/crypto_stream/salsa20/ref \
    -I$(BC_CORE_SRC)/libsodium/include/sodium/private \
    -I$(BC_CORE_SRC)/libsodium/crypto_core/ed25519/ref10/fe_25_5 \
    -I$(BC_CORE_MSG) \
    -I$(TZ_SPAY_COMMON_INC) \
    -I$(TIMA_COMMON_INC) \
    -I$(TZ_PLATFORM_INC) \
    -I$(TZ_PLATFORM_VENDOR_INC) \
    -L$(SW_LIB_PATH) \
    -I$(TZ_PLATFORM_ICCC_INC) \
    -lteesl \
    -ltzsl \
    -lpthread \
    -lscrypto \
#   -Wall \
    -Werror

$(warning ######  Check CFLAG:($(CFLAGS)))


SRCS := $(wildcard $(BC_CORE_SRC)/*.c $(BC_CORE_SRC_BASE)/*.c $(BC_CORE_SRC_ECDSA)/*.c $(BC_CORE_SRC_ED25519)/*.c $(BC_CORE_SRC_LIBBTC)/*.c $(BC_CORE_SRC_PROTO)/*.c $(BC_CORE_SRC_PROTO_TRON)/*.c $(BC_CORE_SRC_PROTO_GOOGLE)/*.c $(BC_CORE_SRC)/*.cxx)
SRCS += \
    $(BC_CORE_SRC)/../../tz_platform/vendor/TEEGRIS/src/BF_TZ_vendor.c \
    $(BC_CORE_SRC)/../../tz_platform/vendor/TEEGRIS/src/cm_api.c \
    $(BC_CORE_SRC)/../../tz_platform/vendor/TEEGRIS/src/spu_crypto.c \
    $(BC_CORE_SRC)/../../tz_spay_common/tl/spay_init_tl.c \
    $(BC_CORE_SRC)/../../tz_spay_common/tl/spay_pin_random_util_tl.c \
    $(BC_CORE_SRC)/../../tz_spay_common/tl/spay_authenticate_transaction_tl.c \
    $(BC_CORE_SRC)/../../tz_spay_common/tl/spay_msk_tl.c \

# add libsodium
SRCS += \
    $(BC_CORE_SRC)/libsodium/crypto_aead/aegis256/aead_aegis256.c \
    $(BC_CORE_SRC)/libsodium/crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \
    $(BC_CORE_SRC)/libsodium/crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c \
    $(BC_CORE_SRC)/libsodium/crypto_auth/crypto_auth.c \
    $(BC_CORE_SRC)/libsodium/crypto_auth/hmacsha256/auth_hmacsha256.c \
    $(BC_CORE_SRC)/libsodium/crypto_auth/hmacsha512/auth_hmacsha512.c \
    $(BC_CORE_SRC)/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256.c \
    $(BC_CORE_SRC)/libsodium/crypto_box/crypto_box.c \
    $(BC_CORE_SRC)/libsodium/crypto_box/crypto_box_easy.c \
    $(BC_CORE_SRC)/libsodium/crypto_box/crypto_box_seal.c \
    $(BC_CORE_SRC)/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305.c \
    $(BC_CORE_SRC)/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c \
    $(BC_CORE_SRC)/libsodium/crypto_core/hchacha20/core_hchacha20.c \
    $(BC_CORE_SRC)/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20_ref2.c \
    $(BC_CORE_SRC)/libsodium/crypto_core/hsalsa20/core_hsalsa20.c \
    $(BC_CORE_SRC)/libsodium/crypto_core/salsa/ref/core_salsa_ref.c \
    $(BC_CORE_SRC)/libsodium/crypto_generichash/crypto_generichash.c \
    $(BC_CORE_SRC)/libsodium/crypto_generichash/blake2b/generichash_blake2.c \
    $(BC_CORE_SRC)/libsodium/crypto_generichash/blake2b/ref/blake2b-compress-ref.c \
    $(BC_CORE_SRC)/libsodium/crypto_generichash/blake2b/ref/blake2b-ref.c \
    $(BC_CORE_SRC)/libsodium/crypto_generichash/blake2b/ref/generichash_blake2b.c \
    $(BC_CORE_SRC)/libsodium/crypto_hash/crypto_hash.c \
    $(BC_CORE_SRC)/libsodium/crypto_hash/sha256/hash_sha256.c \
    $(BC_CORE_SRC)/libsodium/crypto_hash/sha256/cp/hash_sha256_cp.c \
    $(BC_CORE_SRC)/libsodium/crypto_hash/sha512/hash_sha512.c \
    $(BC_CORE_SRC)/libsodium/crypto_hash/sha512/cp/hash_sha512_cp.c \
    $(BC_CORE_SRC)/libsodium/crypto_kdf/blake2b/kdf_blake2b.c \
    $(BC_CORE_SRC)/libsodium/crypto_kdf/crypto_kdf.c \
    $(BC_CORE_SRC)/libsodium/crypto_kx/crypto_kx.c \
    $(BC_CORE_SRC)/libsodium/crypto_onetimeauth/crypto_onetimeauth.c \
    $(BC_CORE_SRC)/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c \
    $(BC_CORE_SRC)/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/argon2-core.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/argon2-encoding.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/argon2-fill-block-ref.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/argon2.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/blake2b-long.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/pwhash_argon2i.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/argon2/pwhash_argon2id.c \
    $(BC_CORE_SRC)/libsodium/crypto_pwhash/crypto_pwhash.c \
    $(BC_CORE_SRC)/libsodium/crypto_scalarmult/crypto_scalarmult.c \
    $(BC_CORE_SRC)/libsodium/crypto_scalarmult/curve25519/ref10/x25519_ref10.c \
    $(BC_CORE_SRC)/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c \
    $(BC_CORE_SRC)/libsodium/crypto_secretbox/crypto_secretbox.c \
    $(BC_CORE_SRC)/libsodium/crypto_secretbox/crypto_secretbox_easy.c \
    $(BC_CORE_SRC)/libsodium/crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305.c \
    $(BC_CORE_SRC)/libsodium/crypto_secretstream/xchacha20poly1305/secretstream_xchacha20poly1305.c \
    $(BC_CORE_SRC)/libsodium/crypto_shorthash/crypto_shorthash.c \
    $(BC_CORE_SRC)/libsodium/crypto_shorthash/siphash24/shorthash_siphash24.c \
    $(BC_CORE_SRC)/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24_ref.c \
    $(BC_CORE_SRC)/libsodium/crypto_sign/crypto_sign.c \
    $(BC_CORE_SRC)/libsodium/crypto_sign/ed25519/sign_ed25519.c \
    $(BC_CORE_SRC)/libsodium/crypto_sign/ed25519/ref10/keypair.c \
    $(BC_CORE_SRC)/libsodium/crypto_sign/ed25519/ref10/open.c \
    $(BC_CORE_SRC)/libsodium/crypto_sign/ed25519/ref10/sign.c \
    $(BC_CORE_SRC)/libsodium/crypto_stream/chacha20/stream_chacha20.c \
    $(BC_CORE_SRC)/libsodium/crypto_stream/chacha20/ref/chacha20_ref.c \
    $(BC_CORE_SRC)/libsodium/crypto_stream/crypto_stream.c \
    $(BC_CORE_SRC)/libsodium/crypto_stream/salsa20/stream_salsa20.c \
    $(BC_CORE_SRC)/libsodium/crypto_stream/xsalsa20/stream_xsalsa20.c \
    $(BC_CORE_SRC)/libsodium/crypto_verify/sodium/verify.c \
    $(BC_CORE_SRC)/libsodium/randombytes/randombytes.c \
    $(BC_CORE_SRC)/libsodium/randombytes/teerandom/randombytes_teerandom.c \
    $(BC_CORE_SRC)/libsodium/sodium/codecs.c \
    $(BC_CORE_SRC)/libsodium/sodium/core.c \
    $(BC_CORE_SRC)/libsodium/sodium/runtime.c \
    $(BC_CORE_SRC)/libsodium/sodium/utils.c \
    $(BC_CORE_SRC)/libsodium/sodium/version.c \
    $(BC_CORE_SRC)/libsodium/crypto_stream/salsa20/ref/salsa20_ref.c \

    # $(BC_CORE_SRC)/libsodium/randombytes/sysrandom/randombytes_sysrandom.c \



# Compile SCrypto IPC related files
ifeq ($(USE_SCRYPTO),true)
    SRCS += $(BC_CORE_SRC)/../../tz_platform/vendor/TEEGRIS/src/SC_IPC_tl.c
endif

$(warning ######  Check SRCS:($(SRCS)))

OBJS := $(patsubst %.cxx,%.o,$(patsubst %.c,%.o,$(SRCS)))

ifneq ($(filter exynos990 exynos980 exynos2100, $(SEC_PRODUCT)), )
    CFLAGS += -DICCC_v4
    CUSTOMER_DRIVER_LIB = $(PWD)/../tz_platform/vendor/iccc/libs/$(SEC_PRODUCT)$(ICCC_ADDITIONAL_DIR)/icccOperations.ol
else 
    CUSTOMER_DRIVER_LIB = $(PWD)/../tz_platform/vendor/iccc/libs/icccOperations.ol \
                        $(PWD)/../tz_platform/vendor/iccc/libs/tl_tz_iccc_init.ol    
endif
DIST = $(BC_CORE_OUT)/000000000000000000004243636f7265
all: $(DIST)

$(DIST): $(BC_CORE_OUT)/bc_core \
	$(TA_SIGN_CERT) \
	$(TA_SIGN_KEY)
	@$(SIGN) -a $< $@ $(DIST)

$(BC_CORE_OUT)/bc_core:
	@mkdir -p $(BC_CORE_OUT)
	@$(CC) $(CFLAGS) $(CONFIG_LDFLAGS_SECURITY) $(SRCS) $(CUSTOMER_DRIVER_LIB) -o $@

clean:
	@rm -f $(OBJS) $(DIST) $(BC_CORE_OUT)/bc_core
