uefi_nvram_specvars/
lib.rs1#![expect(missing_docs)]
7#![forbid(unsafe_code)]
8
9use thiserror::Error;
10
11pub mod boot_order;
12pub mod signature_list;
13
14#[derive(Debug, Error)]
15pub enum ParseError {
16 #[error("parsing boot order")]
17 BootOrder(#[from] boot_order::Error),
18 #[error("parsing signature list")]
19 SignatureList(#[from] signature_list::ParseError),
20}
21
22#[derive(Debug)]
23pub enum ParsedNvramEntry<'a> {
24 BootOrder(Vec<u16>),
25 Boot(boot_order::EfiLoadOption<'a>),
26 SignatureList(Vec<signature_list::SignatureList<'a>>),
27 Unknown(&'a [u8]),
28}
29
30pub fn parse_nvram_entry<'a>(
31 name: &'a str,
32 data: &'a [u8],
33) -> Result<ParsedNvramEntry<'a>, ParseError> {
34 Ok(match name {
35 "BootOrder" => ParsedNvramEntry::BootOrder(boot_order::parse_boot_order(data)?.collect()),
36 _ if name
37 .strip_prefix("Boot")
38 .map(|x| !x.is_empty() && x.chars().all(|c| c.is_ascii_digit()))
39 .unwrap_or(false) =>
40 {
41 ParsedNvramEntry::Boot(boot_order::EfiLoadOption::parse(data)?)
42 }
43 "KEK" | "db" | "dbx" | "PK" | "dbDefault" | "MokList" | "MokListX" => {
44 ParsedNvramEntry::SignatureList(
45 signature_list::ParseSignatureLists::new(data)
46 .collect_signature_lists(|_, _| true)?,
47 )
48 }
49 _ => ParsedNvramEntry::Unknown(data),
50 })
51}