# SPDX-License-Identifier: GPL-2.0-only
# IBM Integrity Measurement Architecture
#
config IMA
	bool "Integrity Measurement Architecture(IMA)"
	select SECURITYFS
	select CRYPTO
	select CRYPTO_HMAC
	select CRYPTO_SHA1
	select CRYPTO_HASH_INFO
	select TCG_TPM if HAS_IOMEM
	select TCG_TIS if TCG_TPM && X86
	select TCG_CRB if TCG_TPM && ACPI
	select TCG_IBMVTPM if TCG_TPM && PPC_PSERIES
	select INTEGRITY_AUDIT if AUDIT
	help
	  The Trusted Computing Group(TCG) runtime Integrity
	  Measurement Architecture(IMA) maintains a list of hash
	  values of executables and other sensitive system files,
	  as they are read or executed. If an attacker manages
	  to change the contents of an important system file
	  being measured, we can tell.

	  If your system has a TPM chip, then IMA also maintains
	  an aggregate integrity value over this list inside the
	  TPM hardware, so that the TPM can prove to a third party
	  whether or not critical system files have been modified.
	  Read <https://www.usenix.org/events/sec04/tech/sailer.html>
	  to learn more about IMA.
	  If unsure, say N.

config IMA_KEXEC
	bool "Enable carrying the IMA measurement list across a soft boot"
	depends on IMA && TCG_TPM && HAVE_IMA_KEXEC
	default n
	help
	   TPM PCRs are only reset on a hard reboot.  In order to validate
	   a TPM's quote after a soft boot, the IMA measurement list of the
	   running kernel must be saved and restored on boot.

	   Depending on the IMA policy, the measurement list can grow to
	   be very large.

config IMA_MEASURE_PCR_IDX
	int
	depends on IMA
	range 8 14
	default 10
	help
	  IMA_MEASURE_PCR_IDX determines the TPM PCR register index
	  that IMA uses to maintain the integrity aggregate of the
	  measurement list.  If unsure, use the default 10.

config IMA_LSM_RULES
	bool
	depends on IMA && AUDIT && (SECURITY_SELINUX || SECURITY_SMACK || SECURITY_APPARMOR)
	default y
	help
	  Disabling this option will disregard LSM based policy rules.

choice
	prompt "Default template"
	default IMA_NG_TEMPLATE
	depends on IMA
	help
	  Select the default IMA measurement template.

	  The original 'ima' measurement list template contains a
	  hash, defined as 20 bytes, and a null terminated pathname,
	  limited to 255 characters.  The 'ima-ng' measurement list
	  template permits both larger hash digests and longer
	  pathnames. The configured default template can be replaced
	  by specifying "ima_template=" on the boot command line.

	config IMA_NG_TEMPLATE
		bool "ima-ng (default)"
	config IMA_SIG_TEMPLATE
		bool "ima-sig"
endchoice

config IMA_DEFAULT_TEMPLATE
	string
	depends on IMA
	default "ima-ng" if IMA_NG_TEMPLATE
	default "ima-sig" if IMA_SIG_TEMPLATE

choice
	prompt "Default integrity hash algorithm"
	default IMA_DEFAULT_HASH_SHA1
	depends on IMA
	help
	   Select the default hash algorithm used for the measurement
	   list, integrity appraisal and audit log.  The compiled default
	   hash algorithm can be overwritten using the kernel command
	   line 'ima_hash=' option.

	config IMA_DEFAULT_HASH_SHA1
		bool "SHA1 (default)"
		depends on CRYPTO_SHA1=y

	config IMA_DEFAULT_HASH_SHA256
		bool "SHA256"
		depends on CRYPTO_SHA256=y

	config IMA_DEFAULT_HASH_SHA512
		bool "SHA512"
		depends on CRYPTO_SHA512=y

	config IMA_DEFAULT_HASH_WP512
		bool "WP512"
		depends on CRYPTO_WP512=y

	config IMA_DEFAULT_HASH_SM3
		bool "SM3"
		depends on CRYPTO_SM3_GENERIC=y
