diff --git a/rust/lanzaboote/Cargo.lock b/rust/lanzaboote/Cargo.lock index 38c443a..5cd2e80 100644 --- a/rust/lanzaboote/Cargo.lock +++ b/rust/lanzaboote/Cargo.lock @@ -26,11 +26,23 @@ version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f2d21333b679bbbac680b3eb45c86937e42f69277028f4e97b599b80b86c253" +[[package]] +name = "goblin" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "572564d6cba7d09775202c8e7eebc4d534d5ae36578ab402fb21e182a0ac9505" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "lanzaboote" version = "0.1.0" dependencies = [ "ed25519-compact", + "goblin", "log", "uefi", "uefi-services", @@ -45,6 +57,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "proc-macro2" version = "1.0.47" @@ -63,6 +81,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "syn" version = "1.0.103" diff --git a/rust/lanzaboote/Cargo.toml b/rust/lanzaboote/Cargo.toml index a255eeb..0acb79c 100644 --- a/rust/lanzaboote/Cargo.toml +++ b/rust/lanzaboote/Cargo.toml @@ -5,10 +5,11 @@ edition = "2021" publish = false [dependencies] -uefi = { version = "0.18.0", features = [ "alloc", "logger", "exts" ] } -uefi-services = "0.15.0" +uefi = { version = "0.18.0", default-features = false, features = [ "alloc", "exts" ] } +uefi-services = { version = "0.15.0", default-features = false, features = [ "panic_handler" ] } log = "0.4.17" ed25519-compact = { version = "2.0.2", default-features = false, features = [] } +goblin = { version = "0.6.0", default-features = false, features = [ "pe64", "alloc" ]} [profile.release] opt-level = "s" diff --git a/rust/lanzaboote/src/main.rs b/rust/lanzaboote/src/main.rs index 5ef4cb8..afe3104 100644 --- a/rust/lanzaboote/src/main.rs +++ b/rust/lanzaboote/src/main.rs @@ -4,26 +4,24 @@ extern crate alloc; +mod pe_section; + use alloc::vec::Vec; -use log::debug; +use log::{debug, info}; use uefi::{ prelude::*, proto::{ console::text::Output, - device_path::{ - text::{AllowShortcuts, DevicePathToText, DisplayOnly}, - DevicePath, - }, - loaded_image::{self, LoadedImage}, - media::{ - file::{File, FileAttribute, FileMode, RegularFile}, - fs::SimpleFileSystem, - }, + device_path::text::{AllowShortcuts, DevicePathToText, DisplayOnly}, + loaded_image::LoadedImage, + media::file::{File, FileAttribute, FileMode, RegularFile}, }, table::boot::{OpenProtocolAttributes, OpenProtocolParams}, - Error, Result, + Result, }; +use crate::pe_section::pe_section; + fn print_logo(output: &mut Output) { output.clear().unwrap(); @@ -36,6 +34,7 @@ fn print_logo(output: &mut Output) { | |/ _` | '_ \\|_ / _` | '_ \\ / _ \\ / _ \\| __|\r | | (_| | | | |/ / (_| | |_) | (_) | (_) | |_ \r |_|\\__,_|_| |_/___\\__,_|_.__/ \\___/ \\___/ \\__|\r +\r " )) .unwrap(); @@ -103,13 +102,18 @@ fn main(handle: Handle, mut system_table: SystemTable) -> Status { let boot_services = system_table.boot_services(); - let image_file = image_file(boot_services, handle).unwrap(); + { + let mut image_file = image_file(boot_services, handle).unwrap(); + let image_data = read_all(&mut image_file).unwrap(); + + if let Some(data) = pe_section(&image_data, ".osrel") { + info!("osrel = {}", core::str::from_utf8(data).unwrap_or("???")) + } + } let mut file_system = boot_services.get_image_file_system(handle).unwrap(); let mut root = file_system.open_volume().unwrap(); - debug!("Found root"); - let mut file = root .open(cstr16!("linux.efi"), FileMode::Read, FileAttribute::empty()) .unwrap() diff --git a/rust/lanzaboote/src/pe_section.rs b/rust/lanzaboote/src/pe_section.rs new file mode 100644 index 0000000..1fc3d77 --- /dev/null +++ b/rust/lanzaboote/src/pe_section.rs @@ -0,0 +1,14 @@ +pub fn pe_section<'a>(file_data: &'a [u8], section_name: &str) -> Option<&'a [u8]> { + let pe_binary = goblin::pe::PE::parse(file_data).ok()?; + + pe_binary + .sections + .iter() + .find(|s| s.name().unwrap() == section_name) + .and_then(|s| { + let section_start: usize = s.pointer_to_raw_data.try_into().ok()?; + let section_end: usize = section_start + usize::try_from(s.size_of_raw_data).ok()?; + + Some(&file_data[section_start..section_end]) + }) +}