ima.h 6.2 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0-only */
M
Mimi Zohar 已提交
2 3 4 5 6 7 8 9
/*
 * Copyright (C) 2008 IBM Corporation
 * Author: Mimi Zohar <zohar@us.ibm.com>
 */

#ifndef _LINUX_IMA_H
#define _LINUX_IMA_H

10
#include <linux/kernel_read_file.h>
M
Mimi Zohar 已提交
11
#include <linux/fs.h>
12
#include <linux/security.h>
13
#include <linux/kexec.h>
M
Mimi Zohar 已提交
14 15
struct linux_binprm;

16 17 18
struct nsproxy;
struct task_struct;

19 20
#ifdef CONFIG_IMA
extern int ima_bprm_check(struct linux_binprm *bprm);
21
extern int ima_file_check(struct file *file, int mask);
22
extern void ima_post_create_tmpfile(struct inode *inode);
23 24
extern void ima_file_free(struct file *file);
extern int ima_file_mmap(struct file *file, unsigned long prot);
25
extern int ima_file_mprotect(struct vm_area_struct *vma, unsigned long prot);
26 27 28
extern int ima_load_data(enum kernel_load_data_id id, bool contents);
extern int ima_post_load_data(char *buf, loff_t size,
			      enum kernel_load_data_id id, char *description);
29 30
extern int ima_read_file(struct file *file, enum kernel_read_file_id id,
			 bool contents);
31 32
extern int ima_post_read_file(struct file *file, void *buf, loff_t size,
			      enum kernel_read_file_id id);
33
extern void ima_post_path_mknod(struct dentry *dentry);
34
extern int ima_file_hash(struct file *file, char *buf, size_t buf_size);
35
extern void ima_kexec_cmdline(int kernel_fd, const void *buf, int size);
36

37 38 39 40
#ifdef CONFIG_IMA_KEXEC
extern void ima_add_kexec_buffer(struct kimage *image);
#endif

41
#ifdef CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT
42
extern bool arch_ima_get_secureboot(void);
43
extern const char * const *arch_get_ima_policy(void);
44 45 46 47 48 49
#else
static inline bool arch_ima_get_secureboot(void)
{
	return false;
}

50 51 52 53
static inline const char * const *arch_get_ima_policy(void)
{
	return NULL;
}
54
#endif
55

56
#else
M
Mimi Zohar 已提交
57 58 59 60 61
static inline int ima_bprm_check(struct linux_binprm *bprm)
{
	return 0;
}

62
static inline int ima_file_check(struct file *file, int mask)
M
Mimi Zohar 已提交
63 64 65 66
{
	return 0;
}

67 68 69 70
static inline void ima_post_create_tmpfile(struct inode *inode)
{
}

M
Mimi Zohar 已提交
71 72 73 74 75 76 77 78 79
static inline void ima_file_free(struct file *file)
{
	return;
}

static inline int ima_file_mmap(struct file *file, unsigned long prot)
{
	return 0;
}
M
Mimi Zohar 已提交
80

81 82 83 84 85 86
static inline int ima_file_mprotect(struct vm_area_struct *vma,
				    unsigned long prot)
{
	return 0;
}

87 88 89 90 91 92 93 94
static inline int ima_load_data(enum kernel_load_data_id id, bool contents)
{
	return 0;
}

static inline int ima_post_load_data(char *buf, loff_t size,
				     enum kernel_load_data_id id,
				     char *description)
95 96 97 98
{
	return 0;
}

99 100
static inline int ima_read_file(struct file *file, enum kernel_read_file_id id,
				bool contents)
101 102 103 104
{
	return 0;
}

105 106 107 108 109 110
static inline int ima_post_read_file(struct file *file, void *buf, loff_t size,
				     enum kernel_read_file_id id)
{
	return 0;
}

111 112 113 114 115
static inline void ima_post_path_mknod(struct dentry *dentry)
{
	return;
}

116 117 118 119 120
static inline int ima_file_hash(struct file *file, char *buf, size_t buf_size)
{
	return -EOPNOTSUPP;
}

121
static inline void ima_kexec_cmdline(int kernel_fd, const void *buf, int size) {}
122
#endif /* CONFIG_IMA */
M
Mimi Zohar 已提交
123

124 125 126 127 128 129 130
#ifndef CONFIG_IMA_KEXEC
struct kimage;

