/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /* * fs-verity (file-based verity) support * * Copyright (C) 2018 Google LLC */ #ifndef _UAPI_LINUX_FSVERITY_H #define _UAPI_LINUX_FSVERITY_H #include <linux/limits.h> #include <linux/ioctl.h> #include <linux/types.h> /* ========== Ioctls ========== */ struct fsverity_digest { __u16 digest_algorithm; __u16 digest_size; /* input/output */ __u8 digest[]; }; #define FS_IOC_ENABLE_VERITY _IO('f', 133) #define FS_IOC_MEASURE_VERITY _IOWR('f', 134, struct fsverity_digest) /* ========== On-disk format ========== */ #define FS_VERITY_MAGIC "FSVerity" /* Supported hash algorithms */ #define FS_VERITY_ALG_SHA256 1 #define FS_VERITY_ALG_SHA512 2 #define FS_VERITY_ALG_CRC32C 3 /* for integrity only */ /* Metadata stored near the end of fs-verity files, after the Merkle tree */ /* This structure is 64 bytes long */ struct fsverity_descriptor { __u8 magic[8]; /* must be FS_VERITY_MAGIC */ __u8 major_version; /* must be 1 */ __u8 minor_version; /* must be 0 */ __u8 log_data_blocksize;/* log2(data-bytes-per-hash), e.g. 12 for 4KB */ __u8 log_tree_blocksize;/* log2(tree-bytes-per-hash), e.g. 12 for 4KB */ __le16 data_algorithm; /* hash algorithm for data blocks */ __le16 tree_algorithm; /* hash algorithm for tree blocks */ __le32 flags; /* flags */ __le32 reserved1; /* must be 0 */ __le64 orig_file_size; /* size of the original, unpadded data */ __le16 auth_ext_count; /* number of authenticated extensions */ __u8 reserved2[30]; /* must be 0 */ }; /* followed by list of 'auth_ext_count' authenticated extensions */ /* * then followed by '__le16 unauth_ext_count' padded to next 8-byte boundary, * then a list of 'unauth_ext_count' (may be 0) unauthenticated extensions */ /* Extension types */ #define FS_VERITY_EXT_ROOT_HASH 1 #define FS_VERITY_EXT_SALT 2 #define FS_VERITY_EXT_PKCS7_SIGNATURE 3 #define FS_VERITY_EXT_ELIDE 4 #define FS_VERITY_EXT_PATCH 5 /* Header of each extension (variable-length metadata item) */ struct fsverity_extension { /* * Length in bytes, including this header but excluding padding to next * 8-byte boundary that is applied when advancing to the next extension. */ __le32 length; __le16 type; /* Type of this extension (see codes above) */ __le16 reserved; /* Reserved, must be 0 */ }; /* followed by the payload of 'length - 8' bytes */ /* Extension payload formats */ /* * FS_VERITY_EXT_ROOT_HASH payload is just a byte array, with size equal to the * digest size of the hash algorithm given in the fsverity_descriptor */ /* FS_VERITY_EXT_SALT payload is just a byte array, any size */ /* * FS_VERITY_EXT_PKCS7_SIGNATURE payload is a DER-encoded PKCS#7 message * containing the signed file measurement in the following format: */ struct fsverity_digest_disk { __le16 digest_algorithm; __le16 digest_size; __u8 digest[]; }; /* FS_VERITY_EXT_ELIDE payload */ struct fsverity_extension_elide { __le64 offset; __le64 length; }; /* FS_VERITY_EXT_PATCH payload */ struct fsverity_extension_patch { __le64 offset; /* followed by variable-length patch data */ }; /* Fields stored at the very end of the file */ struct fsverity_footer { __le32 desc_reverse_offset; /* distance to fsverity_descriptor */ __u8 magic[8]; /* FS_VERITY_MAGIC */ } __attribute__((packed)); #endif /* _UAPI_LINUX_FSVERITY_H */