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)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 exec_file_signature_is_dm_verity(const struct exec_file_signature_info *signature_info)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 exec_file_signature_is_verity(const struct exec_file_signature_info *signature_info)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 exec_file_signature_is_delete(const struct exec_file_signature_info *signature_info)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 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