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
13struct 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
24struct 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
33static 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
38static 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
43static 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
49static 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
54int parse_elf_code_segment_info(struct file *file, struct exec_file_signature_info **code_segment_info);
55int get_exec_file_signature_info(struct file *file, bool is_exec, struct exec_file_signature_info **info_ptr);
56int put_exec_file_signature_info(struct exec_file_signature_info *exec_info);
57void delete_exec_file_signature_info(struct inode *file_node);
58#endif
59