# SPDX-License-Identifier: GPL-2.0

config CRYPTO_HASH_INFO
	bool

config CRYPTO_LIB_UTILS
	tristate

config CRYPTO_LIB_AES
	tristate
	# Select dependencies of modes that are part of libaes.
	select CRYPTO_LIB_GF128HASH if CRYPTO_LIB_AES_GCM != n
	select CRYPTO_LIB_UTILS

config CRYPTO_LIB_AES_ARCH
	bool
	depends on CRYPTO_LIB_AES && !UML && !KMSAN
	default y if ARM
	default y if ARM64
	default y if PPC && (SPE || (PPC64 && VSX))
	default y if RISCV && 64BIT && TOOLCHAIN_HAS_VECTOR_CRYPTO && \
		     RISCV_EFFICIENT_VECTOR_UNALIGNED_ACCESS
	default y if S390
	default y if SPARC64
	default y if X86

config CRYPTO_LIB_AESCFB
	tristate
	select CRYPTO_LIB_AES
	select CRYPTO_LIB_UTILS

config CRYPTO_LIB_AES_CBC
	tristate
	select CRYPTO_LIB_AES
	help
	  The AES-CBC and AES-CBC-CTS library functions.

config CRYPTO_LIB_AES_CBC_MACS
	tristate
	select CRYPTO_LIB_AES
	help
	  The AES-CMAC, AES-XCBC-MAC, and AES-CBC-MAC library functions.  Select
	  this if your module uses any of the functions from
	  <crypto/aes-cbc-macs.h>.

config CRYPTO_LIB_AES_CCM
	tristate
	select CRYPTO_LIB_AES
	select CRYPTO_LIB_AES_CBC_MACS
	select CRYPTO_LIB_AES_CTR
	help
	  The AES-CCM library functions.

config CRYPTO_LIB_AES_CTR
	tristate
	select CRYPTO_LIB_AES
	help
	  The AES-CTR and AES-XCTR library functions.

config CRYPTO_LIB_AES_ECB
	tristate
	select CRYPTO_LIB_AES
	help
	  The AES-ECB library functions.

config CRYPTO_LIB_AES_GCM
	tristate
	select CRYPTO_LIB_AES
	select CRYPTO_LIB_AES_CTR
	help
	  The AES-GCM library functions.

config CRYPTO_LIB_AES_XTS
	tristate
	select CRYPTO_LIB_AES
	help
	  The AES-XTS library functions.

config CRYPTO_LIB_ARC4
	tristate

config CRYPTO_LIB_GF128MUL
	tristate

config CRYPTO_LIB_BLAKE2B
	tristate
	help
	  The BLAKE2b library functions.  Select this if your module uses any of
	  the functions from <crypto/blake2b.h>.

config CRYPTO_LIB_BLAKE2B_ARCH
	bool
	depends on CRYPTO_LIB_BLAKE2B && !UML
	default y if ARM && KERNEL_MODE_NEON

# BLAKE2s support is always built-in, so there's no CRYPTO_LIB_BLAKE2S option.

config CRYPTO_LIB_BLAKE2S_ARCH
	bool
	depends on !UML
	default y if ARM
	default y if X86_64

config CRYPTO_LIB_CHACHA
	tristate
	select CRYPTO_LIB_UTILS
	help
	  Enable the ChaCha library interface.  Select this if your module uses
	  chacha_crypt() or hchacha_block().

config CRYPTO_LIB_CHACHA_ARCH
	bool
	depends on CRYPTO_LIB_CHACHA && !UML && !KMSAN
	default y if ARM
	default y if ARM64
	default y if MIPS && CPU_MIPS32_R2
	default y if PPC64 && CPU_LITTLE_ENDIAN && VSX
	default y if RISCV && 64BIT && TOOLCHAIN_HAS_VECTOR_CRYPTO && \
		     RISCV_EFFICIENT_VECTOR_UNALIGNED_ACCESS
	default y if S390
	default y if X86_64

config CRYPTO_LIB_CURVE25519
	tristate
	select CRYPTO_LIB_UTILS
	help
	  The Curve25519 library functions.  Select this if your module uses any
	  of the functions from <crypto/curve25519.h>.

config CRYPTO_LIB_CURVE25519_ARCH
	bool
	depends on CRYPTO_LIB_CURVE25519 && !UML && !KMSAN
	default y if ARM && KERNEL_MODE_NEON && !CPU_BIG_ENDIAN
	default y if PPC64 && CPU_LITTLE_ENDIAN
	default y if X86_64

config CRYPTO_LIB_CURVE25519_GENERIC
	bool
	depends on CRYPTO_LIB_CURVE25519
	default y if !CRYPTO_LIB_CURVE25519_ARCH || ARM || X86_64

config CRYPTO_LIB_DES
	tristate

config CRYPTO_LIB_GF128HASH
	tristate
	help
	  The GHASH and POLYVAL library functions.  Select this if your module
	  uses any of the functions from <crypto/gf128hash.h>.

config CRYPTO_LIB_GF128HASH_ARCH
	bool
	depends on CRYPTO_LIB_GF128HASH && !UML
	default y if ARM && KERNEL_MODE_NEON
	default y if ARM64
	default y if PPC64 && VSX
	default y if RISCV && 64BIT && TOOLCHAIN_HAS_VECTOR_CRYPTO && \
		     RISCV_EFFICIENT_VECTOR_UNALIGNED_ACCESS
	default y if S390
	default y if X86_64

