2019-02-02 10:41:15 +01:00
// SPDX-License-Identifier: GPL-2.0
2017-02-06 11:22:43 +00:00
/*
* Secure boot handling .
*
* Copyright ( C ) 2013 , 2014 Linaro Limited
* Roy Franz < roy . franz @ linaro . org
* Copyright ( C ) 2013 Red Hat , Inc .
* Mark Salter < msalter @ redhat . com >
*/
# include <linux/efi.h>
# include <asm/efi.h>
2017-04-04 17:09:09 +01:00
# include "efistub.h"
2017-02-06 11:22:43 +00:00
/* BIOS variables */
static const efi_guid_t efi_variable_guid = EFI_GLOBAL_VARIABLE_GUID ;
2018-03-12 08:45:00 +00:00
static const efi_char16_t efi_SecureBoot_name [ ] = L " SecureBoot " ;
static const efi_char16_t efi_SetupMode_name [ ] = L " SetupMode " ;
2017-02-06 11:22:43 +00:00
2017-02-06 11:22:44 +00:00
/* SHIM variables */
static const efi_guid_t shim_guid = EFI_SHIM_LOCK_GUID ;
2018-03-12 08:45:00 +00:00
static const efi_char16_t shim_MokSBState_name [ ] = L " MokSBState " ;
2017-02-06 11:22:44 +00:00
2017-02-06 11:22:43 +00:00
/*
* Determine whether we ' re in secure boot mode .
2018-05-04 07:59:47 +02:00
*
* Please keep the logic in sync with
* arch / x86 / xen / efi . c : xen_efi_get_secureboot ( ) .
2017-02-06 11:22:43 +00:00
*/
2019-12-24 16:10:19 +01:00
enum efi_secureboot_mode efi_get_secureboot ( void )
2017-02-06 11:22:43 +00:00
{
2017-02-06 11:22:44 +00:00
u32 attr ;
u8 secboot , setupmode , moksbstate ;
2017-02-06 11:22:43 +00:00
unsigned long size ;
efi_status_t status ;
size = sizeof ( secboot ) ;
status = get_efi_var ( efi_SecureBoot_name , & efi_variable_guid ,
NULL , & size , & secboot ) ;
2017-03-01 19:04:35 +00:00
if ( status = = EFI_NOT_FOUND )
return efi_secureboot_mode_disabled ;
2017-02-06 11:22:43 +00:00
if ( status ! = EFI_SUCCESS )
goto out_efi_err ;
size = sizeof ( setupmode ) ;
status = get_efi_var ( efi_SetupMode_name , & efi_variable_guid ,
NULL , & size , & setupmode ) ;
if ( status ! = EFI_SUCCESS )
goto out_efi_err ;
if ( secboot = = 0 | | setupmode = = 1 )
return efi_secureboot_mode_disabled ;
2017-02-06 11:22:44 +00:00
/*
* 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 :
2020-04-30 14:28:35 -04:00
efi_info ( " UEFI Secure Boot is enabled. \n " ) ;
2017-02-06 11:22:43 +00:00
return efi_secureboot_mode_enabled ;
out_efi_err :
2020-04-30 14:28:35 -04:00
efi_err ( " Could not determine UEFI Secure Boot status. \n " ) ;
2017-02-06 11:22:43 +00:00
return efi_secureboot_mode_unknown ;
}