2023-02-15 16:09:24 -06:00
|
|
|
use std::fs;
|
|
|
|
use std::path::PathBuf;
|
2023-01-17 18:58:45 -06:00
|
|
|
|
|
|
|
use anyhow::Result;
|
2023-06-16 09:42:19 -05:00
|
|
|
use lanzaboote_tool::architecture::Architecture;
|
|
|
|
use lzbt_systemd::architecture::SystemdArchitectureExt;
|
2023-01-17 18:58:45 -06:00
|
|
|
use tempfile::tempdir;
|
|
|
|
|
|
|
|
mod common;
|
|
|
|
|
2023-04-25 10:26:40 -05:00
|
|
|
use common::{hash_file, mtime, remove_signature, verify_signature, TARGET_SYSTEM_DOUBLE};
|
2023-02-15 16:09:24 -06:00
|
|
|
|
2023-01-17 18:58:45 -06:00
|
|
|
#[test]
|
|
|
|
fn keep_systemd_boot_binaries() -> Result<()> {
|
|
|
|
let esp = tempdir()?;
|
|
|
|
let tmpdir = tempdir()?;
|
|
|
|
let profiles = tempdir()?;
|
|
|
|
let generation_link = common::setup_generation_link(tmpdir.path(), profiles.path(), 1)
|
|
|
|
.expect("Failed to setup generation link");
|
|
|
|
|
|
|
|
let systemd_boot_path = systemd_boot_path(&esp);
|
|
|
|
let systemd_boot_fallback_path = systemd_boot_fallback_path(&esp);
|
|
|
|
|
|
|
|
let output0 = common::lanzaboote_install(0, esp.path(), vec![&generation_link])?;
|
|
|
|
assert!(output0.status.success());
|
|
|
|
|
|
|
|
// Use the modification time instead of a hash because the hash would be the same even if the
|
|
|
|
// file was overwritten.
|
|
|
|
let systemd_boot_mtime0 = mtime(&systemd_boot_path);
|
|
|
|
let systemd_boot_fallback_mtime0 = mtime(&systemd_boot_fallback_path);
|
|
|
|
|
|
|
|
let output1 = common::lanzaboote_install(0, esp.path(), vec![generation_link])?;
|
|
|
|
assert!(output1.status.success());
|
|
|
|
|
|
|
|
let systemd_boot_mtime1 = mtime(&systemd_boot_path);
|
|
|
|
let systemd_boot_fallback_mtime1 = mtime(&systemd_boot_fallback_path);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
systemd_boot_mtime0, systemd_boot_mtime1,
|
|
|
|
"systemd-boot binary was modified on second install."
|
|
|
|
);
|
|
|
|
assert_eq!(
|
|
|
|
systemd_boot_fallback_mtime0, systemd_boot_fallback_mtime1,
|
|
|
|
"systemd-boot fallback binary was moidified on second install."
|
|
|
|
);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn overwrite_malformed_systemd_boot_binaries() -> Result<()> {
|
|
|
|
let esp = tempdir()?;
|
|
|
|
let tmpdir = tempdir()?;
|
|
|
|
let profiles = tempdir()?;
|
|
|
|
let generation_link = common::setup_generation_link(tmpdir.path(), profiles.path(), 1)
|
|
|
|
.expect("Failed to setup generation link");
|
|
|
|
|
|
|
|
let systemd_boot_path = systemd_boot_path(&esp);
|
|
|
|
let systemd_boot_fallback_path = systemd_boot_fallback_path(&esp);
|
|
|
|
|
|
|
|
let output0 = common::lanzaboote_install(0, esp.path(), vec![&generation_link])?;
|
|
|
|
assert!(output0.status.success());
|
|
|
|
|
|
|
|
// Make systemd-boot binaries malformed by truncating them.
|
|
|
|
fs::File::create(&systemd_boot_path)?;
|
|
|
|
fs::File::create(&systemd_boot_fallback_path)?;
|
|
|
|
|
|
|
|
let malformed_systemd_boot_hash = hash_file(&systemd_boot_path);
|
|
|
|
let malformed_systemd_boot_fallback_hash = hash_file(&systemd_boot_fallback_path);
|
|
|
|
|
|
|
|
let output1 = common::lanzaboote_install(0, esp.path(), vec![generation_link])?;
|
|
|
|
assert!(output1.status.success());
|
|
|
|
|
|
|
|
let systemd_boot_hash = hash_file(&systemd_boot_path);
|
|
|
|
let systemd_boot_fallback_hash = hash_file(&systemd_boot_fallback_path);
|
|
|
|
|
|
|
|
assert_ne!(
|
|
|
|
malformed_systemd_boot_hash, systemd_boot_hash,
|
|
|
|
"Malformed systemd-boot binaries were not replaced."
|
|
|
|
);
|
|
|
|
assert_ne!(
|
|
|
|
malformed_systemd_boot_fallback_hash, systemd_boot_fallback_hash,
|
|
|
|
"Maformed systemd-boot fallback binaries were not replaced."
|
|
|
|
);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn overwrite_unsigned_systemd_boot_binaries() -> Result<()> {
|
|
|
|
let esp = tempdir()?;
|
|
|
|
let tmpdir = tempdir()?;
|
|
|
|
let profiles = tempdir()?;
|
|
|
|
let generation_link = common::setup_generation_link(tmpdir.path(), profiles.path(), 1)
|
|
|
|
.expect("Failed to setup generation link");
|
|
|
|
|
|
|
|
let systemd_boot_path = systemd_boot_path(&esp);
|
|
|
|
let systemd_boot_fallback_path = systemd_boot_fallback_path(&esp);
|
|
|
|
|
|
|
|
let output0 = common::lanzaboote_install(0, esp.path(), vec![&generation_link])?;
|
|
|
|
assert!(output0.status.success());
|
|
|
|
|
|
|
|
remove_signature(&systemd_boot_path)?;
|
|
|
|
remove_signature(&systemd_boot_fallback_path)?;
|
|
|
|
assert!(!verify_signature(&systemd_boot_path)?);
|
|
|
|
assert!(!verify_signature(&systemd_boot_fallback_path)?);
|
|
|
|
|
|
|
|
let output1 = common::lanzaboote_install(0, esp.path(), vec![generation_link])?;
|
|
|
|
assert!(output1.status.success());
|
|
|
|
|
|
|
|
assert!(verify_signature(&systemd_boot_path)?);
|
|
|
|
assert!(verify_signature(&systemd_boot_fallback_path)?);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn systemd_boot_path(esp: &tempfile::TempDir) -> PathBuf {
|
2023-06-16 09:42:19 -05:00
|
|
|
let arch = Architecture::from_nixos_system(TARGET_SYSTEM_DOUBLE).unwrap();
|
|
|
|
esp.path()
|
|
|
|
.join("EFI/systemd/")
|
|
|
|
.join(arch.systemd_filename())
|
2023-01-17 18:58:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
fn systemd_boot_fallback_path(esp: &tempfile::TempDir) -> PathBuf {
|
2023-06-16 09:42:19 -05:00
|
|
|
let arch = Architecture::from_nixos_system(TARGET_SYSTEM_DOUBLE).unwrap();
|
|
|
|
esp.path()
|
|
|
|
.join("EFI/BOOT/")
|
|
|
|
.join(arch.efi_fallback_filename())
|
2023-01-17 18:58:45 -06:00
|
|
|
}
|