|
@@ -21,6 +21,12 @@ static const efi_char16_t const efi_SetupMode_name[] = {
|
|
|
'S', 'e', 't', 'u', 'p', 'M', 'o', 'd', 'e', 0
|
|
|
};
|
|
|
|
|
|
+/* SHIM variables */
|
|
|
+static const efi_guid_t shim_guid = EFI_SHIM_LOCK_GUID;
|
|
|
+static efi_char16_t const shim_MokSBState_name[] = {
|
|
|
+ 'M', 'o', 'k', 'S', 'B', 'S', 't', 'a', 't', 'e', 0
|
|
|
+};
|
|
|
+
|
|
|
#define get_efi_var(name, vendor, ...) \
|
|
|
efi_call_runtime(get_variable, \
|
|
|
(efi_char16_t *)(name), (efi_guid_t *)(vendor), \
|
|
@@ -31,7 +37,8 @@ static const efi_char16_t const efi_SetupMode_name[] = {
|
|
|
*/
|
|
|
enum efi_secureboot_mode efi_get_secureboot(efi_system_table_t *sys_table_arg)
|
|
|
{
|
|
|
- u8 secboot, setupmode;
|
|
|
+ u32 attr;
|
|
|
+ u8 secboot, setupmode, moksbstate;
|
|
|
unsigned long size;
|
|
|
efi_status_t status;
|
|
|
|
|
@@ -50,6 +57,22 @@ enum efi_secureboot_mode efi_get_secureboot(efi_system_table_t *sys_table_arg)
|
|
|
if (secboot == 0 || setupmode == 1)
|
|
|
return efi_secureboot_mode_disabled;
|
|
|
|
|
|
+ /*
|
|
|
+ * See if a user has put the shim into insecure mode. If so, and if the
|
|
|
+ * variable doesn't have the runtime attribute set, we might as well
|
|
|
+ * honor that.
|
|
|
+ */
|
|
|
+ size = sizeof(moksbstate);
|
|
|
+ status = get_efi_var(shim_MokSBState_name, &shim_guid,
|
|
|
+ &attr, &size, &moksbstate);
|
|
|
+
|
|
|
+ /* If it fails, we don't care why. Default to secure */
|
|
|
+ if (status != EFI_SUCCESS)
|
|
|
+ goto secure_boot_enabled;
|
|
|
+ if (!(attr & EFI_VARIABLE_RUNTIME_ACCESS) && moksbstate == 1)
|
|
|
+ return efi_secureboot_mode_disabled;
|
|
|
+
|
|
|
+secure_boot_enabled:
|
|
|
pr_efi(sys_table_arg, "UEFI Secure Boot is enabled.\n");
|
|
|
return efi_secureboot_mode_enabled;
|
|
|
|