virtfw-varstore 0.3.4

efi variable store
Documentation
//!
//! efi variable store implementation -- enroll secure boot keys
//!
//use alloc::vec::Vec;

use uguid::Guid;

use virtfw_libefi::efivar::auth::auth_to_esl;
use virtfw_libefi::efivar::sigdb::EfiSigDB;
use virtfw_libefi::efivar::types::{EfiVar, EfiVarAttr};
use virtfw_libefi::guids;
use virtfw_libefi::sb::certs::*;
use virtfw_libefi::sb::dbx::*;

use crate::authvar::{SB_DB, SB_DBX, SB_KEK, SB_PK};
use crate::store::EfiVarStore;

impl EfiVarStore {
    fn enroll_sigdb(&mut self, guid: &Guid, name: &str, sigdb: &EfiSigDB) {
        let var = EfiVar::new_with_vec(
            guid,
            name,
            EfiVarAttr::new_nv_bs_rt().with_time_auth_wr_access(true),
            sigdb.into(),
        );
        self.set_unchecked(var);
    }

    pub fn enroll_pk(&mut self, pk: &EfiSigDB) {
        self.enroll_sigdb(&guids::EfiGlobalVariable, SB_PK, pk);
    }

    pub fn enroll_kek(&mut self, kek: &EfiSigDB) {
        self.enroll_sigdb(&guids::EfiGlobalVariable, SB_KEK, kek);
    }

    pub fn enroll_db(&mut self, db: &EfiSigDB) {
        self.enroll_sigdb(&guids::EfiImageSecurityDatabase, SB_DB, db);
    }

    pub fn enroll_dbx(&mut self, dbx: &EfiSigDB) {
        self.enroll_sigdb(&guids::EfiImageSecurityDatabase, SB_DBX, dbx);
    }

    pub fn enroll_pk_mgmt(&mut self) {
        let pk = EfiSigDB::new_pk_external_mgmt();
        self.enroll_pk(&pk);
    }

    pub fn enroll_kek_microsoft(&mut self) {
        let mut kek = EfiSigDB::new();
        kek.add_x509_from_der(&guids::MicrosoftVendor, MICROSOFT_KEK_2011);
        kek.add_x509_from_der(&guids::MicrosoftVendor, MICROSOFT_KEK_2023);
        self.enroll_kek(&kek);
    }

    pub fn enroll_db_microsoft_uefi(&mut self) {
        let mut db = EfiSigDB::new();
        db.add_x509_from_der(&guids::MicrosoftVendor, MICROSOFT_DB_UEFI_2011);
        db.add_x509_from_der(&guids::MicrosoftVendor, MICROSOFT_DB_UEFI_2023);
        self.enroll_db(&db);
    }

    // Enroll all certs, including the rh test cert which is used to
    // sign test builds.  The private key is public, so that does not
    // actually protect anything.
    #[cfg(feature = "sbtest")]
    pub fn enroll_db_test_insecure(&mut self) {
        let mut db = EfiSigDB::new();
        db.add_x509_from_der(&guids::MicrosoftVendor, MICROSOFT_DB_UEFI_2011);
        db.add_x509_from_der(&guids::MicrosoftVendor, MICROSOFT_DB_UEFI_2023);
        db.add_x509_from_der(&guids::OvmfEnrollDefaultKeys, REDHAT_DB_UEFI_2024);
        db.add_x509_from_der(&guids::OvmfEnrollDefaultKeys, REDHAT_DB_TEST_INSECURE_2012);
        self.enroll_db(&db);
    }

    pub fn enroll_dbx_native(&mut self) {
        if let Some(auth) = DBX_NATIVE {
            let esl = auth_to_esl(auth).unwrap();
            let dbx = EfiSigDB::new_from_bytes(esl).unwrap();
            self.enroll_dbx(&dbx);
        }
    }
}