#!/usr/bin/env bash set -euo pipefail CONFIG=/etc/cachyos-updater/secureboot.conf if [[ -r "$CONFIG" ]]; then # Le fichier est installé et contrôlé par root. # shellcheck source=/dev/null source "$CONFIG" fi KEY=${SECURE_BOOT_KEY:-/root/secureboot-mok/MOK.key} CERT=${SECURE_BOOT_CERT:-/root/secureboot-mok/MOK.crt} ESP=${SECURE_BOOT_ESP:-/boot/efi} SBAT=${SECURE_BOOT_SBAT:-/usr/share/grub/sbat.csv} GRUB_MODULES="all_video bli boot chain configfile echo efi_gop efi_uga ext2 fat font gettext gfxmenu gfxterm gzio linux loadenv normal part_gpt part_msdos png search search_fs_uuid search_label terminal video video_bochs video_cirrus" die() { echo "Secure Boot : $*" >&2 exit 1 } [[ $EUID -eq 0 ]] || die "le signer doit être exécuté en root" for command in findmnt grub-install install sbverify sbsign; do command -v "$command" >/dev/null 2>&1 \ || die "commande requise introuvable : $command" done [[ -r "$KEY" ]] || die "clé privée introuvable : $KEY" [[ -r "$CERT" ]] || die "certificat introuvable : $CERT" [[ -r "$SBAT" ]] || die "fichier SBAT introuvable : $SBAT" if ! findmnt --mountpoint "$ESP" >/dev/null 2>&1; then echo "Secure Boot : montage de $ESP" mount "$ESP" fi ESP_FS=$(findmnt --noheadings --output FSTYPE --mountpoint "$ESP" | tr -d '[:space:]') [[ "$ESP_FS" == "vfat" ]] \ || die "$ESP n'est pas une partition EFI vfat montée (type : ${ESP_FS:-inconnu})" if [[ ${1:-} == "--prepare" ]]; then echo "Secure Boot : pré-vérification réussie sur $ESP" exit 0 elif [[ $# -gt 0 ]]; then die "option inconnue : $1" fi sign_if_needed() { local file=$1 local tmp [[ -f "$file" ]] || return 0 if sbverify --cert "$CERT" "$file" >/dev/null 2>&1; then return 0 fi tmp="${file}.signed.$$" trap 'rm -f "$tmp"' RETURN sbsign --key "$KEY" --cert "$CERT" --output "$tmp" "$file" >/dev/null chown --reference="$file" "$tmp" chmod --reference="$file" "$tmp" mv "$tmp" "$file" trap - RETURN } verify_signature() { local file=$1 sbverify --cert "$CERT" "$file" >/dev/null 2>&1 \ || die "signature MOK invalide : $file" } grub-install \ --target=x86_64-efi \ --efi-directory="$ESP" \ --bootloader-id=CACHYOS \ --modules="$GRUB_MODULES" \ --sbat="$SBAT" \ --no-nvram install -d "$ESP/EFI/CACHYOS" "$ESP/EFI/BOOT" for component in shimx64.efi mmx64.efi fbx64.efi; do [[ -r "/usr/share/shim-signed/$component" ]] \ || die "composant shim introuvable : $component" install -m 0644 \ "/usr/share/shim-signed/$component" \ "$ESP/EFI/CACHYOS/${component^^}" install -m 0644 \ "/usr/share/shim-signed/$component" \ "$ESP/EFI/BOOT/${component^^}" done sign_if_needed "$ESP/EFI/CACHYOS/GRUBX64.EFI" install -m 0644 \ "$ESP/EFI/CACHYOS/GRUBX64.EFI" \ "$ESP/EFI/BOOT/GRUBX64.EFI" shopt -s nullglob kernels=(/boot/vmlinuz-*) [[ ${#kernels[@]} -gt 0 ]] || die "aucun noyau trouvé dans /boot" for kernel in "${kernels[@]}"; do sign_if_needed "$kernel" done verify_signature "$ESP/EFI/CACHYOS/GRUBX64.EFI" verify_signature "$ESP/EFI/BOOT/GRUBX64.EFI" for kernel in "${kernels[@]}"; do verify_signature "$kernel" done sync echo "Secure Boot : GRUB et ${#kernels[@]} noyau(x) signés et vérifiés"