Skip to content

Commit 123d0aa

Browse files
Domenico PanellaDomenico Panella
authored andcommitted
New feature: bootloader signing
1 parent e9dea2d commit 123d0aa

File tree

1 file changed

+39
-1
lines changed

1 file changed

+39
-1
lines changed

mklive.sh.in

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ umask 022
3232
readonly REQUIRED_PKGS="base-files libgcc dash coreutils sed tar gawk syslinux grub-i386-efi grub-x86_64-efi squashfs-tools xorriso"
3333
readonly INITRAMFS_PKGS="binutils xz device-mapper dhclient dracut-network openresolv"
3434
readonly PROGNAME=$(basename "$0")
35+
toSign=0
3536

3637
info_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
8790
The $PROGNAME script generates a live image of the Void Linux distribution.
@@ -197,6 +200,11 @@ generate_isolinux_boot() {
197200
"$ISOLINUX_DIR"/isolinux.cfg
198201
}
199202

203+
dosign() {
204+
print_step "Signing $2..."
205+
sbsign --key $DBKEY --cert $DBCRT --output "$1".signed "$1"
206+
}
207+
200208
generate_grub_efi_boot() {
201209
cp -f grub/grub.cfg "$GRUB_DIR"
202210
cp -f grub/grub_void.cfg.in "$GRUB_DIR"/grub_void.cfg
@@ -233,6 +241,12 @@ generate_grub_efi_boot() {
233241
fi
234242
mkdir -p "${GRUB_EFI_TMPDIR}"/EFI/BOOT
235243
cp -f "$VOIDHOSTDIR"/tmp/bootia32.efi "${GRUB_EFI_TMPDIR}"/EFI/BOOT/BOOTIA32.EFI
244+
245+
#Bootloader signing
246+
if [ $toSign -eq 1 ] && [ -f "${GRUB_EFI_TMPDIR}"/EFI/BOOT/BOOTX32.EFI ]; then
247+
dosign "${GRUB_EFI_TMPDIR}"/EFI/BOOT/BOOTX32.EFI BOOTX32.EFI
248+
fi
249+
236250
xbps-uchroot "$VOIDHOSTDIR" grub-mkstandalone -- \
237251
--directory="/usr/lib/grub/x86_64-efi" \
238252
--format="x86_64-efi" \
@@ -244,6 +258,12 @@ generate_grub_efi_boot() {
244258
die "Failed to generate EFI loader"
245259
fi
246260
cp -f "$VOIDHOSTDIR"/tmp/bootx64.efi "${GRUB_EFI_TMPDIR}"/EFI/BOOT/BOOTX64.EFI
261+
262+
#Bootloader signing
263+
if [ $toSign -eq 1 ] && [ -f "${GRUB_EFI_TMPDIR}"/EFI/BOOT/BOOTX64.EFI ]; then
264+
dosign "${GRUB_EFI_TMPDIR}"/EFI/BOOT/BOOTX64.EFI BOOTX64.EFI
265+
fi
266+
247267
umount "$GRUB_EFI_TMPDIR"
248268
losetup --detach "${LOOP_DEVICE}"
249269
rm -rf "$GRUB_EFI_TMPDIR"
@@ -289,7 +309,7 @@ generate_iso_image() {
289309
#
290310
# main()
291311
#
292-
while getopts "a:b:r:c:C:T:Kk:l:i:I:s:S:o:p:v:h" opt; do
312+
while getopts "a:b:r:c:C:T:Kk:l:i:I:s:S:o:p:v:d:t:h" opt; do
293313
case $opt in
294314
a) BASE_ARCH="$OPTARG";;
295315
b) BASE_SYSTEM_PKG="$OPTARG";;
@@ -307,6 +327,8 @@ while getopts "a:b:r:c:C:T:Kk:l:i:I:s:S:o:p:v:h" opt; do
307327
C) BOOT_CMDLINE="$OPTARG";;
308328
T) BOOT_TITLE="$OPTARG";;
309329
v) LINUX_VERSION="$OPTARG";;
330+
d) DBKEY="$OPTARG";;
331+
t) DBCRT="$OPTARG";;
310332
h) usage;;
311333
*) usage;;
312334
esac
@@ -337,6 +359,22 @@ if [ "$(id -u)" -ne 0 ]; then
337359
die "Must be run as root, exiting..."
338360
fi
339361

362+
#The -d and -t options are complementary. If one exists, the other must also exist.
363+
#If these options are set, I also check sbsign command.
364+
if ([ $DBKEY ] && [ ! $DBCRT ]) || ([ ! $DBKEY ] && [ $DBCRT ]); then
365+
die "Must be set a key and certificate via -d and -t option, exiting..."
366+
elif [ $DBKEY ] && [ $DBCRT ]; then
367+
if [ ! -f $DBKEY ]; then
368+
die "$DBKEY does not exist, exiting..."
369+
elif [ ! -f $DBCRT ]; then
370+
die "$DBCRT does not exist, exiting..."
371+
elif ! command -v sbsign > /dev/null; then
372+
die "sbsign command does not exist, exiting..."
373+
else
374+
toSign=1
375+
fi
376+
fi
377+
340378
if [ -n "$ROOTDIR" ]; then
341379
BUILDDIR=$(mktemp --tmpdir="$ROOTDIR" -d)
342380
else

0 commit comments

Comments
 (0)