]> git.ipfire.org Git - thirdparty/grub.git/log
thirdparty/grub.git
2 weeks agoutil/grub-editenv: Add probe call for external envblk
Michael Chang [Fri, 17 Oct 2025 09:01:39 +0000 (17:01 +0800)] 
util/grub-editenv: Add probe call for external envblk

This patch adds the probe_fs_envblk() function to identify the root
filesystem and invoke fs_envblk_init() with the probed filesystem type
and device. This checks if the feature is available and initializes the
handle, fs_envblk, to access the external environment block. It avoids
configurations with diskfilter or cryptodisk where filesystem blocks may
be remapped or encrypted.

The probe is only invoked when grub-editenv is working on the default
environment file path. This restriction ensures that probing and
possible raw device access are not triggered for arbitrary user supplied
paths, but only for the standard grubenv file. In that case the code
checks if the filename equals DEFAULT_ENVBLK_PATH and then calls
probe_fs_envblk with fs_envblk_spec. The result is stored in the global
fs_envblk handle. At this stage the external environment block is only
detected and recorded, and the behavior of grub-editenv is unchanged.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoutil/grub-editenv: Wire list_variables() to optional fs_envblk
Michael Chang [Fri, 17 Oct 2025 09:01:38 +0000 (17:01 +0800)] 
util/grub-editenv: Wire list_variables() to optional fs_envblk

This patch updates list_variables() so that it also prints entries from
the external environment block when one is present. The function first
lists all variables from the file based envblk, then iterates over the
external envblk and prints those as well.

The output format remains the same as before. The change makes it
possible to inspect variables regardless of whether they are stored in
the file envblk or in the reserved block.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoutil/grub-editenv: Wire unset_variables() to optional fs_envblk
Michael Chang [Fri, 17 Oct 2025 09:01:37 +0000 (17:01 +0800)] 
util/grub-editenv: Wire unset_variables() to optional fs_envblk

This patch updates unset_variables() so that removals are also applied
to the external environment block when it is present. The code opens the
external block, deletes the same named keys there, and then writes the
external block back using fs_envblk_write(). The file based envblk is
still updated and written as before.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoutil/grub-editenv: Wire set_variables() to optional fs_envblk
Michael Chang [Fri, 17 Oct 2025 09:01:36 +0000 (17:01 +0800)] 
util/grub-editenv: Wire set_variables() to optional fs_envblk

This patch changes set_variables() so that it can use an external
environment block when one is present. The variable next_entry is
written into the external block, env_block is treated as read only, and
all other variables are written into the normal file based envblk.

A cleanup step is added to handle cases where GRUB at runtime writes
variables into the external block because file based updates are not
safe on a copy on write filesystem such as Btrfs. For example, the
savedefault command can update saved_entry, and on Btrfs GRUB will place
that update in the external block instead of the file envblk. If an
older copy remains in the external block, it would override the newer
value from the file envblk when GRUB first loads the file and then
applies the external block on top of it. To avoid this, whenever
a variable is updated in the file envblk, any same named key in
the external block is deleted.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoutil/grub-editenv: Add fs_envblk write helper
Michael Chang [Fri, 17 Oct 2025 09:01:35 +0000 (17:01 +0800)] 
util/grub-editenv: Add fs_envblk write helper

This patch adds the function fs_envblk_write to update the reserved
environment block on disk. The helper takes an in memory envblk buffer
and writes it back to the device at the location defined by the
fs_envblk specification. It performs size checks and uses file sync to
ensure that the updated data is flushed.

The helper is also added into the fs_envblk ops table, together with the
open helper from the previous patch. With this change the basic input
and output path for an external environment block is complete. The
choice of which variables should be written externally will be handled
by later patches.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoutil/grub-editenv: Add fs_envblk open helper
Michael Chang [Fri, 17 Oct 2025 09:01:34 +0000 (17:01 +0800)] 
util/grub-editenv: Add fs_envblk open helper

This patch adds the logic to locate and open an environment block that
is stored in a reserved area on the device. It introduces the function
fs_envblk_open() together with helper routines to read the block pointed
to by the env_block variable, and to create the block on disk when it
does not exist yet. When a block is created, the code records its
location inside the file based envblk by setting env_block in block list
syntax of offset plus size in sectors.

The env_block variable acts as a link from the file envblk to the raw
disk region so that later runs of grub-editenv can follow it and access
the external block. The helper is exposed through a small ops table
attached to fs_envblk so that later patches can call
fs_envblk->ops->open() without touching core code again. At this stage
variables are still stored in the file envblk and no redirection has
been applied.

In relation to this, the fs_envblk_spec table defines the file-system
specific layout of the reserved raw blocks used for environment storage.
It is prepared to facilitate integration in grub-editenv, with Btrfs to
be added in the future once its reserved area is defined.

An fs_envblk_init() helper is added to prepare it for using the ops with
its associated data context if the feature is available. It is not used
yet, but will be used later when a filesystem and its device are probed
to initialize the fs_envblk handle and enable access to the feature.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agotests: Add "z" length modifier printf tests
Michael Chang [Fri, 17 Oct 2025 09:01:33 +0000 (17:01 +0800)] 
tests: Add "z" length modifier printf tests

Add unit tests for %zd, %zu and %zx to verify size_t and ssize_t
formatting matches system snprintf().

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agokern/misc: Add the "z" length modifier support
Michael Chang [Fri, 17 Oct 2025 09:01:32 +0000 (17:01 +0800)] 
kern/misc: Add the "z" length modifier support

Add support for the "z" length modifier in the printf code. This allows
printing of size_t and ssize_t values using %zu, %zd and related
formats. The parser maps "z" to the correct integer width based on
sizeof(size_t).

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agodisk/cryptodisk: Add --hw-accel to enable hardware acceleration
Gary Lin [Wed, 22 Oct 2025 01:29:00 +0000 (09:29 +0800)] 
disk/cryptodisk: Add --hw-accel to enable hardware acceleration

The --hw-accel option has been added to cryptomount to speed up
decryption by temporarily enabling hardware-specific instruction
sets (e.g., AVX, SSE) in libgcrypt.

A new feature, "feature_gcry_hw_accel", is also introduced to mark the
availability of the new option.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt: Add hardware acceleration for gcry_sha512
Gary Lin [Wed, 22 Oct 2025 01:28:59 +0000 (09:28 +0800)] 
libgcrypt: Add hardware acceleration for gcry_sha512

Enable hardware acceleration for the gcry_sha512 module when building
for the x86_64 EFI target.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt: Add hardware acceleration for gcry_sha256
Gary Lin [Wed, 22 Oct 2025 01:28:58 +0000 (09:28 +0800)] 
libgcrypt: Add hardware acceleration for gcry_sha256

Enable hardware acceleration for the gcry_sha256 module when building
for the x86_64 EFI target.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt: Declare the sha256 shaext function
Gary Lin [Wed, 22 Oct 2025 01:28:57 +0000 (09:28 +0800)] 
libgcrypt: Declare the sha256 shaext function

There is no prototype of _gcry_sha256_transform_intel_shaext() defined
in the header or libgcrypt-grub/cipher/sha256.c, and gcc may complain
the missing-prototypes error when compiling sha256-intel-shaext.c.

