#!/bin/bash
source utils.sh

export SEC_SOC_NUM=$1
export PLATFORM_OS_VER=$2
export VKBUILD_MODE=$3

export COMP_PATH_BASE=$(pwd)
export COMP_PATH_SECAPP=$COMP_PATH_BASE/app/platform/teegris
export COMP_PATH_SECDRV=$COMP_PATH_BASE/driver/platform/teegris
export VK_TA_NAME=00000000-0000-0000-0000-564c544b5052
export VK_DRV_NAME=00000000-0000-0000-0000-564c544b4456
TEEGRIS_SDK20_PATH=$P4_SECURITY_DEV_PATH/TZSDK/blowfish-sdk-2.0/bf_sdk
TEEGRIS_SDK30_PATH=$P4_SECURITY_DEV_PATH/TZSDK/teegris_sdk
TEEGRIS_SDK40_PATH=$P4_SECURITY_DEV_PATH/TZSDK/teegris_sdk.4.1.0

if [ "$PLATFORM_OS_VER" == "p" ] || [ "$PLATFORM_OS_VER" == "P" ]; then
VK_TA_OUTPUT_ROOT_PATH=$COMP_PATH_BASE/../Bin/TA/Android_P/teegris
else
VK_TA_OUTPUT_ROOT_PATH=$COMP_PATH_BASE/../Bin/TA/teegris
fi

if [ "$3" == "" ]; then
	VKBUILD_MODE=release
fi

show_invalid_param()
{
	echo "------------------------------------------------------------------"
	echo "Please check parameter, Your args (Chipset:${SEC_SOC_NUM}) (TargetVersion:${PLATFORM_OS_VER}) (VkBuildMode:${VKBUILD_MODE})"
	echo "[Usage] ./build_teegris.sh [Chipset] [TargetVersion] {VkBuildMode}"
	echo "[Chipset Support] common 9610 9820 7904 9830 9630 3830"
	echo "[Android Platform version] Q, P"
	# debug mode : Add logs for debugging
	# no_key : Disable RPMB forcely(include debug mode)
	echo "[VkBuildMode Support - default release] debug, no_key"
	echo "------------------------------------------------------------------"
}

validate_params()
{
	# Check SDK version parameter
	if [ "$SEC_SOC_NUM" ]; then
		printGreen "VaultKeeper TEEgris TA build for $SEC_SOC_NUM"
		case "$SEC_SOC_NUM" in
			common) # 6737,6757,7570,7884
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK20_PATH
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/common
				;;
			7904)
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK30_PATH
				export TEEGRIS_SDK_VER=V3
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/7904
				export VK_DRV_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/7904/drv
				export SIGNED_TA_MODEL_NAME=TEEGRIS_EXYNOS7904_SAMSUNG_TA
				export SIGNED_DRV_MODEL_NAME=TEEGRIS_EXYNOS7904_SAMSUNG_DRV
				;;
			9610)
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK30_PATH
				export TEEGRIS_SDK_VER=V3
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9610
				export VK_DRV_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9610/drv
				export SIGNED_TA_MODEL_NAME=TEEGRIS_EXYNOS9610_SAMSUNG_TA
				export SIGNED_DRV_MODEL_NAME=TEEGRIS_EXYNOS9610_SAMSUNG_DRV
				;;
			9820)
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK30_PATH
				export TEEGRIS_SDK_VER=V3
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9820
				export VK_DRV_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9820/drv
				export SIGNED_TA_MODEL_NAME=TEEGRIS_EXYNOS9820_SAMSUNG_TA
				export SIGNED_DRV_MODEL_NAME=TEEGRIS_EXYNOS9820_SAMSUNG_DRV
				;;
			9830)
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK40_PATH
				export TEEGRIS_SDK_VER=V4
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9830
				export VK_DRV_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9830/drv
				export SIGNED_TA_MODEL_NAME=TEEGRIS_EXYNOS9830_SAMSUNG_TA
				export SIGNED_DRV_MODEL_NAME=TEEGRIS_EXYNOS9830_SAMSUNG_DRV
				;;
			9630)
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK40_PATH
				export TEEGRIS_SDK_VER=V4
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9630
				export VK_DRV_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/9630/drv
				export SIGNED_TA_MODEL_NAME=TEEGRIS_EXYNOS9630_SAMSUNG_TA
				export SIGNED_DRV_MODEL_NAME=TEEGRIS_EXYNOS9630_SAMSUNG_DRV
				;;
			850)
				export TEEGRIS_SDK_PATH=$TEEGRIS_SDK40_PATH
				export TEEGRIS_SDK_VER=V4
				export VK_TA_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/850
				export VK_DRV_OUTPUT_PATH=$VK_TA_OUTPUT_ROOT_PATH/850/drv
				export SIGNED_TA_MODEL_NAME=TEEGRIS_EXYNOS3830_SAMSUNG_TA
				export SIGNED_DRV_MODEL_NAME=TEEGRIS_EXYNOS3830_SAMSUNG_DRV
				;;
			*)
				show_invalid_param
				exit
				;;
		esac
	else
		show_invalid_param
		exit
	fi

	# Check Android target version
	if [ "$PLATFORM_OS_VER" ]; then
		printGreen "Android version : $PLATFORM_OS_VER OS"
		case "$PLATFORM_OS_VER" in
			q|Q|p|P|o|O)
				;;
			*)
				show_invalid_param
				exit
				;;
		esac
	else
		show_invalid_param
		exit
	fi

	# Check build mode parameter
	if [ "$VKBUILD_MODE" ]; then
		printGreen "VaultKeeper TEEgris TA build as $VKBUILD_MODE mode"
		case "$VKBUILD_MODE" in
			release|debug|no_key)
				;;
			*)
				show_invalid_param
				exit
				;;
		esac
	else
		show_invalid_param
		exit
	fi
}

