# 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
	select INTEGRITY_CA_MACHINE_KEYRING if LOAD_PPC_KEYS
	select INTEGRITY_CA_MACHINE_KEYRING_MAX if 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
