Skip to content

Commit 9bf4eda

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

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

mklive.sh.in

Lines changed: 45 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,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+
200214
generate_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..."
338366
fi
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+
340384
if [ -n "$ROOTDIR" ]; then
341385
BUILDDIR=$(mktemp --tmpdir="$ROOTDIR" -d)
342386
else

0 commit comments

Comments
 (0)