import os
import re
Import('env')

env = env.Clone()
#------------------------------------------------------------------------------
# VK FUNC
#------------------------------------------------------------------------------
def VK_LOGD(str):
  print("\n\033[0;33;40m" +  "[VK_DBG] " + str + "\033[0;m\n")

CHIPSET = env['CHIPSET']
if CHIPSET == "saipan":
  CHIPSET = "sm7250"
if CHIPSET == "kamorta":
  CHIPSET = "sm6115"
if CHIPSET == "bitra":
  CHIPSET = "sm7225"

TARGET_BUILD_VARIANT = os.environ['TARGET_BUILD_VARIANT']
PLATFORM_VERSION = os.environ['PLATFORM_VERSION']
SHIPPING_API_LEVEL = os.environ['PRODUCT_SHIPPING_API_LEVEL']

if TARGET_BUILD_VARIANT == "eng":
  VK_LOGD("CHIPSET:" + CHIPSET)
  VK_LOGD("PLATFORM_VER : " + os.environ['PLATFORM_VERSION'])
  VK_LOGD("SHIPPING_API_LEVEL : " + os.environ['PRODUCT_SHIPPING_API_LEVEL'])

#------------------------------------------------------------------------------
# OUT DIR
#------------------------------------------------------------------------------
if os.path.exists(env['BUILD_ROOT'] + '/ssg'):
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/ssg"
else:
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/core"

