On Tue, Aug 19, 2025 at 06:43:15PM +0530, Sudhakar Kuppusamy wrote:
> 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.
> This is introduced by a subsequent patch.
> 
> 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 are 
> introduced by
> a subsequent patch.
> 
> Note:-
> 
> 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 <sudha...@linux.ibm.com>
> Reviewed-by: Stefan Berger <stef...@linux.ibm.com>
> Reviewed-by: Avnish Chouhan <avn...@linux.ibm.com>
> ---
>  grub-core/commands/appendedsig/appendedsig.c | 452 ++++++++++++++++++-
>  include/grub/crypto.h                        |   1 +
>  include/grub/efi/pks.h                       | 112 +++++
>  include/grub/types.h                         |   4 +
>  4 files changed, 563 insertions(+), 6 deletions(-)
>  create mode 100644 include/grub/efi/pks.h
> 
> diff --git a/grub-core/commands/appendedsig/appendedsig.c 
> b/grub-core/commands/appendedsig/appendedsig.c
> index c952b04a2..04b3ccc93 100644
> --- a/grub-core/commands/appendedsig/appendedsig.c
> +++ b/grub-core/commands/appendedsig/appendedsig.c
> @@ -33,7 +33,8 @@
>  #include <libtasn1.h>
>  #include <grub/env.h>
>  #include <grub/lockdown.h>
> -
> +#include <grub/efi/pks.h>
> +#include <grub/powerpc/ieee1275/platform_keystore.h>
>  #include "appendedsig.h"
>  
>  GRUB_MOD_LICENSE ("GPLv3+");
> @@ -67,15 +68,23 @@ struct grub_appended_signature
>    struct pkcs7_signedData pkcs7;        /* Parsed PKCS#7 data. */
>  };
>  
> -/* This represents a trusted certificates. */
> +/* This represents a db/dbx list. */
>  struct grub_database
>  {
>    struct x509_certificate *certs; /* Certificates. */
>    grub_uint32_t cert_entries;     /* Number of certificates. */
> +  grub_uint8_t **signatures;      /* Certificate/binary hashes. */
> +  grub_size_t *signature_size;    /* Size of certificate/binary hashes. */
> +  grub_uint32_t signature_entries;/* Number of certificate/binary hashes. */
>  };
>  
>  /* The db list */
> -struct grub_database db = {.certs = NULL, .cert_entries = 0};
> +struct grub_database db = {.certs = NULL, .cert_entries = 0, .signatures = 
> NULL,
> +                           .signature_size = NULL, .signature_entries = 0};
> +
> +/* The dbx list */
> +struct grub_database dbx = {.certs = NULL, .cert_entries = 0, .signatures = 
> NULL,
> +                            .signature_size = NULL, .signature_entries = 0};
>  
>  /* Appended signature size. */
>  static grub_size_t append_sig_len = 0;
> @@ -136,6 +145,134 @@ grub_env_write_sec (struct grub_env_var *var 
> __attribute__ ((unused)), const cha
>    return ret;
>  }
>  
> +static const char *
> +grub_env_read_key (struct grub_env_var *var __attribute__ ((unused)),
> +                   const char *val __attribute__ ((unused)))
> +{
> +  if (grub_pks_use_keystore == true)
> +    return "dynamic";
> +
> +  return "static";
> +}
> +
> +static char *
> +grub_env_write_key (struct grub_env_var *var __attribute__ ((unused)), const 
> char *val)
> +{
> +  char *ret;
> +
> +  /*
> +   * Do not allow the value to be changed if check_sigs is set to enforce and
> +   * GRUB is locked down.
> +   */
> +  if (check_sigs == true && grub_is_lockdown () == GRUB_LOCKDOWN_ENABLED)
> +    {
> +      ret = grub_strdup (grub_env_read_key (NULL, NULL));
> +      if (ret == NULL)
> +        grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> +
> +      return ret;
> +    }
> +
> +  if (check_sigs == false)
> +    {
> +      if ((*val == '1') || (*val == 'd'))
> +        grub_pks_use_keystore = true;
> +      else if ((*val == '0') || (*val == 's'))
> +        grub_pks_use_keystore = false;
> +    }
> +
> +  ret = grub_strdup (grub_env_read_key (NULL, NULL));
> +  if (ret == NULL)
> +    grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> +
> +  return ret;
> +}
> +
> +/*
> + * GUID can be used to determine the hashing function and
> + * generate the hash using determined hashing function.
> + */
> +static grub_err_t
> +get_hash (const grub_packed_guid_t *guid, const grub_uint8_t *data, const 
> grub_size_t data_size,
> +          grub_uint8_t *hash, grub_size_t *hash_size)
> +{
> +  gcry_md_spec_t *hash_func = NULL;
> +
> +  if (guid == NULL)
> +    return grub_error (GRUB_ERR_OUT_OF_RANGE, "GUID is not available");
> +
> +  if (grub_memcmp (guid, &GRUB_PKS_CERT_SHA256_GUID, GRUB_PACKED_GUID_SIZE) 
> == 0 ||
> +      grub_memcmp (guid, &GRUB_PKS_CERT_X509_SHA256_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0)
> +    hash_func = &_gcry_digest_spec_sha256;
> +  else if (grub_memcmp (guid, &GRUB_PKS_CERT_SHA384_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0 ||
> +           grub_memcmp (guid, &GRUB_PKS_CERT_X509_SHA384_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0)
> +    hash_func = &_gcry_digest_spec_sha384;
> +  else if (grub_memcmp (guid, &GRUB_PKS_CERT_SHA512_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0 ||
> +           grub_memcmp (guid, &GRUB_PKS_CERT_X509_SHA512_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0)
> +    hash_func = &_gcry_digest_spec_sha512;
> +  else
> +    return grub_error (GRUB_ERR_OUT_OF_RANGE, "unsupported GUID hash");
> +
> +  grub_memset (hash, 0, GRUB_MAX_HASH_SIZE);
> +  grub_crypto_hash (hash_func, hash, data, data_size);
> +  *hash_size =  hash_func->mdlen;
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +/* Add the certificate/binary hash into the db/dbx list. */
> +static grub_err_t
> +add_hash (const grub_uint8_t **data, const grub_size_t data_size,
Do you intend to make 'data' a const variable in 'add_hash()'? If so, it
should be 'grub_uint8_t ** const data'. With 'const grub_uint8_t **',
'data' becomes a pointer to a constant, and it doesn't match the
parameter passed in create_dbx_list().

> +          grub_uint8_t ***signature_list, grub_size_t **signature_size_list,
> +          grub_uint32_t *signature_list_entries)
> +{
> +  grub_uint8_t **signatures;
> +  grub_size_t *signature_size;
> +  grub_uint32_t signature_entries = *signature_list_entries;
> +
> +  if (*data == NULL || data_size == 0)
> +    return grub_error (GRUB_ERR_OUT_OF_RANGE, "certificate/binary-hash data 
> or size is not available");
> +
> +  signatures = grub_realloc (*signature_list, sizeof (grub_uint8_t *) * 
> (signature_entries + 1));
> +  if (signatures == NULL)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> +
> +  signature_size = grub_realloc (*signature_size_list,
> +                                 sizeof (grub_size_t) * (signature_entries + 
> 1));
> +  if (signature_size == NULL)
> +    {
> +      /*
> +       * Allocated memory will be freed by
> +       * free_db_list/free_dbx_list.
> +       */
> +      signatures[signature_entries + 1] = NULL;
> +      *signature_list = signatures;
> +      *signature_list_entries = signature_entries + 1;
> +
> +      return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> +    }
> +
> +  signatures[signature_entries] = (grub_uint8_t *) *data;
> +  signature_size[signature_entries] = data_size;
> +  signature_entries++;
> +  *data = NULL;
> +
> +  *signature_list = signatures;
> +  *signature_size_list = signature_size;
> +  *signature_list_entries = signature_entries;
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +static bool
> +is_x509 (const grub_packed_guid_t *guid)
> +{
> +  if (grub_memcmp (guid, &GRUB_PKS_CERT_X509_GUID, GRUB_PACKED_GUID_SIZE) == 
> 0)
> +    return true;
> +
> +  return false;
> +}
> +
>  static bool
>  is_cert_match (const struct x509_certificate *distrusted_cert,
>                 const struct x509_certificate *db_cert)
> @@ -150,6 +287,95 @@ is_cert_match (const struct x509_certificate 
> *distrusted_cert,
>    return false;
>  }
>  
> +/* Check the certificate presence in the Platform Keystore dbx list. */
> +static grub_err_t
> +is_dbx_cert (const struct x509_certificate *db_cert)
> +{
> +  grub_err_t rc;
> +  grub_uint32_t i;
> +  struct x509_certificate *distrusted_cert;
> +
> +  for (i = 0; i < grub_pks_keystore.dbx_entries; i++)
> +    {
> +      if (grub_pks_keystore.dbx[i].data == NULL)
> +        continue;
> +
> +      if (is_x509 (&grub_pks_keystore.dbx[i].guid) == true)
> +        {
> +          distrusted_cert = grub_zalloc (sizeof (struct x509_certificate));
> +          if (distrusted_cert == NULL)
> +            return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> +
> +          rc = parse_x509_certificate (grub_pks_keystore.dbx[i].data,
> +                                       grub_pks_keystore.dbx[i].data_size, 
> distrusted_cert);
> +          if (rc != GRUB_ERR_NONE)
> +            {
> +              grub_free (distrusted_cert);
> +              continue;
> +            }
> +
> +          if (is_cert_match (distrusted_cert, db_cert) == true)
> +            {
> +              grub_dprintf ("appendedsig", "a certificate CN='%s' is ignored 
> "
> +                            "because it is on the dbx list\n", 
> db_cert->subject);
> +              return GRUB_ERR_ACCESS_DENIED;
> +            }
> +
> +          certificate_release (distrusted_cert);
> +          grub_free (distrusted_cert);
> +        }
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +/* Add the certificate into the db/dbx list */
> +static grub_err_t
> +add_certificate (const grub_uint8_t *data, const grub_size_t data_size,
> +                 struct grub_database *database, const bool is_db)
> +{
> +  struct x509_certificate *cert;
> +  grub_err_t rc;
> +  grub_uint32_t cert_entries = database->cert_entries;
> +
> +  if (data == NULL || data_size == 0)
> +    return grub_error (GRUB_ERR_OUT_OF_RANGE, "certificate data or size is 
> not available");
> +
> +  cert = grub_zalloc (sizeof (struct x509_certificate));
> +  if (cert == NULL)
> +    return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
> +
> +  rc = parse_x509_certificate (data, data_size, cert);
> +  if (rc != GRUB_ERR_NONE)
> +    {
> +      grub_dprintf ("appendedsig", "cannot add a certificate CN='%s' to 
> %s\n",
> +                    cert->subject, ((is_db == true) ? "db" : "dbx"));
> +      grub_free (cert);
> +      return rc;
> +    }
> +
> +  if (is_db == true)
> +    {
> +      rc = is_dbx_cert (cert);
> +      if (rc != GRUB_ERR_NONE)
> +        {
> +          certificate_release (cert);
> +          grub_free (cert);
> +          return rc;
> +        }
> +    }
> +
> +  grub_dprintf ("appendedsig", "add a certificate CN='%s' to %s", 
> cert->subject,
> +                ((is_db == true) ? "db" : "dbx"));
> +
> +  cert_entries++;
> +  cert->next = database->certs;
> +  database->certs = cert;
> +  database->cert_entries = cert_entries;
> +
> +  return rc;
> +}
> +
>  static grub_err_t
>  file_read_whole (grub_file_t file, grub_uint8_t **buf, grub_size_t *len)
>  {
> @@ -648,11 +874,169 @@ static struct grub_fs pseudo_fs = {
>  
>  static grub_command_t cmd_verify, cmd_list_db, cmd_dbx_cert, cmd_db_cert;
>  
> +/* Check the certificate hash presence in the PKS dbx list. */
> +static bool
> +is_dbx_cert_hash (const grub_uint8_t *data, const grub_size_t data_size)
> +{
> +  grub_err_t rc;
> +  grub_uint32_t i;
> +  grub_size_t cert_hash_size = 0;
> +  grub_uint8_t cert_hash[GRUB_MAX_HASH_SIZE] = { 0 };
> +
> +  for (i = 0; i < grub_pks_keystore.dbx_entries; i++)
> +    {
> +      if (grub_pks_keystore.dbx[i].data == NULL ||
> +          grub_pks_keystore.dbx[i].data_size == 0)
> +        continue;
> +
> +      rc = get_hash (&grub_pks_keystore.dbx[i].guid, data, data_size,
> +                     cert_hash, &cert_hash_size);
> +      if (rc != GRUB_ERR_NONE)
> +        continue;
> +
> +      if (cert_hash_size == grub_pks_keystore.dbx[i].data_size &&
> +          grub_memcmp (grub_pks_keystore.dbx[i].data, cert_hash, 
> cert_hash_size) == 0)
> +        {
> +          grub_dprintf ("appendedsig", "a certificate (%02x%02x%02x%02x) is 
> ignored "
> +                        "because this certificate hash is on the dbx list\n",
> +                        cert_hash[0], cert_hash[1], cert_hash[2], 
> cert_hash[3]);
> +          return true;
> +        }
> +    }
> +
> +  return false;
> +}
> +
> +/* Check the binary hash presence in the PKS dbx list. */
> +static bool
> +is_dbx_binary_hash (const grub_uint8_t *binary_hash, const grub_size_t 
> binary_hash_size)
> +{
> +  grub_uint32_t i;
> +
> +  for (i = 0; i < grub_pks_keystore.dbx_entries; i++)
> +    {
> +      if (grub_pks_keystore.dbx[i].data == NULL ||
> +          grub_pks_keystore.dbx[i].data_size == 0)
> +        continue;
> +
> +      if (binary_hash_size == grub_pks_keystore.dbx[i].data_size &&
> +          grub_memcmp (grub_pks_keystore.dbx[i].data, binary_hash, 
> binary_hash_size) == 0)
> +        {
> +          grub_dprintf ("appendedsig", "a binary hash (%02x%02x%02x%02x) is 
> ignored"
> +                        " because it is on the dbx list\n", binary_hash[0], 
> binary_hash[1],
> +                        binary_hash[2], binary_hash[3]);
> +          return true;
> +        }
> +    }
> +
> +  return false;
> +}
> +
> +/* Add the binary hash to the db list if it does not exist in the PKS dbx 
> list. */
> +static grub_err_t
> +add_db_binary_hash (const grub_uint8_t **data, const grub_size_t data_size)
Again, 'const grub_uint8_t **' seems not a correct type for 'data'.

> +{
> +  if (*data == NULL || data_size == 0)
> +    return grub_error (GRUB_ERR_OUT_OF_RANGE, "binary hash data or size is 
> not available");
> +
> +  if (is_dbx_binary_hash (*data, data_size) == false)
> +    return add_hash (data, data_size, &db.signatures, &db.signature_size,
> +                     &db.signature_entries);
> +
> +  return GRUB_ERR_BAD_SIGNATURE;
> +}
> +
> +static bool
> +is_hash (const grub_packed_guid_t *guid)
> +{
> +  /* GUID type of the binary hash. */
> +  if (grub_memcmp (guid, &GRUB_PKS_CERT_SHA256_GUID, GRUB_PACKED_GUID_SIZE) 
> == 0 ||
> +      grub_memcmp (guid, &GRUB_PKS_CERT_SHA384_GUID, GRUB_PACKED_GUID_SIZE) 
> == 0 ||
> +      grub_memcmp (guid, &GRUB_PKS_CERT_SHA512_GUID, GRUB_PACKED_GUID_SIZE) 
> == 0)
> +    return true;
> +
> +  /* GUID type of the certificate hash. */
> +  if (grub_memcmp (guid, &GRUB_PKS_CERT_X509_SHA256_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0 ||
> +      grub_memcmp (guid, &GRUB_PKS_CERT_X509_SHA384_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0 ||
> +      grub_memcmp (guid, &GRUB_PKS_CERT_X509_SHA512_GUID, 
> GRUB_PACKED_GUID_SIZE) == 0)
> +    return true;
> +
> +  return false;
> +}
> +
> +/* Add the X.509 certificates/binary hash to the db list from PKS. */
> +static grub_err_t
> +create_db_list (void)
> +{
> +  grub_err_t rc;
> +  grub_uint32_t i;
> +
> +  for (i = 0; i < grub_pks_keystore.db_entries; i++)
> +    {
> +      if (is_hash (&grub_pks_keystore.db[i].guid) == true)
> +        {
> +          rc = add_db_binary_hash ((const grub_uint8_t **) 
> grub_pks_keystore.db[i].data,
With 'grub_uint8_t ** const data' in 'add_db_binary_hash()', you don't
need to do type-casting here. However, this line is still not working.

1) 'grub_pks_keystore.db[i].data' is 'grub_uint8_t *' so the correct
   parameter is '&grub_pks_keystore.db[i].data'.

2) Even with the fix for 1), GCC 15 complains:

error: taking address of packed member of ‘struct grub_pks_sd’ may result in an 
unaligned pointer value [-Werror=address-of-packed-member]

Unfortunately, I don't have a good solution for this error.

> +                                   grub_pks_keystore.db[i].data_size);
> +          if (rc == GRUB_ERR_OUT_OF_MEMORY)
> +            return rc;
> +        }
> +      else if (is_x509 (&grub_pks_keystore.db[i].guid) == true)
> +        {
> +          if (is_dbx_cert_hash (grub_pks_keystore.db[i].data,
> +                                grub_pks_keystore.db[i].data_size) == true)
> +            continue;
> +
> +          rc = add_certificate (grub_pks_keystore.db[i].data,
> +                                grub_pks_keystore.db[i].data_size, &db, 
> true);
> +          if (rc == GRUB_ERR_OUT_OF_MEMORY)
> +            return rc;
> +        }
> +      else
> +        grub_dprintf ("appendedsig", "unsupported signature data type and "
> +                      "skipped (%u)\n", i + 1);
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
> +/* Add the certificates and certificate/binary hash to the dbx list from 
> PKS. */
> +static grub_err_t
> +create_dbx_list (void)
> +{
> +  grub_err_t rc;
> +  grub_uint32_t i;
> +
> +  for (i = 0; i < grub_pks_keystore.dbx_entries; i++)
> +    {
> +      if (is_x509 (&grub_pks_keystore.dbx[i].guid) == true)
> +        {
> +          rc = add_certificate (grub_pks_keystore.dbx[i].data,
> +                                grub_pks_keystore.dbx[i].data_size, &dbx, 
> false);
> +          if (rc == GRUB_ERR_OUT_OF_MEMORY)
> +            return rc;
> +        }
> +      else if (is_hash (&grub_pks_keystore.dbx[i].guid) == true)
> +        {
> +          rc = add_hash ((const grub_uint8_t **) 
> grub_pks_keystore.dbx[i].data,

The same situation as that in create_db_list().

Cheers,

Gary Lin

> +                         grub_pks_keystore.dbx[i].data_size, &dbx.signatures,
> +                         &dbx.signature_size, &dbx.signature_entries);
> +          if (rc != GRUB_ERR_NONE)
> +            return rc;
> +        }
> +      else
> +        grub_dprintf ("appendedsig", "unsupported signature data type and "
> +                      "skipped (%u)\n", i + 1);
> +    }
> +
> +  return GRUB_ERR_NONE;
> +}
> +
>  /* Free db list memory */
>  static void
>  free_db_list (void)
>  {
>    struct x509_certificate *cert;
> +  grub_uint32_t i;
>  
>    while (db.certs != NULL)
>      {
> @@ -662,9 +1046,37 @@ free_db_list (void)
>        grub_free (cert);
>      }
>  
> +  for (i = 0; i < db.signature_entries; i++)
> +    grub_free (db.signatures[i]);
> +
> +  grub_free (db.signatures);
> +  grub_free (db.signature_size);
>    grub_memset (&db, 0, sizeof (struct grub_database));
>  }
>  
> +/* Free dbx list memory */
> +static void
> +free_dbx_list (void)
> +{
> +  struct x509_certificate *cert;
> +  grub_uint32_t i;
> +
> +  while (dbx.certs != NULL)
> +    {
> +      cert = dbx.certs;
> +      dbx.certs = dbx.certs->next;
> +      certificate_release (cert);
> +      grub_free (cert);
> +    }
> +
> +  for (i = 0; i < dbx.signature_entries; i++)
> +    grub_free (dbx.signatures[i]);
> +
> +  grub_free (dbx.signatures);
> +  grub_free (dbx.signature_size);
> +  grub_memset (&dbx, 0, sizeof (struct grub_database));
> +}
> +
>  /*
>   * Extract the X.509 certificates from the ELF Note header,
>   * parse it, and add it to the db list.
> @@ -737,6 +1149,7 @@ unregister_appended_signatures_cmd (void)
>  GRUB_MOD_INIT (appendedsig)
>  {
>    grub_int32_t rc;
> +  grub_err_t err;
>  
>    /*
>     * If secure boot is enabled with enforced mode and GRUB is locked down,
> @@ -748,20 +1161,44 @@ GRUB_MOD_INIT (appendedsig)
>    grub_register_variable_hook ("check_appended_signatures", 
> grub_env_read_sec, grub_env_write_sec);
>    grub_env_export ("check_appended_signatures");
>  
> +  /* Key management variable. */
> +  grub_register_variable_hook ("appendedsig_key_mgmt", grub_env_read_key, 
> grub_env_write_key);
> +  grub_env_export ("appendedsig_key_mgmt");
> +
>    rc = asn1_init ();
>    if (rc != ASN1_SUCCESS)
>      grub_fatal ("error initing ASN.1 data structures: %d: %s\n", rc, 
> asn1_strerror (rc));
>  
>    /*
> -   * If signature verification is enabled,
> -   * extract trusted keys from ELF Note and store them in the db.
> +   * If signature verification is enabled with static key management mode,
> +   * extract trusted keys from ELF Note and store them in the db list.
>     */
> -  if (check_sigs == true)
> +  if (grub_pks_use_keystore == false && check_sigs == true)
>      {
>        build_static_db_list ();
>        grub_dprintf ("appendedsig", "the db list now has %u static keys\n",
>                      db.cert_entries);
>      }
> +  /*
> +   * If signature verification is enabled with dynamic key management mode,
> +   * extract trusted and distrusted keys from PKS and store them in the db 
> and dbx list.
> +   */
> +  else if (grub_pks_use_keystore == true && check_sigs == true)
> +    {
> +      err = create_db_list ();
> +      if (err != GRUB_ERR_NONE)
> +        grub_dprintf ("appendedsig", "warning: db list might not be fully 
> populated\n");
> +
> +      err = create_dbx_list ();
> +      if (err != GRUB_ERR_NONE)
> +        grub_dprintf ("appendedsig", "warning: dbx list might not be fully 
> populated\n");
> +
> +      grub_dprintf ("appendedsig", "the db list now has %u keys\n"
> +                    "the dbx list now has %u keys\n",
> +                    db.signature_entries + db.cert_entries,
> +                    dbx.signature_entries + dbx.cert_entries);
> +      grub_pks_free_keystore ();
> +    }
>  
>    register_appended_signatures_cmd ();
>    grub_verifier_register (&grub_appendedsig_verifier);
> @@ -776,8 +1213,11 @@ GRUB_MOD_FINI (appendedsig)
>     */
>  
>    free_db_list ();
> +  free_dbx_list ();
>    grub_register_variable_hook ("check_appended_signatures", NULL, NULL);
>    grub_env_unset ("check_appended_signatures");
> +  grub_register_variable_hook ("appendedsig_key_mgmt", NULL, NULL);
> +  grub_env_unset ("appendedsig_key_mgmt");
>    grub_verifier_unregister (&grub_appendedsig_verifier);
>    unregister_appended_signatures_cmd ();
>  }
> diff --git a/include/grub/crypto.h b/include/grub/crypto.h
> index b0d7add1d..00d074df8 100644
> --- a/include/grub/crypto.h
> +++ b/include/grub/crypto.h
> @@ -510,6 +510,7 @@ grub_crypto_hmac_buffer (const struct gcry_md_spec *md,
>  extern gcry_md_spec_t _gcry_digest_spec_md5;
>  extern gcry_md_spec_t _gcry_digest_spec_sha1;
>  extern gcry_md_spec_t _gcry_digest_spec_sha256;
> +extern gcry_md_spec_t _gcry_digest_spec_sha384;
>  extern gcry_md_spec_t _gcry_digest_spec_sha512;
>  extern gcry_md_spec_t _gcry_digest_spec_crc32;
>  extern gcry_cipher_spec_t _gcry_cipher_spec_aes;
> diff --git a/include/grub/efi/pks.h b/include/grub/efi/pks.h
> new file mode 100644
> index 000000000..ff306f591
> --- /dev/null
> +++ b/include/grub/efi/pks.h
> @@ -0,0 +1,112 @@
> +/*
> + * Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved. This
> + * program and the accompanying materials are licensed and made available
> + * under the terms and conditions of the 2-Clause BSD License which
> + * accompanies this distribution.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions are 
> met:
> + *
> + * 1. Redistributions of source code must retain the above copyright notice,
> + * this list of conditions and the following disclaimer.
> + *
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
> IS"
> + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
> + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
> + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
> + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> + * POSSIBILITY OF SUCH DAMAGE.
> + *
> + * https://github.com/tianocore/edk2-staging (edk2-staging repo of 
> tianocore),
> + * the ImageAuthentication.h file under it, and here's the copyright and 
> license.
> + *
> + * MdePkg/Include/Guid/ImageAuthentication.h
> + *
> + * Copyright 2022, 2023, 2024, 2025 IBM Corp.
> + */
> +
> +#ifndef PKS_HEADER
> +#define PKS_HEADER   1
> +
> +#include <grub/types.h>
> +
> +/*
> + * It is derived from EFI_CERT_X509_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_X509_GUID \
> +  (grub_guid_t) \
> +  { 0xa159c0a5, 0xe494, 0xa74a, \
> +    { 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72 } \
> +  }
> +
> +/*
> + * It is derived from EFI_CERT_SHA256_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_SHA256_GUID \
> +  (grub_guid_t) \
> +  { 0x2616c4c1, 0x4c50, 0x9240, \
> +    { 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28 } \
> +  }
> +
> +/*
> + * It is derived from EFI_CERT_SHA384_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_SHA384_GUID \
> +  (grub_guid_t) \
> +  { 0x07533eff, 0xd09f, 0xc948, \
> +    { 0x85, 0xf1, 0x8a, 0xd5, 0x6c, 0x70, 0x1e, 0x1 } \
> +  }
> +
> +/*
> + * It is derived from EFI_CERT_SHA512_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_SHA512_GUID \
> +  (grub_guid_t) \
> +  { 0xae0f3e09, 0xc4a6, 0x504f, \
> +    { 0x9f, 0x1b, 0xd4, 0x1e, 0x2b, 0x89, 0xc1, 0x9a } \
> +  }
> +
> +/*
> + * It is derived from EFI_CERT_X509_SHA256_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_X509_SHA256_GUID \
> +  (grub_guid_t) \
> +  { 0x92a4d23b, 0xc096, 0x7940, \
> +    { 0xb4, 0x20, 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed } \
> +  }
> +
> +/*
> + * It is derived from EFI_CERT_X509_SHA384_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_X509_SHA384_GUID     \
> +  (grub_guid_t) \
> +  { 0x6e877670, 0xc280, 0xe64e, \
> +    { 0xaa, 0xd2, 0x28, 0xb3, 0x49, 0xa6, 0x86, 0x5b } \
> +  }
> +
> +/*
> + * It is derived from EFI_CERT_X509_SHA512_GUID.
> + * 
> https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h
> + */
> +#define GRUB_PKS_CERT_X509_SHA512_GUID \
> +  (grub_guid_t) \
> +  { 0x63bf6d44, 0x0225, 0xda4c, \
> +    { 0xbc, 0xfa, 0x24, 0x65, 0xd2, 0xb0, 0xfe, 0x9d } \
> +  }
> +
> +#endif
> diff --git a/include/grub/types.h b/include/grub/types.h
> index 45079bf65..b3ba762fc 100644
> --- a/include/grub/types.h
> +++ b/include/grub/types.h
> @@ -379,6 +379,8 @@ struct grub_guid
>  } __attribute__ ((aligned(4)));
>  typedef struct grub_guid grub_guid_t;
>  
> +#define GRUB_GUID_SIZE    (sizeof (grub_guid_t))
> +
>  struct grub_packed_guid
>  {
>    grub_uint32_t data1;
> @@ -388,4 +390,6 @@ struct grub_packed_guid
>  } GRUB_PACKED;
>  typedef struct grub_packed_guid grub_packed_guid_t;
>  
> +#define GRUB_PACKED_GUID_SIZE    (sizeof (grub_packed_guid_t))
> +
>  #endif /* ! GRUB_TYPES_HEADER */
> -- 
> 2.39.5 (Apple Git-154)
> 
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to