@@ -32,6 +32,7 @@ umask 022
3232readonly REQUIRED_PKGS=" base-files libgcc dash coreutils sed tar gawk syslinux grub-i386-efi grub-x86_64-efi squashfs-tools xorriso"
3333readonly INITRAMFS_PKGS=" binutils xz device-mapper dhclient dracut-network openresolv"
3434readonly PROGNAME=$( basename " $0 " )
35+ toSign=0
3536
3637info_msg () {
3738 printf " \033[1m$@ \n\033[m"
@@ -82,6 +83,8 @@ directory if unset).
8283 -C "cmdline args" Add additional kernel command line arguments.
8384 -T "title" Modify the bootloader title.
8485 -v linux<version> Install a custom Linux version on ISO image (linux meta-package if unset).
86+ -d <key-file> Set a key file to sign bootloader.
87+ -t <cert-file> Set a certificate file to sign bootloader.
8588 -K Do not remove builddir.
8689
8790The $PROGNAME script generates a live image of the Void Linux distribution.
@@ -197,6 +200,17 @@ generate_isolinux_boot() {
197200 " $ISOLINUX_DIR " /isolinux.cfg
198201}
199202
203+ dosign () {
204+ print_step " Signing $2 ..."
205+
206+ if ! sbsign --key " $DBKEY " --cert " $DBCRT " --output " $1 .signed" " $1 " ; then
207+ die " Failed to sign $2 "
208+ fi
209+ if ! sbverify --cert " $DBCRT " " $1 .signed" ; then
210+ die " failed to verify the signature"
211+ fi
212+ }
213+
200214generate_grub_efi_boot () {
201215 cp -f grub/grub.cfg " $GRUB_DIR "
202216 cp -f grub/grub_void.cfg.in " $GRUB_DIR " /grub_void.cfg
@@ -233,6 +247,12 @@ generate_grub_efi_boot() {
233247 fi
234248 mkdir -p " ${GRUB_EFI_TMPDIR} " /EFI/BOOT
235249 cp -f " $VOIDHOSTDIR " /tmp/bootia32.efi " ${GRUB_EFI_TMPDIR} " /EFI/BOOT/BOOTIA32.EFI
250+
251+ # Bootloader signing
252+ if [ $toSign -eq 1 ] && [ -f " ${GRUB_EFI_TMPDIR} " /EFI/BOOT/BOOTX32.EFI ]; then
253+ dosign " ${GRUB_EFI_TMPDIR} " /EFI/BOOT/BOOTX32.EFI BOOTX32.EFI
254+ fi
255+
236256 xbps-uchroot " $VOIDHOSTDIR " grub-mkstandalone -- \
237257 --directory=" /usr/lib/grub/x86_64-efi" \
238258 --format=" x86_64-efi" \
@@ -244,6 +264,12 @@ generate_grub_efi_boot() {
244264 die " Failed to generate EFI loader"
245265 fi
246266 cp -f " $VOIDHOSTDIR " /tmp/bootx64.efi " ${GRUB_EFI_TMPDIR} " /EFI/BOOT/BOOTX64.EFI
267+
268+ # Bootloader signing
269+ if [ $toSign -eq 1 ] && [ -f " ${GRUB_EFI_TMPDIR} " /EFI/BOOT/BOOTX64.EFI ]; then
270+ dosign " ${GRUB_EFI_TMPDIR} " /EFI/BOOT/BOOTX64.EFI BOOTX64.EFI
271+ fi
272+
247273 umount " $GRUB_EFI_TMPDIR "
248274 losetup --detach " ${LOOP_DEVICE} "
249275 rm -rf " $GRUB_EFI_TMPDIR "
@@ -289,7 +315,7 @@ generate_iso_image() {
289315#
290316# main()
291317#
292- while getopts " a:b:r:c:C:T:Kk:l:i:I:s:S:o:p:v:h" opt; do
318+ while getopts " a:b:r:c:C:T:Kk:l:i:I:s:S:o:p:v:d:t: h" opt; do
293319 case $opt in
294320 a) BASE_ARCH=" $OPTARG " ;;
295321 b) BASE_SYSTEM_PKG=" $OPTARG " ;;
@@ -307,6 +333,8 @@ while getopts "a:b:r:c:C:T:Kk:l:i:I:s:S:o:p:v:h" opt; do
307333 C) BOOT_CMDLINE=" $OPTARG " ;;
308334 T) BOOT_TITLE=" $OPTARG " ;;
309335 v) LINUX_VERSION=" $OPTARG " ;;
336+ d) DBKEY=" $OPTARG " ;;
337+ t) DBCRT=" $OPTARG " ;;
310338 h) usage;;
311339 * ) usage;;
312340 esac
@@ -337,6 +365,22 @@ if [ "$(id -u)" -ne 0 ]; then
337365 die " Must be run as root, exiting..."
338366fi
339367
368+ # The -d and -t options are complementary. If one exists, the other must also exist.
369+ # If these options are set, I also check sbsign command.
370+ if ([ $DBKEY ] && [ ! $DBCRT ]) || ([ ! $DBKEY ] && [ $DBCRT ]); then
371+ die " Must be set a key and certificate via -d and -t option, exiting..."
372+ elif [ $DBKEY ] && [ $DBCRT ]; then
373+ if [ ! -f $DBKEY ]; then
374+ die " $DBKEY does not exist, exiting..."
375+ elif [ ! -f $DBCRT ]; then
376+ die " $DBCRT does not exist, exiting..."
377+ elif ! command -v sbsign > /dev/null; then
378+ die " sbsign command does not exist, exiting..."
379+ else
380+ toSign=1
381+ fi
382+ fi
383+
340384if [ -n " $ROOTDIR " ]; then
341385 BUILDDIR=$( mktemp --tmpdir=" $ROOTDIR " -d)
342386else
0 commit comments