# This file is part of the openHiTLS project.
#
# openHiTLS is licensed under the Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#     http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.


# ============================================================
# Current file defines all user-configurable options for the build.
# Tip: The indentation preceding the options may indicate the following relationships:
#   1. Parent-Child Relationships/Compilation Dependencies in Features:
#      For example, HITLS_CRYPTO_MD represents all HASH algorithms, HITLS_CRYPTO_MD5 represents the MD5 algorithm.
#      Enabling HITLS_CRYPTO_MD means enabling all hash algorithms, including MD5(HITLS_CRYPTO_MD5).
#      Conversely, HITLS_CRYPTO_MD5 depend on HITLS_CRYPTO_MD(For compilation), Therefore,
#      to enable and compile HITLS_CRYPTO_MD5, HITLS_CRYPTO_MD must also be enabled.
#      In our build system, when a user enables HITLS_CRYPTO_MD5, HITLS_CRYPTO_MD is automatically enabled.
#   2. Some Additional Features
#      For example, HITLS_CRYPTO_AES_PRECALC_TABLES is an additional feature for AES,
#      which enables the use of precalculated tables to improve performance.
# ============================================================

include_guard(GLOBAL)

# ============================================================
# Build Related Only Options
# ============================================================

option(HITLS_BUNDLE_LIB             "Bundle all libraries into single library"    OFF)
option(HITLS_BUILD_EXE              "Build executable"                            OFF)
option(HITLS_BUILD_BENCHMARK        "Build benchmark executable"                  OFF)
option(HITLS_BUILD_GEN_INFO         "Generate build information files"            OFF)
option(HITLS_BUILD_STATIC           "Build static libraries"                      ON)
option(HITLS_BUILD_SHARED           "Build shared libraries"                      ON)

# Ignore feature dependencies check
option(HITLS_SKIP_CONFIG_CHECK "Skip configuration checks for unsatisfied dependencies" OFF)

# preset profile (full, iso19790, none)
set(HITLS_BUILD_PROFILE       "full" CACHE STRING "Build profile (full, iso19790, none)")

# Compile/link options (Will be initialized in hitls_compile_options.cmake)
set(HITLS_COMPILE_OPTIONS     "" CACHE STRING "Compile options applied to all HiTLS targets (via add_compile_options).")
set(HITLS_SHARED_LINKER_FLAGS "" CACHE STRING "Linker flags applied to dynamic libraries via target_link_options.")
set(HITLS_EXE_LINKER_FLAGS    "" CACHE STRING "Linker flags applied to executable targets via target_link_options.")

# Platform options
set(HITLS_PLATFORM_ENDIAN   "" CACHE STRING "Endianness of the target platform (little|big). Auto-detected if not set.")
set(HITLS_PLATFORM_BITS     "" CACHE STRING "Bitness of the target platform (32|64). Auto-detected if not set.")
option(HITLS_PLATFORM_INT128                "Target compiler supports 128-bit integers" ON)
option(HITLS_AARCH64_PACIASP                "AArch64 PACIASP support" ON)

# ============================================================
# Feature Options
# ============================================================

# Variable options 
set(HITLS_EAL_INIT_OPTS "" CACHE STRING "Eal init options")
set(HITLS_CRYPTO_DRBG_GM_LEVEL "" CACHE STRING "Drbg gm level")
set(HITLS_SEED_DRBG_INIT_RAND_ALG "" CACHE STRING "DRBG Initial Random Algorithm Configuration")
set(HITLS_CONFIG_FILE "" CACHE STRING "Configuration file for Provider Only")

# -- ASM options ---
option(HITLS_ASM        "Enable assembly optimizations"                 OFF)
option(HITLS_ASM_ARMV8  "Enable ARMv8 assembly optimizations"           OFF)
option(HITLS_ASM_ARMV7  "Enable ARMv7 assembly optimizations"           OFF)
option(HITLS_ASM_X8664  "Enable x86_64 assembly optimizations"          OFF)
option(HITLS_ASM_X8664_AVX512  "Enable x86_64 AVX512 assembly optimizations" OFF)
option(HITLS_CRYPTO_ASM_CHECK        "Check for assembly optimizations" OFF)

# --- Top-Level Components ---
option(HITLS_BSL    "Build BSL (Basic Support Library)"  OFF)
option(HITLS_CRYPTO "Build Crypto library "              OFF)
option(HITLS_PKI    "Build PKI library "                 OFF)
option(HITLS_TLS    "Build TLS library "                 OFF)
option(HITLS_AUTH   "Build Authentication library "      OFF)

# --- BSL Features ---
option(HITLS_BSL_SAL                                           "SAL" OFF)
option(HITLS_BSL_SAL_DL                                        "SAL DL" OFF)
option(HITLS_BSL_SAL_FILE                                      "SAL FILE" OFF)
option(HITLS_BSL_SAL_LOCK                                      "SAL LOCK" OFF)
option(HITLS_BSL_SAL_MEM                                       "SAL MEM" OFF)
option(HITLS_BSL_SAL_NET                                       "SAL NET" OFF)
option(HITLS_BSL_SAL_STR                                       "SAL STR" OFF)
option(HITLS_BSL_SAL_THREAD                                    "SAL THREAD" OFF)
option(HITLS_BSL_SAL_TIME                                      "SAL TIME" OFF)
option(HITLS_BSL_SAL_PID                                       "SAL PID" OFF)
option(HITLS_BSL_SAL_IP                                        "SAL IP" OFF)
option(HITLS_BSL_SAL_LINUX                                     "SAL Linux" OFF)
option(HITLS_BSL_SAL_DARWIN                                    "SAL Darwin" OFF)
option(HITLS_ATOMIC_THREAD_LOCK                                "Use atomic operations for thread locking" OFF)
option(HITLS_BSL_ASN1                                          "ASN1" OFF)
option(HITLS_BSL_BASE64                                        "BASE64" OFF)
option(HITLS_BSL_BUFFER                                        "BUFFER" OFF)
option(HITLS_BSL_CONF                                          "CONF" OFF)
option(HITLS_BSL_ERR                                           "ERR" OFF)
option(HITLS_BSL_HASH                                          "HASH" OFF)
option(HITLS_BSL_INIT                                          "INIT" OFF)
option(HITLS_BSL_LIST                                          "LIST" OFF)
option(HITLS_BSL_LOG                                           "LOG" OFF)
option(HITLS_BSL_LOG_NO_FORMAT_STRING                          "BSL_LOG_NO_FORMAT_STRING" OFF)
option(HITLS_BSL_OBJ                                           "OBJ" OFF)
option(HITLS_BSL_OBJ_DEFAULT                                   "OBJ DEFAULT" OFF)
option(HITLS_BSL_OBJ_CUSTOM                                    "OBJ CUSTOM" OFF)
option(HITLS_BSL_PARAMS                                        "PARAMS" OFF)
option(HITLS_BSL_PEM                                           "PEM" OFF)
option(HITLS_BSL_PRINT                                         "PRINT" OFF)
option(HITLS_BSL_TLV                                           "TLV" OFF)
option(HITLS_BSL_UI                                            "UI" OFF)
option(HITLS_BSL_UIO                                           "UIO" OFF)
  option(HITLS_BSL_UIO_BUFFER                                    "UIO BUFFER" OFF)
  option(HITLS_BSL_UIO_FILE                                      "UIO FILE" OFF)
  option(HITLS_BSL_UIO_MEM                                       "UIO MEM" OFF)
  option(HITLS_BSL_UIO_PLT                                       "UIO PLT" OFF)
  option(HITLS_BSL_UIO_SCTP                                      "UIO SCTP" OFF)
  option(HITLS_BSL_UIO_TCP                                       "UIO TCP" OFF)
  option(HITLS_BSL_UIO_UDP                                       "UIO UDP" OFF)
  option(HITLS_BSL_UIO_MTU_QUERY                                 "UIO MTU QUERY" OFF)

