#
# Copyright 2018-2020 NXP
# SPDX-License-Identifier: Apache-2.0
#
# #############################################################
# This file is generated using a script
# #############################################################
#
IF(
    SSS_HAVE_APPLET_A71CH
     OR SSS_HAVE_APPLET_A71CL
     OR SSS_HAVE_APPLET_A71CH_SIM
     OR SSS_HAVE_APPLET_SE05X_A
     OR SSS_HAVE_APPLET_SE05X_B
     OR SSS_HAVE_APPLET_SE05X_C
     OR SSS_HAVE_APPLET_SE05X_L
     OR SSS_HAVE_APPLET_LOOPBACK
)
    SET(SSS_HAVE_APPLET ON)
ELSE()
    SET(SSS_HAVE_APPLET OFF)
ENDIF()
IF(SSS_HAVE_APPLET_SE05X_A OR SSS_HAVE_APPLET_SE05X_B OR SSS_HAVE_APPLET_SE05X_C)
    SET(SSS_HAVE_APPLET_SE05X_IOT ON)
ELSE()
    SET(SSS_HAVE_APPLET_SE05X_IOT OFF)
ENDIF()
IF(SSS_HAVE_MBEDTLS_ALT_SSS OR SSS_HAVE_MBEDTLS_ALT_A71CH)
    SET(SSS_HAVE_MBEDTLS_ALT ON)
ELSE()
    SET(SSS_HAVE_MBEDTLS_ALT OFF)
ENDIF()
IF(SSS_HAVE_HOSTCRYPTO_MBEDTLS OR SSS_HAVE_HOSTCRYPTO_MBEDCRYPTO OR SSS_HAVE_HOSTCRYPTO_OPENSSL OR SSS_HAVE_HOSTCRYPTO_USER)
    SET(SSS_HAVE_HOSTCRYPTO_ANY ON)
ELSE()
    SET(SSS_HAVE_HOSTCRYPTO_ANY OFF)
ENDIF()
IF(SSS_HAVE_FIPS_SE050 OR SSS_HAVE_FIPS_140_2 OR SSS_HAVE_FIPS_140_3)
    SET(SSS_HAVE_FIPS ON)
ELSE()
    SET(SSS_HAVE_FIPS OFF)
ENDIF()

IF(WithHost_frdmk64f AND SSS_HAVE_APPLET)
    IF(NOT (WithSMCOM_SCI2C OR WithSMCOM_T1oI2C OR WithSMCOM_T1oI2C_GP1_0))
        MESSAGE(
            FATAL_ERROR
                "One of 'WithSMCOM_SCI2C, WithSMCOM_T1oI2C, WithSMCOM_T1oI2C_GP1_0' must be set[for WithHost_frdmk64f AND SSS_HAVE_APPLET]."
        )
    ENDIF()
ENDIF(WithHost_frdmk64f AND SSS_HAVE_APPLET)

IF(WithHost_evkmimxrt1060 AND SSS_HAVE_APPLET)
    IF(NOT (WithSMCOM_SCI2C OR WithSMCOM_T1oI2C OR WithSMCOM_T1oI2C_GP1_0))
        MESSAGE(
            FATAL_ERROR
                "One of 'WithSMCOM_SCI2C, WithSMCOM_T1oI2C, WithSMCOM_T1oI2C_GP1_0' must be set[for WithHost_evkmimxrt1060 AND SSS_HAVE_APPLET]."
        )
    ENDIF()
ENDIF(WithHost_evkmimxrt1060 AND SSS_HAVE_APPLET)

IF(WithSSS_A71CH)
    MESSAGE(WARNING "Keyword 'WithSSS_A71CH' is deprecated.")
ENDIF()

IF(WithSSS_A71CL)
    MESSAGE(WARNING "Keyword 'WithSSS_A71CL' is deprecated.")
ENDIF()

IF(WithSSS_SE050)
    MESSAGE(WARNING "Keyword 'WithSSS_SE050' is deprecated.")
