uefi_nvram_specvars/
lib.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//!  UEFI NVRAM structures.
5
6#![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}