# --- CRYPTO Features ---
## Eal
option(HITLS_CRYPTO_EAL                                        "EAL" OFF)
  option(HITLS_CRYPTO_EAL_REPORT                                 "EAL Report" ON)
  option(HITLS_CRYPTO_RAND_CB                                    "Random Callback" OFF)
  option(HITLS_CRYPTO_ENTROPY_GM_CF                              "GM Entropy Configuration" OFF)

## EalInit
option(HITLS_CRYPTO_EALINIT                                    "EAL INIT" OFF)
  option(HITLS_CRYPTO_AUXVAL                                     "Auxiliary Vector" ON)

## Md(Hash)
option(HITLS_CRYPTO_MD                                         "MD" OFF)
  option(HITLS_CRYPTO_MD5                                        "MD5" OFF)
  option(HITLS_CRYPTO_SHA1                                       "SHA1" OFF)
  option(HITLS_CRYPTO_SHA1_SMALL_MEM                             "SHA1 Small Memory" OFF)
  option(HITLS_CRYPTO_SHA2                                       "SHA2" OFF)
    option(HITLS_CRYPTO_SHA224                                     "SHA224" OFF)
    option(HITLS_CRYPTO_SHA256                                     "SHA256" OFF)
    option(HITLS_CRYPTO_SHA256_SMALL_MEM                           "SHA256 Small Memory" OFF)
    option(HITLS_CRYPTO_SHA384                                     "SHA384" OFF)
    option(HITLS_CRYPTO_SHA512                                     "SHA512" OFF)
    option(HITLS_CRYPTO_SHA512_SMALL_MEM                           "SHA512 Small Memory" OFF)
  option(HITLS_CRYPTO_SHA3                                       "SHA3" OFF)
  option(HITLS_CRYPTO_SM3                                        "SM3" OFF)
  option(HITLS_CRYPTO_SM3_SMALL_MEM                              "SM3 Small Memory" OFF)

## Md_mb
option(HITLS_CRYPTO_MD_MB                                      "Multi-Buffer MD" OFF)
  option(HITLS_CRYPTO_SHA2_MB                                    "SHA2 Multi-Buffer" OFF)
    option(HITLS_CRYPTO_SHA256_MB                                  "SHA256 Multi-Buffer" OFF)

## Mac
option(HITLS_CRYPTO_MAC                                        "MAC" OFF)
  option(HITLS_CRYPTO_HMAC                                       "HMAC" OFF)
  option(HITLS_CRYPTO_GMAC                                       "GMAC" OFF)
  option(HITLS_CRYPTO_CMAC                                       "CMAC" OFF)
    option(HITLS_CRYPTO_CMAC_AES                                   "CMAC AES" OFF)
    option(HITLS_CRYPTO_CMAC_SM4                                   "CMAC SM4" OFF)
  option(HITLS_CRYPTO_CBC_MAC                                    "CBC-MAC" OFF)
  option(HITLS_CRYPTO_SIPHASH                                    "SIPHASH" OFF)

## Hpke
option(HITLS_CRYPTO_HPKE                                       "HPKE" OFF)

## Kdf
option(HITLS_CRYPTO_KDF                                        "KDF" OFF)
  option(HITLS_CRYPTO_HKDF                                       "HKDF" OFF)
  option(HITLS_CRYPTO_PBKDF2                                     "PBKDF2" OFF)
  option(HITLS_CRYPTO_SCRYPT                                     "scrypt" OFF)
  option(HITLS_CRYPTO_KDFTLS12                                   "KDF TLS 1.2" OFF)

## Drbg
option(HITLS_CRYPTO_DRBG                                       "DRBG" OFF)
  option(HITLS_CRYPTO_DRBG_CTR                                   "DRBG CTR" OFF)
  option(HITLS_CRYPTO_DRBG_HASH                                  "DRBG HASH" OFF)
  option(HITLS_CRYPTO_DRBG_HMAC                                  "DRBG HMAC" OFF)
  option(HITLS_CRYPTO_DRBG_GM                                    "DRBG GM" OFF)

## Entropy
option(HITLS_CRYPTO_ENTROPY                                    "Entropy" OFF)
  option(HITLS_CRYPTO_ENTROPY_HARDWARE                           "Hardware Entropy" OFF)
  option(HITLS_CRYPTO_ENTROPY_DEVRANDOM                          "DevRandom Entropy" OFF)
  option(HITLS_CRYPTO_ENTROPY_GETENTROPY                         "getentropy() Entropy" OFF)
  option(HITLS_CRYPTO_ENTROPY_SYS                                "SysRandom Entropy" OFF)

## Modes
option(HITLS_CRYPTO_MODES                                      "Cipher Modes" OFF)
  option(HITLS_CRYPTO_GCM                                        "GCM" OFF)
  option(HITLS_CRYPTO_CBC                                        "CBC" OFF)
  option(HITLS_CRYPTO_CTR                                        "CTR" OFF)
  option(HITLS_CRYPTO_CCM                                        "CCM" OFF)
  option(HITLS_CRYPTO_ECB                                        "ECB" OFF)
  option(HITLS_CRYPTO_XTS                                        "XTS" OFF)
  option(HITLS_CRYPTO_CFB                                        "CFB" OFF)
    option(HITLS_CRYPTO_CFB128                                     "CFB128" OFF)
  option(HITLS_CRYPTO_OFB                                        "OFB" OFF)
  option(HITLS_CRYPTO_HCTR                                       "HCTR" OFF)
  option(HITLS_CRYPTO_CHACHA20POLY1305                           "CHACHA20-POLY1305" OFF)
  option(HITLS_CRYPTO_WRAP                                       "Key Wrap Mode" OFF)
  option(HITLS_CRYPTO_GHASH                                      "GHASH" OFF)

## Cipher
option(HITLS_CRYPTO_CIPHER                                     "Cipher" OFF)
  option(HITLS_CRYPTO_AES                                        "AES" OFF)
    option(HITLS_CRYPTO_AES_PRECALC_TABLES                         "AES Precalculated Tables" ON)
  option(HITLS_CRYPTO_SM4                                        "SM4" OFF)
  option(HITLS_CRYPTO_CHACHA20                                   "CHACHA20" OFF)