Declare the prototype in sha256-intel-shaext.c to avoid the error.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt: Implement _gcry_get_hw_features()
Gary Lin [Wed, 22 Oct 2025 01:28:56 +0000 (09:28 +0800)] 
libgcrypt: Implement _gcry_get_hw_features()

Implement _gcry_get_hw_features() and enable hardware feature detection
for x86_64.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt: Copy sha512 x86_64 assembly files
Gary Lin [Wed, 22 Oct 2025 01:28:55 +0000 (09:28 +0800)] 
libgcrypt: Copy sha512 x86_64 assembly files

Copy the selected x86_64 assembly files to support hardware
acceleration for sha512.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt: Copy sha256 x86_64 assembly files
Gary Lin [Wed, 22 Oct 2025 01:28:54 +0000 (09:28 +0800)] 
libgcrypt: Copy sha256 x86_64 assembly files

Copy the selected x86_64 assembly files to support hardware
acceleration for sha256.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolib/hwfeatures-gcry: Enable SSE and AVX for x86_64 EFI
Gary Lin [Wed, 22 Oct 2025 01:28:53 +0000 (09:28 +0800)] 
lib/hwfeatures-gcry: Enable SSE and AVX for x86_64 EFI

Implement the necessary functions to dynamically enable SSE and AVX
on x86_64 EFI systems when the hardware is capable.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolib/hwfeatures-gcry: Introduce functions to manage hardware features
Gary Lin [Wed, 22 Oct 2025 01:28:52 +0000 (09:28 +0800)] 
lib/hwfeatures-gcry: Introduce functions to manage hardware features

This commit introduces the generic functions to manage the hardware
features in libgcrypt. These functions are stubs for future
platform-specific implementations:
  - grub_gcry_hwf_enabled() returns __gcry_use_hwf which indicates if
    the hardware features are enabled specifically by grub_enable_gcry_hwf(),
  - grub_enable_gcry_hwf() invokes the architecture specific enablement
    functions and sets __gcry_use_hwf to true,
  - grub_reset_gcry_hwf() invokes the architecture specific reset
    functions and sets __gcry_use_hwf to false.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoconfigure: Tweak autoconf/automake files to detect x86_64 features
Gary Lin [Wed, 22 Oct 2025 01:28:51 +0000 (09:28 +0800)] 
configure: Tweak autoconf/automake files to detect x86_64 features

To enable hardware acceleration, this commit ports the feature detection
logic from libgcrypt. This allows us to check if the compiler supports
specific assembly instructions, including SSSE3, Intel SHA extensions,
SSE4.1, AVX, AVX2, AVX512, and BMI2.

To simplify the initial implementation, support for x86_64 feature
detection is currently limited to the x86_64 EFI target.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolib/pbkdf2: Optimize PBKDF2 by reusing HMAC handle
Gary Lin [Thu, 14 Aug 2025 06:32:42 +0000 (14:32 +0800)] 
lib/pbkdf2: Optimize PBKDF2 by reusing HMAC handle

The previous PBKDF2 implementation used grub_crypto_hmac_buffer() which
allocates and frees an HMAC handle on every call. This approach caused
significant performance overhead slowing down the boot process considerably.

This commit refactors the PBKDF2 code to use the new HMAC functions
allowing the HMAC handle and its buffers to be allocated once and reused
across multiple operations. This change significantly reduces disk
unlocking time.

In a QEMU/OVMF test environment this patch reduced the time to unlock
a LUKS2 (*) partition from approximately 15 seconds to 4 seconds.

  (*) PBKDF2 SHA256 with 3454944 iterations.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolib/crypto: Introduce new HMAC functions to reuse buffers
Gary Lin [Thu, 14 Aug 2025 06:32:41 +0000 (14:32 +0800)] 
lib/crypto: Introduce new HMAC functions to reuse buffers

To enable more efficient buffer reuse for HMAC operations three new
functions have been introduced. This change prevents the need to
reallocate memory for each HMAC operation:
  - grub_crypto_hmac_reset(): reinitializes the hash contexts in the HMAC handle,
  - grub_crypto_hmac_final(): provides the final HMAC result without freeing the
    handle allowing it to be reused immediately,
  - grub_crypto_hmac_free(): deallocates the HMAC handle and its associated memory.

To further facilitate buffer reuse ctx2 is now included within the HMAC handle
struct and the initialization of ctx2 is moved to grub_crypto_hmac_init().

The intermediate hash states, ctx and ctx2, for the inner and outer padded
keys are now cached. The grub_crypto_hmac_reset() restores these cached
states for new operations which avoids redundant hashing of the keys.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agodocs: Document argon2 and argon2_test modules
Gary Lin [Wed, 15 Oct 2025 03:00:27 +0000 (11:00 +0800)] 
docs: Document argon2 and argon2_test modules

Signed-off-by: Gary Lin <glin@suse.com>
Tested-By: Waldemar Brodkorb <wbx@openadk.org>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agokern/misc: Implement faster grub_memcpy() for aligned buffers
Gary Lin [Wed, 15 Oct 2025 03:00:28 +0000 (11:00 +0800)] 
kern/misc: Implement faster grub_memcpy() for aligned buffers

When both "dest" and "src" are aligned, copying the data in grub_addr_t
sized chunks is more efficient than a byte-by-byte copy.

Also tweak __aeabi_memcpy(), __aeabi_memcpy4(), and __aeabi_memcpy8(),
since grub_memcpy() is not inline anymore.

Optimization for unaligned buffers was omitted to maintain code
simplicity and readability. The current chunk-copy optimization
for aligned buffers already provides a noticeable performance
improvement (*) for Argon2 keyslot decryption.

  (*) On my system, for a LUKS2 keyslot configured with a 1 GB Argon2
      memory requirement, this patch reduces the decryption time from
      22 seconds to 12 seconds.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agotests/util/grub-fs-tester: Use Argon2id for LUKS2 test
Gary Lin [Wed, 15 Oct 2025 03:00:26 +0000 (11:00 +0800)] 
tests/util/grub-fs-tester: Use Argon2id for LUKS2 test

Given that the LUKS1 test already covers PBKDF2, the default KDF for the
LUKS2 test has been switched to Argon2id to ensure both algorithms are
validated.

Signed-off-by: Gary Lin <glin@suse.com>
Tested-By: Waldemar Brodkorb <wbx@openadk.org>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agotests: Integrate Argon2 tests into functional_test
Gary Lin [Wed, 15 Oct 2025 03:00:25 +0000 (11:00 +0800)] 
tests: Integrate Argon2 tests into functional_test

Refactor the Argon2 tests to enable the module build and integrate the
tests into function_test.

Signed-off-by: Gary Lin <glin@suse.com>
Tested-By: Waldemar Brodkorb <wbx@openadk.org>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agotests: Import Argon2 tests from libgcrypt
Gary Lin [Wed, 15 Oct 2025 03:00:24 +0000 (11:00 +0800)] 
tests: Import Argon2 tests from libgcrypt

Copy the Argon2 test function, check_argon2(), from t-kdf.c in libgcrypt
to grub-core/tests/argon2_test.c.

Signed-off-by: Gary Lin <glin@suse.com>
Tested-By: Waldemar Brodkorb <wbx@openadk.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agodisk/luks2: Add Argon2 support
Gary Lin [Wed, 15 Oct 2025 03:00:23 +0000 (11:00 +0800)] 
disk/luks2: Add Argon2 support

Leverage the new grub_crypto_argon2() function to add support for the
Argon2i and Argon2id KDFs in LUKS2.

Signed-off-by: Gary Lin <glin@suse.com>
Tested-By: Waldemar Brodkorb <wbx@openadk.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoargon2: Introduce grub_crypto_argon2()
Gary Lin [Wed, 15 Oct 2025 03:00:22 +0000 (11:00 +0800)] 
argon2: Introduce grub_crypto_argon2()

This commit introduces grub_crypto_argon2() which leverages the
_gcry_kdf_*() functions from libgcrypt to provide Argon2 support.

Due to the dependency of the _gcry_kdf_*() functions, the order of
"ldadd" entries have to be tweaked in Makefile.util.def so that the
linker can discover these functions.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt/kdf: Fix 64-bit modulus on 32-bit platforms
Gary Lin [Wed, 15 Oct 2025 03:00:21 +0000 (11:00 +0800)] 
libgcrypt/kdf: Fix 64-bit modulus on 32-bit platforms

Use grub_divmod64() for the 64-bit modulus to prevent creation of
special division calls such as __umoddi3() and __aeabi_uldivmod() on
32-bit platforms.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt/kdf: Remove unsupported KDFs
Gary Lin [Wed, 15 Oct 2025 03:00:20 +0000 (11:00 +0800)] 
libgcrypt/kdf: Remove unsupported KDFs

Clean up _gcry_kdf_*() to remove unsupported KDFs.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt/kdf: Get rid of gpg_err_code_from_errno()
Gary Lin [Wed, 15 Oct 2025 03:00:19 +0000 (11:00 +0800)] 
libgcrypt/kdf: Get rid of gpg_err_code_from_errno()

gpg_err_code_from_errno() requires libgcrypt_wrap/mem.c which is not in
Makefile.utilgcry.def. This commit replaces gpg_err_code_from_errno()
with GPG_ERR_* to avoid the build errors.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agolibgcrypt/kdf: Implement hash_buffers() for BLAKE2b-512
Gary Lin [Wed, 15 Oct 2025 03:00:18 +0000 (11:00 +0800)] 
libgcrypt/kdf: Implement hash_buffers() for BLAKE2b-512

The hash_buffers() functions are disabled in GRUB by default but the
Argon2 implementation requires hash_buffers() for BLAKE2b-512.

This commit implements argon2_blake2b_512_hash_buffers() as the
replacement of _gcry_digest_spec_blake2b_512.hash_buffers().

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agocrypto: Update crypto.h for libgcrypt KDF functions
Gary Lin [Wed, 15 Oct 2025 03:00:17 +0000 (11:00 +0800)] 
crypto: Update crypto.h for libgcrypt KDF functions

This commit introduces the necessary changes to crypto.h in preparation
for implementing Argon2 support via the generic KDF functions, _gcry_kdf_*():
  - add new GPG error types required by kdf.c,
  - declare _gcry_digest_spec_blake2b_512 to enable BLAKE2b-512 digest calculations,
  - define the gcrypt KDF algorithm IDs for Argon2,
  - add the prototypes of _gcry_kdf_*() functions.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 weeks agoutil/import_gcry: Import kdf.c for Argon2
Gary Lin [Wed, 15 Oct 2025 03:00:16 +0000 (11:00 +0800)] 
util/import_gcry: Import kdf.c for Argon2

The import_gcry.py script now imports kdf.c from libgcrypt. To isolate
the Argon2 implementation, all unrelated functions have been removed.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agocommands/menuentry: Fix for out of bound access
Sudhakar Kuppusamy [Thu, 9 Oct 2025 09:19:39 +0000 (14:49 +0530)] 
commands/menuentry: Fix for out of bound access

A menu entry with an empty title leads to an out-of-bounds access at
"ch = src[len - 1]", i.e., "src" is empty and "len" is zero. So, fixing
this by checking the menu entry title length and throwing an error if
the length is zero.

Signed-off-by: Sridhar Markonda <sridharm@linux.ibm.com>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotests/tpm2_key_protector_test: Add a test for PCR Capping
Gary Lin [Fri, 3 Oct 2025 03:22:08 +0000 (11:22 +0800)] 
tests/tpm2_key_protector_test: Add a test for PCR Capping

A test is introduced to cap PCR 1 and track the PCR 1 value before and
after key unsealing.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotpm2_key_protector: Support PCR capping
Gary Lin [Fri, 3 Oct 2025 03:22:07 +0000 (11:22 +0800)] 
tpm2_key_protector: Support PCR capping

To prevent a sealed key from being unsealed again, a common and
straightforward method is to "cap" the key by extending the associated
PCRs. When the PCRs associated with the sealed key are extended, TPM will
be unable to unseal the key, as the PCR values required for unsealing no
longer match, effectively rendering the key unusable until the next
system boot or a state where the PCRs are reset to their expected values.

To cap a specific set of PCRs, simply append the argument '-c pcr_list'
to the tpm2_key_protector command. Upon successfully unsealing the key,
the TPM2 key protector will then invoke tpm2_protector_cap_pcrs(). This
function extends the selected PCRs with an EV_SEPARATOR event,
effectively "capping" them. Consequently, the associated key cannot be
unsealed in any subsequent attempts until these PCRs are reset to their
original, pre-capped state, typically occurring upon the next system
boot.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotss2: Implement grub_tcg2_cap_pcr() for emu
Gary Lin [Fri, 3 Oct 2025 03:22:06 +0000 (11:22 +0800)] 
tss2: Implement grub_tcg2_cap_pcr() for emu

Since there is no system firmware for grub-emu, the TPM2_PCR_Event
command becomes the only choice to implement grub_tcg2_cap_pcr().

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotss2: Implement grub_tcg2_cap_pcr() for ieee1275
Gary Lin [Fri, 3 Oct 2025 03:22:05 +0000 (11:22 +0800)] 
tss2: Implement grub_tcg2_cap_pcr() for ieee1275

This commit implements grub_tcg2_cap_pcr() for ieee1275 with the
firmware function, 2hash-ext-log, to extend the target PCR with an
EV_SEPARATOR event and record the event into the TPM event log.

To avoid duplicate code, ibmvtpm_2hash_ext_log() is moved to tcg2.c
and exported as a global function.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotss2: Implement grub_tcg2_cap_pcr() for EFI
Gary Lin [Fri, 3 Oct 2025 03:22:04 +0000 (11:22 +0800)] 
tss2: Implement grub_tcg2_cap_pcr() for EFI

This commit implements grub_tcg2_cap_pcr() for EFI by using the UEFI
TCG2 protocol, HashLogExtendEvent, to extend the specified PCR with an
EV_SEPARATOR event and ensure the event will be recorded properly in the
TPM event log.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotss2: Introduce grub_tcg2_cap_pcr()
Gary Lin [Fri, 3 Oct 2025 03:22:03 +0000 (11:22 +0800)] 
tss2: Introduce grub_tcg2_cap_pcr()

This commit introduces the definition of grub_tcg2_cap_pcr(), a new
function designed to enhance the security of sealed keys. Its primary
purpose is to "cap" a specific PCR by extending it with an EV_SEPARATOR
event. This action cryptographically alters the PCR value, making it
impossible to unseal any key that was previously sealed to the original
PCR state. Consequently, the sealed key remains protected against
unauthorized unsealing attempts until the associated PCRs are reset to
their initial configuration, typically occurring during a subsequent
system boot.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agotss2: Add TPM2_PCR_Event command
Gary Lin [Fri, 3 Oct 2025 03:22:02 +0000 (11:22 +0800)] 
tss2: Add TPM2_PCR_Event command

