blob: 00c64f987452e4bd555c3c9e966eda962c16d2e5 [file] [log] [blame]
/* 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 */