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 secure boot is enabled with PKS, it will read secure boot variables such as db and dbx from PKS and extract ESL's from it. The ESL's 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 mode will be activated: 1. When Secure Boot is enabled with static keys 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 - Secure Boot mode 1 - PKS 0 - static key (embeded key) Signed-off-by: Sudhakar Kuppusamy <sudha...@linux.ibm.com> --- grub-core/Makefile.am | 2 + grub-core/Makefile.core.def | 2 + grub-core/kern/ieee1275/ieee1275.c | 1 - grub-core/kern/ieee1275/init.c | 18 +- grub-core/kern/powerpc/ieee1275/ieee1275.c | 139 +++++++ .../kern/powerpc/ieee1275/platform_keystore.c | 343 ++++++++++++++++++ include/grub/ieee1275/ieee1275.h | 3 + include/grub/powerpc/ieee1275/ieee1275.h | 21 ++ .../grub/powerpc/ieee1275/platform_keystore.h | 126 +++++++ 9 files changed, 651 insertions(+), 4 deletions(-) create mode 100644 grub-core/kern/powerpc/ieee1275/ieee1275.c create mode 100644 grub-core/kern/powerpc/ieee1275/platform_keystore.c create mode 100644 include/grub/powerpc/ieee1275/platform_keystore.h diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am index e50db8106..cd6bb7c32 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -241,11 +241,13 @@ KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h endif if COND_powerpc_ieee1275 +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/powerpc/ieee1275/ieee1275.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/alloc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/extcmd.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/lib/arg.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/powerpc/ieee1275/platform_keystore.h endif if COND_sparc64_ieee1275 diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index 214856b5a..a86d27f2f 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -328,10 +328,12 @@ kernel = { extra_dist = video/sis315_init.c; mips_loongson = commands/keylayouts.c; + powerpc_ieee1275 = kern/powerpc/ieee1275/ieee1275.c; powerpc_ieee1275 = kern/powerpc/cache.S; powerpc_ieee1275 = kern/powerpc/dl.c; powerpc_ieee1275 = kern/powerpc/compiler-rt.S; powerpc_ieee1275 = kern/lockdown.c; + powerpc_ieee1275 = kern/powerpc/ieee1275/platform_keystore.c; sparc64_ieee1275 = kern/sparc64/cache.S; sparc64_ieee1275 = kern/sparc64/dl.c; diff --git a/grub-core/kern/ieee1275/ieee1275.c b/grub-core/kern/ieee1275/ieee1275.c index 36ca2dbfc..afa37a9f0 100644 --- a/grub-core/kern/ieee1275/ieee1275.c +++ b/grub-core/kern/ieee1275/ieee1275.c @@ -23,7 +23,6 @@ #define IEEE1275_PHANDLE_INVALID ((grub_ieee1275_cell_t) -1) #define IEEE1275_IHANDLE_INVALID ((grub_ieee1275_cell_t) 0) -#define IEEE1275_CELL_INVALID ((grub_ieee1275_cell_t) -1) diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c index f19d5cda9..f7a7c96f8 100644 --- a/grub-core/kern/ieee1275/init.c +++ b/grub-core/kern/ieee1275/init.c @@ -51,6 +51,8 @@ #endif #if defined(__powerpc__) #include <grub/lockdown.h> +#include <grub/powerpc/ieee1275/ieee1275.h> +#include <grub/powerpc/ieee1275/platform_keystore.h> #endif /* The maximum heap size we're going to claim at boot. Not used by sparc. */ @@ -1004,7 +1006,8 @@ grub_get_ieee1275_secure_boot (void) { grub_ieee1275_phandle_t root; int rc; - grub_uint32_t is_sb; + grub_err_t err; + grub_uint32_t is_sb = SB_DISABLED; rc = grub_ieee1275_finddevice ("/", &root); if (rc != 0) @@ -1028,8 +1031,17 @@ grub_get_ieee1275_secure_boot (void) * * We only support enforce. */ - if (is_sb >= 2) - grub_lockdown (); + if (is_sb == SB_ENFORCED) + { + grub_dprintf ("ieee1275", "Secure Boot Enabled\n"); + err = grub_pks_keystore_init (); + if (err != GRUB_ERR_NONE) + grub_error (err, "initialization of the Platform Keystore failed.\n"); + + grub_lockdown (); + } + else + grub_dprintf ("ieee1275", "Secure Boot Disabled\n"); } #endif diff --git a/grub-core/kern/powerpc/ieee1275/ieee1275.c b/grub-core/kern/powerpc/ieee1275/ieee1275.c new file mode 100644 index 000000000..52984caae --- /dev/null +++ b/grub-core/kern/powerpc/ieee1275/ieee1275.c @@ -0,0 +1,139 @@ +/* ieee1275.c - Access the Open Firmware client interface. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2003,2004,2005,2007,2008,2009 Free Software Foundation, Inc. + * Copyright (C) 2020, 2021, 2022, 2023, 2024, 2025 IBM Corporation + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ +#include <grub/ieee1275/ieee1275.h> +#include <grub/powerpc/ieee1275/ieee1275.h> +#include <grub/misc.h> + +int +grub_ieee1275_test (const char *name, grub_ieee1275_cell_t *missing) +{ + struct test_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t name; + grub_ieee1275_cell_t missing; + } args; + + INIT_IEEE1275_COMMON (&args.common, "test", 1, 1); + args.name = (grub_ieee1275_cell_t) name; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.missing == IEEE1275_CELL_INVALID) + return -1; + + *missing = args.missing; + + return 0; +} + +int +grub_ieee1275_pks_max_object_size (grub_size_t *result) +{ + struct mos_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t size; + } args; + + INIT_IEEE1275_COMMON (&args.common, "pks-max-object-size", 0, 1); + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.size == IEEE1275_CELL_INVALID) + return -1; + + *result = args.size; + + return 0; +} + +int +grub_ieee1275_pks_read_object (grub_uint8_t consumer, grub_uint8_t *label, + grub_size_t label_len, grub_uint8_t *buffer, + grub_size_t buffer_len, grub_size_t *data_len, + grub_uint32_t *policies) +{ + struct pks_read_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t consumer; + grub_ieee1275_cell_t label; + grub_ieee1275_cell_t label_len; + grub_ieee1275_cell_t buffer; + grub_ieee1275_cell_t buffer_len; + grub_ieee1275_cell_t data_len; + grub_ieee1275_cell_t policies; + grub_ieee1275_cell_t rc; + } args; + + INIT_IEEE1275_COMMON (&args.common, "pks-read-object", 5, 3); + args.consumer = (grub_ieee1275_cell_t) consumer; + args.label = (grub_ieee1275_cell_t) label; + args.label_len = (grub_ieee1275_cell_t) label_len; + args.buffer = (grub_ieee1275_cell_t) buffer; + args.buffer_len = (grub_ieee1275_cell_t) buffer_len; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.data_len == IEEE1275_CELL_INVALID) + return -1; + + *data_len = args.data_len; + *policies = args.policies; + + return (int) args.rc; +} + +int +grub_ieee1275_pks_read_sbvar (grub_uint8_t sbvarflags, grub_uint8_t sbvartype, + grub_uint8_t *buffer, grub_size_t buffer_len, + grub_size_t *data_len) +{ + struct pks_read_sbvar_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t sbvarflags; + grub_ieee1275_cell_t sbvartype; + grub_ieee1275_cell_t buffer; + grub_ieee1275_cell_t buffer_len; + grub_ieee1275_cell_t data_len; + grub_ieee1275_cell_t rc; + } args; + + INIT_IEEE1275_COMMON (&args.common, "pks-read-sbvar", 4, 2); + args.sbvarflags = (grub_ieee1275_cell_t) sbvarflags; + args.sbvartype = (grub_ieee1275_cell_t) sbvartype; + args.buffer = (grub_ieee1275_cell_t) buffer; + args.buffer_len = (grub_ieee1275_cell_t) buffer_len; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.data_len == IEEE1275_CELL_INVALID) + return -1; + + *data_len = args.data_len; + + return (int) args.rc; +} diff --git a/grub-core/kern/powerpc/ieee1275/platform_keystore.c b/grub-core/kern/powerpc/ieee1275/platform_keystore.c new file mode 100644 index 000000000..3af1ea28a --- /dev/null +++ b/grub-core/kern/powerpc/ieee1275/platform_keystore.c @@ -0,0 +1,343 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2024 Free Software Foundation, Inc. + * Copyright (C) 2022, 2023, 2024, 2025 IBM Corporation + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <grub/mm.h> +#include <grub/types.h> +#include <grub/misc.h> +#include <grub/lockdown.h> +#include <grub/ieee1275/ieee1275.h> +#include <grub/powerpc/ieee1275/ieee1275.h> +#include <grub/powerpc/ieee1275/platform_keystore.h> + +/* PKS consumer type for firmware. */ +#define PKS_CONSUMER_FW ((grub_uint8_t) 1) + +/* PKS read object lable for secure boot version. */ +#define SB_VERSION_KEY_NAME ((grub_uint8_t *) "SB_VERSION") +#define SB_VERSION_KEY_LEN ((grub_size_t) 10) + +/* PKS read secure boot variable request type for db and dbx. */ +#define DB ((grub_uint8_t) 1) +#define DBX ((grub_uint8_t) 2) + +static grub_size_t pks_max_object_size; +grub_uint8_t grub_pks_use_keystore = 0; + +/* Platform Keystore. */ +grub_pks_t grub_pks_keystore = { .db = NULL, .dbx = NULL, .db_entries = 0, .dbx_entries = 0 }; + +/* Convert the esl data into the ESL. */ +static grub_esl_t * +convert_to_esl (const grub_uint8_t *esl_data, const grub_size_t esl_data_size) +{ + grub_esl_t *esl = NULL; + + if (esl_data_size < sizeof (grub_esl_t) || esl_data == NULL) + return esl; + + esl = (grub_esl_t *) esl_data; + + return esl; +} + +/* + * Import the GUID, esd, and its size into the pks sd buffer and + * pks sd entries from the EFI signature list. + */ +static grub_err_t +esd_from_esl (const grub_uint8_t *esl_data, grub_size_t esl_size, + const grub_size_t signature_size, const grub_packed_guid_t *guid, + grub_pks_sd_t **pks_sd, grub_size_t *pks_sd_entries) +{ + grub_esd_t *esd; + grub_pks_sd_t *signature = *pks_sd; + grub_size_t entries = *pks_sd_entries; + grub_size_t data_size, offset = 0; + + /* Reads the esd from esl. */ + while (esl_size > 0) + { + esd = (grub_esd_t *) (esl_data + offset); + data_size = signature_size - sizeof (grub_esd_t); + + signature = grub_realloc (signature, (entries + 1) * sizeof (grub_pks_sd_t)); + if (signature == NULL) + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory."); + + signature[entries].data = grub_malloc (data_size * sizeof (grub_uint8_t)); + if (signature[entries].data == NULL) + { + /* + * Allocated memory will be freed by + * grub_free_platform_keystore. + */ + *pks_sd = signature; + *pks_sd_entries = entries + 1; + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory."); + } + + grub_memcpy (signature[entries].data, esd->signature_data, data_size); + signature[entries].data_size = data_size; + signature[entries].guid = *guid; + entries++; + esl_size -= signature_size; + offset += signature_size; + } + + *pks_sd = signature; + *pks_sd_entries = entries; + + return GRUB_ERR_NONE; +} + +/* Extract the esd after removing the esl header from esl. */ +static grub_err_t +esl_to_esd (const grub_uint8_t *esl_data, grub_size_t *next_esl, + grub_pks_sd_t **pks_sd, grub_size_t *pks_sd_entries) +{ + grub_packed_guid_t guid; + grub_esl_t *esl; + grub_size_t offset, esl_size, + signature_size, signature_header_size; + + esl = convert_to_esl (esl_data, *next_esl); + if (esl == NULL) + return grub_error (GRUB_ERR_BUG, "invalid ESL."); + + esl_size = grub_le_to_cpu32 (esl->signature_list_size); + signature_header_size = grub_le_to_cpu32 (esl->signature_header_size); + signature_size = grub_le_to_cpu32 (esl->signature_size); + grub_memcpy (&guid, &esl->signature_type, sizeof (grub_packed_guid_t)); + + if (esl_size < sizeof (grub_esl_t) || esl_size > *next_esl) + return grub_error (GRUB_ERR_BUG, "invalid ESL size (%u)\n", esl_size); + + *next_esl = esl_size; + offset = sizeof (grub_esl_t) + signature_header_size; + esl_size = esl_size - offset; + + return esd_from_esl (esl_data + offset, esl_size, signature_size, &guid, + pks_sd, pks_sd_entries); +} + +/* + * Import the EFI signature data and the number of esd from the esl + * into the pks sd buffer and pks sd entries. + */ +static grub_err_t +pks_sd_from_esl (const grub_uint8_t *esl_data, grub_size_t esl_size, + grub_pks_sd_t **pks_sd, grub_size_t *pks_sd_entries) +{ + grub_err_t rc; + grub_size_t next_esl = esl_size; + + do + { + rc = esl_to_esd (esl_data, &next_esl, pks_sd, pks_sd_entries); + if (rc != GRUB_ERR_NONE) + break; + + esl_data += next_esl; + esl_size -= next_esl; + next_esl = esl_size; + } + while (esl_size > 0); + + return rc; +} + +/* + * Read the secure boot version from PKS as an object. + * caller must free result. + */ +static grub_err_t +read_sbversion_from_pks (grub_uint8_t **out, grub_size_t *outlen, grub_size_t *policy) +{ + int rc; + + *out = grub_malloc (pks_max_object_size); + if (*out == NULL) + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory."); + + rc = grub_ieee1275_pks_read_object (PKS_CONSUMER_FW, SB_VERSION_KEY_NAME, + SB_VERSION_KEY_LEN, *out, pks_max_object_size, + outlen, policy); + if (rc != 0) + return grub_error (GRUB_ERR_READ_ERROR, "SB version read failed (%d)\n", rc); + + return GRUB_ERR_NONE; +} + +/* + * Reads the secure boot variable from PKS. + * caller must free result. + */ +static grub_err_t +read_sbvar_from_pks (const grub_uint8_t sbvarflags, const grub_uint8_t sbvartype, + grub_uint8_t **out, grub_size_t *outlen) +{ + int rc; + + *out = grub_malloc (pks_max_object_size); + if (*out == NULL) + return grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory."); + + rc = grub_ieee1275_pks_read_sbvar (sbvarflags, sbvartype, *out, pks_max_object_size, outlen); + if (rc == (int) IEEE1275_CELL_NOT_FOUND) + return grub_error (GRUB_ERR_UNKNOWN_COMMAND, "secure boot variable %s not found (%d)", + (sbvartype == DB ? "db" : "dbx"), rc); + else if (rc != 0) + return grub_error (GRUB_ERR_READ_ERROR, "secure boot variable %s reading (%d)", + (sbvartype == DB ? "db" : "dbx"), rc); + + return GRUB_ERR_NONE; +} + +/* Test the availability of PKS support. */ +static grub_err_t +is_support_pks (void) +{ + int rc; + grub_ieee1275_cell_t missing = 0; + + rc = grub_ieee1275_test ("pks-max-object-size", &missing); + if (rc != 0 || missing == IEEE1275_CELL_INVALID) + grub_error (GRUB_ERR_BAD_FIRMWARE, "firmware doesn't have PKS support.\n"); + else + { + rc = grub_ieee1275_pks_max_object_size (&pks_max_object_size); + if (rc != 0) + grub_error (GRUB_ERR_BAD_NUMBER, "PKS support is there but it has zero objects.\n"); + } + + return GRUB_ERR_NONE; +} + +/* + * Retrieve the secure boot variable from PKS, unpacks it, read the esd + * from ESL, and store the information in the pks sd buffer. + */ +static grub_err_t +read_secure_boot_variables (const grub_uint8_t sbvarflags, const grub_uint8_t sbvartype, + grub_pks_sd_t **pks_sd, grub_size_t *pks_sd_entries) +{ + grub_err_t rc; + grub_uint8_t *esl_data = NULL; + grub_size_t esl_data_size = 0; + + rc = read_sbvar_from_pks (sbvarflags, sbvartype, &esl_data, &esl_data_size); + if (rc == GRUB_ERR_NONE && esl_data_size != 0) + rc = pks_sd_from_esl ((const grub_uint8_t *) esl_data, esl_data_size, + pks_sd, pks_sd_entries); + grub_free (esl_data); + + return rc; +} + +/* + * Reads secure boot version (SB_VERSION) and it supports following. + * SB_VERSION + * 1 - PKS + * 0 - static key (embeded key) + */ +static grub_err_t +get_secure_boot_version (void) +{ + grub_err_t rc; + grub_uint8_t *data = NULL; + grub_size_t len = 0, policy = 0; + + rc = read_sbversion_from_pks (&data, &len, &policy); + if (rc == GRUB_ERR_NONE && (len != 1 || (*data >= 2))) + rc = grub_error (GRUB_ERR_BAD_NUMBER, "found unexpected SB version (%d)\n", *data); + + if (rc != GRUB_ERR_NONE) + { + grub_printf ("switch to static key.\n"); + if (grub_is_lockdown () == GRUB_LOCKDOWN_ENABLED) + grub_fatal ("secure boot locked down."); + } + else + grub_pks_use_keystore = *data; + + grub_free (data); + + return rc; +} + +/* Free allocated memory. */ +void +grub_pks_free_keystore (void) +{ + grub_size_t i; + + for (i = 0; i < grub_pks_keystore.db_entries; i++) + grub_free (grub_pks_keystore.db[i].data); + + for (i = 0; i < grub_pks_keystore.dbx_entries; i++) + grub_free (grub_pks_keystore.dbx[i].data); + + grub_free (grub_pks_keystore.db); + grub_free (grub_pks_keystore.dbx); + grub_memset (&grub_pks_keystore, 0, sizeof (grub_pks_t)); +} + +/* Initialization of the Platform Keystore. */ +grub_err_t +grub_pks_keystore_init (void) +{ + grub_err_t rc; + + grub_dprintf ("ieee1275", "trying to load Platform Keystore.\n"); + + rc = is_support_pks (); + if (rc != GRUB_ERR_NONE) + { + grub_printf ("switch to static key.\n"); + return rc; + } + + /* Read SB_VERSION from PKS. */ + rc = get_secure_boot_version (); + if (rc != GRUB_ERR_NONE) + return rc; + + if (grub_pks_use_keystore) + { + grub_memset (&grub_pks_keystore, 0, sizeof (grub_pks_t)); + /* Read DB from PKS. */ + rc = read_secure_boot_variables (0, DB, &grub_pks_keystore.db, &grub_pks_keystore.db_entries); + if (rc == GRUB_ERR_NONE) + { + /* Read DBX from PKS. */ + rc = read_secure_boot_variables (0, DBX, &grub_pks_keystore.dbx, &grub_pks_keystore.dbx_entries); + if (rc == GRUB_ERR_UNKNOWN_COMMAND) + { + grub_dprintf ("ieee1275", "dbx is not found in PKS.\n"); + rc = GRUB_ERR_NONE; + } + } + + } + + if (rc != GRUB_ERR_NONE) + grub_pks_free_keystore (); + + return rc; +} diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h index c445d0499..3965c5fc6 100644 --- a/include/grub/ieee1275/ieee1275.h +++ b/include/grub/ieee1275/ieee1275.h @@ -24,6 +24,9 @@ #include <grub/types.h> #include <grub/machine/ieee1275.h> +#define IEEE1275_CELL_INVALID ((grub_ieee1275_cell_t) -1) +#define IEEE1275_CELL_NOT_FOUND ((grub_ieee1275_cell_t) -7) + #define GRUB_IEEE1275_CELL_FALSE ((grub_ieee1275_cell_t) 0) #define GRUB_IEEE1275_CELL_TRUE ((grub_ieee1275_cell_t) -1) diff --git a/include/grub/powerpc/ieee1275/ieee1275.h b/include/grub/powerpc/ieee1275/ieee1275.h index 4eb207018..1772d1f6d 100644 --- a/include/grub/powerpc/ieee1275/ieee1275.h +++ b/include/grub/powerpc/ieee1275/ieee1275.h @@ -28,4 +28,25 @@ typedef grub_uint32_t grub_ieee1275_cell_t; #define PRIxGRUB_IEEE1275_CELL_T PRIxGRUB_UINT32_T #define PRIuGRUB_IEEE1275_CELL_T PRIuGRUB_UINT32_T +#ifdef __powerpc__ + +extern int +EXPORT_FUNC (grub_ieee1275_test) (const char *name, + grub_ieee1275_cell_t *missing); + +extern int +grub_ieee1275_pks_max_object_size (grub_size_t *result); + +extern int +grub_ieee1275_pks_read_object (grub_uint8_t consumer, grub_uint8_t *label, + grub_size_t label_len, grub_uint8_t *buffer, + grub_size_t buffer_len, grub_size_t *data_len, + grub_uint32_t *policies); + +extern int +grub_ieee1275_pks_read_sbvar (grub_uint8_t sbvarflags, grub_uint8_t sbvartype, + grub_uint8_t *buffer, grub_size_t buffer_len, + grub_size_t *data_len); +#endif + #endif /* ! GRUB_IEEE1275_MACHINE_HEADER */ diff --git a/include/grub/powerpc/ieee1275/platform_keystore.h b/include/grub/powerpc/ieee1275/platform_keystore.h new file mode 100644 index 000000000..d48c60200 --- /dev/null +++ b/include/grub/powerpc/ieee1275/platform_keystore.h @@ -0,0 +1,126 @@ +/* + * 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 __PLATFORM_KEYSTORE_H__ +#define __PLATFORM_KEYSTORE_H__ + +#include <grub/symbol.h> +#include <grub/mm.h> +#include <grub/types.h> + +#if __GNUC__ >= 9 +#pragma GCC diagnostic ignored "-Waddress-of-packed-member" +#endif + +#define GRUB_MAX_HASH_SIZE 64 + +/* Secure Boot Mode. */ +#define SB_DISABLED 0 +#define SB_ENFORCED 2 + +/* + * It is derived from EFI_SIGNATURE_DATA + * https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h + * + * The structure of an EFI signature database (ESD).*/ +struct grub_esd +{ + /* + * An identifier which identifies the agent which added + * the signature to the list. + */ + grub_packed_guid_t signature_owner; + /* The format of the signature is defined by the SignatureType.*/ + grub_uint8_t signature_data[]; +} GRUB_PACKED; + +typedef struct grub_esd grub_esd_t; + +/* + * It is derived from EFI_SIGNATURE_LIST + * https://github.com/tianocore/edk2-staging/blob/master/MdePkg/Include/Guid/ImageAuthentication.h + * + * The structure of an EFI signature list (ESL).*/ +struct grub_esl +{ + /* Type of the signature. GUID signature types are defined in below.*/ + grub_packed_guid_t signature_type; + /* Total size of the signature list, including this header.*/ + grub_uint32_t signature_list_size; + /* + * Size of the signature header which precedes + * the array of signatures. + */ + grub_uint32_t signature_header_size; + /* Size of each signature.*/ + grub_uint32_t signature_size; +} GRUB_PACKED; + +typedef struct grub_esl grub_esl_t; + +/* The structure of a PKS signature data.*/ +struct grub_pks_sd +{ + grub_packed_guid_t guid; /* Signature type. */ + grub_uint8_t *data; /* Signature data. */ + grub_size_t data_size; /* Size of signature data. */ +} GRUB_PACKED; + +typedef struct grub_pks_sd grub_pks_sd_t; + +/* The structure of a PKS.*/ +struct grub_pks +{ + grub_pks_sd_t *db; /* Signature database. */ + grub_pks_sd_t *dbx; /* Forbidden signature database. */ + grub_size_t db_entries; /* Size of signature database. */ + grub_size_t dbx_entries; /* Size of forbidden signature database. */ +} GRUB_PACKED; + +typedef struct grub_pks grub_pks_t; + +/* Initialization of the Platform Keystore. */ +extern grub_err_t +grub_pks_keystore_init (void); + +/* Free allocated memory. */ +extern void +EXPORT_FUNC (grub_pks_free_keystore) (void); + +extern grub_uint8_t EXPORT_VAR (grub_pks_use_keystore); +extern grub_pks_t EXPORT_VAR (grub_pks_keystore); + +#endif -- 2.39.5 (Apple Git-154) _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel