use std::os::fd::AsFd;
pub use composefs_ioctls::fsverity::{EnableVerityError, MeasureVerityError};
use super::FsVerityHashValue;
pub(super) fn fs_ioc_enable_verity<H: FsVerityHashValue>(
fd: impl AsFd,
) -> Result<(), EnableVerityError> {
composefs_ioctls::fsverity::fs_ioc_enable_verity(fd.as_fd(), H::ALGORITHM.kernel_id(), 4096)
}
pub(super) fn fs_ioc_measure_verity<H: FsVerityHashValue>(
fd: impl AsFd,
) -> Result<H, MeasureVerityError> {
let kid = H::ALGORITHM.kernel_id();
match kid {
1 => {
let digest: [u8; 32] =
composefs_ioctls::fsverity::fs_ioc_measure_verity(fd.as_fd(), kid)?;
Ok(H::read_from_bytes(&digest).expect("size mismatch"))
}
2 => {
let digest: [u8; 64] =
composefs_ioctls::fsverity::fs_ioc_measure_verity(fd.as_fd(), kid)?;
Ok(H::read_from_bytes(&digest).expect("size mismatch"))
}
_ => unreachable!(),
}
}
#[cfg(test)]
mod tests {
use std::os::fd::OwnedFd;
use tempfile::tempfile_in;
use crate::{fsverity::Sha256HashValue, test::tempfile};
use super::*;
#[test]
fn test_measure_verity_opt() {
let tf = tempfile();
assert!(matches!(
fs_ioc_measure_verity::<Sha256HashValue>(&tf),
Err(MeasureVerityError::VerityMissing)
));
}
#[test_with::path(/dev/shm)]
#[test]
fn test_measure_verity_not_supported() {
let tf = tempfile_in("/dev/shm").unwrap();
assert!(matches!(
fs_ioc_measure_verity::<Sha256HashValue>(&tf),
Err(MeasureVerityError::FilesystemNotSupported)
));
}
#[test_with::path(/dev/shm)]
#[test]
fn test_fs_ioc_enable_verity_wrong_fs() {
let file = tempfile_in("/dev/shm").unwrap();
let fd = OwnedFd::from(file);
let err = fs_ioc_enable_verity::<Sha256HashValue>(&fd).unwrap_err();
assert!(matches!(err, EnableVerityError::FilesystemNotSupported));
assert_eq!(err.to_string(), "Filesystem does not support fs-verity",);
}
}