The TPM2_PCR_Event command is introduced to tss2 to allow the user to
extend a specific PCR. The related data structure and unmarshal function
are also introduced.

However, simply invoking TPM2_PCR_Event does not automatically record
the event into the TPM event log. The TPM event log is primarily
maintained by the system firmware (e.g., BIOS/UEFI). Therefore, for most
standard use cases, the recommended method for extending PCRs and
ensuring proper event logging is to utilize the system firmware
functions.

There are specific scenarios where direct use of TPM2_PCR_Event becomes
necessary. For instance, in environments lacking system firmware support
for PCR extension, such as the grub-emu, TPM2_PCR_Event serves as the
only available method to extend PCRs.

Signed-off-by: Gary Lin <glin@suse.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoloader/i386/linux: Transfer EDID information to kernel
Thomas Zimmermann [Thu, 2 Oct 2025 12:44:01 +0000 (14:44 +0200)] 
loader/i386/linux: Transfer EDID information to kernel

The Linux kernel's struct bootparams provides a field at offset 0x140
for storing an EDID header. Copy the video adapter's data to the field.

The edid_info field was added in 2003 (see "[FBDEV] EDID support from
OpenFirmware on PPC platoforms and from the BIOS on intel platforms."),
but only got useable in 2004 (see "[PATCH] Fix EDID_INFO in zero-page").
The boot protocol was at version 2.03 at that time.

The field was never used much, but with the recent addition of the efidrm
and vesadrm drivers to the kernel, it becomes much more useful. As with
the initial screen setup, these drivers can make use of the provided
EDID information for basic display output.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Reviewed-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agofs/hfsplus: Allow reading files created by Mac OS 9
Dave Vasilevsky [Wed, 1 Oct 2025 21:03:48 +0000 (17:03 -0400)] 
fs/hfsplus: Allow reading files created by Mac OS 9

The "permissions" field of hfsplus files is only used by Mac OS X. This
causes GRUB to skip reading files created by Mac OS 9, since their
file mode is read as unknown. Instead, assume files with zero mode
are regular files.

From Technote 1150:

  The traditional Mac OS implementation of HFS Plus does not use the
  permissions field. Files created by traditional Mac OS have the
  entire field set to 0.

Signed-off-by: Dave Vasilevsky <dave@vasilevsky.ca>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agodocs: Fix build warnings in libgcrypt and blsuki doc
Sridhar Markonda [Wed, 17 Sep 2025 10:54:09 +0000 (16:24 +0530)] 
docs: Fix build warnings in libgcrypt and blsuki doc

Following warnings are thrown during libgrcypt and bluski doc build:

  grub.texi:4744: warning: node next pointer for `gcry_arcfour_module' is `gcry_blake2_module' but next is `gcry_aria_module' in menu
  grub.texi:4744: warning: node prev pointer for `gcry_arcfour_module' is `gcry_aria_module' but prev is `functional_test_module' in menu
  grub.texi:4751: warning: node prev pointer for `gcry_blake2_module' is `gcry_arcfour_module' but prev is `gcry_aria_module' in menu
  grub.texi:8532: warning: node next pointer for `trust' is `unset' but next is `uki' in menu
  grub.texi:8549: warning: node next pointer for `unset' is `uki' but next is `verify_detached' in menu
  grub.texi:8549: warning: node prev pointer for `unset' is `trust' but prev is `uki' in menu
  grub.texi:8557: warning: node next pointer for `uki' is `verify_detached' but next is `unset' in menu
  grub.texi:8557: warning: node prev pointer for `uki' is `unset' but prev is `trust' in menu
  grub.texi:8600: warning: node prev pointer for `verify_detached' is `uki' but prev is `unset' in menu

Fix order of gcry_aria_module and unset nodes.

Signed-off-by: Sridhar Markonda <sridharm@linux.ibm.com>
Reviewed-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agokern/command,commands/extcmd: Perform explicit NULL check in both the unregister...
Srish Srinivasan [Mon, 22 Sep 2025 06:02:46 +0000 (11:32 +0530)] 
kern/command,commands/extcmd: Perform explicit NULL check in both the unregister helpers

During command registration, grub_register_command_prio() returns
a 0 when there is a failure in memory allocation. In such a situation,
calls to grub_unregister_{command(), extcmd()} during command
unregistration will result in dereferencing a NULL pointer.

Perform explicit NULL check in both unregister helpers to prevent
undefined behaviour due to a NULL pointer dereference.

Signed-off-by: Srish Srinivasan <ssrish@linux.ibm.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agocommands/efi/tpm: Call get_active_pcr_banks() only with TCG2 1.1 or newer
Luca Boccassi [Sat, 20 Sep 2025 01:12:32 +0000 (02:12 +0100)] 
commands/efi/tpm: Call get_active_pcr_banks() only with TCG2 1.1 or newer

The call was added in the 1.1 revision of the spec, 1.0 does
not have it, and there are some machines out there with a TPM2
and a UEFI firmware that only supports version 1.0, so the
call fails in those cases. Check the reported version before
calling get_active_pcr_banks().

See Table 4 in section 6.2 of the TCG EFI Protocol Specification:

  https://trustedcomputinggroup.org/wp-content/uploads/EFI-Protocol-Specification-rev13-160330final.pdf

Fixes: f326c5c47 (commands/bli: Set LoaderTpm2ActivePcrBanks runtime variable)
Signed-off-by: Luca Boccassi <luca.boccassi@gmail.com>
Reviewed-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agokern: Include function name on debug and error print functions
Leo Sandoval [Tue, 23 Sep 2025 23:33:32 +0000 (17:33 -0600)] 
kern: Include function name on debug and error print functions

With the following change, we see standard (grub_dprintf) and
error (grub_error) logs with the function name embedded (see below)
into the log which is particular useful when debugging:

  commands/efi/tpm.c:grub_tpm_measure:281:tpm: log_event, pcr = 8, size = 0xb,

Including one more field on the print log impacts the binary sizes
and in turn their respective distro packages. For Fedora rpm packages
the increase is 20k approximately.

Signed-off-by: Leo Sandoval <lsandova@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agokern: Make grub_error() more verbose
Peter Jones [Tue, 23 Sep 2025 23:33:31 +0000 (17:33 -0600)] 
kern: Make grub_error() more verbose

Signed-off-by: Peter Jones <pjones@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agonet/tcp: Fix TCP port number reused on reboot
Michael Chang [Tue, 2 Sep 2025 06:58:50 +0000 (14:58 +0800)] 
net/tcp: Fix TCP port number reused on reboot

GRUB's TCP stack assigns source ports for outgoing connections starting
at 21550 and increments sequentially by 1 (e.g., 21550, 21551, ...).
While this generally works, it can lead to failures if the system
reboots rapidly and reuses the same source port too soon.

This issue was observed on powerpc-ieee1275 platforms using CAS (Client
Architecture Support) reboot. In such cases, loading the initrd over
HTTP may fail with connection timeouts. Packet captures show the failed
connections are flagged as "TCP Port Number Reused" by Wireshark.

The root cause is that GRUB reuses the same port shortly after reboot,
while the server may still be tracking the previous connection in
TIME_WAIT. This can result in the server rejecting the connection
attempt or responding with a stale ACK or RST, leading to handshake
failure.

This patch fixes the issue by introducing a time based source port
selection strategy. Instead of always starting from port 21550, GRUB now
computes an initial base port based on the current RTC time, divided
into 5 minute windows. The purpose of this time based strategy is to
ensure that GRUB avoids reusing the same source port within a 5 minute
window, thereby preventing collisions with stale server side connection
tracking that could interfere with a new TCP handshake.

A step size of 8 ensures that the same port will not be reused across
reboots unless GRUB opens more than 8 TCP connections per second on
average, something that is highly unlikely. In typical usage, a GRUB
boot cycle lasts about 15 seconds and may open fewer than 100
connections total, well below the reuse threshold. This makes the
approach robust against short reboot intervals while keeping the logic
simple and deterministic.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agodocs/grub: Document appended signature
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:25:05 +0000 (12:55 +0530)] 
docs/grub: Document appended signature