## Pkey
option(HITLS_CRYPTO_PKEY                                       "Public Key Cryptography" OFF)
  option(HITLS_CRYPTO_PKEY_CMP                                   "Public Key Compare" OFF)
  option(HITLS_CRYPTO_DSA                                        "DSA" OFF)
    option(HITLS_CRYPTO_DSA_CHECK                                  "DSA Check" OFF)
    option(HITLS_CRYPTO_DSA_CMP                                    "DSA Compare" OFF)
    option(HITLS_CRYPTO_DSA_GEN_PARA                               "DSA Parameter Generation" OFF)
  option(HITLS_CRYPTO_CURVE25519                                 "Curve25519" OFF)
    option(HITLS_CRYPTO_CURVE25519_CMP                             "Curve25519 Compare" OFF)
    option(HITLS_CRYPTO_ED25519                                    "Ed25519" OFF)
      option(HITLS_CRYPTO_ED25519_CHECK                              "Ed25519 Check" OFF)
    option(HITLS_CRYPTO_X25519                                     "X25519" OFF)
      option(HITLS_CRYPTO_X25519_CHECK                               "X25519 Check" OFF)
  option(HITLS_CRYPTO_RSA                                        "RSA" OFF)
    option(HITLS_CRYPTO_RSA_GEN                                    "RSA Generate" OFF)
    option(HITLS_CRYPTO_RSA_SIGN                                   "RSA Sign" OFF)
    option(HITLS_CRYPTO_RSA_VERIFY                                 "RSA Verify" OFF)
    option(HITLS_CRYPTO_RSA_RECOVER                                "RSA Recover" OFF)
    option(HITLS_CRYPTO_RSA_ENCRYPT                                "RSA Encrypt" OFF)
    option(HITLS_CRYPTO_RSA_DECRYPT                                "RSA Decrypt" OFF)
    option(HITLS_CRYPTO_RSA_PAD                                    "RSA Padding" OFF)
      option(HITLS_CRYPTO_RSA_NO_PAD                                 "RSA No Padding" OFF)
      option(HITLS_CRYPTO_RSAES_OAEP                                 "RSAES OAEP" OFF)
      option(HITLS_CRYPTO_RSAES_PKCSV15                              "RSAES PKCS#1 v1.5" OFF)
      option(HITLS_CRYPTO_RSAES_PKCSV15_TLS                          "RSAES PKCS#1 v1.5 TLS" OFF)
      option(HITLS_CRYPTO_RSA_EMSA_ISO9796_2                         "RSA EMSA ISO9796-2" OFF)
      option(HITLS_CRYPTO_RSA_EMSA_PKCSV15                           "RSA EMSA PKCS#1 v1.5" OFF)
      option(HITLS_CRYPTO_RSA_EMSA_PSS                               "RSA EMSA PSS" OFF)
    option(HITLS_CRYPTO_RSA_BLINDING                               "RSA Blinding" OFF)
    option(HITLS_CRYPTO_RSA_BSSA                                   "RSA BSSA" OFF)
    option(HITLS_CRYPTO_RSA_CMP                                    "RSA Compare" OFF)
    option(HITLS_CRYPTO_RSA_CHECK                                  "RSA Check" OFF)
    option(HITLS_CRYPTO_SP800_STRICT_CHECK                         "SP800-56B Strict Check" OFF)
  option(HITLS_CRYPTO_DH                                         "Diffie-Hellman" OFF)
    option(HITLS_CRYPTO_DH_CMP                                     "Diffie-Hellman Compare" OFF)
    option(HITLS_CRYPTO_DH_CHECK                                   "Diffie-Hellman Check" OFF)
  option(HITLS_CRYPTO_ECC                                        "Elliptic Curve Cryptography" OFF)
    option(HITLS_CRYPTO_ECC_CMP                                    "Elliptic Curve Compare" OFF)
    option(HITLS_CRYPTO_ECC_CHECK                                  "Elliptic Curve Check" OFF)
    option(HITLS_CRYPTO_CURVE_MONT                                 "Montgomery Curve" OFF)
      option(HITLS_CRYPTO_CURVE_MONT_NIST                            "Montgomery NIST Curve" OFF)
      option(HITLS_CRYPTO_CURVE_MONT_PRIME                           "Montgomery Prime Curve" OFF)
    option(HITLS_CRYPTO_CURVE_BP256R1                              "Brainpool P256r1" OFF)
    option(HITLS_CRYPTO_CURVE_BP384R1                              "Brainpool P384r1" OFF)
    option(HITLS_CRYPTO_CURVE_BP512R1                              "Brainpool P512r1" OFF)
    option(HITLS_CRYPTO_CURVE_NISTP192                             "NIST P-192" OFF)
    option(HITLS_CRYPTO_CURVE_NISTP224                             "NIST P-224" OFF)
    option(HITLS_CRYPTO_CURVE_NISTP256                             "NIST P-256" OFF)
    option(HITLS_CRYPTO_CURVE_NISTP384                             "NIST P-384" OFF)
    option(HITLS_CRYPTO_CURVE_NISTP521                             "NIST P-521" OFF)
    option(HITLS_CRYPTO_CURVE_SM2                                  "SM2 Curve" OFF)
    option(HITLS_CRYPTO_NIST_ECC_ACCELERATE                        "NIST ECC Accelerate" ON)
    option(HITLS_CRYPTO_NIST_USE_ACCEL                             "Use NIST ECC Accelerate" OFF)
  option(HITLS_CRYPTO_ECDSA                                      "Elliptic Curve Digital Signature Algorithm" OFF)
    option(HITLS_CRYPTO_ECDSA_CMP                                  "ECDSA Compare" OFF)
    option(HITLS_CRYPTO_ECDSA_CHECK                                "ECDSA Check" OFF)
  option(HITLS_CRYPTO_ECDH                                       "Elliptic Curve Diffie-Hellman" OFF)
    option(HITLS_CRYPTO_ECDH_CMP                                   "ECDH Compare" OFF)
    option(HITLS_CRYPTO_ECDH_CHECK                                 "ECDH Check" OFF)
  option(HITLS_CRYPTO_SM2                                        "SM2" OFF)
    option(HITLS_CRYPTO_SM2_SIGN                                   "SM2 Sign" OFF)
    option(HITLS_CRYPTO_SM2_CRYPT                                  "SM2 Cryptography" OFF)
    option(HITLS_CRYPTO_SM2_EXCH                                   "SM2 Key Exchange" OFF)
    option(HITLS_CRYPTO_SM2_CMP                                    "SM2 Compare" OFF)
    option(HITLS_CRYPTO_SM2_CHECK                                  "SM2 Check" OFF)
  option(HITLS_CRYPTO_SM9                                        "SM9 Public Key Encryption" OFF)
    option(HITLS_CRYPTO_SM9_CRYPT                                  "SM9 Cryptography" OFF)
    option(HITLS_CRYPTO_SM9_SIGN                                   "SM9 Sign" OFF)
    option(HITLS_CRYPTO_SM9_CMP                                    "SM9 Compare" OFF)
    option(HITLS_CRYPTO_SM9_CHECK                                  "SM9 Check" OFF)
  option(HITLS_CRYPTO_PAILLIER                                   "Paillier Cryptosystem" OFF)
  option(HITLS_CRYPTO_ELGAMAL                                    "ElGamal Public Key Encryption" OFF)
  option(HITLS_CRYPTO_LMS                                        "LMS" OFF)
    option(HITLS_CRYPTO_LMS_CHECK                                  "LMS Check" OFF)
  option(HITLS_CRYPTO_HSS                                        "HSS" OFF)
    option(HITLS_CRYPTO_HSS_CHECK                                  "HSS Check" OFF)
  option(HITLS_CRYPTO_XMSS                                       "XMSS" OFF)
    option(HITLS_CRYPTO_XMSS_CHECK                                 "XMSS Check" OFF)
  option(HITLS_CRYPTO_XMSSMT                                      "XMSSMT" OFF)
    option(HITLS_CRYPTO_XMSSMT_CHECK                               "XMSSMT Check" OFF)
  option(HITLS_CRYPTO_SLH_DSA                                    "SLH DSA" OFF)
    option(HITLS_CRYPTO_SLH_DSA_CHECK                              "SLH DSA Check" OFF)
  option(HITLS_CRYPTO_MLKEM                                      "MLKEM" OFF)
    option(HITLS_CRYPTO_MLKEM_CMP                                  "MLKEM Compare" OFF)
    option(HITLS_CRYPTO_MLKEM_CHECK                                "MLKEM Check" OFF)
  option(HITLS_CRYPTO_FRODOKEM                                   "FrodoKEM" OFF)
    option(HITLS_CRYPTO_FRODOKEM_CMP                               "FrodoKEM Compare" OFF)
  option(HITLS_CRYPTO_MCELIECE                                   "Classic McEliece" OFF)
    option(HITLS_CRYPTO_MCELIECE_CMP                               "Classic McEliece Compare" OFF)
  option(HITLS_CRYPTO_HYBRIDKEM                                  "Hybrid Key Encapsulation Mechanism" OFF)
  option(HITLS_CRYPTO_MLDSA                                      "MLDSA" OFF)
    option(HITLS_CRYPTO_MLDSA_CMP                                  "MLDSA Compare" OFF)
    option(HITLS_CRYPTO_MLDSA_CHECK                                "MLDSA Check" OFF)
  option(HITLS_CRYPTO_COMPOSITE                                  "Composite signatures" OFF)
    option(HITLS_CRYPTO_COMPOSITE_CHECK                            "Composite Check" OFF)
  option(HITLS_CRYPTO_ACVP_TESTS                                 "ACVP Tests" OFF)
  option(HITLS_SM2_PRECOMPUTE_512K_TBL                           "SM2 512K Precomputation Table" OFF)
