xref: /linux/security/ipe/policy.h (revision a430d95c5efa2b545d26a094eb5f624e36732af0)
154a88cd2SDeven Bowers /* SPDX-License-Identifier: GPL-2.0 */
254a88cd2SDeven Bowers /*
354a88cd2SDeven Bowers  * Copyright (C) 2020-2024 Microsoft Corporation. All rights reserved.
454a88cd2SDeven Bowers  */
554a88cd2SDeven Bowers #ifndef _IPE_POLICY_H
654a88cd2SDeven Bowers #define _IPE_POLICY_H
754a88cd2SDeven Bowers 
854a88cd2SDeven Bowers #include <linux/list.h>
954a88cd2SDeven Bowers #include <linux/types.h>
102261306fSDeven Bowers #include <linux/fs.h>
1154a88cd2SDeven Bowers 
1254a88cd2SDeven Bowers enum ipe_op_type {
1354a88cd2SDeven Bowers 	IPE_OP_EXEC = 0,
1454a88cd2SDeven Bowers 	IPE_OP_FIRMWARE,
1554a88cd2SDeven Bowers 	IPE_OP_KERNEL_MODULE,
1654a88cd2SDeven Bowers 	IPE_OP_KEXEC_IMAGE,
1754a88cd2SDeven Bowers 	IPE_OP_KEXEC_INITRAMFS,
1854a88cd2SDeven Bowers 	IPE_OP_POLICY,
1954a88cd2SDeven Bowers 	IPE_OP_X509,
2054a88cd2SDeven Bowers 	__IPE_OP_MAX,
2154a88cd2SDeven Bowers };
2254a88cd2SDeven Bowers 
2354a88cd2SDeven Bowers #define IPE_OP_INVALID __IPE_OP_MAX
2454a88cd2SDeven Bowers 
2554a88cd2SDeven Bowers enum ipe_action_type {
2654a88cd2SDeven Bowers 	IPE_ACTION_ALLOW = 0,
2754a88cd2SDeven Bowers 	IPE_ACTION_DENY,
2854a88cd2SDeven Bowers 	__IPE_ACTION_MAX
2954a88cd2SDeven Bowers };
3054a88cd2SDeven Bowers 
3154a88cd2SDeven Bowers #define IPE_ACTION_INVALID __IPE_ACTION_MAX
3254a88cd2SDeven Bowers 
3354a88cd2SDeven Bowers enum ipe_prop_type {
34a8a74df1SFan Wu 	IPE_PROP_BOOT_VERIFIED_FALSE,
35a8a74df1SFan Wu 	IPE_PROP_BOOT_VERIFIED_TRUE,
36e155858dSDeven Bowers 	IPE_PROP_DMV_ROOTHASH,
37e155858dSDeven Bowers 	IPE_PROP_DMV_SIG_FALSE,
38e155858dSDeven Bowers 	IPE_PROP_DMV_SIG_TRUE,
39*31f8c868SFan Wu 	IPE_PROP_FSV_DIGEST,
40*31f8c868SFan Wu 	IPE_PROP_FSV_SIG_FALSE,
41*31f8c868SFan Wu 	IPE_PROP_FSV_SIG_TRUE,
4254a88cd2SDeven Bowers 	__IPE_PROP_MAX
4354a88cd2SDeven Bowers };
4454a88cd2SDeven Bowers 
4554a88cd2SDeven Bowers #define IPE_PROP_INVALID __IPE_PROP_MAX
4654a88cd2SDeven Bowers 
4754a88cd2SDeven Bowers struct ipe_prop {
4854a88cd2SDeven Bowers 	struct list_head next;
4954a88cd2SDeven Bowers 	enum ipe_prop_type type;
5054a88cd2SDeven Bowers 	void *value;
5154a88cd2SDeven Bowers };
5254a88cd2SDeven Bowers 
5354a88cd2SDeven Bowers struct ipe_rule {
5454a88cd2SDeven Bowers 	enum ipe_op_type op;
5554a88cd2SDeven Bowers 	enum ipe_action_type action;
5654a88cd2SDeven Bowers 	struct list_head props;
5754a88cd2SDeven Bowers 	struct list_head next;
5854a88cd2SDeven Bowers };
5954a88cd2SDeven Bowers 
6054a88cd2SDeven Bowers struct ipe_op_table {
6154a88cd2SDeven Bowers 	struct list_head rules;
6254a88cd2SDeven Bowers 	enum ipe_action_type default_action;
6354a88cd2SDeven Bowers };
6454a88cd2SDeven Bowers 
6554a88cd2SDeven Bowers struct ipe_parsed_policy {
6654a88cd2SDeven Bowers 	const char *name;
6754a88cd2SDeven Bowers 	struct {
6854a88cd2SDeven Bowers 		u16 major;
6954a88cd2SDeven Bowers 		u16 minor;
7054a88cd2SDeven Bowers 		u16 rev;
7154a88cd2SDeven Bowers 	} version;
7254a88cd2SDeven Bowers 
7354a88cd2SDeven Bowers 	enum ipe_action_type global_default_action;
7454a88cd2SDeven Bowers 
7554a88cd2SDeven Bowers 	struct ipe_op_table rules[__IPE_OP_MAX];
7654a88cd2SDeven Bowers };
7754a88cd2SDeven Bowers 
7854a88cd2SDeven Bowers struct ipe_policy {
7954a88cd2SDeven Bowers 	const char *pkcs7;
8054a88cd2SDeven Bowers 	size_t pkcs7len;
8154a88cd2SDeven Bowers 
8254a88cd2SDeven Bowers 	const char *text;
8354a88cd2SDeven Bowers 	size_t textlen;
8454a88cd2SDeven Bowers 
8554a88cd2SDeven Bowers 	struct ipe_parsed_policy *parsed;
862261306fSDeven Bowers 
872261306fSDeven Bowers 	struct dentry *policyfs;
8854a88cd2SDeven Bowers };
8954a88cd2SDeven Bowers 
9054a88cd2SDeven Bowers struct ipe_policy *ipe_new_policy(const char *text, size_t textlen,
9154a88cd2SDeven Bowers 				  const char *pkcs7, size_t pkcs7len);
9254a88cd2SDeven Bowers void ipe_free_policy(struct ipe_policy *pol);
932261306fSDeven Bowers int ipe_update_policy(struct inode *root, const char *text, size_t textlen,
942261306fSDeven Bowers 		      const char *pkcs7, size_t pkcs7len);
952261306fSDeven Bowers int ipe_set_active_pol(const struct ipe_policy *p);
962261306fSDeven Bowers extern struct mutex ipe_policy_lock;
9754a88cd2SDeven Bowers 
9854a88cd2SDeven Bowers #endif /* _IPE_POLICY_H */
99