static inline void ima_add_kexec_buffer(struct kimage *image)
{}
#endif

131
#ifdef CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS
132 133 134 135 136 137 138 139 140 141 142
extern void ima_post_key_create_or_update(struct key *keyring,
					  struct key *key,
					  const void *payload, size_t plen,
					  unsigned long flags, bool create);
#else
static inline void ima_post_key_create_or_update(struct key *keyring,
						 struct key *key,
						 const void *payload,
						 size_t plen,
						 unsigned long flags,
						 bool create) {}
143
#endif  /* CONFIG_IMA_MEASURE_ASYMMETRIC_KEYS */
144

M
Mimi Zohar 已提交
145
#ifdef CONFIG_IMA_APPRAISE
146
extern bool is_ima_appraise_enabled(void);
M
Mimi Zohar 已提交
147
extern void ima_inode_post_setattr(struct dentry *dentry);
148 149
extern int ima_inode_setxattr(struct dentry *dentry, const char *xattr_name,
		       const void *xattr_value, size_t xattr_value_len);
150 151 152 153
extern void ima_inode_post_setxattr(struct dentry *dentry,
				    const char *xattr_name,
				    const void *xattr_value,
				    size_t xattr_value_len);
154
extern int ima_inode_removexattr(struct dentry *dentry, const char *xattr_name);
155 156
extern void ima_inode_post_removexattr(struct dentry *dentry,
				       const char *xattr_name);
M
Mimi Zohar 已提交
157
#else
158 159 160 161 162
static inline bool is_ima_appraise_enabled(void)
{
	return 0;
}

M
Mimi Zohar 已提交
163 164 165 166
static inline void ima_inode_post_setattr(struct dentry *dentry)
{
	return;
}
167 168 169 170 171 172 173 174 175

static inline int ima_inode_setxattr(struct dentry *dentry,
				     const char *xattr_name,
				     const void *xattr_value,
				     size_t xattr_value_len)
{
	return 0;
}

176 177 178 179 180 181 182
static inline void ima_inode_post_setxattr(struct dentry *dentry,
					   const char *xattr_name,
					   const void *xattr_value,
					   size_t xattr_value_len)
{
}

183 184 185 186 187
static inline int ima_inode_removexattr(struct dentry *dentry,
					const char *xattr_name)
{
	return 0;
}
188 189 190 191 192

static inline void ima_inode_post_removexattr(struct dentry *dentry,
					      const char *xattr_name)
{
}
193
#endif /* CONFIG_IMA_APPRAISE */
194 195 196 197 198 199 200 201 202

#if defined(CONFIG_IMA_APPRAISE) && defined(CONFIG_INTEGRITY_TRUSTED_KEYRING)
extern bool ima_appraise_signature(enum kernel_read_file_id func);
#else
static inline bool ima_appraise_signature(enum kernel_read_file_id func)
{
	return false;
}
#endif /* CONFIG_IMA_APPRAISE && CONFIG_INTEGRITY_TRUSTED_KEYRING */
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256

struct ima_namespace {
	struct kref kref;
	struct ns_common ns;
	struct ucounts *ucounts;
	struct user_namespace *user_ns;
} __randomize_layout;

extern struct ima_namespace init_ima_ns;

#ifdef CONFIG_IMA_NS
struct ima_namespace *copy_ima_ns(unsigned long flags,
				  struct user_namespace *user_ns,
				  struct ima_namespace *old_ns);

void free_ima_ns(struct kref *kref);

int imans_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk);

static inline struct ima_namespace *get_ima_ns(struct ima_namespace *ns)
{
	if (ns)
		kref_get(&ns->kref);
	return ns;
}
static inline void put_ima_ns(struct ima_namespace *ns)
{
	if (ns)
		kref_put(&ns->kref, free_ima_ns);
}

#else
static inline struct ima_namespace *copy_ima_ns(unsigned long flags,
						struct user_namespace *user_ns,
						struct ima_namespace *old_ns)
{
	return old_ns;
}

static inline int imans_on_fork(struct nsproxy *nsproxy,
				struct task_struct *tsk)
{
	return 0;
}

static inline struct ima_namespace *get_ima_ns(struct ima_namespace *ns)
{
	return ns;
}

static inline void put_ima_ns(struct ima_namespace *ns)
{
}
#endif /* CONFIG_IMA_NS */
M
Mimi Zohar 已提交
257
#endif /* _LINUX_IMA_H */