## Provider
option(HITLS_CRYPTO_PROVIDER                                   "Provider" OFF)
  option(HITLS_CRYPTO_CMVP                                       "CMVP" OFF)
  option(HITLS_CRYPTO_CMVP_ISO19790                              "CMVP ISO 19790" OFF)
  option(HITLS_CRYPTO_CMVP_SM                                    "CMVP SM" OFF)
## Bn
option(HITLS_CRYPTO_BN                                         "BigNum" OFF)
  option(HITLS_CRYPTO_BN_BASIC                                   "BigNum Basic" OFF)
  option(HITLS_CRYPTO_BN_RAND                                    "BigNum Random" OFF)
  option(HITLS_CRYPTO_BN_PRIME                                   "BigNum Prime Generation" OFF)
  option(HITLS_CRYPTO_BN_RFC_PRIME                               "BigNum RFC Prime Generation" OFF)
  option(HITLS_CRYPTO_BN_COMBA                                   "BigNum Comba Multiplication" ON)
  option(HITLS_CRYPTO_BN_SMALL_MEM                               "BigNum Small Memory" OFF)
  option(HITLS_CRYPTO_BN_STR_CONV                                "BigNum String Conversion" OFF)
  option(HITLS_CRYPTO_BN_CB                                      "BigNum CB Multiplication" OFF)
  option(HITLS_CRYPTO_EAL_BN                                     "EAL BigNum" OFF)

## CodecsKey
option(HITLS_CRYPTO_CODECSKEY                                  "Key encoding/decoding (PKCS#8, etc.)" OFF)
  option(HITLS_CRYPTO_KEY_DECODE                                 "Key decoding" OFF)
  option(HITLS_CRYPTO_KEY_ENCODE                                 "Key encoding" OFF)
  option(HITLS_CRYPTO_KEY_EPKI                                   "Key EPKI" OFF)
  option(HITLS_CRYPTO_KEY_INFO                                   "Key info" OFF)

## DecodeChain
option(HITLS_CRYPTO_KEY_DECODE_CHAIN                           "Key decoding chain" OFF)

## Codecs
option(HITLS_CRYPTO_CODECS                                     "Codecs" OFF)

