summaryrefslogtreecommitdiffstats
path: root/security/ipe/policy.c
diff options
context:
space:
mode:
authorLuca Boccassi <bluca@debian.org>2024-09-15 11:11:19 +0200
committerFan Wu <wufan@kernel.org>2024-10-17 20:46:10 +0200
commit02e2f9aa33e461468de02e35ad977bd7233960ae (patch)
tree1b05e9d1b3db1e4fb340f10111986e35ba59dec3 /security/ipe/policy.c
parentipe: also reject policy updates with the same version (diff)
downloadlinux-02e2f9aa33e461468de02e35ad977bd7233960ae.tar.xz
linux-02e2f9aa33e461468de02e35ad977bd7233960ae.zip
ipe: allow secondary and platform keyrings to install/update policies
The current policy management makes it impossible to use IPE in a general purpose distribution. In such cases the users are not building the kernel, the distribution is, and access to the private key included in the trusted keyring is, for obvious reason, not available. This means that users have no way to enable IPE, since there will be no built-in generic policy, and no access to the key to sign updates validated by the trusted keyring. Just as we do for dm-verity, kernel modules and more, allow the secondary and platform keyrings to also validate policies. This allows users enrolling their own keys in UEFI db or MOK to also sign policies, and enroll them. This makes it sensible to enable IPE in general purpose distributions, as it becomes usable by any user wishing to do so. Keys in these keyrings can already load kernels and kernel modules, so there is no security downgrade. Add a kconfig each, like dm-verity does, but default to enabled if the dependencies are available. Signed-off-by: Luca Boccassi <bluca@debian.org> Reviewed-by: Serge Hallyn <serge@hallyn.com> [FW: fixed some style issues] Signed-off-by: Fan Wu <wufan@kernel.org>
Diffstat (limited to 'security/ipe/policy.c')
-rw-r--r--security/ipe/policy.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/security/ipe/policy.c b/security/ipe/policy.c
index 4cea067adf6a..45f7d6a0ed23 100644
--- a/security/ipe/policy.c
+++ b/security/ipe/policy.c
@@ -169,9 +169,21 @@ struct ipe_policy *ipe_new_policy(const char *text, size_t textlen,
goto err;
}
- rc = verify_pkcs7_signature(NULL, 0, new->pkcs7, pkcs7len, NULL,
+ rc = verify_pkcs7_signature(NULL, 0, new->pkcs7, pkcs7len,
+#ifdef CONFIG_IPE_POLICY_SIG_SECONDARY_KEYRING
+ VERIFY_USE_SECONDARY_KEYRING,
+#else
+ NULL,
+#endif
VERIFYING_UNSPECIFIED_SIGNATURE,
set_pkcs7_data, new);
+#ifdef CONFIG_IPE_POLICY_SIG_PLATFORM_KEYRING
+ if (rc == -ENOKEY)
+ rc = verify_pkcs7_signature(NULL, 0, new->pkcs7, pkcs7len,
+ VERIFY_USE_PLATFORM_KEYRING,
+ VERIFYING_UNSPECIFIED_SIGNATURE,
+ set_pkcs7_data, new);
+#endif
if (rc)
goto err;
} else {