summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Jones <pjones@redhat.com>2024-05-15 16:13:40 -0400
committerPeter Jones <pjones@redhat.com>2025-02-24 15:24:24 -0500
commit49db3de08ef2c55f6dbc3c2b8e6ab7b2f22e5309 (patch)
treeb79d8424a0deb106ab1cc8d972d396d5ae38a07d
parent3d7c0572c2296f1c31c1f0fb051412ab76828dd2 (diff)
downloadefi-boot-shim-49db3de08ef2c55f6dbc3c2b8e6ab7b2f22e5309.tar.gz
efi-boot-shim-49db3de08ef2c55f6dbc3c2b8e6ab7b2f22e5309.zip
mok: add MOK_VARIABLE_CONFIG_ONLY
This adds a mok variable flag "MOK_VARIABLE_CONFIG_ONLY" to specify that the data should be added to our UEFI config table, but shim should not create a legacy UEFI variable. Signed-off-by: Peter Jones <pjones@redhat.com>
-rw-r--r--include/mok.h2
-rw-r--r--mok.c36
2 files changed, 30 insertions, 8 deletions
diff --git a/include/mok.h b/include/mok.h
index fb19423b..fe92cf03 100644
--- a/include/mok.h
+++ b/include/mok.h
@@ -81,6 +81,8 @@ struct mok_state_variable {
* MOK_MIRROR_DELETE_FIRST delete any existing variable first
* MOK_VARIABLE_MEASURE extend PCR 7 and log the hash change
* MOK_VARIABLE_LOG measure into whatever .pcr says and log
+ * MOK_VARIABLE_CONFIG_ONLY don't create a UEFI variable, only add
+ * it to the config space variables.
*/
UINTN pcr; /* PCR to measure and hash to */
diff --git a/mok.c b/mok.c
index 5ae91244..2778cd05 100644
--- a/mok.c
+++ b/mok.c
@@ -106,11 +106,12 @@ categorize_deauthorized(struct mok_state_variable *v)
return VENDOR_ADDEND_DB;
}
-#define MOK_MIRROR_KEYDB 0x01
-#define MOK_MIRROR_DELETE_FIRST 0x02
-#define MOK_VARIABLE_MEASURE 0x04
-#define MOK_VARIABLE_LOG 0x08
-#define MOK_VARIABLE_INVERSE 0x10
+#define MOK_MIRROR_KEYDB 0x01
+#define MOK_MIRROR_DELETE_FIRST 0x02
+#define MOK_VARIABLE_MEASURE 0x04
+#define MOK_VARIABLE_LOG 0x08
+#define MOK_VARIABLE_INVERSE 0x10
+#define MOK_VARIABLE_CONFIG_ONLY 0x20
struct mok_state_variable mok_state_variable_data[] = {
{.name = L"MokList",
@@ -834,7 +835,8 @@ mirror_one_mok_variable(struct mok_state_variable *v,
dprint(L"FullDataSize:%lu FullData:0x%llx p:0x%llx pos:%lld\n",
FullDataSize, FullData, p, p-(uintptr_t)FullData);
- if (FullDataSize && v->flags & MOK_MIRROR_KEYDB) {
+ if (FullDataSize && v->flags & MOK_MIRROR_KEYDB &&
+ !(v->flags & MOK_VARIABLE_CONFIG_ONLY)) {
dprint(L"calling mirror_mok_db(\"%s\", datasz=%lu)\n",
v->rtname, FullDataSize);
efi_status = mirror_mok_db(v->rtname, (CHAR8 *)v->rtname8, v->guid,
@@ -842,7 +844,8 @@ mirror_one_mok_variable(struct mok_state_variable *v,
only_first);
dprint(L"mirror_mok_db(\"%s\", datasz=%lu) returned %r\n",
v->rtname, FullDataSize, efi_status);
- } else if (FullDataSize && only_first) {
+ } else if (FullDataSize && only_first &&
+ !(v->flags & MOK_VARIABLE_CONFIG_ONLY)) {
efi_status = SetVariable(v->rtname, v->guid, attrs,
FullDataSize, FullData);
}
@@ -938,7 +941,8 @@ EFI_STATUS import_one_mok_state(struct mok_state_variable *v,
dprint(L"importing mok state for \"%s\"\n", v->name);
- if (!v->data && !v->data_size) {
+ if (!v->data && !v->data_size &&
+ !(v->flags & MOK_VARIABLE_CONFIG_ONLY)) {
efi_status = get_variable_attr(v->name,
&v->data, &v->data_size,
*v->guid, &attrs);
@@ -980,6 +984,22 @@ EFI_STATUS import_one_mok_state(struct mok_state_variable *v,
}
}
}
+
+ if (!v->data && !v->data_size &&
+ (v->flags & MOK_VARIABLE_CONFIG_ONLY)) {
+ efi_status = get_variable_attr(v->name,
+ &v->data, &v->data_size,
+ *v->guid, &attrs);
+ if (EFI_ERROR(efi_status)) {
+ dprint(L"Couldn't get variable \"%s\" for mirroring: %r\n",
+ v->name, efi_status);
+ if (efi_status != EFI_NOT_FOUND)
+ return efi_status;
+ v->data = NULL;
+ v->data_size = 0;
+ }
+ }
+
if (delete == TRUE) {
perror(L"Deleting bad variable %s\n", v->name);
efi_status = LibDeleteVariable(v->name, v->guid);