# --- Crypto Assembling Options ---
## BN
option(HITLS_CRYPTO_BN_ASM                                     "BigNum ASM" OFF)
option(HITLS_CRYPTO_BN_ARMV8                                   "BigNum ARMv8" OFF)
option(HITLS_CRYPTO_BN_X8664                                   "BigNum x86_64" OFF)
## Cipher
option(HITLS_CRYPTO_AES_ASM                                    "AES ASM" OFF)
option(HITLS_CRYPTO_AES_ARMV8                                  "AES ARMv8" OFF)
option(HITLS_CRYPTO_AES_X8664                                  "AES x86_64" OFF)
option(HITLS_CRYPTO_SM4_ASM                                    "SM4 ASM" OFF)
option(HITLS_CRYPTO_SM4_ARMV8                                  "SM4 ARMv8" OFF)
option(HITLS_CRYPTO_SM4_X8664                                  "SM4 x86_64" OFF)
option(HITLS_CRYPTO_CHACHA20_ASM                               "ChaCha20 ASM" OFF)
option(HITLS_CRYPTO_CHACHA20_ARMV8                             "ChaCha20 ARMv8" OFF)
option(HITLS_CRYPTO_CHACHA20_X8664                             "ChaCha20 x86_64" OFF)
option(HITLS_CRYPTO_CHACHA20_X8664_AVX512                      "ChaCha20 x86_64 AVX512" OFF)
## Cipher Modes
option(HITLS_CRYPTO_MODES_ASM                                  "Cipher Modes ASM" OFF)
option(HITLS_CRYPTO_MODES_ARMV8                                "Cipher Modes ARMv8" OFF)
option(HITLS_CRYPTO_MODES_X8664                                "Cipher Modes x86_64" OFF)
option(HITLS_CRYPTO_MODES_X8664_AVX512                         "Cipher Modes x86_64 AVX512" OFF)
option(HITLS_CRYPTO_GCM_ASM                                    "GCM ASM" OFF)
option(HITLS_CRYPTO_GCM_ARMV8                                  "GCM ARMv8" OFF)
option(HITLS_CRYPTO_GCM_X8664                                  "GCM x86_64" OFF)
option(HITLS_CRYPTO_CHACHA20POLY1305_ASM                       "ChaCha20-Poly1305 ASM" OFF)
option(HITLS_CRYPTO_CHACHA20POLY1305_X8664                     "ChaCha20-Poly1305 x86_64" OFF)
option(HITLS_CRYPTO_CHACHA20POLY1305_X8664_AVX512              "ChaCha20-Poly1305 x86_64 AVX512" OFF)
option(HITLS_CRYPTO_GHASH_ASM                                  "GHASH ASM" OFF)
option(HITLS_CRYPTO_GHASH_ARMV8                                "GHASH ARMv8" OFF)
option(HITLS_CRYPTO_GHASH_X8664                                "GHASH x86_64" OFF)
## HASH
option(HITLS_CRYPTO_MD5_ASM                                    "MD5 ASM" OFF)
option(HITLS_CRYPTO_MD5_X8664                                  "MD5 x86_64" OFF)
option(HITLS_CRYPTO_SHA1_ASM                                   "SHA1 ASM" OFF)
option(HITLS_CRYPTO_SHA1_ARMV8                                 "SHA1 ARMv8" OFF)
option(HITLS_CRYPTO_SHA1_X8664                                 "SHA1 x86_64" OFF)
option(HITLS_CRYPTO_SHA2_ASM                                   "SHA2 ASM" OFF)
option(HITLS_CRYPTO_SHA2_ARMV8                                 "SHA2 ARMv8" OFF)
option(HITLS_CRYPTO_SHA2_X8664                                 "SHA2 x86_64" OFF)
option(HITLS_CRYPTO_SHA256_ARMV8                               "SHA256 ARMv8" OFF)
option(HITLS_CRYPTO_SHA256_X8664                               "SHA256 x86_64" OFF)
option(HITLS_CRYPTO_SHA512_ARMV8                               "SHA512 ARMv8" OFF)
option(HITLS_CRYPTO_SHA512_X8664                               "SHA512 x86_64" OFF)
option(HITLS_CRYPTO_SHA3_ASM                                   "SHA3 ASM" OFF)
option(HITLS_CRYPTO_SHA3_ARMV8                                 "SHA3 ARMv8" OFF)
option(HITLS_CRYPTO_SM3_ASM                                    "SM3 ASM" OFF)
option(HITLS_CRYPTO_SM3_ARMV8                                  "SM3 ARMv8" OFF)
option(HITLS_CRYPTO_SM3_ARMV7                                  "SM3 ARMv7" OFF)
option(HITLS_CRYPTO_SM3_X8664                                  "SM3 x86_64" OFF)
## ECC
option(HITLS_CRYPTO_ECC_ASM                                    "ECC ASM" OFF)
option(HITLS_CRYPTO_ECC_ARMV8                                  "ECC ARMv8" OFF)
option(HITLS_CRYPTO_ECC_ARMV7                                  "ECC ARMv7" OFF)
option(HITLS_CRYPTO_ECC_X8664                                  "ECC x86_64" OFF)
option(HITLS_CRYPTO_CURVE_NISTP256_ASM                         "Curve NIST P-256 ASM" OFF)
option(HITLS_CRYPTO_CURVE_NISTP256_ARMV8                       "Curve NIST P-256 ARMv8" OFF)
option(HITLS_CRYPTO_CURVE_NISTP256_X8664                       "Curve NIST P-256 x86_64" OFF)
option(HITLS_CRYPTO_CURVE_NISTP384_ASM                         "Curve NIST P-384 ASM" OFF)
option(HITLS_CRYPTO_CURVE_NISTP384_ARMV8                       "Curve NIST P-384 ARMv8" OFF)
option(HITLS_CRYPTO_CURVE_NISTP384_X8664                       "Curve NIST P-384 x86_64" OFF)
option(HITLS_CRYPTO_CURVE_SM2_ASM                              "Curve SM2 ASM" OFF)
option(HITLS_CRYPTO_CURVE_SM2_ARMV8                            "Curve SM2 ARMv8" OFF)
option(HITLS_CRYPTO_CURVE_SM2_ARMV7                            "Curve SM2 ARMv7" OFF)
option(HITLS_CRYPTO_CURVE_SM2_X8664                            "Curve SM2 x86_64" OFF)
option(HITLS_CRYPTO_X25519_ASM                                 "X25519 ASM" OFF)
option(HITLS_CRYPTO_X25519_ARMV8                               "X25519 ARMv8" OFF)
option(HITLS_CRYPTO_X25519_ARMV8_NEON_INTERLEAVE               "X25519 ARMv8 NEON interleave" OFF)
option(HITLS_CRYPTO_X25519_X8664                               "X25519 x86_64" OFF)
## MLKEM
option(HITLS_CRYPTO_MLKEM_ASM                                  "MLKEM ASM" OFF)
option(HITLS_CRYPTO_MLKEM_ARMV8                                "MLKEM ARMv8" OFF)
## FRODOKEM
option(HITLS_CRYPTO_FRODOKEM_ASM                               "FrodoKEM ASM" OFF)
option(HITLS_CRYPTO_FRODOKEM_ARMV8                             "FrodoKEM ARMv8" OFF)

# --- PKI Features ---
## X509
option(HITLS_PKI_X509                                          "X509" OFF)
  option(HITLS_PKI_X509_CRT                                      "X509 Certificate" OFF)
    option(HITLS_PKI_X509_CRT_GEN                                  "X509 Certificate Generation" OFF)
    option(HITLS_PKI_X509_CRT_PARSE                                "X509 Certificate Parse" OFF)
    option(HITLS_PKI_X509_CRT_AUTH                                 "X509 Certificate Authority" OFF)
  option(HITLS_PKI_X509_CSR                                      "X509 CSR" OFF)
    option(HITLS_PKI_X509_CSR_GEN                                  "X509 CSR Generation" OFF)
    option(HITLS_PKI_X509_CSR_PARSE                                "X509 CSR Parse" OFF)
    option(HITLS_PKI_X509_CSR_ATTR                                 "X509 CSR Attribute" OFF)
    option(HITLS_PKI_X509_CSR_GET                                  "X509 CSR Get" OFF)
  option(HITLS_PKI_X509_CRL                                      "X509 CRL" OFF)
    option(HITLS_PKI_X509_CRL_GEN                                  "X509 CRL Generation" OFF)
    option(HITLS_PKI_X509_CRL_PARSE                                "X509 CRL Parse" OFF)
  option(HITLS_PKI_X509_VFY                                      "X509 Verify" OFF)
    option(HITLS_PKI_X509_VFY_DEFAULT                              "X509 Verify Default" OFF)
    option(HITLS_PKI_X509_VFY_CB                                   "X509 Verify Callback" OFF)
    option(HITLS_PKI_X509_VFY_LOCATION                             "X509 Verify Location" OFF)
    option(HITLS_PKI_X509_VFY_IDENTITY                             "X509 Verify Hostname" OFF)
    option(HITLS_PKI_X509_VFY_CRL_LITE                        "X509 Verify CRL Legacy" OFF)

## CMS
option(HITLS_PKI_CMS                                           "CMS" OFF)
  option(HITLS_PKI_CMS_DATA                                      "CMS Data" OFF)
  option(HITLS_PKI_CMS_DIGESTINFO                                "CMS DigestInfo" OFF)
  option(HITLS_PKI_CMS_SIGNEDDATA                                "CMS SignedData" OFF)
  option(HITLS_PKI_CMS_ENCRYPTDATA                               "CMS EncryptedData" OFF)

## PKCS12
option(HITLS_PKI_PKCS12                                        "PKCS12" OFF)
  option(HITLS_PKI_PKCS12_GEN                                    "PKCS12 Generation" OFF)
  option(HITLS_PKI_PKCS12_PARSE                                  "PKCS12 Parse" OFF)

