#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------
import os
Import('env')
env = env.Clone()
kg_support_hdm = os.environ.get('KG_CHECK_HDM_SUPPORTED', 'no')

#------------------------------------------------------------------------------
# KG FUNC
#------------------------------------------------------------------------------
def KG_LOGD(str):
  print("\n\033[0;33;40m" +  "[KG_DBG] " + str + "\033[0;m\n")

if not hasattr(env, 'IMAGE_ALIASES'):
  aliases = []
  aliases = ['tz_kg',]
  env.Replace(OUT_DIR = '${BUILD_ROOT}/ssg/bsp/trustzone/qsapps/tz_kg/build')
  
if env.has_key('USES_NO_CP'):
  env.Append(CCFLAGS = ' -DUSES_NO_CP ')

KG_LOGD("HDM feature = " + kg_support_hdm)

if kg_support_hdm == 'yes':
  env.Append(CCFLAGS = ' -DKG_CHECK_HDM_SUPPORTED ')
  KG_LOGD("define KG_CHECK_HDM_SUPPORTED")

target_name = 'tz_kg'
app_name = 'tz_kg'

CHIPSET = env['RAW_CHIPSET']

SCRYPTO_LIB = os.environ['TZ_SCRYPTO_LIB32']

KG_LOGD("KG_CHECK_PROCA_SUPPORTED : " + os.environ['KG_CHECK_PROCA_SUPPORTED'])
#------------------------------------------------------------------------------
# We need to specify "neon" to generate SIMD instructions in 32-bit mode
#------------------------------------------------------------------------------
if env['PROC'] == 'scorpion':
  env.Append(CCFLAGS = " -mfpu=neon ")

env.Append(CCFLAGS = " -DCONFIG_QSEE")

env.RequirePrivateApi('SECUREMSM')

includes = [
          '#../../core/api/services',
          '#../../core/api/boot/qfprom',
          '#../../ssg/api/securemsm/trustzone/qsee',
          '#../../ssg/api/securemsm/trustzone/gp',
          '#../../ssg/securemsm/trustzone/qsapps/tz_kg/inc',
          os.environ['TZ_PROCA_HEADER_PATH'],
          os.environ['TZ_SCRYPTO_HEADER_PATH'],
          '#../../ssg/securemsm/tz_common/public',
          '#../../ssg/securemsm/tz_platform/public/tl',
          '#../../ssg/securemsm/tz_platform/vendor/QSEE/tl',
          '#../../ssg/securemsm/uclib/usr/legacy/secrsa/shared/src',
          '#../../ssg/securemsm/uclib/usr/legacy/secrsa/shared/inc',
          '#../../ssg/securemsm/uclib/usr/legacy/secmath/shared/inc',
           ]

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------
sources = [
        '../../tz_kg/src/app_main.c',
        '../../tz_kg/src/kg_hotp.c',
        '../../tz_kg/src/kg_hotp_cmd.c',
        '../../tz_kg/src/kg_dh.c',
        '../../tz_kg/src/kg_utils.c',
        '../../tz_kg/src/kg_rpmb.c',
        '../../tz_kg/src/kg_read_data.c',
        '../../tz_kg/src/base64.c',
        '../../tz_kg/src/kg_x509.c',
        '../../tz_kg/src/kg_policy.c',
        '../../tz_kg/src/kg_policy_cmd.c',
        '../../tz_kg/src/kg_dh_cmd.c',
        '../../tz_kg/src/kg_lock_cmd.c',
        '../../tz_kg/src/kg_state_cmd.c',
        '../../tz_kg/src/kg_init.c',
        '../../tz_kg/src/process_cmd.c',
        '../../tz_kg/src/kg_hdm_cmd.c',
        '../../tz_kg/src/tz_hdm_common_tl.c',
        '../../tz_kg/src/QSEE_TZ_Vendor.c'
]

#compile idl files
idl_files = env.Glob("../../hdm_idl/*.idl")
env.LoadToolScript("${BUILD_ROOT}/ssg/bsp/build/scripts/idlcompiler.py")
idl_output_dir = "../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)

# Deterministic TA build
# http://mosaic.sec.samsung.net/kms/comty.do?comtyId=428005508&menuId=821970986&postId=1344006823&page=view&type=LIST&access=ADDRESS
if os.getenv('SUPPORT_NEW_TA_BUILD','false') == 'true':
  env.Append(LINKFLAGS='-no-threads')

#-------------------------------------------------------------------------------
# Add Libraries to image
#-------------------------------------------------------------------------------
libs = env.File(SCRYPTO_LIB.split())

if env['PROC'] == 'scorpion':
  libca = env.SubstRealPath('${MUSL32PATH}/lib/libc.a')
else:
  libca = env.SubstRealPath('${MUSLPATH}/lib/libc.a')

libs.append(env.File(libca))

if os.environ['KG_CHECK_PROCA_SUPPORTED'] == 'TRUE':
  env.Append(CCFLAGS = ' -DKG_CHECK_PROCA_SUPPORTED')
  if env['PROC'] == 'scorpion':
    PROCA_LIB = os.environ['TZ_PROCA_LIB32']
  else:
    PROCA_LIB = os.environ['TZ_PROCA_LIB64']
  libs.append(env.File(PROCA_LIB.split()))
  KG_LOGD("PROCA_LIB : " + PROCA_LIB)
#------------------------------------------------------------------------------
# Add command to Imprint HMAC
#------------------------------------------------------------------------------
if env['CHIPSET'] in ['lahaina','kodiak']:
  KG_ELF_PATH = env.subst('${OUT_DIR}/' + "tz_kg.elf")

if env['CHIPSET'] in ['rennell','sdm855']:
  KG_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/' + "tz_kg.elf")

if env['CHIPSET'] == 'bitra':
  KG_ELF_PATH = env.subst('${OUT_DIR}/' + '${SHORT_BUILDPATH}/' + "scorpion/" +  "tz_kg.elf")

KG_RUN_FIPS_TOOLS_COMMAND = os.environ['TZ_SCRYPTO_TOOLS_IMPRINT'] + " " + KG_ELF_PATH
KG_LOGD("KG_RUN_FIPS_TOOLS_COMMAND:" + KG_RUN_FIPS_TOOLS_COMMAND)
env.Append(LINKCOM = " && ")
env.Append(LINKCOM = KG_RUN_FIPS_TOOLS_COMMAND)

#-------------------------------------------------------------------------------
# Add metadata to image
#-------------------------------------------------------------------------------
#if env['CHIPSET'] in ['lahina','rennell','bitra']:
if os.environ['KG_CHECK_PROCA_SUPPORTED'] == 'TRUE':
  md = {
   'appName':    app_name,
   'privileges': ['default',
                  'WhitelistBypass',
                  'HDMKG',
                  'System',
                  'ProcessAuthenticator',
                 ],
   'heapSize': 0x50000,
   'stackSize': 0x3000,
  }
else:
  md = {
   'appName':    app_name,
   'privileges': ['default',
                  'WhitelistBypass',
                  'HDMKG',
                  'System',
                 ],
   'heapSize': 0x50000,
   'stackSize': 0x3000,
  }

deploy_header_files = env.Glob('../inc/*')

tz_kg_units = env.SecureAppBuilder(
  sources = sources,
  includes = includes,
  metadata = md,
  image = target_name,
  user_libs = libs,
  deploy_sources = sources + ['SConscript'] + deploy_header_files
)

if hasattr(env, 'IMAGE_ALIASES'):
  for image in env['IMAGE_ALIASES']:
    env.Alias(image, tz_kg_units)
else:
  env.Alias(aliases, tz_kg_units)
