Thank you Daniel. > On 13 Aug 2025, at 10:15 PM, Daniel Kiper <dki...@net-space.pl> wrote: > > On Tue, Jul 29, 2025 at 08:21:55PM +0530, Sudhakar Kuppusamy wrote: >> Signing GRUB for firmware that verifies an appended signature is a >> bit fiddly. I don't want people to have to figure it out from scratch >> so document it here. >> >> Signed-off-by: Daniel Axtens <d...@axtens.net> >> Signed-off-by: Sudhakar Kuppusamy <sudha...@linux.ibm.com> >> Reviewed-by: Stefan Berger <stef...@linux.ibm.com> >> Reviewed-by: Avnish Chouhan <avn...@linux.ibm.com> >> --- >> docs/grub.texi | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 98 insertions(+) >> >> diff --git a/docs/grub.texi b/docs/grub.texi >> index 72ee8d08c..2ff867cc5 100644 >> --- a/docs/grub.texi >> +++ b/docs/grub.texi >> @@ -9379,6 +9379,104 @@ image works under UEFI secure boot and can maintain >> the secure-boot chain. It >> will also be necessary to enroll the public key used into a relevant firmware >> key database. >> >> +@section Signing GRUB with an appended signature >> +The @file{core.elf} itself can be signed with a Linux kernel module-style >> +appended signature. >> +To support IEEE1275 platforms where the boot image is often loaded directly >> +from a disk partition rather than from a file system, the @file{core.elf} >> +can specify the size and location of the appended signature with an ELF >> +Note added by @command{grub-install} or @command{grub-mkimage}. >> +An image can be signed this way using the @command{sign-file} command from >> +the Linux kernel: >> + >> +@itemize >> +@item Signing a GRUB image using single signer key. The grub.key is your >> +private key, certificate.der is your GRUB signing public key, and > > I would be more consistent and use grub.der instead of certificate.der > here and below... > > And I would propose updated sentence... > > Signing a GRUB image using single signer key. The grub.key is your > private key used for GRUB signing, grub.der is corresponding public key > (certificate) used for GRUB signature verification, and kernel.der is > your public key (certificate) used for kernel signature verification.
Sure, will do it. Thank you Daniel for the updated sentence. > >> +kernel.der is your kernel signing public key. >> +@example >> +@group >> +# Determine the size of the appended signature. It depends on the >> +# signing certificate and the hash algorithm. > > s/certificate/key (certificate)/ Will do it. > >> +# >> +# Signing the /dev/null with an appended signature. >> + >> +sign-file SHA256 grub.key certificate.der /dev/null ./empty.sig >> + >> +# Get the size of the signature. >> + >> +EMPTY_SIG_SIZE=`stat -c '%s' ./empty.sig` >> + >> +# Remove the empty file signature. >> + >> +rm ./empty.sig >> + >> +# Build a GRUB image with $EMPTY_SIG_SIZE reserved for the signature. >> + >> +grub-install --appended-signature-size $EMPTY_SIG_SIZE \ >> + --modules="appendedsig ..." ... >> + or >> +grub-mkimage -O powerpc-ieee1275 -o core.elf.unsigned -x kernel.der \ >> + -p /grub --appended-signature-size $EMPTY_SIG_SIZE \ >> + --modules="appendedsig ..." ... >> + >> +# Signing a GRUB image with an appended signature. >> + >> +sign-file SHA256 grub.key certificate.der core.elf.unsigned core.elf.signed >> + >> +@end group >> +@end example >> +@item Signing a GRUB image using more than one signer key. The grub1.key and >> +grub2.key are your private keys, certificate1.der and certificate2.der >> +are your GRUB signing public keys. kernel.der and kernel2.der are your >> +kernel signing public key. > > These sentences are complete mess. Please fix them. You have an example how > it should be done properly above… Sure, will do it. > >> +@example >> +@group >> +# Generate a raw signature for /dev/null signing using OpenSSL. >> + >> +openssl cms -sign -binary -nocerts -in /dev/null -signer \ >> + certificate1.pem -inkey grub1.key -signer certificate2.pem \ > > You say *.der above and here is *.pem... Something is off... > Same below... What about earlier examples? Oh sorry typo error. Will correct it. I am documenting two examples for GRUB image signing, which are Core Image signing with a single signer key and Core Image signing with more than one signer key. An earlier example is GRUB image signing using a single signer key. This example is GRUB image signing using more than one signer key. > >> + -inkey grub2.key -out ./empty.p7s -outform DER -noattr -md sha256 >> + >> +# Signing the /dev/null with an appended signature. >> + >> +sign-file -s ./empty.p7s sha256 /dev/null /dev/null ./empty.signed >> + >> +# Get the size of the signature. >> + >> +EMPTY_SIG_SIZE=`stat -c '%s' ./empty.signed` >> + >> +# Remove the empty file signatures. >> + >> +rm ./empty.signed ./empty.p7s >> + >> +# Build a GRUB image with $EMPTY_SIG_SIZE reserved for the signature. >> + >> +grub-install --appended-signature-size $EMPTY_SIG_SIZE \ >> + --modules="appendedsig ..." ... >> + or >> +grub-mkimage -O powerpc-ieee1275 -o core.elf.unsigned -x kernel.der \ >> + -p /grub --appended-signature-size $EMPTY_SIG_SIZE \ >> + --modules="appendedsig ..." ... >> + >> +# Generate a raw signature for GRUB image signing using OpenSSL. >> + >> +openssl cms -sign -binary -nocerts -in core.elf.unsigned -signer \ >> + certificate.pem -inkey grub.key -signer certificate1.pem -inkey \ >> + grub1.key -out core.p7s -outform DER -noattr -md sha256 >> + >> +# Signing a GRUB image with an appended signature. >> + >> +sign-file -s core.p7s sha256 /dev/null core.elf.unsigned core.elf.signed >> + >> +@end group >> +@end example >> +@item Don't forget to install the signed image as required >> +(e.g. on powerpc-ieee1275, to the PReP partition). >> +@end itemize >> + >> +As with UEFI secure boot, it is necessary to build-in the required modules, >> +or sign them separately. > > s/separately/if they are not part of the GRUB image/ Will do it. Thanks, Sudhakar > > Daniel _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel