# SPDX-License-Identifier: GPL-2.0-only
#
config INTEGRITY
	bool "Integrity subsystem"
	depends on SECURITY
	default y
	help
	  This option enables the integrity subsystem, which is comprised
	  of a number of different components including the Integrity
	  Measurement Architecture (IMA), Extended Verification Module
	  (EVM), IMA-appraisal extension, digital signature verification
	  extension and audit measurement log support.

	  Each of these components can be enabled/disabled separately.
	  Refer to the individual components for additional details.

if INTEGRITY

config INTEGRITY_SIGNATURE
	bool "Digital signature verification using multiple keyrings"
	default n
	select KEYS
	select SIGNATURE
	help
	  This option enables digital signature verification support
	  using multiple keyrings. It defines separate keyrings for each
	  of the different use cases - evm, ima, and modules.
	  Different keyrings improves search performance, but also allow
	  to "lock" certain keyring to prevent adding new keys.
	  This is useful for evm and module keyrings, when keys are
	  usually only added from initramfs.

config INTEGRITY_ASYMMETRIC_KEYS
	bool "Enable asymmetric keys support"
	depends on INTEGRITY_SIGNATURE
	default n
	select ASYMMETRIC_KEY_TYPE
	select ASYMMETRIC_PUBLIC_KEY_SUBTYPE
	select CRYPTO_RSA
	select X509_CERTIFICATE_PARSER
	help
	  This option enables digital signature verification using
	  asymmetric keys.

config INTEGRITY_TRUSTED_KEYRING
	bool "Require all keys on the integrity keyrings be signed"
	depends on SYSTEM_TRUSTED_KEYRING
	depends on INTEGRITY_ASYMMETRIC_KEYS
	default y
	help
	   This option requires that all keys added to the .ima and
	   .evm keyrings be signed by a key on the system trusted
	   keyring.

config INTEGRITY_PLATFORM_KEYRING
	bool "Provide keyring for platform/firmware trusted keys"
	depends on INTEGRITY_ASYMMETRIC_KEYS
	depends on SYSTEM_BLACKLIST_KEYRING
	help
	  Provide a separate, distinct keyring for platform trusted keys, which
	  the kernel automatically populates during initialization from values
	  provided by the platform for verifying the kexec'ed kerned image
	  and, possibly, the initramfs signature.

config INTEGRITY_MACHINE_KEYRING
	bool "Provide a keyring to which Machine Owner Keys may be added"
	depends on SECONDARY_TRUSTED_KEYRING
	depends on INTEGRITY_ASYMMETRIC_KEYS
	depends on SYSTEM_BLACKLIST_KEYRING
	depends on LOAD_UEFI_KEYS || LOAD_PPC_KEYS
	help
	  If set, provide a keyring to which Machine Owner Keys (MOK) may
	  be added. This keyring shall contain just MOK keys.  Unlike keys
	  in the platform keyring, keys contained in the .machine keyring will
	  be trusted within the kernel.

config INTEGRITY_CA_MACHINE_KEYRING
	bool "Enforce Machine Keyring CA Restrictions"
	depends on INTEGRITY_MACHINE_KEYRING
	default n
	help
	  The .machine keyring can be configured to enforce CA restriction
	  on any key added to it.  By default no restrictions are in place
	  and all Machine Owner Keys (MOK) are added to the machine keyring.
	  If enabled only CA keys are added to the machine keyring, all
	  other MOK keys load into the platform keyring.

config INTEGRITY_CA_MACHINE_KEYRING_MAX
	bool "Only CA keys without DigitialSignature usage set"
	depends on INTEGRITY_CA_MACHINE_KEYRING
	default n
	help
	  When selected, only load CA keys are loaded into the machine
	  keyring that contain the CA bit set along with the keyCertSign
	  Usage field.  Keys containing the digitialSignature Usage field
	  will not be loaded. The remaining MOK keys are loaded into the
	  .platform keyring.

config LOAD_UEFI_KEYS
	depends on INTEGRITY_PLATFORM_KEYRING
	depends on EFI
	def_bool y

config LOAD_IPL_KEYS
	depends on INTEGRITY_PLATFORM_KEYRING
	depends on S390
	def_bool y

config LOAD_PPC_KEYS
	bool "Enable loading of platform and blacklisted keys for POWER"
	depends on INTEGRITY_PLATFORM_KEYRING
	depends on PPC_SECURE_BOOT
	default y
	help
	  Enable loading of keys to the .platform keyring and blacklisted
	  hashes to the .blacklist keyring for powerpc based platforms.

config INTEGRITY_AUDIT
	bool "Enables integrity auditing support "
	depends on AUDIT
	default y
	help
	  In addition to enabling integrity auditing support, this
	  option adds a kernel parameter 'integrity_audit', which
	  controls the level of integrity auditing messages.
	  0 - basic integrity auditing messages (default)
	  1 - additional integrity auditing messages

	  Additional informational integrity auditing messages would
	  be enabled by specifying 'integrity_audit=1' on the kernel
	  command line.

source "security/integrity/ima/Kconfig"
source "security/integrity/evm/Kconfig"

endif   # if INTEGRITY