endchoice

config IMA_DEFAULT_HASH
	string
	depends on IMA
	default "sha1" if IMA_DEFAULT_HASH_SHA1
	default "sha256" if IMA_DEFAULT_HASH_SHA256
	default "sha512" if IMA_DEFAULT_HASH_SHA512
	default "wp512" if IMA_DEFAULT_HASH_WP512
	default "sm3" if IMA_DEFAULT_HASH_SM3

config IMA_WRITE_POLICY
	bool "Enable multiple writes to the IMA policy"
	depends on IMA
	default n
	help
	  IMA policy can now be updated multiple times.  The new rules get
	  appended to the original policy.  Have in mind that the rules are
	  scanned in FIFO order so be careful when you design and add new ones.

	  If unsure, say N.

config IMA_READ_POLICY
	bool "Enable reading back the current IMA policy"
	depends on IMA
	default y if IMA_WRITE_POLICY
	default n if !IMA_WRITE_POLICY
	help
	   It is often useful to be able to read back the IMA policy.  It is
	   even more important after introducing CONFIG_IMA_WRITE_POLICY.
	   This option allows the root user to see the current policy rules.

config IMA_APPRAISE
	bool "Appraise integrity measurements"
	depends on IMA
	default n
	help
	  This option enables local measurement integrity appraisal.
	  It requires the system to be labeled with a security extended
	  attribute containing the file hash measurement.  To protect
	  the security extended attributes from offline attack, enable
	  and configure EVM.

	  For more information on integrity appraisal refer to:
	  <http://linux-ima.sourceforge.net>
	  If unsure, say N.

config IMA_ARCH_POLICY
        bool "Enable loading an IMA architecture specific policy"
        depends on (KEXEC_SIG && IMA) || IMA_APPRAISE \
		   && INTEGRITY_ASYMMETRIC_KEYS
        default n
        help
          This option enables loading an IMA architecture specific policy
          based on run time secure boot flags.

config IMA_APPRAISE_BUILD_POLICY
	bool "IMA build time configured policy rules"
	depends on IMA_APPRAISE && INTEGRITY_ASYMMETRIC_KEYS
	default n
	help
	  This option defines an IMA appraisal policy at build time, which
	  is enforced at run time without having to specify a builtin
	  policy name on the boot command line.  The build time appraisal
	  policy rules persist after loading a custom policy.

	  Depending on the rules configured, this policy may require kernel
	  modules, firmware, the kexec kernel image, and/or the IMA policy
	  to be signed.  Unsigned files might prevent the system from
	  booting or applications from working properly.

config IMA_APPRAISE_REQUIRE_FIRMWARE_SIGS
	bool "Appraise firmware signatures"
	depends on IMA_APPRAISE_BUILD_POLICY
	default n
	help
	  This option defines a policy requiring all firmware to be signed,
	  including the regulatory.db.  If both this option and
	  CFG80211_REQUIRE_SIGNED_REGDB are enabled, then both signature
	  verification methods are necessary.

config IMA_APPRAISE_REQUIRE_KEXEC_SIGS
	bool "Appraise kexec kernel image signatures"
	depends on IMA_APPRAISE_BUILD_POLICY
	default n
	help
	  Enabling this rule will require all kexec'ed kernel images to
	  be signed and verified by a public key on the trusted IMA
	  keyring.

	  Kernel image signatures can not be verified by the original
	  kexec_load syscall.  Enabling this rule will prevent its
	  usage.

config IMA_APPRAISE_REQUIRE_MODULE_SIGS
	bool "Appraise kernel modules signatures"
	depends on IMA_APPRAISE_BUILD_POLICY
	default n
	help
	  Enabling this rule will require all kernel modules to be signed
	  and verified by a public key on the trusted IMA keyring.

	  Kernel module signatures can only be verified by IMA-appraisal,
	  via the finit_module syscall. Enabling this rule will prevent
	  the usage of the init_module syscall.