This explains how appended signatures can be used to form part of
a secure boot chain, and documents the commands and variables
introduced.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agodocs/grub: Document signing GRUB with an appended signature
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:25:04 +0000 (12:55 +0530)] 
docs/grub: Document signing GRUB with an appended signature

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 <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agodocs/grub: Document signing GRUB under UEFI
Daniel Axtens [Mon, 6 Oct 2025 07:25:03 +0000 (12:55 +0530)] 
docs/grub: Document signing GRUB under UEFI

Before adding information about how GRUB is signed with an appended
signature scheme, it's worth adding some information about how it
can currently be signed for UEFI.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Verification tests
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:25:02 +0000 (12:55 +0530)] 
appended signatures: Verification tests

These tests are run through all_functional_test and test a range
of commands and behaviours.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: GRUB commands to manage the hashes
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:25:01 +0000 (12:55 +0530)] 
appended signatures: GRUB commands to manage the hashes

Introducing the following GRUB commands to manage certificate/binary
hashes.

  1. append_list_dbx:
      Show the list of distrusted certificates and binary/certificate
      hashes from the dbx list.
  2. append_add_db_hash:
      Add the trusted binary hash to the db list.
  3. append_add_dbx_hash:
      Add the distrusted certificate/binary hash to the dbx list.

Note that if signature verification (check_appended_signatures) is set to yes,
the append_add_db_hash and append_add_dbx_hash commands only accept the file
‘hash_file’ that is signed with an appended signature.

Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Tested-by: Sridhar Markonda <sridharm@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: GRUB commands to manage the certificates
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:25:00 +0000 (12:55 +0530)] 
appended signatures: GRUB commands to manage the certificates

Introducing the following GRUB commands to manage the certificates.

 1. append_list_db:
      Show the list of trusted certificates from the db list
 2. append_add_db_cert:
      Add the trusted certificate to the db list
 3. append_add_dbx_cert:
      Add the distrusted certificate to the dbx list
 4. append_verify:
      Verify the signed file using db list

Note that if signature verification (check_appended_signatures) is set to yes,
the append_add_db_cert and append_add_dbx_cert commands only accept the file
‘X509_certificate’ that is signed with an appended signature.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Tested-by: Sridhar Markonda <sridharm@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Using db and dbx lists for signature verification
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:59 +0000 (12:54 +0530)] 
appended signatures: Using db and dbx lists for signature verification

Signature verification: verify the kernel against lists of hashes that are
either in dbx or db list. If it is not in the dbx list then the trusted keys
from the db list are used to verify the signature.

Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Create db and dbx lists
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:58 +0000 (12:54 +0530)] 
appended signatures: Create db and dbx lists

If secure boot is enabled with static key management mode, the trusted
certificates will be extracted from the GRUB ELF Note and added to db list.

If secure boot is enabled with dynamic key management mode, the trusted
certificates and certificate/binary hash will be extracted from the PKS
and added to db list. The distrusted certificates, certificate/binary hash
are read from the PKS and added to dbx list. Both dbx and db lists usage is
added by a subsequent patch.

Note:
- If db does not exist in the PKS storage, then read the static keys as a db
  default keys from the GRUB ELF Note and add them into the db list.
- If the certificate or the certificate hash exists in the dbx list, then do not
  add that certificate/certificate hash to the db list.

Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Introducing key management environment variable
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:57 +0000 (12:54 +0530)] 
appended signatures: Introducing key management environment variable

Introducing the appended signature key management environment variable. It is
automatically set to either "static" or "dynamic" based on the Platform KeyStore.

"static": Enforce static key management signature verification. This is the
          default. When the GRUB is locked down, user cannot change the value
          by setting the appendedsig_key_mgmt variable back to "dynamic".

"dynamic": Enforce dynamic key management signature verification. When the GRUB
           is locked down, user cannot change the value by setting the
           appendedsig_key_mgmt variable back to "static".

Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agopowerpc/ieee1275: Read the db and dbx secure boot variables
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:56 +0000 (12:54 +0530)] 
powerpc/ieee1275: Read the db and dbx secure boot variables

Enhancing the infrastructure to enable the Platform Keystore (PKS) feature,
which provides access to the SB_VERSION, db, and dbx secure boot variables
from PKS.

If PKS is enabled, it will read secure boot variables such as db and dbx
from PKS and extract EFI Signature List (ESL) from it. The ESLs would be
saved in the Platform Keystore buffer, and the appendedsig module would
read it later to extract the certificate's details from ESL.

In the following scenarios, static key management mode will be activated:
 1. When Secure Boot is enabled with static key management mode
 2. When SB_VERSION is unavailable but Secure Boot is enabled
 3. When PKS support is unavailable but Secure Boot is enabled

Note:

 SB_VERSION: Key Management Mode
 1 - Enable dynamic key management mode. Read the db and dbx variables from PKS,
     and use them for signature verification.
 0 - Enable static key management mode. Read keys from the GRUB ELF Note and
     use it for signature verification.

Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Support verifying appended signatures
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:55 +0000 (12:54 +0530)] 
appended signatures: Support verifying appended signatures

Building on the parsers and the ability to embed X.509 certificates, as well
as the existing gcrypt functionality, add a module for verifying appended
signatures.

This includes a signature verifier that requires that the Linux kernel and
GRUB modules have appended signatures for verification.

Signature verification must be enabled by setting check_appended_signatures.
If secure boot is enabled with enforce mode when the appendedsig module is
loaded, signature verification will be enabled, and trusted keys will be
extracted from the GRUB ELF Note and stored in the db and locked automatically.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agopowerpc/ieee1275: Enter lockdown based on /ibm, secure-boot
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:54 +0000 (12:54 +0530)] 
powerpc/ieee1275: Enter lockdown based on /ibm, secure-boot

Read secure boot mode from 'ibm,secure-boot' property and if the secure boot
mode is set to 2 (enforce), enter lockdown. Else it is considered as disabled.
There are three secure boot modes. They are

0 - disabled
     No signature verification is performed. This is the default.
1 - audit
     Signature verification is performed and if signature verification fails,
     display the errors and allow the boot to continue.
2 - enforce
     Lockdown the GRUB. Signature verification is performed and if signature
     verification fails, display the errors and stop the boot.

