1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (c) 2023 Huawei Device Co., Ltd.
4  */
5 #ifndef _EXEC_SIGNATURE_INFO_H
6 #define _EXEC_SIGNATURE_INFO_H
7 
8 #include <linux/types.h>
9 #include <linux/fs.h>
10 #include <linux/rbtree.h>
11 #include <linux/list.h>
12 
13 struct exec_segment_info {
14 	uintptr_t	file_offset;
15 	size_t	size;
16 };
17 
18 #define FILE_SIGNATURE_INVALID	0
19 #define FILE_SIGNATURE_FS_VERITY	1
20 #define FILE_SIGNATURE_DM_VERITY	2
21 #define FILE_SIGNATURE_MASK	0x0000000F
22 #define FILE_SIGNATURE_DELETE	0x80000000
23 
24 struct exec_file_signature_info {
25 	struct rb_node	rb_node;
26 	atomic_t	reference;
27 	unsigned int	type;
28 	uintptr_t	inode;
29 	unsigned int	code_segment_count;
30 	struct exec_segment_info	*code_segments;
31 };
32 
exec_file_signature_is_fs_verity(const struct exec_file_signature_info *signature_info)33 static inline bool exec_file_signature_is_fs_verity(const struct exec_file_signature_info *signature_info)
34 {
35 	return (signature_info->type & FILE_SIGNATURE_MASK) == FILE_SIGNATURE_FS_VERITY;
36 }
37 
exec_file_signature_is_dm_verity(const struct exec_file_signature_info *signature_info)38 static inline bool exec_file_signature_is_dm_verity(const struct exec_file_signature_info *signature_info)
39 {
40 	return (signature_info->type & FILE_SIGNATURE_MASK) == FILE_SIGNATURE_DM_VERITY;
41 }
42 
exec_file_signature_is_verity(const struct exec_file_signature_info *signature_info)43 static inline bool exec_file_signature_is_verity(const struct exec_file_signature_info *signature_info)
44 {
45 	return (signature_info->type & FILE_SIGNATURE_MASK) == FILE_SIGNATURE_DM_VERITY ||
46 		(signature_info->type & FILE_SIGNATURE_MASK) == FILE_SIGNATURE_FS_VERITY;
47 }
48 
exec_file_signature_is_delete(const struct exec_file_signature_info *signature_info)49 static inline bool exec_file_signature_is_delete(const struct exec_file_signature_info *signature_info)
50 {
51 	return !!(signature_info->type & FILE_SIGNATURE_DELETE);
52 }
53 
54 int parse_elf_code_segment_info(struct file *file, struct exec_file_signature_info **code_segment_info);
55 int get_exec_file_signature_info(struct file *file, bool is_exec, struct exec_file_signature_info **info_ptr);
56 int put_exec_file_signature_info(struct exec_file_signature_info *exec_info);
57 void delete_exec_file_signature_info(struct inode *file_node);
58 #endif
59