config IMA_APPRAISE_REQUIRE_POLICY_SIGS
	bool "Appraise IMA policy signature"
	depends on IMA_APPRAISE_BUILD_POLICY
	default n
	help
	  Enabling this rule will require the IMA policy to be signed and
	  and verified by a key on the trusted IMA keyring.

config IMA_APPRAISE_BOOTPARAM
	bool "ima_appraise boot parameter"
	depends on IMA_APPRAISE
	default y
	help
	  This option enables the different "ima_appraise=" modes
	  (eg. fix, log) from the boot command line.

config IMA_APPRAISE_MODSIG
	bool "Support module-style signatures for appraisal"
	depends on IMA_APPRAISE
	depends on INTEGRITY_ASYMMETRIC_KEYS
	select PKCS7_MESSAGE_PARSER
	select MODULE_SIG_FORMAT
	default n
	help
	   Adds support for signatures appended to files. The format of the
	   appended signature is the same used for signed kernel modules.
	   The modsig keyword can be used in the IMA policy to allow a hook
	   to accept such signatures.

config IMA_KEYRINGS_PERMIT_SIGNED_BY_BUILTIN_OR_SECONDARY
	bool "Permit keys validly signed by a built-in or secondary CA cert (EXPERIMENTAL)"
	depends on SYSTEM_TRUSTED_KEYRING
	depends on SECONDARY_TRUSTED_KEYRING
	depends on INTEGRITY_ASYMMETRIC_KEYS
	select INTEGRITY_TRUSTED_KEYRING
	default n
	help
	  Keys may be added to the IMA or IMA blacklist keyrings, if the
	  key is validly signed by a CA cert in the system built-in or
	  secondary trusted keyrings.

	  Intermediate keys between those the kernel has compiled in and the
	  IMA keys to be added may be added to the system secondary keyring,
	  provided they are validly signed by a key already resident in the
	  built-in or secondary trusted keyrings.

config IMA_BLACKLIST_KEYRING
	bool "Create IMA machine owner blacklist keyrings (EXPERIMENTAL)"
	depends on SYSTEM_TRUSTED_KEYRING
	depends on IMA_TRUSTED_KEYRING
	default n
	help
	   This option creates an IMA blacklist keyring, which contains all
	   revoked IMA keys.  It is consulted before any other keyring.  If
	   the search is successful the requested operation is rejected and
	   an error is returned to the caller.

config IMA_LOAD_X509
	bool "Load X509 certificate onto the '.ima' trusted keyring"
	depends on IMA_TRUSTED_KEYRING
	default n
	help
	   File signature verification is based on the public keys
	   loaded on the .ima trusted keyring. These public keys are
	   X509 certificates signed by a trusted key on the
	   .system keyring.  This option enables X509 certificate
	   loading from the kernel onto the '.ima' trusted keyring.

config IMA_X509_PATH
	string "IMA X509 certificate path"
	depends on IMA_LOAD_X509
	default "/etc/keys/x509_ima.der"
	help
	   This option defines IMA X509 certificate path.

config IMA_APPRAISE_SIGNED_INIT
	bool "Require signed user-space initialization"
	depends on IMA_LOAD_X509
	default n
	help
	   This option requires user-space init to be signed.

config IMA_MEASURE_ASYMMETRIC_KEYS
	bool
	depends on IMA
	depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
	default y

config IMA_QUEUE_EARLY_BOOT_KEYS
	bool
	depends on IMA_MEASURE_ASYMMETRIC_KEYS
	depends on SYSTEM_TRUSTED_KEYRING
	default y

config IMA_SECURE_AND_OR_TRUSTED_BOOT
       bool
       depends on IMA_ARCH_POLICY
       help
          This option is selected by architectures to enable secure and/or
          trusted boot based on IMA runtime policies.

config IMA_DISABLE_HTABLE
	bool "Disable htable to allow measurement of duplicate records"
	depends on IMA
	default n
	help
	   This option disables htable to allow measurement of duplicate records.