config CRYPTO_LIB_MD5
	tristate
	help
	  The MD5 and HMAC-MD5 library functions.  Select this if your module
	  uses any of the functions from <crypto/md5.h>.

config CRYPTO_LIB_MLDSA
	tristate
	select CRYPTO_LIB_SHA3
	help
	  The ML-DSA library functions.  Select this if your module uses any of
	  the functions from <crypto/mldsa.h>.

config CRYPTO_LIB_NH
	tristate
	help
	  Implementation of the NH almost-universal hash function, specifically
	  the variant of NH used in Adiantum.

config CRYPTO_LIB_NH_ARCH
	bool
	depends on CRYPTO_LIB_NH && !UML && !KMSAN
	default y if ARM && KERNEL_MODE_NEON
	default y if ARM64
	default y if X86_64

config CRYPTO_LIB_POLY1305
	tristate
	help
	  The Poly1305 library functions.  Select this if your module uses any
	  of the functions from <crypto/poly1305.h>.

config CRYPTO_LIB_POLY1305_ARCH
	bool
	depends on CRYPTO_LIB_POLY1305 && !UML && !KMSAN
	default y if ARM
	default y if ARM64
	default y if MIPS
	# The PPC64 code needs to be fixed to work in softirq context.
	default y if PPC64 && CPU_LITTLE_ENDIAN && VSX && BROKEN
	default y if RISCV
	default y if X86_64

# This symbol controls the inclusion of the Poly1305 generic code.  This differs
# from most of the other algorithms, which handle the generic code
# "automatically" via __maybe_unused.  This is needed so that the Adiantum code,
# which calls the poly1305_core_*() functions directly, can enable them.
config CRYPTO_LIB_POLY1305_GENERIC
	bool
	depends on CRYPTO_LIB_POLY1305
	# Enable if there's no arch impl or the arch impl requires the generic
	# impl as a fallback.  (Or if selected explicitly.)
	default y if !CRYPTO_LIB_POLY1305_ARCH || PPC64

config CRYPTO_LIB_POLY1305_RSIZE
	int
	default 2 if MIPS || RISCV
	default 11 if X86_64
	default 9 if ARM || ARM64
	default 1

config CRYPTO_LIB_CHACHA20POLY1305
	tristate
	select CRYPTO_LIB_CHACHA
	select CRYPTO_LIB_POLY1305
	select CRYPTO_LIB_UTILS

config CRYPTO_LIB_SHA1
	tristate
	help
	  The SHA-1 and HMAC-SHA1 library functions.  Select this if your module
	  uses any of the functions from <crypto/sha1.h>.

config CRYPTO_LIB_SHA1_ARCH
	bool
	depends on CRYPTO_LIB_SHA1 && !UML
	default y if ARM
	default y if ARM64
	default y if MIPS && CPU_CAVIUM_OCTEON
	default y if PPC
	default y if S390
	default y if SPARC64
	default y if X86_64

config CRYPTO_LIB_SHA256
	tristate
	help
	  The SHA-224, SHA-256, HMAC-SHA224, and HMAC-SHA256 library functions.
	  Select this if your module uses any of these functions from
	  <crypto/sha2.h>.

config CRYPTO_LIB_SHA256_ARCH
	bool
	depends on CRYPTO_LIB_SHA256 && !UML
	default y if ARM && !CPU_V7M
	default y if ARM64
	default y if MIPS && CPU_CAVIUM_OCTEON
	default y if PPC && SPE
	default y if RISCV && 64BIT && TOOLCHAIN_HAS_VECTOR_CRYPTO && \
		     RISCV_EFFICIENT_VECTOR_UNALIGNED_ACCESS
	default y if S390
	default y if SPARC64
	default y if X86_64

config CRYPTO_LIB_SHA512
	tristate
	help
	  The SHA-384, SHA-512, HMAC-SHA384, and HMAC-SHA512 library functions.
	  Select this if your module uses any of these functions from
	  <crypto/sha2.h>.

config CRYPTO_LIB_SHA512_ARCH
	bool
	depends on CRYPTO_LIB_SHA512 && !UML
	default y if ARM && !CPU_V7M
	default y if ARM64
	default y if MIPS && CPU_CAVIUM_OCTEON
	default y if RISCV && 64BIT && TOOLCHAIN_HAS_VECTOR_CRYPTO && \
		     RISCV_EFFICIENT_VECTOR_UNALIGNED_ACCESS
	default y if S390
	default y if SPARC64
	default y if X86_64

config CRYPTO_LIB_SHA3
	tristate
	select CRYPTO_LIB_UTILS
	help
	  The SHA3 library functions.  Select this if your module uses any of
	  the functions from <crypto/sha3.h>.

config CRYPTO_LIB_SHA3_ARCH
	bool
	depends on CRYPTO_LIB_SHA3 && !UML
	default y if ARM64
	default y if S390

config CRYPTO_LIB_SM3
	tristate
	help
	  The SM3 library functions.  Select this if your module uses any of the
	  functions from <crypto/sm3.h>.

config CRYPTO_LIB_SM3_ARCH
	bool
	depends on CRYPTO_LIB_SM3 && !UML
	default y if ARM64
	default y if RISCV && 64BIT && TOOLCHAIN_HAS_VECTOR_CRYPTO && \
		     RISCV_EFFICIENT_VECTOR_UNALIGNED_ACCESS
	default y if X86_64
