talos/internal/pkg/secureboot/secureboot.go
Noel Georgi 59582496d5
feat: bring in partity with sd-257
Bring in parity with systemd 257 by supporting more UKI sections.

The output of `sd-measure` and our measure code will be different until
https://github.com/systemd/systemd/pull/35765 is fixed upstream.

Fixes: #10075

Signed-off-by: Noel Georgi <git@frezbo.dev>
2025-01-03 17:34:17 +05:30

106 lines
3.2 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Package secureboot contains base definitions for the Secure Boot process.
package secureboot
// Section is a name of a PE file section (UEFI binary).
type Section string
// List of well-known section names.
const (
Linux Section = ".linux"
OSRel Section = ".osrel"
CMDLine Section = ".cmdline"
Initrd Section = ".initrd"
Ucode Section = ".ucode"
Splash Section = ".splash"
DTB Section = ".dtb"
Uname Section = ".uname"
SBAT Section = ".sbat"
PCRSig Section = ".pcrsig"
PCRPKey Section = ".pcrpkey"
Profile Section = ".profile"
DTBAuto Section = ".dtbauto"
HWIDS Section = ".hwids"
)
// OrderedSections returns the sections that are measured into PCR.
//
// Derived from https://github.com/systemd/systemd/blob/v257.1/src/fundamental/uki.h#L6
// .pcrsig section is omitted here since that's what we are calulating here.
func OrderedSections() []Section {
// DO NOT REARRANGE
return []Section{
Linux,
OSRel,
CMDLine,
Initrd,
Ucode,
Splash,
DTB,
Uname,
SBAT,
PCRPKey,
Profile,
DTBAuto,
HWIDS,
}
}
// Phase is the phase value extended to the PCR.
type Phase string
const (
// EnterInitrd is the phase value extended to the PCR during the initrd.
EnterInitrd Phase = "enter-initrd"
// LeaveInitrd is the phase value extended to the PCR just before switching to machined.
LeaveInitrd Phase = "leave-initrd"
// EnterMachined is the phase value extended to the PCR before starting machined.
// There should be only a signed signature for the enter-machined phase.
EnterMachined Phase = "enter-machined"
// StartTheWorld is the phase value extended to the PCR before starting all services.
StartTheWorld Phase = "start-the-world"
)
// PhaseInfo describes which phase extensions are signed/measured.
type PhaseInfo struct {
Phase Phase
CalculateSignature bool
}
// OrderedPhases returns the phases that are measured, in order.
//
// Derived from https://github.com/systemd/systemd/blob/v253/src/boot/measure.c#L295-L308
// ref: https://www.freedesktop.org/software/systemd/man/systemd-pcrphase.service.html#Description
//
// In the case of Talos disk decryption, happens in machined, so we need to only sign EnterMachined
// so that machined can only decrypt the disk if the system booted with the correct kernel/initrd/cmdline
// OrderedPhases returns the phases that are measured.
func OrderedPhases() []PhaseInfo {
// DO NOT REARRANGE
return []PhaseInfo{
{
Phase: EnterInitrd,
CalculateSignature: false,
},
{
Phase: LeaveInitrd,
CalculateSignature: false,
},
{
Phase: EnterMachined,
CalculateSignature: true,
},
}
}
const (
// UKIPCR is the PCR number where sections except `.pcrsig` are measured.
UKIPCR = 11
// SecureBootStatePCR is the PCR number where the secure boot state and the signature are measured.
// PCR 7 changes when UEFI SecureBoot mode is enabled/disabled, or firmware certificates (PK, KEK, db, dbx, …) are updated.
SecureBootStatePCR = 7
)