delete_local_output()
{
	rm -rf $VK_TA_OUTPUT_PATH
	mkdir -p $VK_TA_OUTPUT_PATH
	cd $COMP_PATH_SECAPP
	make clean


	if [ "$TEEGRIS_SDK_VER" == "V3" ] || [ "$TEEGRIS_SDK_VER" == "V4" ] ; then
		mkdir -p $VK_DRV_OUTPUT_PATH
		cd $COMP_PATH_SECDRV
		make clean
	fi

	cd $COMP_PATH_BASE
}

do_teegris_ta_build()
{
	cd $COMP_PATH_SECAPP
	make
	check_return_code $? "do_teegris_ta_build"

	cd $COMP_PATH_SECAPP/libs

	if [ "$TEEGRIS_SDK_VER" == "V3" ] || [ "$TEEGRIS_SDK_VER" == "V4" ]; then
		java -jar signclient.jar -runtype ss_teegris_ta -model $SIGNED_TA_MODEL_NAME \
			 -input $VK_TA_OUTPUT_PATH/unsigned-$VK_TA_NAME \
			 -output $VK_TA_OUTPUT_PATH/$VK_TA_NAME
	else
		./imprint2_bf $VK_TA_OUTPUT_PATH/unsigned-$VK_TA_NAME

		java -jar signclient.jar -runtype ss_bf_ta -model BF_SAMSUNG_TA \
			 -input $VK_TA_OUTPUT_PATH/unsigned-$VK_TA_NAME \
			 -output $VK_TA_OUTPUT_PATH/$VK_TA_NAME
	fi
}

do_teegris_drv_build()
{
	cd $COMP_PATH_SECDRV
	make
	check_return_code $? "do_teegris_drv_build"

	cd $COMP_PATH_SECDRV/libs

	if [ "$TEEGRIS_SDK_VER" == "V3" ] || [ "$TEEGRIS_SDK_VER" == "V4" ]; then
		java -jar signclient.jar -runtype ss_teegris_ta -model $SIGNED_DRV_MODEL_NAME \
			 -input $VK_TA_OUTPUT_PATH/drv/unsigned-$VK_DRV_NAME \
			 -output $VK_TA_OUTPUT_PATH/drv/$VK_DRV_NAME
	else
		show_invalid_param
		exit
	fi
}

build_ta_library()
{
	printGreen "************************************"
	printGreen "Build VaultKeeper library for TA API"

	rm -rf $COMP_PATH_SECAPP/vkmanager/lib
	mkdir -p $COMP_PATH_SECAPP/vkmanager/lib

if [ "$TEEGRIS_SDK_VER" == "V3" ] ; then
	cd $COMP_PATH_SECAPP/vkmanager/
	make MODEL=v3 ARCH=64
	cp -f $COMP_PATH_SECAPP/vkmanager/vkmanager* $COMP_PATH_SECAPP/vkmanager/lib/
	make clean
	make MODEL=v3 ARCH=32
	cp -f $COMP_PATH_SECAPP/vkmanager/vkmanager* $COMP_PATH_SECAPP/vkmanager/lib/
	make clean
fi

if [ "$TEEGRIS_SDK_VER" == "V4" ] ; then
	cd $COMP_PATH_SECAPP/vkmanager/
	make MODEL=v4 ARCH=64
	cp -f $COMP_PATH_SECAPP/vkmanager/vkmanager* $COMP_PATH_SECAPP/vkmanager/lib/
	make clean
	make MODEL=v4 ARCH=32
	cp -f $COMP_PATH_SECAPP/vkmanager/vkmanager* $COMP_PATH_SECAPP/vkmanager/lib/
	make clean
fi

	printGreen "************************************"
}

push_to_device()
{
	adb remount
	adb push $VK_TA_OUTPUT_PATH/$VK_TA_NAME /system/tee/
	adb shell ls -al /system/tee/$VK_TA_NAME
	adb push $VK_TA_OUTPUT_PATH/$VK_TA_NAME /vendor/tee/
	adb shell ls -al /vendor/tee/$VK_TA_NAME

	if [ "$TEEGRIS_SDK_VER" == "V3" ] || [ "$TEEGRIS_SDK_VER" == "V4" ] ; then
		adb push $VK_TA_OUTPUT_PATH/drv/$VK_DRV_NAME /vendor/tee/driver
		adb shell ls -al /vendor/tee/driver/$VK_DRV_NAME
	fi
}

# Build VaultKeeper TA
validate_params
delete_local_output
echo ""
do_teegris_ta_build

if [ "$TEEGRIS_SDK_VER" == "V3" ] || [ "$TEEGRIS_SDK_VER" == "V4" ] ; then
	do_teegris_drv_build
	## Build static library (Support TA interface)
	build_ta_library
fi

## Push binary to device
echo ""
adb start-server
RET="$(adb get-state)"
if [ "$RET" = "device" ]; then
	print_success "device is connected. push vaultkeeper binary to device."
	push_to_device
else
	print_warning "device isn't connected. skip vaultkeeper binary push"
fi