## Info/Print
option(HITLS_PKI_INFO                                          "PKI Info" OFF)
  option(HITLS_PKI_INFO_DN_CONF                                  "PKI Info DN Config" OFF)
  option(HITLS_PKI_INFO_DN_HASH                                  "PKI Info DN Hash" OFF)
  option(HITLS_PKI_INFO_CRT                                      "PKI Info Certificate" OFF)
  option(HITLS_PKI_INFO_CSR                                      "PKI Info CSR" OFF)
  option(HITLS_PKI_INFO_CRL                                      "PKI Info CRL" OFF)

# --- TLS Features ---
option(HITLS_TLS_PROTO_TLS                                     "TLS Protocol TLS" OFF)
option(HITLS_TLS_PROTO_TLS_BASIC                               "TLS Protocol TLS Basic" OFF)
option(HITLS_TLS_PROTO_DTLS                                    "TLS Protocol DTLS" OFF)

## TLS Proto Version
option(HITLS_TLS_PROTO_VERSION                                 "TLS Protocol Versions" OFF)
  option(HITLS_TLS_PROTO_TLS12                                   "TLS Protocol TLS 1.2" OFF)
  option(HITLS_TLS_PROTO_TLS13                                   "TLS Protocol TLS 1.3" OFF)
  option(HITLS_TLS_PROTO_TLCP11                                  "TLS Protocol TLCP 1.1" OFF)
  option(HITLS_TLS_PROTO_DTLS12                                  "TLS Protocol DTLS 1.2" OFF)
  option(HITLS_TLS_PROTO_DTLCP11                                 "TLS Protocol DTLCP 1.1" OFF)

## TLS Host
option(HITLS_TLS_HOST                                          "TLS Host" OFF)
  option(HITLS_TLS_HOST_CLIENT                                   "TLS Host Client" OFF)
  option(HITLS_TLS_HOST_SERVER                                   "TLS Host Server" OFF)

## TLS Callback / Provider
option(HITLS_TLS_CALLBACK                                      "TLS Callback" OFF)
  option(HITLS_TLS_FEATURE_PROVIDER                              "TLS Feature Provider" OFF)
    option(HITLS_TLS_FEATURE_PROVIDER_HARD_CODING                  "TLS Feature Provider Hard Coding" OFF)
    option(HITLS_TLS_FEATURE_PROVIDER_DYNAMIC                      "TLS Feature Provider Dynamic" OFF)
  option(HITLS_TLS_CALLBACK_SAL                                  "TLS Callback SAL" OFF)
  option(HITLS_TLS_CALLBACK_CERT                                 "TLS Callback Cert" OFF)
  option(HITLS_TLS_CALLBACK_CRYPT                                "TLS Callback Crypt" OFF)
  option(HITLS_TLS_CALLBACK_CRYPT_HMAC_PRIMITIVES                "TLS Callback Crypt HMAC Primitives" OFF)

## TLS Features
option(HITLS_TLS_FEATURE                                       "TLS Feature" OFF)
  option(HITLS_TLS_FEATURE_RENEGOTIATION                         "TLS Feature Renegotiation" OFF)
  option(HITLS_TLS_FEATURE_ALPN                                  "TLS Feature ALPN" OFF)
  option(HITLS_TLS_FEATURE_SNI                                   "TLS Feature SNI" OFF)
  option(HITLS_TLS_FEATURE_PHA                                   "TLS Feature Post-Handshake Authentication" OFF)
  option(HITLS_TLS_FEATURE_PSK                                   "TLS Feature PSK" OFF)
  option(HITLS_TLS_FEATURE_SECURITY                              "TLS Feature Security" OFF)
  option(HITLS_TLS_FEATURE_INDICATOR                             "TLS Feature Indicator" OFF)
  option(HITLS_TLS_FEATURE_SESSION                               "TLS Feature Session" OFF)
    option(HITLS_TLS_FEATURE_SESSION_TICKET                        "TLS Feature Session Ticket" OFF)
    option(HITLS_TLS_FEATURE_SESSION_ID                            "TLS Feature Session ID" OFF)
    option(HITLS_TLS_FEATURE_SESSION_CACHE_CB                      "TLS Feature Session Cache Callback" OFF)
    option(HITLS_TLS_FEATURE_SESSION_CUSTOM_TICKET                 "TLS Feature Session Custom Ticket" OFF)
  option(HITLS_TLS_FEATURE_EXPORT_KEY_MATERIAL                   "TLS Feature Export Key Material" OFF)
  option(HITLS_TLS_FEATURE_MODE                                  "TLS Feature Mode" OFF)
    option(HITLS_TLS_FEATURE_MODE_FALL_BACK_SCSV                   "TLS Feature Mode Fall Back SCSV" OFF)
    option(HITLS_TLS_FEATURE_MODE_AUTO_RETRY                       "TLS Feature Mode Auto Retry" OFF)
    option(HITLS_TLS_FEATURE_MODE_ACCEPT_MOVING_WRITE_BUFFER       "TLS Feature Mode Accept Moving Write Buffer" OFF)
    option(HITLS_TLS_FEATURE_MODE_RELEASE_BUFFERS                  "TLS Feature Mode Release Buffers" OFF)
  option(HITLS_TLS_FEATURE_KEY_UPDATE                            "TLS Feature Key Update" OFF)
  option(HITLS_TLS_FEATURE_FLIGHT                                "TLS Feature Flight" OFF)
  option(HITLS_TLS_FEATURE_CERT_MODE                             "TLS Feature Cert Mode" OFF)
    option(HITLS_TLS_FEATURE_CERT_MODE_CLIENT_VERIFY               "TLS Feature Cert Mode Client Verify" OFF)
    option(HITLS_TLS_FEATURE_CERT_MODE_VERIFY_PEER                 "TLS Feature Cert Mode Verify Peer" OFF)
  option(HITLS_TLS_FEATURE_ANTI_REPLAY                           "TLS Feature Anti-Replay" OFF)
  option(HITLS_TLS_FEATURE_EXTENDED_MASTER_SECRET                "TLS Feature Extended Master Secret" OFF)
  option(HITLS_TLS_FEATURE_RECORD_SIZE_LIMIT                     "TLS Feature Record Size Limit" OFF)
  option(HITLS_TLS_FEATURE_KEM                                   "TLS Feature KEM" OFF)
  option(HITLS_TLS_FEATURE_CLIENT_HELLO_CB                       "TLS Feature Client Hello Callback" OFF)
  option(HITLS_TLS_FEATURE_CERT_CB                               "TLS Feature Cert Callback" OFF)
  option(HITLS_TLS_FEATURE_MAX_SEND_FRAGMENT                     "TLS Feature Max Send Fragment" OFF)
  option(HITLS_TLS_FEATURE_REC_INBUFFER_SIZE                     "TLS Feature Record Inbuffer Size" OFF)
  option(HITLS_TLS_FEATURE_CUSTOM_EXTENSION                      "TLS Feature Custom Extension" OFF)
  option(HITLS_TLS_FEATURE_CERTIFICATE_AUTHORITIES               "TLS Feature Certificate Authorities" OFF)
  option(HITLS_TLS_FEATURE_MTU_QUERY                             "TLS Feature MTU Query" OFF)
  option(HITLS_TLS_FEATURE_SM_TLS13                              "TLS Feature SM TLS 1.3" OFF)
  option(HITLS_TLS_FEATURE_DEFAULT_COOKIE                        "TLS Feature Default Cookie" OFF)
  option(HITLS_TLS_FEATURE_ETM                                   "TLS Feature Encrypt-Then-MAC" OFF)

