# SPDX-License-Identifier: GPL-2.0-only
#
# Key management configuration
#

menuconfig KEYS
	bool "Enable access key retention support"
	select ASSOCIATIVE_ARRAY
	help
	  This option provides support for retaining authentication tokens and
	  access keys in the kernel.

	  It also includes provision of methods by which such keys might be
	  associated with a process so that network filesystems, encryption
	  support and the like can find them.

	  Furthermore, a special type of key is available that acts as keyring:
	  a searchable sequence of keys. Each process is equipped with access
	  to five standard keyrings: UID-specific, GID-specific, session,
	  process and thread.

	  If you are unsure as to whether this is required, answer N.

if KEYS

config KEYS_REQUEST_CACHE
	bool "Enable temporary caching of the last request_key() result"
	help
	  This option causes the result of the last successful request_key()
	  call that didn't upcall to the kernel to be cached temporarily in the
	  task_struct.  The cache is cleared by exit and just prior to the
	  resumption of userspace.

	  This allows the key used for multiple step processes where each step
	  wants to request a key that is likely the same as the one requested
	  by the last step to save on the searching.

	  An example of such a process is a pathwalk through a network
	  filesystem in which each method needs to request an authentication
	  key.  Pathwalk will call multiple methods for each dentry traversed
	  (permission, d_revalidate, lookup, getxattr, getacl, ...).

config PERSISTENT_KEYRINGS
	bool "Enable register of persistent per-UID keyrings"
	help
	  This option provides a register of persistent per-UID keyrings,
	  primarily aimed at Kerberos key storage.  The keyrings are persistent
	  in the sense that they stay around after all processes of that UID
	  have exited, not that they survive the machine being rebooted.

	  A particular keyring may be accessed by either the user whose keyring
	  it is or by a process with administrative privileges.  The active
	  LSMs gets to rule on which admin-level processes get to access the
	  cache.

	  Keyrings are created and added into the register upon demand and get
	  removed if they expire (a default timeout is set upon creation).

config BIG_KEYS
	bool "Large payload keys"
	depends on TMPFS
	select CRYPTO_LIB_CHACHA20POLY1305
	help
	  This option provides support for holding large keys within the kernel
	  (for example Kerberos ticket caches).  The data may be stored out to
	  swapspace by tmpfs.

	  If you are unsure as to whether this is required, answer N.

config TRUSTED_KEYS
	tristate "TRUSTED KEYS"
	help
	  This option provides support for creating, sealing, and unsealing
	  keys in the kernel. Trusted keys are random number symmetric keys,
	  generated and sealed by a trust source selected at kernel boot-time.
	  Userspace will only ever see encrypted blobs.

	  If you are unsure as to whether this is required, answer N.

if TRUSTED_KEYS
source "security/keys/trusted-keys/Kconfig"
endif

config ENCRYPTED_KEYS
	tristate "ENCRYPTED KEYS"
	select CRYPTO
	select CRYPTO_AES
	select CRYPTO_CBC
	select CRYPTO_LIB_SHA256
	help
	  This option provides support for create/encrypting/decrypting keys
	  in the kernel.  Encrypted keys are instantiated using kernel
	  generated random numbers or provided decrypted data, and are
	  encrypted/decrypted with a 'master' symmetric key. The 'master'
	  key can be either a trusted-key or user-key type. Only encrypted
	  blobs are ever output to Userspace.

	  If you are unsure as to whether this is required, answer N.

config USER_DECRYPTED_DATA
	bool "Allow encrypted keys with user decrypted data"
	depends on ENCRYPTED_KEYS
	help
	  This option provides support for instantiating encrypted keys using
	  user-provided decrypted data.  The decrypted data must be hex-ascii
	  encoded.

	  If you are unsure as to whether this is required, answer N.

config KEY_DH_OPERATIONS
       bool "Diffie-Hellman operations on retained keys"
       select CRYPTO
       select CRYPTO_KDF800108_CTR
       select CRYPTO_DH
       help
	 This option provides support for calculating Diffie-Hellman
	 public keys and shared secrets using values stored as keys
	 in the kernel.

	 If you are unsure as to whether this is required, answer N.

config KEY_NOTIFICATIONS
	bool "Provide key/keyring change notifications"
	depends on WATCH_QUEUE
	help
	  This option provides support for getting change notifications
	  on keys and keyrings on which the caller has View permission.
	  This makes use of pipes to handle the notification buffer and
	  provides KEYCTL_WATCH_KEY to enable/disable watches.

endif # KEYS