Now, only support disabled and enforce.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Parse X.509 certificates
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:53 +0000 (12:54 +0530)] 
appended signatures: Parse X.509 certificates

This code allows us to parse:

 - X.509 certificates: at least enough to verify the signatures on the PKCS#7
   messages. We expect that the certificates embedded in GRUB will be leaf
   certificates, not CA certificates. The parser enforces this.

 - X.509 certificates support the Extended Key Usage extension and handle it by
   verifying that the certificate has a Code Signing usage.

Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> # EKU support
Reported-by: Michal Suchanek <msuchanek@suse.com> # key usage issue
Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Parse PKCS#7 signed data
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:52 +0000 (12:54 +0530)] 
appended signatures: Parse PKCS#7 signed data

This code allows us to parse:

 - PKCS#7 signed data messages. Only a single signer info is supported, which
   is all that the Linux sign-file utility supports creating out-of-the-box.
   Only RSA, SHA-256 and SHA-512 are supported. Any certificate embedded in
   the PKCS#7 message will be ignored.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Parse ASN1 node
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:51 +0000 (12:54 +0530)] 
appended signatures: Parse ASN1 node

This code allows us to parse ASN1 node and allocating memory to store it.
It will work for anything where the size libtasn1 returns is right:
 - Integers
 - Octet strings
 - DER encoding of other structures

It will _not_ work for things where libtasn1 size requires adjustment:
 - Strings that require an extra NULL byte at the end
 - Bit strings because libtasn1 returns the length in bits, not bytes.

If the function returns a non-NULL value, the caller must free it.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agoappended signatures: Import GNUTLS's ASN.1 description files
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:50 +0000 (12:54 +0530)] 
appended signatures: Import GNUTLS's ASN.1 description files

In order to parse PKCS#7 messages and X.509 certificates with libtasn1, we need
some information about how they are encoded. We get these from GNUTLS, which has
the benefit that they support the features we need and are well tested.

The GNUTLS files are from:

- https://github.com/gnutls/gnutls/blob/master/lib/gnutls.asn
- https://github.com/gnutls/gnutls/blob/master/lib/pkix.asn

The GNUTLS license is LGPLv2.1+, which is GPLv3 compatible, allowing us to import
it without issue.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agogrub-install: Support embedding x509 certificates
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:49 +0000 (12:54 +0530)] 
grub-install: Support embedding x509 certificates

To support verification of appended signatures, we need a way to embed the
necessary public keys. Existing appended signature schemes in the Linux kernel
use X.509 certificates, so allow certificates to be embedded in the GRUB core
image in the same way as PGP keys.

Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agopgp: Rename OBJ_TYPE_PUBKEY to OBJ_TYPE_GPG_PUBKEY
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:48 +0000 (12:54 +0530)] 
pgp: Rename OBJ_TYPE_PUBKEY to OBJ_TYPE_GPG_PUBKEY

Prior to the addition of the X.509 public key support for appended signature,
current PGP signature relied on the GPG public key. Changing the enum name
from "OBJ_TYPE_PUBKEY" to "OBJ_TYPE_GPG_PUBKEY" to differentiate between x509
certificate based appended signature and GPG certificate based PGP signature.

Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agocrypto: Move storage for grub_crypto_pk_* to crypto.c
Daniel Axtens [Mon, 6 Oct 2025 07:24:47 +0000 (12:54 +0530)] 
crypto: Move storage for grub_crypto_pk_* to crypto.c

The way gcry_rsa and friends (the asymmetric ciphers) are loaded for the
pgp module is a bit quirky.

include/grub/crypto.h contains:
  extern struct gcry_pk_spec *grub_crypto_pk_rsa;

commands/pgp.c contains the actual storage:
  struct gcry_pk_spec *grub_crypto_pk_rsa;

And the module itself saves to the storage in pgp.c:
  GRUB_MOD_INIT(gcry_rsa)
  {
    grub_crypto_pk_rsa = &_gcry_pubkey_spec_rsa;
  }

This is annoying: gcry_rsa now has a dependency on pgp!

We want to be able to bring in gcry_rsa without bringing in PGP, so move the
storage to crypto.c.

Previously, gcry_rsa depended on pgp and mpi. Now it depends on crypto and mpi.
As pgp depends on crypto, this doesn't add any new module dependencies using
the PGP verfier.

[FWIW, the story is different for the symmetric ciphers. cryptodisk and friends
(zfs encryption etc) use grub_crypto_lookup_cipher_by_name() to get a cipher
handle. That depends on grub_ciphers being populated by people calling
grub_cipher_register. import_gcry.py ensures that the symmetric ciphers call it.]

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
3 weeks agopowerpc/ieee1275: Add support for signing GRUB with an appended signature
Sudhakar Kuppusamy [Mon, 6 Oct 2025 07:24:46 +0000 (12:54 +0530)] 
powerpc/ieee1275: Add support for signing GRUB with an appended signature

Add infrastructure to allow firmware to verify the integrity of GRUB
by use of a Linux-kernel-module-style appended signature. We initially
target powerpc-ieee1275, but the code should be extensible to other
platforms.

Usually these signatures are appended to a file without modifying the
ELF file itself. (This is what the 'sign-file' tool does, for example.)
The verifier loads the signed file from the file system and looks at the
end of the file for the appended signature. However, on powerpc-ieee1275
platforms, the bootloader is often stored directly in the PReP partition
as raw bytes without a file-system. This makes determining the location
of an appended signature more difficult.

To address this, we add a new ELF Note.

The name field of shall be the string "Appended-Signature", zero-padded
to 4 byte alignment. The type field shall be 0x41536967 (the ASCII values
for the string "ASig"). It must be the final section in the ELF binary.

The description shall contain the appended signature structure as defined
by the Linux kernel. The description will also be padded to be a multiple
of 4 bytes. The padding shall be added before the appended signature
structure (not at the end) so that the final bytes of a signed ELF file
are the appended signature magic.

A subsequent patch documents how to create a GRUB core.img validly signed
under this scheme.

Signed-off-by: Rashmica Gupta <rashmica.g@gmail.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Sudhakar Kuppusamy <sudhakar@linux.ibm.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Avnish Chouhan <avnish@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
8 weeks agolib/b64dec: Use grub_size_t instead of size_t for _gpgrt_b64dec_proc() function defin...
Anaëlle Cazuc [Tue, 2 Sep 2025 10:26:44 +0000 (12:26 +0200)] 
lib/b64dec: Use grub_size_t instead of size_t for _gpgrt_b64dec_proc() function definition

On some targets, size_t and grub_size_t may not be the same type
(unsigned long / unsigned int). This breaks the compilation because the
definition of _gpgrt_b64dec_proc() differs from gpgrt_b64dec_proc()
declaration. Fix it by using grub_size_t in the _gpgrt_b64dec_proc()
definition.

Signed-off-by: Anaëlle Cazuc <acazuc@acazuc.fr>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
8 weeks agoutil/grub-mkimagexx: Fix riscv32 relocation offset
Anaëlle Cazuc [Tue, 2 Sep 2025 09:50:51 +0000 (11:50 +0200)] 
util/grub-mkimagexx: Fix riscv32 relocation offset

When using grub-mkrescue for a riscv32 target, an invalid implicit cast
on the offset calculation produces an error during the relocation process:

  grub-mkrescue: error: target XXX not reachable from pc=fc.

This patch adds an explicit grub_int64_t cast to compute the offset
as a 64-bit subtraction.