## TLS Proto Module
option(HITLS_TLS_PROTO                                         "TLS Proto Module" OFF)
  option(HITLS_TLS_PROTO_CLOSE_STATE                             "TLS Proto Close State" OFF)
  option(HITLS_TLS_PROTO_DFX                                     "TLS Proto DFX" OFF)
    option(HITLS_TLS_PROTO_DFX_CHECK                               "TLS Proto DFX Check" OFF)
    option(HITLS_TLS_PROTO_DFX_INFO                                "TLS Proto DFX Info" OFF)
    option(HITLS_TLS_PROTO_DFX_ALERT_NUMBER                        "TLS Proto DFX Alert Number" OFF)
    option(HITLS_TLS_PROTO_DFX_SERVER_PREFER                       "TLS Proto DFX Server Prefer" OFF)

## TLS Config
option(HITLS_TLS_CONFIG                                        "TLS Config" OFF)
  option(HITLS_TLS_CONFIG_MANUAL_DH                              "TLS Config Manual DH" OFF)
  option(HITLS_TLS_CONFIG_CERT                                   "TLS Config Cert" OFF)
    option(HITLS_TLS_CONFIG_CERT_LOAD_FILE                         "TLS Config Cert Load File" OFF)
    option(HITLS_TLS_CONFIG_CERT_CALLBACK                          "TLS Config Cert Callback" OFF)
    option(HITLS_TLS_CONFIG_CERT_BUILD_CHAIN                       "TLS Config Cert Build Chain" OFF)
    option(HITLS_TLS_CONFIG_CERT_VERIFY_LOCATION                   "TLS Config Cert Verify Location" OFF)
    option(HITLS_TLS_CONFIG_CERT_CRL                               "TLS Config Cert CRL" OFF)
  option(HITLS_TLS_CONFIG_KEY_USAGE                              "TLS Config Key Usage" OFF)
  option(HITLS_TLS_CONFIG_STATE                                  "TLS Config State" OFF)
  option(HITLS_TLS_CONFIG_RECORD_PADDING                         "TLS Config Record Padding" OFF)
  option(HITLS_TLS_CONFIG_USER_DATA                              "TLS Config User Data" OFF)
  option(HITLS_TLS_CONFIG_CIPHER_SUITE                           "TLS Config Cipher Suite" OFF)
  option(HITLS_TLS_CONFIG_VERSION                                "TLS Config Version" OFF)

## TLS Connection
option(HITLS_TLS_CONNECTION                                    "TLS Connection" OFF)
  option(HITLS_TLS_CONNECTION_INFO_NEGOTIATION                   "TLS Connection Info Negotiation" OFF)

