ci: add test coverage for secure boot and addons, and shim integration (#38377)
Now that we can enable SB on GHA do it by default in mkosi images with selfenroll, and add a smoke test. Also add one CI job that tests the shim integration. This will catch regressions like https://github.com/systemd/systemd/issues/38349
This commit is contained in:
@@ -7,5 +7,6 @@ integration_tests += [
|
||||
'storage': 'persistent',
|
||||
'coredump-exclude-regex' : '/(test-usr-dump|test-dump|bash)$',
|
||||
'vm' : true,
|
||||
'firmware' : 'auto',
|
||||
},
|
||||
]
|
||||
|
||||
@@ -156,7 +156,11 @@ test -f "$CREDENTIAL_FILE"
|
||||
CREDENTIAL_NAME=${CREDENTIAL_FILE#/tmp/fakexbootldr/loader/credentials/}
|
||||
CREDENTIAL_NAME=${CREDENTIAL_NAME%.cred}
|
||||
|
||||
systemd-creds decrypt --name="$CREDENTIAL_NAME" "$CREDENTIAL_FILE"
|
||||
# If SB is enabled then this will fail as it's not locked but TPM2 is enabled
|
||||
if cmp /sys/firmware/efi/efivars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c <(printf '\6\0\0\0\1'); then
|
||||
ALLOW_NULL=--allow-null
|
||||
fi
|
||||
systemd-creds decrypt "${ALLOW_NULL:-}" --name="$CREDENTIAL_NAME" "$CREDENTIAL_FILE"
|
||||
ln -s "$CREDENTIAL_FILE" /tmp/fakexbootldr/loader/credentials/"$CREDENTIAL_NAME"
|
||||
test -f /tmp/fakexbootldr/loader/credentials/"$CREDENTIAL_NAME"
|
||||
|
||||
|
||||
@@ -21,7 +21,42 @@ fi
|
||||
|
||||
(! systemd-detect-virt -cq)
|
||||
|
||||
restore_esp() {
|
||||
if [ ! -d /tmp/esp.bak ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [ -d /tmp/esp.bak/EFI/ ]; then
|
||||
cp -r /tmp/esp.bak/EFI/* "$(bootctl --print-esp-path)/EFI/"
|
||||
fi
|
||||
if [ -d /tmp/esp.bak/loader/ ]; then
|
||||
cp -r /tmp/esp.bak/loader/* "$(bootctl --print-esp-path)/loader/"
|
||||
fi
|
||||
rm -rf /tmp/esp.bak
|
||||
}
|
||||
|
||||
backup_esp() {
|
||||
if [ -d /tmp/esp.bak ]; then
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ -d "$(bootctl --print-esp-path)/EFI" ]]; then
|
||||
mkdir -p /tmp/esp.bak
|
||||
cp -r "$(bootctl --print-esp-path)/EFI/" /tmp/esp.bak/
|
||||
fi
|
||||
if [[ -d "$(bootctl --print-esp-path)/loader" ]]; then
|
||||
mkdir -p /tmp/esp.bak
|
||||
cp -r "$(bootctl --print-esp-path)/loader/" /tmp/esp.bak/
|
||||
fi
|
||||
}
|
||||
|
||||
basic_tests() {
|
||||
# Ensure the system's ESP (no --image/--root args) is still available for the next tests
|
||||
if [ $# -eq 0 ]; then
|
||||
backup_esp
|
||||
trap restore_esp RETURN ERR
|
||||
fi
|
||||
|
||||
bootctl "$@" --help
|
||||
bootctl "$@" --version
|
||||
|
||||
@@ -274,6 +309,10 @@ testcase_bootctl_varlink() {
|
||||
}
|
||||
|
||||
testcase_bootctl_secure_boot_auto_enroll() {
|
||||
# mkosi can also add keys here, so back them up and restored them
|
||||
backup_esp
|
||||
trap restore_esp RETURN ERR
|
||||
|
||||
cat >/tmp/openssl.conf <<EOF
|
||||
[ req ]
|
||||
prompt = no
|
||||
@@ -293,6 +332,9 @@ EOF
|
||||
-x509 -sha256 -nodes -days 365 -newkey rsa:4096 \
|
||||
-keyout /tmp/sb.key -out /tmp/sb.crt
|
||||
|
||||
# This will fail if there are already keys in the ESP, so we remove them first
|
||||
rm -rf "$(bootctl --print-esp-path)/loader/keys/auto"
|
||||
|
||||
bootctl install --make-entry-directory=yes --secure-boot-auto-enroll=yes --certificate /tmp/sb.crt --private-key /tmp/sb.key
|
||||
for var in PK KEK db; do
|
||||
test -f "$(bootctl --print-esp-path)/loader/keys/auto/$var.auth"
|
||||
@@ -300,4 +342,21 @@ EOF
|
||||
bootctl remove
|
||||
}
|
||||
|
||||
testcase_secureboot() {
|
||||
if [ ! -d /sys/firmware/efi ]; then
|
||||
echo "Not booted with EFI, skipping secureboot tests."
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Ensure secure boot is enabled and not in setup mode
|
||||
cmp /sys/firmware/efi/efivars/SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c <(printf '\6\0\0\0\1')
|
||||
cmp /sys/firmware/efi/efivars/SetupMode-8be4df61-93ca-11d2-aa0d-00e098032b8c <(printf '\6\0\0\0\0')
|
||||
bootctl status | grep -q "Secure Boot: enabled"
|
||||
|
||||
# Ensure the addon is fully loaded and parsed
|
||||
bootctl status | grep -q "global-addon: loader/addons/test.addon.efi"
|
||||
bootctl status | grep "cmdline" | grep -q addonfoobar
|
||||
grep -q addonfoobar /proc/cmdline
|
||||
}
|
||||
|
||||
run_testcases
|
||||
|
||||
Reference in New Issue
Block a user