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