if not hasattr(env, 'IMAGE_ALIASES'):
  aliases = []
  aliases = ['vaultkeeper',]
  env.Replace(OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/vaultkeeper/build")
  env.Replace(LIB_OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/vaultkeeper/build/" + "${SHORT_BUILDPATH}")

#------------------------------------------------------------------------------
# VK Source PATH
#------------------------------------------------------------------------------
VK_ROOT_PATH = QSEE_APP_DIR + "/securemsm/trustzone/qsapps/vaultkeeper/"

#------------------------------------------------------------------------------
# VK Defines
#------------------------------------------------------------------------------
# Common
env.Append(CPPDEFINES = [
  "USE_QSEE",
])

#if TARGET_BUILD_VARIANT == "eng":
#  env.Append(CCFLAGS = ' -D__DEBUG__')

# CHIPSET dependency
# QC, LSI 9810 9820 9830 7885 7904, MTK  : VK_VERSION_2, LSI 7870 7880 7570 8890 : VK_VERSION_1
env.Append(CPPDEFINES = [
  "VK_SWD_QSEE",
  "VK_VERSION_2",
])

## We need to specify "neon" to generate SIMD instructions in 32-bit mode
if 'scorpion' in env['PROC']:
  env.Append(CCFLAGS = " -mfpu=neon ")

env.Append(CFLAGS = ' -fPIC -Werror -Wno-macro-redefined -Wbuiltin-macro-redefined')
env.Replace(ARM_OPT_STACK_GUARD = ' -fstack-protector-strong')

env.Append(CFLAGS = ' -fstack-protector -fstack-protector-all')
env.Append(CCFLAGS = ' -D_GNU_SOURCE')
env.Append(CCFLAGS = ' -DVK_QSEE_%s' % re.findall("\d+",CHIPSET)[0])

# Android OS is higher than or equal to Q
env.Append(CCFLAGS = ' -DVK_ANDROID_OS_Q')

if SHIPPING_API_LEVEL == "28":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_P')
if SHIPPING_API_LEVEL == "29":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_Q')
if SHIPPING_API_LEVEL == "30":
  env.Append(CCFLAGS = ' -DVK_SHIPPING_API_LEVEL_R')

if CHIPSET == "sm8250":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
  env.Append(CCFLAGS = ' -DVK_PROCA_ENABLE')
if CHIPSET == "sm7250":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
  env.Append(CCFLAGS = ' -DVK_PROCA_ENABLE')
if CHIPSET == "sm7225":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
  env.Append(CCFLAGS = ' -DVK_PROCA_ENABLE')
if CHIPSET == "sm6115":
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')
  env.Append(CCFLAGS = ' -DVK_RPMB_TRANSFER_MLT_BLK')
if CHIPSET == "sdm660":
  env.Append(CPPDEFINES = 'VAULTKEEPER=1')
if CHIPSET == "sdm450":
  env.Append(CCFLAGS = ' -DQSEE_OLD_INIT_INVOCATION_STYLE')
if CHIPSET == "msm8953":
  env.Append(CPPDEFINES = 'VAULTKEEPER=1')
  env.Append(CCFLAGS = ' -DQSEE_OLD_INIT_INVOCATION_STYLE')
if CHIPSET == "sdm439":
  env.Append(CPPDEFINES = 'VAULTKEEPER=1')
  env.Append(CCFLAGS = ' -DQSEE_OLD_INIT_INVOCATION_STYLE')
  env.Append(CCFLAGS = ' -DNO_NEED_TO_MIGRATION01')

if CHIPSET in ['sdm845', 'sdm710', 'sdm855', 'sm6150', 'sm7150', 'sm7250', 'sm8250' , 'sm6115', 'sm7225']:
  env.Append(CCFLAGS = ' -DVK_QSEE_T2T_COM')

VK_LOGD("CCFLAG: " + env['CCFLAGS'])
VK_LOGD("CPPDEFINES: " + env['CPPDEFINES'][0] + " " + env['CPPDEFINES'][1] + " " + env['CPPDEFINES'][2])

#------------------------------------------------------------------------------
# VK idl files
#------------------------------------------------------------------------------
if os.path.exists(env['BUILD_ROOT'] + '/ssg'):
  idl_files = env.Glob(VK_ROOT_PATH + "vkmanager/idl/*.idl")
  env.LoadToolScript(QSEE_APP_DIR + "/bsp/build/scripts/idlcompiler.py")
  idl_output_dir = VK_ROOT_PATH + "inc"
  for idl_file in idl_files:
    t = os.path.join(idl_output_dir, os.path.basename(os.path.splitext(str(idl_file))[0] + ".h"))
    env.MINKIDL(source=idl_file, target=t)

#------------------------------------------------------------------------------
# VK includes
#------------------------------------------------------------------------------
includes = [
  "${INC_ROOT}/core/api/services",
  QSEE_APP_DIR + "/api/securemsm/trustzone/qsee",
  VK_ROOT_PATH + "inc",
  VK_ROOT_PATH + "inc/qsee",
  VK_ROOT_PATH + "inc/scrypto",
  VK_ROOT_PATH + "inc/vk_client_worker",
  VK_ROOT_PATH + "inc/crypto",
  VK_ROOT_PATH + "inc/proca",
  VK_ROOT_PATH + "vkmanager",
]

if CHIPSET in ['sdm439', 'sdm450', 'msm8953']:
  includes.append(QSEE_APP_DIR + "/securemsm/trustzone/qsapps/libs/applib/qsee/src")
  includes.append(QSEE_APP_DIR + "/api/boot/qfprom")

#------------------------------------------------------------------------------
# VK APP_CORE_ENTRY_SOURCES
#------------------------------------------------------------------------------
APP_CORE_ENTRY_SOURCES = [
  VK_ROOT_PATH + "app_main.c",
  VK_ROOT_PATH + "t2t_cmd_listener.c",
  VK_ROOT_PATH + "vkqsee_rpmb.c",
  VK_ROOT_PATH + "vkqsee_crypto.c",
  VK_ROOT_PATH + "vkqsee_fuse.c",
  VK_ROOT_PATH + "vk_cmd_listener.c",
  VK_ROOT_PATH + "vk_utils.c",
  VK_ROOT_PATH + "vk_packet_maker.c",
  VK_ROOT_PATH + "vk_vault_manager.c",
  VK_ROOT_PATH + "crypto/vk_crypto.c",
  VK_ROOT_PATH + "crypto/vk_crypto_cert.c",
  VK_ROOT_PATH + "crypto/vk_crypto_rsa.c",
  VK_ROOT_PATH + "crypto/vk_crypto_aes.c",
  VK_ROOT_PATH + "vk_client_worker/vk_cp_cmd_worker.c",
  VK_ROOT_PATH + "vk_client_worker/vk_kg_cmd_worker.c",
  VK_ROOT_PATH + "vk_client_worker/vk_everyman_cmd_worker.c",
  VK_ROOT_PATH + "qsee_printk.c",
  VK_ROOT_PATH + "vk_migration.c",
  VK_ROOT_PATH + "vk_prepare_service.c",
  VK_ROOT_PATH + "call_by_qseecom_uefi.c",
]


#------------------------------------------------------------------------------
# Library
#------------------------------------------------------------------------------
libs = []
SCRYPTO_PATH = ""

if hasattr(os.environ, 'USE_SCRYPTO'):
  if os.environ['USE_SCRYPTO'] == 'True':
    SCRYPTO_PATH = os.getenv("SCRYPTO_LIB_FILE")
    VK_LOGD("use_scrypto:" + os.environ['USE_SCRYPTO'])
if SCRYPTO_PATH == "":
  if CHIPSET in ['sm8250', 'sm7250' , 'sm6115', 'sm7225']:
    SCRYPTO_LIB = "scrypto_v2.5_x32_qsee_release.a"
  else:
    if CHIPSET in ['sdm439', 'msm8953']:
      SCRYPTO_LIB = "qualcomm_msm8953_scrypto_v2.1_x32_release.a"
    else:
      SCRYPTO_LIB = "scrypto_v2.4_x32_qsee_release.a"
  SCRYPTO_PATH = VK_ROOT_PATH + SCRYPTO_LIB

VK_LOGD("SCRYPTO_PATH:" + SCRYPTO_PATH)
libs.append(env.File(SCRYPTO_PATH.split()))


VK_LOGD("PROC:" + env['PROC'][0])
if 'scorpion' in env['PROC']:
  LIBC_PATH = "${MUSL32PATH}/lib/libc.a"
else:
  LIBC_PATH = "${MUSLPATH}/lib/libc.a"
libs.append(env.File(LIBC_PATH.split()))

if CHIPSET in ['sm7250', 'sm8250', 'sm7225']:
  PROCA_LIB = "pa_tz_api.a"
  PROCA_PATH = VK_ROOT_PATH + PROCA_LIB
  libs.append(env.File(PROCA_PATH.split()))

#------------------------------------------------------------------------------
# Add command to Imprint HMAC
#------------------------------------------------------------------------------
if CHIPSET in ['sm8250', 'sm7250', 'sm6115', 'sm7225']:
  VK_IMPRINT = "imprint256"
else:
  VK_IMPRINT = "imprint"
VK_IMPRINT_PATH = VK_ROOT_PATH + VK_IMPRINT

VK_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/' + "vaultkeeper.elf")
if CHIPSET in ['sm7250', 'sm7225']:
  VK_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/scorpion/' + "vaultkeeper.elf")
if CHIPSET in ['sm6115']:
  VK_ELF_PATH = env.subst('${OUT_DIR}/' + "vaultkeeper.elf")

VK_RUN_FIPS_TOOLS_COMMAND =  VK_IMPRINT_PATH + " " + VK_ELF_PATH

env.Append(LINKCOM = " && ")
env.Append(LINKCOM = VK_RUN_FIPS_TOOLS_COMMAND)
env.Replace(VK_RUN_FIPS_TOOLS_COMMAND = VK_IMPRINT_PATH + " " + VK_ELF_PATH)

#------------------------------------------------------------------------------
# Add metadata to image
#------------------------------------------------------------------------------
md = {
  'appName':    'vaultkeeper',
  'privileges': ['default',
                 'HWFuse',
                 'ProcessAuthenticator',
                ],
}

if 'scorpion' in env['PROC']:
  md['memoryType'] = 'Unprotected'

if CHIPSET in ['sdm845', 'sdm670', 'sdm855', 'sm6150', 'sm7150', 'sm7250', 'sm8250', 'sm6115', 'sm7225']:
  md['heapSize'] = 0x4a000
  md['stackSize'] = 0x4a000
  if CHIPSET in ['sm7250', 'sm6115', 'sm7225']:
    md['privileges'].append('System')

  vaultkeeper_units = env.SecureAppBuilder(
    sources = [ APP_CORE_ENTRY_SOURCES ],
    includes = includes,
    user_libs = libs,
    metadata = md,
    image = 'vaultkeeper',
  )
else:
  vaultkeeper_units = env.SecureAppBuilder(
    sources = [ APP_CORE_ENTRY_SOURCES ],
    includes = includes,
    user_libs = libs,
    metadata = md,
    image = 'vaultkeeper',
    heap_size = '0x4a000',
  )

if hasattr(env, 'IMAGE_ALIASES'):
  for image in env['IMAGE_ALIASES']:
    env.Alias(image, vaultkeeper_units)
else:
  env.Alias(aliases, vaultkeeper_units)
