#===========================================================================
#  Copyright (c) 2011-2016, 2017 QUALCOMM Technologies Incorporated.
#  All Rights Reserved.
#  Qualcomm Confidential and Proprietary
#===========================================================================
#
#
# GENERAL DESCRIPTION
#    build script
#                      EDIT HISTORY FOR FILE
#
#  This section contains comments describing changes made to the module.
#  Notice that changes are listed in reverse chronological order.
#
# when       who     what, where, why
# --------   ---     ---------------------------------------------------------
#
#===============================================================================

#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------
import os

Import('env')
env = env.Clone()

#------------------------------------------------------------------------------
# MLDAP FUNC
#------------------------------------------------------------------------------
def MLDAP_LOGD(str):
  print("\n\033[0;33;40m" +  "[MLDAP_DBG] " + str + "\033[0;m\n")

CHIPSET = env['CHIPSET']

if os.path.exists(env['BUILD_ROOT'] + '/ssg'):
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/ssg"
else:
  QSEE_APP_DIR = env['BUILD_ROOT'] + "/core"

if CHIPSET in ['sdm660']:
  META_OPTION = 'exception'
else:
  META_OPTION = 'apply'

if not hasattr(env, 'IMAGE_ALIASES'):
  MLDAP_LOGD("Not Image_aliases")
  aliases = []
  aliases = ['mldap',]
  env.Replace(OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/mldap/build")
env.Replace(LIB_OUT_DIR = QSEE_APP_DIR + "/bsp/trustzone/qsapps/mldap/build/" + "${SHORT_BUILDPATH}")

#------------------------------------------------------------------------------
# We need to specify "neon" to generate SIMD instructions in 32-bit mode
#------------------------------------------------------------------------------
if env['PROC'] == 'scorpion':
  env.Append(CCFLAGS = " -mfpu=neon ")
os.environ['USE_ENCAPSULATED_TID'] = "FALSE"
os.environ['USE_QSEE'] = "TRUE"
os.environ['USE_DRKV2'] = "TRUE"

env.Append(CPPDEFINES=['USE_QSEE'])
env.Append(CPPDEFINES=['USE_DRKV2'])
env.Append(CPPDEFINES=['CONFIG_MSM8998'])

if CHIPSET in ['sdm660']:
  env.Append(CPPDEFINES=['USE_QSEE_WRAP_WITH_SFS'])

env.Append(CFLAGS = ' -fstack-protector -fstack-protector-all')
env.Append(CCFLAGS = " -Wno-error -Wno-unused-value ")

#------------------------------------------------------------------------------
# MLDAP Source PATH
#------------------------------------------------------------------------------
MLDAP_ROOT_PATH = QSEE_APP_DIR + "/securemsm/trustzone/qsapps/mldap/"

#------------------------------------------------------------------------------
# MLDAP includes
#------------------------------------------------------------------------------
includes = [
    "${INC_ROOT}/core/api/services",
    QSEE_APP_DIR + "/api/securemsm/trustzone/qsee",
    MLDAP_ROOT_PATH + "src",
    MLDAP_ROOT_PATH + "src/x509",
    MLDAP_ROOT_PATH + "src/crypto/include",
    MLDAP_ROOT_PATH + "src/qsee",
    MLDAP_ROOT_PATH + "src/base64",
    MLDAP_ROOT_PATH + "src/wb",
    MLDAP_ROOT_PATH + "src/include",
]

#----------------------------------------------------------------------------
# App core Objects
#----------------------------------------------------------------------------
#compile idl files
#idl_files = env.Glob("../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)

sources = [
    MLDAP_ROOT_PATH + "src/qsee/qsee_agent_main.c",
    MLDAP_ROOT_PATH + "src/CryptoPlatform.c",
    MLDAP_ROOT_PATH + "src/CommandHandler.c",
    MLDAP_ROOT_PATH + "src/qsee/CryptoPlatformQSEE.c",
    MLDAP_ROOT_PATH + "src/qsee/SfsFileOperations.c",
    MLDAP_ROOT_PATH + "src/ServiceName.c",
    MLDAP_ROOT_PATH + "src/TLV.c",

    MLDAP_ROOT_PATH + "src/crypto/sec_alloc.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_wrapper.c",
    MLDAP_ROOT_PATH + "src/crypto/rsa/rsa_wrapper.c",
    MLDAP_ROOT_PATH + "src/crypto/mem_clr.c",

    MLDAP_ROOT_PATH + "src/x509/asn1.c",
    MLDAP_ROOT_PATH + "src/x509/asn1rsa.c",
    MLDAP_ROOT_PATH + "src/x509/asn1ec.c",
    MLDAP_ROOT_PATH + "src/x509/asn1gen.c",
    MLDAP_ROOT_PATH + "src/x509/x509v3.c",
    MLDAP_ROOT_PATH + "src/x509/da_cert_parcer.c",
    MLDAP_ROOT_PATH + "src/x509/da_cert_gencer.c",

    MLDAP_ROOT_PATH + "src/base64/base64.c",

    MLDAP_ROOT_PATH + "src/crypto/bn/bn_lib.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_ctx.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_rand.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_asm.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_word.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_add.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_mul.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_mod.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_div.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_exp.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_sqr.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_shift.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_mont.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_recp.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_gcd.c",
    MLDAP_ROOT_PATH + "src/crypto/bn/bn_prime.c",
    MLDAP_ROOT_PATH + "src/crypto/rand/rand_lib.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ec_key.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ec_lib.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ec_curve.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ec_cvt.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ec_mult.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ecp_mont.c",
    MLDAP_ROOT_PATH + "src/crypto/ec/ecp_smpl.c",
    MLDAP_ROOT_PATH + "src/crypto/rsa/rsa_gen.c",
    MLDAP_ROOT_PATH + "src/crypto/rsa/rsa.c",
    MLDAP_ROOT_PATH + "src/crypto/hash/sha512.c",
]
deploy_sources = []
deploy_sources.extend(sources)

libs = [
    File(env.SubstRealPath('${LLVMLIB}/libclang_rt.builtins-arm.a'))
]
if env["PROC"] == "scorpion":
    libs.append(File(env.SubstRealPath('${MUSL32PATH}/lib/libc.a')))
else:
    libs.append(File(env.SubstRealPath('${MUSLPATH}/lib/libc.a')))

target_name = 'mldap'
app_name = 'mldap'

#-------------------------------------------------------------------------------
# Add metadata to image
#-------------------------------------------------------------------------------
privileges = ['default',
                  'I2C',
                  'OEMUnwrapKeys',
                  'TestSandbox',
                  'CertValidate',
                  'SPI',
                  'SPCOM',
                  'TLMM',
                  'SecureDisplay',
                  'DebugPolicySource',
                  'IntMask',
                  'OEMBuf',
                  'TransNSAddr',
                  'NSSystemReg',
                  'HdcpEncryption',
                 ]

if META_OPTION != 'exception':
  privileges.append('RTICReport')

md = {
   'appName':    app_name,
   'privileges': privileges,
}

if META_OPTION != 'exception':
  md['totalStorageFiles'] = 2000
  md['storageFilesNoPersist'] = 'True'

if CHIPSET in ['sdm845', 'sdm670', 'sdm855', 'sm6150', 'sm7150', 'sm8250', 'saipan']:
  md['heapSize'] = 0x1B8000
  md['stackSize'] = 0x10000
  mldap_units = env.SecureAppBuilder(
    sources = sources,
    includes = includes,
    metadata = md,
    image = target_name,
    user_libs = libs,
  )
else:
  mldap_units = env.SecureAppBuilder(
    sources = sources,
    includes = includes,
    metadata = md,
    image = target_name,
    user_libs = libs,
    stack_size = '0x10000',
    heap_size = '0x1B8000',
  )

if hasattr(env, 'IMAGE_ALIASES'):
  for image in env['IMAGE_ALIASES']:
    env.Alias(image, mldap_units)
else:
  env.Alias(aliases, mldap_units)
