diff --git a/Cargo.lock b/Cargo.lock index 0bbb6f2..36d816a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,17 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "autocfg" version = "1.5.0" @@ -32,6 +43,15 @@ version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bytemuck" version = "1.24.0" @@ -44,12 +64,27 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + [[package]] name = "cfg-if" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -59,6 +94,26 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "edera-sprout" version = "0.0.11" @@ -67,6 +122,7 @@ dependencies = [ "image", "log", "serde", + "sha256", "toml", "uefi", "uefi-raw", @@ -97,12 +153,28 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "hashbrown" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + [[package]] name = "image" version = "0.25.8" @@ -126,6 +198,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + [[package]] name = "log" version = "0.4.28" @@ -160,6 +238,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + [[package]] name = "png" version = "0.18.0" @@ -259,6 +343,30 @@ dependencies = [ "serde_core", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha256" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -275,6 +383,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "pin-project-lite", +] + [[package]] name = "toml" version = "0.9.8" @@ -314,6 +432,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + [[package]] name = "ucs2" version = "0.3.3" @@ -372,6 +496,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "winnow" version = "0.7.13" diff --git a/Cargo.toml b/Cargo.toml index 77f2168..02a07fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,9 +11,10 @@ edition = "2024" anyhow = "1.0.100" toml = "0.9.8" log = "0.4.28" +sha256 = "1.6.0" [dependencies.image] -version = "0.25.6" +version = "0.25.8" default-features = false features = ["png"] optional = true diff --git a/src/autoconfigure/bls.rs b/src/autoconfigure/bls.rs index 07bbddb..3ecb7e2 100644 --- a/src/autoconfigure/bls.rs +++ b/src/autoconfigure/bls.rs @@ -4,6 +4,7 @@ use crate::config::RootConfiguration; use crate::entries::EntryDeclaration; use crate::generators::GeneratorDeclaration; use crate::generators::bls::BlsConfiguration; +use crate::utils; use anyhow::{Context, Result}; use uefi::cstr16; use uefi::fs::{FileSystem, Path}; @@ -33,6 +34,9 @@ pub fn scan( // Add a trailing slash to the root to ensure the path is valid. root.push('/'); + // Generate a unique hash of the root path. + let root_unique_hash = utils::unique_hash(&root); + // Whether we have a loader.conf file. let has_loader_conf = filesystem .try_exists(bls_loader_conf_path) @@ -54,7 +58,7 @@ pub fn scan( } // Generate a unique name for the BLS chainload action. - let chainload_action_name = format!("{}{}", BLS_CHAINLOAD_ACTION_PREFIX, root); + let chainload_action_name = format!("{}{}", BLS_CHAINLOAD_ACTION_PREFIX, root_unique_hash,); // BLS is now detected, generate a configuration for it. let generator = BlsConfiguration { @@ -68,7 +72,7 @@ pub fn scan( // Generate a unique name for the BLS generator and insert the generator into the configuration. config.generators.insert( - format!("autoconfigure-bls-{}", root), + format!("autoconfigure-bls-{}", root_unique_hash), GeneratorDeclaration { bls: Some(generator), ..Default::default() diff --git a/src/autoconfigure/linux.rs b/src/autoconfigure/linux.rs index 4d1ea64..d471484 100644 --- a/src/autoconfigure/linux.rs +++ b/src/autoconfigure/linux.rs @@ -4,6 +4,7 @@ use crate::config::RootConfiguration; use crate::entries::EntryDeclaration; use crate::generators::GeneratorDeclaration; use crate::generators::list::ListConfiguration; +use crate::utils; use anyhow::{Context, Result}; use std::collections::BTreeMap; use uefi::CString16; @@ -136,6 +137,9 @@ pub fn scan( // Add a trailing slash to the root to ensure the path is valid. root.push('/'); + // Generate a unique hash of the root path. + let root_unique_hash = utils::unique_hash(&root); + // Scan all locations for kernel pairs, adding them to the list. for location in SCAN_LOCATIONS { let scanned = scan_directory(filesystem, location) @@ -149,7 +153,7 @@ pub fn scan( } // Generate a unique name for the linux chainload action. - let chainload_action_name = format!("{}{}", LINUX_CHAINLOAD_ACTION_PREFIX, root); + let chainload_action_name = format!("{}{}", LINUX_CHAINLOAD_ACTION_PREFIX, root_unique_hash,); // Kernel pairs are detected, generate a list configuration for it. let generator = ListConfiguration { @@ -171,7 +175,7 @@ pub fn scan( // Generate a unique name for the Linux generator and insert the generator into the configuration. config.generators.insert( - format!("autoconfigure-linux-{}", root), + format!("autoconfigure-linux-{}", root_unique_hash), GeneratorDeclaration { list: Some(generator), ..Default::default() diff --git a/src/menu.rs b/src/menu.rs index 958a877..b87281e 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -102,7 +102,7 @@ fn select_with_input<'a>( info!("Boot Menu:"); for (index, entry) in entries.iter().enumerate() { let title = entry.context().stamp(&entry.declaration().title); - info!(" [{}] {}", index, title); + info!(" [{}] {} ({})", index, title, entry.name()); } } diff --git a/src/utils.rs b/src/utils.rs index c40ead1..e988b8c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -175,3 +175,9 @@ pub fn combine_options>(options: impl Iterator) -> Strin .collect::>() .join(" ") } + +/// Produce a unique hash for the input. +/// This uses SHA-256, which is unique enough but relatively short. +pub fn unique_hash(input: &str) -> String { + sha256::digest(input.as_bytes()) +}