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

config 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.

config KEYS_REQUEST_CACHE
	bool "Enable temporary caching of the last request_key() result"
	depends on KEYS
	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"
	depends on KEYS
	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 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"
	depends on 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"
	depends on KEYS
	select CRYPTO
	select CRYPTO_HMAC
	select CRYPTO_AES
	select CRYPTO_CBC
	select CRYPTO_SHA256
	select CRYPTO_RNG
	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"
       depends on 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 KEYS && 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.