Signed-off-by: Anaëlle Cazuc <acazuc@acazuc.fr>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
8 weeks agolibgcrypt: Allow GRUB to build with Clang
Andrew Hamilton [Sun, 31 Aug 2025 03:32:39 +0000 (22:32 -0500)] 
libgcrypt: Allow GRUB to build with Clang

Attempts to build GRUB with Clang were failing due to errors such as:

  error: redefinition of typedef 'gcry_md_hd_t' is a C11 feature

Correct this by adding a compiler pragma to disable the Clang
"typedef-redefinition" warnings. This required an update to
include/grub/crypto.h and the util/import_gcry.py script to add the
pragma to libgcrypt-grub's types.h due to u16 and similar types.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
8 weeks agotests: Add test ISO files to dist package
Andrew Hamilton [Mon, 1 Sep 2025 02:40:49 +0000 (21:40 -0500)] 
tests: Add test ISO files to dist package

Add test ISO files to dist package to allow ISO test to pass.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
8 weeks agotests: Test dates outside of 32-bit Unix range
Vladimir Serbinenko [Wed, 27 Aug 2025 22:32:14 +0000 (17:32 -0500)] 
tests: Test dates outside of 32-bit Unix range

Add tests outside the date range possible with 32-bit time calculation.

Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
8 weeks agolib/datetime: Support dates outside of 1901..2038 range
Vladimir Serbinenko [Wed, 27 Aug 2025 22:32:13 +0000 (17:32 -0500)] 
lib/datetime: Support dates outside of 1901..2038 range

Fixes: https://savannah.gnu.org/bugs/?63894
Fixes: https://savannah.gnu.org/bugs/?66301
Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agobootstrap: Ensure shallow gnulib clone works on newer git
Andrew Hamilton [Mon, 25 Aug 2025 01:38:41 +0000 (20:38 -0500)] 
bootstrap: Ensure shallow gnulib clone works on newer git

Update the bootstrap script to be compatible with newer versions of git
that changed the "git clone -h" output from containing:

  --depth

to:

  --[no-]depth

This bootstrap script is pulled the latest gnulib version from gnulib
git, commit 9a1a6385 (Silence 'time-stamp' warnings with bleeding-edge
Emacs.). This change avoids a full clone on gnulib, saving something
like 50 MB.

Fixes: https://savannah.gnu.org/bugs/?66357
Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agodocs: Correct some URLs
Andrew Hamilton [Mon, 25 Aug 2025 02:50:14 +0000 (21:50 -0500)] 
docs: Correct some URLs

Correct some outdated links to various websites and change
http to https in a few places.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agodocs: Update Future section to reflect current release
Andrew Hamilton [Mon, 25 Aug 2025 02:50:13 +0000 (21:50 -0500)] 
docs: Update Future section to reflect current release

Update the Future section of the GRUB manual to reflect
current work on the 2.x series.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agodocs: Document new libgrypt modules
Andrew Hamilton [Mon, 25 Aug 2025 02:50:12 +0000 (21:50 -0500)] 
docs: Document new libgrypt modules

Add documentation for new libgcrypt modules imported into GRUB.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agodocs: Clarify section heading and fix wording
Andrew Hamilton [Mon, 25 Aug 2025 02:50:11 +0000 (21:50 -0500)] 
docs: Clarify section heading and fix wording

Update chapter name from "Outline" to "Platform-specific operations" to
improve readability. Also slightly improve some wording in this section.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoBUGS: Update to point to bug tracking system
Andrew Hamilton [Sat, 23 Aug 2025 23:09:18 +0000 (18:09 -0500)] 
BUGS: Update to point to bug tracking system

Update the BUGS file to just point to the GRUB bug tracking system.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoINSTALL: Document libtasn1 needed for grub-protect
Andrew Hamilton [Sat, 23 Aug 2025 23:09:17 +0000 (18:09 -0500)] 
INSTALL: Document libtasn1 needed for grub-protect

Update INSTALL documentation to note that the optional grub-protect
utility requires libtasn1 to build.

Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agopo: Update translations to build with gettext 0.26
Andrew Hamilton [Sat, 23 Aug 2025 03:43:17 +0000 (22:43 -0500)] 
po: Update translations to build with gettext 0.26

Gettext 0.26 validates format strings. In some cases before
the GRUB build process was converting newlines sequences (\n)
to (\<translated character>) which is invalid. Update the
impacted language sed script files to ensure newlines use
the correct escape sequence.

This avoids build errors such as:

  de@hebrew.po:8192: 'msgstr' is not a valid Shell printf format string, unlike 'msgid'. Reason: This escape sequence is invalid.

Fixes: https://savannah.gnu.org/bugs/?67353
Signed-off-by: Andrew Hamilton <adhamilt@gmail.com>
Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoterm/efi/console: Treat key.scan_code 0x0102 (suspend) as Enter
Kancy Joe [Tue, 19 Aug 2025 15:12:03 +0000 (23:12 +0800)] 
term/efi/console: Treat key.scan_code 0x0102 (suspend) as Enter

Some Qualcomm-based UEFI platforms only provide volume up, volume down,
and power keys. The volume keys are already mapped to SCAN_UP and SCAN_DOWN,
while the power key is mapped to SCAN_SUSPEND (key.scan_code 0x0102).

On such devices, the power key is commonly used as the Enter (confirm)
button, since no dedicated Enter key exists. This patch treats key.scan_code
0x0102 as Enter to improve usability on these platforms.

Signed-off-by: Kancy Joe <kancy2333@outlook.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoutil/bash-completion.d/Makefile.am: s/mkrescure/mkrescue/g
Mate Kukri [Tue, 19 Aug 2025 13:13:10 +0000 (14:13 +0100)] 
util/bash-completion.d/Makefile.am: s/mkrescure/mkrescue/g

This is a typo that was stopping this bash-completion from being installed.

Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoblsuki: Add uki command to load Unified Kernel Image entries
Alec Brown [Tue, 12 Aug 2025 03:45:36 +0000 (03:45 +0000)] 
blsuki: Add uki command to load Unified Kernel Image entries

A Unified Kernel Image (UKI) is a single UEFI PE file that combines
a UEFI boot stub, a Linux kernel image, an initrd, and further resources.
The uki command will locate where the UKI file is and create a GRUB menu
entry to load it.

The Unified Kernel Image Specification: https://uapi-group.org/specifications/specs/unified_kernel_image/

Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoblsuki: Check for mounted /boot in emu
Robbie Harwood [Tue, 12 Aug 2025 03:45:35 +0000 (03:45 +0000)] 
blsuki: Check for mounted /boot in emu

Irritatingly, BLS defines paths relative to the mountpoint of the
filesystem which contains its snippets, not / or any other fixed
location. So grub-emu needs to know whether /boot is a separate
filesystem from / and conditionally prepend a path.

Signed-off-by: Robbie Harwood <rharwood@redhat.com>
Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoutil/misc.c: Change offset type for grub_util_write_image_at()
Alec Brown [Tue, 12 Aug 2025 03:45:34 +0000 (03:45 +0000)] 
util/misc.c: Change offset type for grub_util_write_image_at()