## TLS Cipher Suites
option(HITLS_TLS_SUITE                                         "TLS Cipher Suites" OFF)
  option(HITLS_TLS_SUITE_AES_128_GCM_SHA256                      "TLS Suite AES-128-GCM-SHA256 (TLS 1.3)" OFF)
  option(HITLS_TLS_SUITE_AES_256_GCM_SHA384                      "TLS Suite AES-256-GCM-SHA384 (TLS 1.3)" OFF)
  option(HITLS_TLS_SUITE_CHACHA20_POLY1305_SHA256                "TLS Suite CHACHA20-POLY1305-SHA256 (TLS 1.3)" OFF)
  option(HITLS_TLS_SUITE_AES_128_CCM_SHA256                      "TLS Suite AES-128-CCM-SHA256 (TLS 1.3)" OFF)
  option(HITLS_TLS_SUITE_AES_128_CCM_8_SHA256                    "TLS Suite AES-128-CCM-8-SHA256 (TLS 1.3)" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_128_CBC_SHA                "TLS Suite RSA-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_256_CBC_SHA                "TLS Suite RSA-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_128_CBC_SHA256             "TLS Suite RSA-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_256_CBC_SHA256             "TLS Suite RSA-AES-256-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_128_GCM_SHA256             "TLS Suite RSA-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_256_GCM_SHA384             "TLS Suite RSA-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_128_CCM                    "TLS Suite RSA-AES-128-CCM" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_128_CCM_8                  "TLS Suite RSA-AES-128-CCM-8" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_256_CCM                    "TLS Suite RSA-AES-256-CCM" OFF)
  option(HITLS_TLS_SUITE_RSA_WITH_AES_256_CCM_8                  "TLS Suite RSA-AES-256-CCM-8" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_128_GCM_SHA256         "TLS Suite DHE-RSA-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_256_GCM_SHA384         "TLS Suite DHE-RSA-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_128_CBC_SHA            "TLS Suite DHE-RSA-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_256_CBC_SHA            "TLS Suite DHE-RSA-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_128_CBC_SHA256         "TLS Suite DHE-RSA-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_256_CBC_SHA256         "TLS Suite DHE-RSA-AES-256-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_128_CCM                "TLS Suite DHE-RSA-AES-128-CCM" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_AES_256_CCM                "TLS Suite DHE-RSA-AES-256-CCM" OFF)
  option(HITLS_TLS_SUITE_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256   "TLS Suite DHE-RSA-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_DSS_WITH_AES_128_GCM_SHA256         "TLS Suite DHE-DSS-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_DSS_WITH_AES_256_GCM_SHA384         "TLS Suite DHE-DSS-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_DHE_DSS_WITH_AES_128_CBC_SHA            "TLS Suite DHE-DSS-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DHE_DSS_WITH_AES_256_CBC_SHA            "TLS Suite DHE-DSS-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DHE_DSS_WITH_AES_128_CBC_SHA256         "TLS Suite DHE-DSS-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_DSS_WITH_AES_256_CBC_SHA256         "TLS Suite DHE-DSS-AES-256-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_128_CBC_SHA        "TLS Suite ECDHE-ECDSA-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_256_CBC_SHA        "TLS Suite ECDHE-ECDSA-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256     "TLS Suite ECDHE-ECDSA-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384     "TLS Suite ECDHE-ECDSA-AES-256-CBC-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256     "TLS Suite ECDHE-ECDSA-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384     "TLS Suite ECDHE-ECDSA-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_128_CCM            "TLS Suite ECDHE-ECDSA-AES-128-CCM" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_AES_256_CCM            "TLS Suite ECDHE-ECDSA-AES-256-CCM" OFF)
  option(HITLS_TLS_SUITE_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 "TLS Suite ECDHE-ECDSA-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_AES_128_CBC_SHA          "TLS Suite ECDHE-RSA-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_AES_256_CBC_SHA          "TLS Suite ECDHE-RSA-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_AES_128_CBC_SHA256       "TLS Suite ECDHE-RSA-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_AES_256_CBC_SHA384       "TLS Suite ECDHE-RSA-AES-256-CBC-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_AES_128_GCM_SHA256       "TLS Suite ECDHE-RSA-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_AES_256_GCM_SHA384       "TLS Suite ECDHE-RSA-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 "TLS Suite ECDHE-RSA-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_DH_ANON_WITH_AES_128_CBC_SHA            "TLS Suite DH-ANON-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DH_ANON_WITH_AES_256_CBC_SHA            "TLS Suite DH-ANON-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DH_ANON_WITH_AES_128_CBC_SHA256         "TLS Suite DH-ANON-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_DH_ANON_WITH_AES_256_CBC_SHA256         "TLS Suite DH-ANON-AES-256-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_DH_ANON_WITH_AES_128_GCM_SHA256         "TLS Suite DH-ANON-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_DH_ANON_WITH_AES_256_GCM_SHA384         "TLS Suite DH-ANON-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDH_ANON_WITH_AES_128_CBC_SHA          "TLS Suite ECDH-ANON-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDH_ANON_WITH_AES_256_CBC_SHA          "TLS Suite ECDH-ANON-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_128_CBC_SHA                "TLS Suite PSK-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_256_CBC_SHA                "TLS Suite PSK-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_128_CBC_SHA256             "TLS Suite PSK-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_256_CBC_SHA384             "TLS Suite PSK-AES-256-CBC-SHA384" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_128_GCM_SHA256             "TLS Suite PSK-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_256_GCM_SHA384             "TLS Suite PSK-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_AES_256_CCM                    "TLS Suite PSK-AES-256-CCM" OFF)
  option(HITLS_TLS_SUITE_PSK_WITH_CHACHA20_POLY1305_SHA256       "TLS Suite PSK-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_128_CBC_SHA            "TLS Suite DHE-PSK-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_256_CBC_SHA            "TLS Suite DHE-PSK-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_128_CBC_SHA256         "TLS Suite DHE-PSK-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_256_CBC_SHA384         "TLS Suite DHE-PSK-AES-256-CBC-SHA384" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_128_GCM_SHA256         "TLS Suite DHE-PSK-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_256_GCM_SHA384         "TLS Suite DHE-PSK-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_128_CCM                "TLS Suite DHE-PSK-AES-128-CCM" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_AES_256_CCM                "TLS Suite DHE-PSK-AES-256-CCM" OFF)
  option(HITLS_TLS_SUITE_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256   "TLS Suite DHE-PSK-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_AES_128_CBC_SHA            "TLS Suite RSA-PSK-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_AES_256_CBC_SHA            "TLS Suite RSA-PSK-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_AES_128_CBC_SHA256         "TLS Suite RSA-PSK-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_AES_256_CBC_SHA384         "TLS Suite RSA-PSK-AES-256-CBC-SHA384" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_AES_128_GCM_SHA256         "TLS Suite RSA-PSK-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_AES_256_GCM_SHA384         "TLS Suite RSA-PSK-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256   "TLS Suite RSA-PSK-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_128_CBC_SHA          "TLS Suite ECDHE-PSK-AES-128-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_256_CBC_SHA          "TLS Suite ECDHE-PSK-AES-256-CBC-SHA" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_128_CBC_SHA256       "TLS Suite ECDHE-PSK-AES-128-CBC-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_256_CBC_SHA384       "TLS Suite ECDHE-PSK-AES-256-CBC-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_128_GCM_SHA256       "TLS Suite ECDHE-PSK-AES-128-GCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_256_GCM_SHA384       "TLS Suite ECDHE-PSK-AES-256-GCM-SHA384" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_AES_128_CCM_SHA256       "TLS Suite ECDHE-PSK-AES-128-CCM-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 "TLS Suite ECDHE-PSK-CHACHA20-POLY1305-SHA256" OFF)
  option(HITLS_TLS_SUITE_ECDHE_SM4_CBC_SM3                       "TLS Suite ECDHE-SM4-CBC-SM3" OFF)
  option(HITLS_TLS_SUITE_ECC_SM4_CBC_SM3                         "TLS Suite ECC-SM4-CBC-SM3" OFF)
  option(HITLS_TLS_SUITE_ECDHE_SM4_GCM_SM3                       "TLS Suite ECDHE-SM4-GCM-SM3" OFF)
  option(HITLS_TLS_SUITE_ECC_SM4_GCM_SM3                         "TLS Suite ECC-SM4-GCM-SM3" OFF)
  option(HITLS_TLS_SUITE_SM4_GCM_SM3                             "TLS Suite SM4-GCM-SM3" OFF)
  option(HITLS_TLS_SUITE_SM4_CCM_SM3                             "TLS Suite SM4-CCM-SM3" OFF)

## TLS Suite Cipher type
option(HITLS_TLS_SUITE_CIPHER                                  "TLS Suite Cipher" OFF)
  option(HITLS_TLS_SUITE_CIPHER_AEAD                             "TLS Suite Cipher AEAD" OFF)
  option(HITLS_TLS_SUITE_CIPHER_CBC                              "TLS Suite Cipher CBC" OFF)

## TLS Suite Key Exchange
option(HITLS_TLS_SUITE_KX                                      "TLS Suite Key Exchange" OFF)
  option(HITLS_TLS_SUITE_KX_ECDHE                                "TLS Suite Key Exchange ECDHE" OFF)
  option(HITLS_TLS_SUITE_KX_DHE                                  "TLS Suite Key Exchange DHE" OFF)
  option(HITLS_TLS_SUITE_KX_RSA                                  "TLS Suite Key Exchange RSA" OFF)

## TLS Suite Authentication
option(HITLS_TLS_SUITE_AUTH                                    "TLS Suite Authentication" OFF)
  option(HITLS_TLS_SUITE_AUTH_RSA                                "TLS Suite Auth RSA" OFF)
  option(HITLS_TLS_SUITE_AUTH_ECDSA                              "TLS Suite Auth ECDSA" OFF)
  option(HITLS_TLS_SUITE_AUTH_DSS                                "TLS Suite Auth DSS" OFF)
  option(HITLS_TLS_SUITE_AUTH_PSK                                "TLS Suite Auth PSK" OFF)
  option(HITLS_TLS_SUITE_AUTH_SM2                                "TLS Suite Auth SM2" OFF)

## TLS Maintain
option(HITLS_TLS_MAINTAIN                                      "TLS Maintain" OFF)
  option(HITLS_TLS_MAINTAIN_KEYLOG                               "TLS Maintain Key Log" OFF)

## TLS OTHER
option(HITLS_TLS_CAP_NO_STR                                    "TLS Capability No STR" OFF)
option(HITLS_TLS_EXTENSION_COOKIE                              "TLS Extension Cookie" OFF)

# --- AUTH Features ---
## PrivPass Token
option(HITLS_AUTH_PRIVPASS_TOKEN                               "PrivPass Token" OFF)
## OTP
option(HITLS_AUTH_OTP                                          "OTP" OFF)
## PAKE
option(HITLS_AUTH_PAKE                                         "PAKE" OFF)
  option(HITLS_AUTH_PAKE_CORE                                    "PAKE Core" OFF)
  option(HITLS_AUTH_SPAKE2PLUS                                   "SPAKE2+" OFF)

# --- APPS Features ---
option(HITLS_APP_SM_MODE                                       "SM Mode" OFF)