# SPDX-License-Identifier: GPL-2.0-only
#
# Integrity Policy Enforcement (IPE) configuration
#

menuconfig SECURITY_IPE
	bool "Integrity Policy Enforcement (IPE)"
	depends on SECURITY && SECURITYFS && AUDIT && AUDITSYSCALL
	select PKCS7_MESSAGE_PARSER
	select SYSTEM_DATA_VERIFICATION
	select IPE_PROP_DM_VERITY if DM_VERITY
	select IPE_PROP_DM_VERITY_SIGNATURE if DM_VERITY && DM_VERITY_VERIFY_ROOTHASH_SIG
	select IPE_PROP_FS_VERITY if FS_VERITY
	select IPE_PROP_FS_VERITY_BUILTIN_SIG if FS_VERITY && FS_VERITY_BUILTIN_SIGNATURES
	help
	  This option enables the Integrity Policy Enforcement LSM
	  allowing users to define a policy to enforce a trust-based access
	  control. A key feature of IPE is a customizable policy to allow
	  admins to reconfigure trust requirements on the fly.

	  If unsure, answer N.

if SECURITY_IPE
config IPE_BOOT_POLICY
	string "Integrity policy to apply on system startup"
	help
	  This option specifies a filepath to an IPE policy that is compiled
	  into the kernel. This policy will be enforced until a policy update
	  is deployed via the $securityfs/ipe/policies/$policy_name/active
	  interface.

	  If unsure, leave blank.

config IPE_POLICY_SIG_SECONDARY_KEYRING
	bool "IPE policy update verification with secondary keyring"
	default y
	depends on SECONDARY_TRUSTED_KEYRING
	help
	  Also allow the secondary trusted keyring to verify IPE policy
	  updates.

	  If unsure, answer Y.

config IPE_POLICY_SIG_PLATFORM_KEYRING
	bool "IPE policy update verification with platform keyring"
	default y
	depends on INTEGRITY_PLATFORM_KEYRING
	help
	  Also allow the platform keyring to verify IPE policy updates.

	  If unsure, answer Y.

menu "IPE Trust Providers"

config IPE_PROP_DM_VERITY
	bool "Enable support for dm-verity based on root hash"
	depends on DM_VERITY
	help
	  This option enables the 'dmverity_roothash' property within IPE
	  policies. The property evaluates to TRUE when a file from a dm-verity
	  volume is evaluated, and the volume's root hash matches the value
	  supplied in the policy.

config IPE_PROP_DM_VERITY_SIGNATURE
	bool "Enable support for dm-verity based on root hash signature"
	depends on DM_VERITY && DM_VERITY_VERIFY_ROOTHASH_SIG
	help
	  This option enables the 'dmverity_signature' property within IPE
	  policies. The property evaluates to TRUE when a file from a dm-verity
	  volume, which has been mounted with a valid signed root hash,
	  is evaluated.

	  If unsure, answer Y.

config IPE_PROP_FS_VERITY
	bool "Enable support for fs-verity based on file digest"
	depends on FS_VERITY
	help
	  This option enables the 'fsverity_digest' property within IPE
	  policies. The property evaluates to TRUE when a file is fsverity
	  enabled and its digest matches the supplied digest value in the
	  policy.

	  if unsure, answer Y.

config IPE_PROP_FS_VERITY_BUILTIN_SIG
	bool "Enable support for fs-verity based on builtin signature"
	depends on FS_VERITY && FS_VERITY_BUILTIN_SIGNATURES
	help
	  This option enables the 'fsverity_signature' property within IPE
	  policies. The property evaluates to TRUE when a file is fsverity
	  enabled and it has a valid builtin signature whose signing cert
	  is in the .fs-verity keyring.

	  if unsure, answer Y.

endmenu

config SECURITY_IPE_KUNIT_TEST
	bool "Build KUnit tests for IPE" if !KUNIT_ALL_TESTS
	depends on KUNIT=y
	default KUNIT_ALL_TESTS
	help
	  This builds the IPE KUnit tests.

	  KUnit tests run during boot and output the results to the debug log
	  in TAP format (https://testanything.org/). Only useful for kernel devs
	  running KUnit test harness and are not for inclusion into a
	  production build.

	  For more information on KUnit and unit tests in general please refer
	  to the KUnit documentation in Documentation/dev-tools/kunit/.

	  If unsure, say N.

endif