ENDIF()

IF(WithSSS_A71CH_SIM)
    MESSAGE(WARNING "Keyword 'WithSSS_A71CH_SIM' is deprecated.")
ENDIF()

IF(WithSSS_SE050_EAR_CL)
    MESSAGE(WARNING "Keyword 'WithSSS_SE050_EAR_CL' is deprecated.")
ENDIF()

IF(WithSSS_TESTCOUNTERPART)
    MESSAGE(WARNING "Keyword 'WithSSS_TESTCOUNTERPART' is deprecated.")
ENDIF()

IF(Applet_SE05X_Ver_01_01_00)
    MESSAGE(WARNING "Keyword 'Applet_SE05X_Ver_01_01_00' is deprecated.")
ENDIF()

IF(Applet_SE05X_Ver_01_02_00)
    MESSAGE(WARNING "Keyword 'Applet_SE05X_Ver_01_02_00' is deprecated.")
ENDIF()

IF(Applet_SE05X_Ver_02_00_00)
    MESSAGE(WARNING "Keyword 'Applet_SE05X_Ver_02_00_00' is deprecated.")
ENDIF()

IF(Applet_SE05X_Ver_02_01_00)
    MESSAGE(WARNING "Keyword 'Applet_SE05X_Ver_02_01_00' is deprecated.")
ENDIF()

IF(WithSMCOM_JRCP)
    MESSAGE(WARNING "Keyword 'WithSMCOM_JRCP' is deprecated.")
ENDIF()

IF(WithSMCOM_SOCKET)
    MESSAGE(WARNING "Keyword 'WithSMCOM_SOCKET' is deprecated.")
ENDIF()

IF(WithSSS_TestCounterPart)
    MESSAGE(WARNING "Keyword 'WithSSS_TestCounterPart' is deprecated.")