Adding filevercmp support to grub-core/commands/blsuki.c from gnulib will cause
issues with the type of the offset parameter for grub_util_write_image_at() for
emu builds. To fix this issue, we can change the type from off_t to grub_off_t.

Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoblsuki: Add blscfg command to parse Boot Loader Specification snippets
Peter Jones [Tue, 12 Aug 2025 03:45:33 +0000 (03:45 +0000)] 
blsuki: Add blscfg command to parse Boot Loader Specification snippets

The BootLoaderSpec (BLS) defines a scheme where different bootloaders can
share a format for boot items and a configuration directory that accepts
these common configurations as drop-in files.

The BLS Specification: https://uapi-group.org/specifications/specs/boot_loader_specification/

Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Will Thompson <wjt@endlessm.com>
Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agokern/misc: Implement grub_strtok()
Alec Brown [Tue, 12 Aug 2025 03:45:32 +0000 (03:45 +0000)] 
kern/misc: Implement grub_strtok()

Add the functions grub_strtok() and grub_strtok_r() to help parse strings into
tokens separated by characters in the "delim" parameter. These functions are
present in gnulib but calling them directly from the gnulib code is quite
challenging since the call "#include <string.h>" would include the header file
grub-core/lib/posix_wrap/string.h instead of grub-core/lib/gnulib/string.h,
where strtok() and strtok_r() are declared. Since this overlap is quite
problematic, the simpler solution was to implement the code in the GRUB based
on gnulib's implementation. For more information on these functions, visit the
Linux Programmer's Manual, man strtok.

Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agokern/xen: Add Xen command line parsing
Aaron Rainbolt [Thu, 14 Aug 2025 01:36:45 +0000 (20:36 -0500)] 
kern/xen: Add Xen command line parsing

Xen traditionally allows customizing guest behavior by passing arguments
to the VM kernel via the kernel command line. This is no longer possible
when using GRUB with Xen, as the kernel command line is decided by the
GRUB configuration file within the guest, not data passed to the guest
by Xen.

To work around this limitation, enable GRUB to parse a command line
passed to it by Xen, and expose data from the command line to the GRUB
configuration as environment variables. These variables can be used in
the GRUB configuration for any desired purpose, such as extending the
kernel command line passed to the guest. The command line format is
inspired by the Linux kernel's command line format.

To reduce the risk of misuse, abuse, or accidents in production, the
command line will only be parsed if it consists entirely of 7-bit ASCII
characters, only alphabetical characters and underscores are permitted
in variable names, and all variable names must start with the string
"xen_grub_env_". This also allows room for expanding the command line
arguments accepted by GRUB in the future, should other arguments end up
becoming desirable in the future.

Signed-off-by: Aaron Rainbolt <arraybolt3@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoinclude/xen/xen.h: Add warning comment for cmd_line
Aaron Rainbolt [Thu, 14 Aug 2025 01:36:44 +0000 (20:36 -0500)] 
include/xen/xen.h: Add warning comment for cmd_line

The cmd_line field of the start_info struct is not guaranteed to be
NUL-terminated, even though it is intended to contain a NUL-terminated
string. Add a warning about this in a comment so future consumers of
this field know to check it for a NUL terminator before using it.

Signed-off-by: Aaron Rainbolt <arraybolt3@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agozfs: Fix LINUX_ROOT_DEVICE when grub-probe fails
Doug Goldstein [Wed, 23 Jul 2025 15:40:04 +0000 (16:40 +0100)] 
zfs: Fix LINUX_ROOT_DEVICE when grub-probe fails

When grub-probe fails, the current code is to just stuff an empty result
in which causes the user to not knowingly have a system that no longer
boots. grub-probe can fail because the ZFS pool that contains the root
filesystem might have features that GRUB does not yet support which is
a common configuration for people with a rpool and a bpool. This behavior
uses the zdb utility to dump the same value as the filesystem label
would print.

Signed-off-by: Doug Goldstein <cardoe@cardoe.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agorelocator: Switch to own page table while moving chunks
Vladimir Serbinenko [Mon, 11 Aug 2025 18:02:54 +0000 (18:02 +0000)] 
relocator: Switch to own page table while moving chunks

We need to avoid clobbering existing table between starting of chunk movers
and the moment we install target page table. Generate temporary table for
this rather than hoping that we don't clobber existing one.

Fixes 64-bit GhostBSD on 64-bit EFI.

Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoconfigure: Generate tar-ustar tarball instead of tar-v7
Mate Kukri [Thu, 24 Jul 2025 17:06:29 +0000 (18:06 +0100)] 
configure: Generate tar-ustar tarball instead of tar-v7

Some of our paths are too long for tar-v7 at this point but tar-ustar
is supported by essentially everything. So, let's use that.

Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agobuild: Add new libgcrypt and libtasn1 related files to EXTRA_DISTS
Mate Kukri [Thu, 14 Aug 2025 15:12:03 +0000 (17:12 +0200)] 
build: Add new libgcrypt and libtasn1 related files to EXTRA_DISTS

These files were not added to EXTRA_DISTS during the libgcrypt
and libtasn1 imports but are required for autogen.sh to work.

Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agobuild: Add util/import_gcrypt_inth.sed to EXTRA_DISTS
Mate Kukri [Thu, 24 Jul 2025 09:33:44 +0000 (10:33 +0100)] 
build: Add util/import_gcrypt_inth.sed to EXTRA_DISTS

This new file was not added to the distribution tarball during the last
libgcrypt import.

Fixes: 0739d24cd164 (libgcrypt: Adjust import script, definitions and API users for libgcrypt 1.11)
Signed-off-by: Mate Kukri <mate.kukri@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoinclude/xen/xen.h: Rename MAX_GUEST_CMDLINE to GRUB_XEN_MAX_GUEST_CMDLINE
Aaron Rainbolt [Thu, 14 Aug 2025 01:36:43 +0000 (20:36 -0500)] 
include/xen/xen.h: Rename MAX_GUEST_CMDLINE to GRUB_XEN_MAX_GUEST_CMDLINE

The include/xen/xen.h header was using an overly generic name to refer
to the maximum length of the command line passed from Xen to a guest.
Rename it to avoid confusion or conflicts in the future.

Signed-off-by: Aaron Rainbolt <arraybolt3@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoloader/arm64/xen_boot: Set correctly bootargs property for modules
Frediano Ziglio [Mon, 21 Jul 2025 16:25:57 +0000 (17:25 +0100)] 
loader/arm64/xen_boot: Set correctly bootargs property for modules

The cmdline_size already account for NUL terminator, you can see
this in xen_boot_binary_load(). The same property is set correctly
for Xen command line.

Signed-off-by: Frediano Ziglio <frediano.ziglio@cloud.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 months agoloader/efi/linux: Return correct size from LoadFile2
Frediano Ziglio [Wed, 16 Jul 2025 08:06:09 +0000 (09:06 +0100)] 
loader/efi/linux: Return correct size from LoadFile2

From UEFI specifications 2.10, section 13.2.2, EFI_LOAD_FILE2_PROTOCOL.LoadFile
(see https://uefi.org/specs/UEFI/2.10/13_Protocols_Media_Access.html), for BufferSize:

  On input the size of Buffer in bytes. On output with a return code
  of EFI_SUCCESS, the amount of data transferred to Buffer. On output
  with a return code of EFI_BUFFER_TOO_SMALL, the size of Buffer
  required to retrieve the requested file.

So, set *buffer_size correctly.

Signed-off-by: Frediano Ziglio <frediano.ziglio@cloud.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>