# 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
	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"
       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