ENDIF()
SET(WithApplet_SE05X ${SSS_HAVE_APPLET_SE05X_IOT})
SET(WithApplet_SE050_A ${SSS_HAVE_APPLET_SE05X_A})
SET(WithApplet_SE050_B ${SSS_HAVE_APPLET_SE05X_B})
SET(WithApplet_SE050_C ${SSS_HAVE_APPLET_SE05X_C})
SET(SSS_HAVE_SE050_A ${SSS_HAVE_APPLET_SE05X_A})
SET(SSS_HAVE_SE050_B ${SSS_HAVE_APPLET_SE05X_B})
SET(SSS_HAVE_SE050_C ${SSS_HAVE_APPLET_SE05X_C})
SET(SSS_HAVE_SE05X ${SSS_HAVE_APPLET_SE05X_IOT})
SET(SSS_HAVE_SE ${SSS_HAVE_APPLET})
SET(SSS_HAVE_LOOPBACK ${SSS_HAVE_APPLET_LOOPBACK})
SET(SSS_HAVE_ALT ${SSS_HAVE_MBEDTLS_ALT})
SET(WithApplet_None ${SSS_HAVE_APPLET_NONE})
SET(SSS_HAVE_None ${SSS_HAVE_APPLET_NONE})
SET(WithApplet_A71CH ${SSS_HAVE_APPLET_A71CH})
SET(SSS_HAVE_A71CH ${SSS_HAVE_APPLET_A71CH})
SET(WithApplet_A71CL ${SSS_HAVE_APPLET_A71CL})
SET(SSS_HAVE_A71CL ${SSS_HAVE_APPLET_A71CL})
SET(WithApplet_A71CH_SIM ${SSS_HAVE_APPLET_A71CH_SIM})
SET(SSS_HAVE_A71CH_SIM ${SSS_HAVE_APPLET_A71CH_SIM})
SET(WithApplet_SE05X_A ${SSS_HAVE_APPLET_SE05X_A})
SET(SSS_HAVE_SE05X_A ${SSS_HAVE_APPLET_SE05X_A})
SET(WithApplet_SE05X_B ${SSS_HAVE_APPLET_SE05X_B})
SET(SSS_HAVE_SE05X_B ${SSS_HAVE_APPLET_SE05X_B})
SET(WithApplet_SE05X_C ${SSS_HAVE_APPLET_SE05X_C})
SET(SSS_HAVE_SE05X_C ${SSS_HAVE_APPLET_SE05X_C})
SET(WithApplet_SE05X_L ${SSS_HAVE_APPLET_SE05X_L})
SET(SSS_HAVE_SE05X_L ${SSS_HAVE_APPLET_SE05X_L})
SET(WithApplet_LoopBack ${SSS_HAVE_APPLET_LOOPBACK})
SET(SSS_HAVE_LoopBack ${SSS_HAVE_APPLET_LOOPBACK})
SET(SSS_HAVE_MBEDTLS ${SSS_HAVE_HOSTCRYPTO_MBEDTLS})
SET(SSS_HAVE_MBEDCRYPTO ${SSS_HAVE_HOSTCRYPTO_MBEDCRYPTO})
SET(SSS_HAVE_OPENSSL ${SSS_HAVE_HOSTCRYPTO_OPENSSL})
SET(SSS_HAVE_USER ${SSS_HAVE_HOSTCRYPTO_USER})
SET(SSS_HAVE_NONE ${SSS_HAVE_HOSTCRYPTO_NONE})
SET(SSS_HAVE_ALT_SSS ${SSS_HAVE_MBEDTLS_ALT_SSS})
SET(SSS_HAVE_ALT_A71CH ${SSS_HAVE_MBEDTLS_ALT_A71CH})
SET(SSS_HAVE_ALT_NONE ${SSS_HAVE_MBEDTLS_ALT_NONE})
SET(SSS_HAVE_SE05X_Auth_None ${SSS_HAVE_SE05X_AUTH_NONE})
SET(SSS_HAVE_SE05X_Auth_UserID ${SSS_HAVE_SE05X_AUTH_USERID})
SET(SSS_HAVE_SE05X_Auth_PlatfSCP03 ${SSS_HAVE_SE05X_AUTH_PLATFSCP03})
SET(SSS_HAVE_SE05X_Auth_AESKey ${SSS_HAVE_SE05X_AUTH_AESKEY})
SET(SSS_HAVE_SE05X_Auth_ECKey ${SSS_HAVE_SE05X_AUTH_ECKEY})
SET(SSS_HAVE_SE05X_Auth_UserID_PlatfSCP03 ${SSS_HAVE_SE05X_AUTH_USERID_PLATFSCP03})
SET(SSS_HAVE_SE05X_Auth_AESKey_PlatfSCP03 ${SSS_HAVE_SE05X_AUTH_AESKEY_PLATFSCP03})
SET(SSS_HAVE_SE05X_Auth_ECKey_PlatfSCP03 ${SSS_HAVE_SE05X_AUTH_ECKEY_PLATFSCP03})

# Version checks GTE - Greater Than Or Equal To
IF(SSS_HAVE_APPLET_SE05X_IOT)
    IF(SSS_HAVE_SE05X_VER_06_00)
         SET(SSS_HAVE_SE05X_VER_GTE_06_00 ON)
         SET(SSS_HAVE_SE05X_VER_GTE_03_XX ON)
    ENDIF()

    IF(SSS_HAVE_SE05X_VER_03_XX)
         SET(SSS_HAVE_SE05X_VER_GTE_06_00 OFF)
         SET(SSS_HAVE_SE05X_VER_GTE_03_XX ON)
    ENDIF()

ELSE() #SSS_HAVE_APPLET_SE05X_IOT
     SET(SSS_HAVE_SE05X_VER_GTE_03_XX OFF)
     SET(SSS_HAVE_SE05X_VER_GTE_06_00 OFF)
ENDIF() #SSS_HAVE_APPLET_SE05X_IOT
