2018-10-09 23:00:33 +05:30
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright ( C ) 2018 IBM Corporation
*/
# include <linux/efi.h>
2019-04-03 22:12:17 -04:00
# include <linux/module.h>
2018-10-09 23:00:33 +05:30
# include <linux/ima.h>
extern struct boot_params boot_params ;
2018-11-18 04:08:12 -05:00
static enum efi_secureboot_mode get_sb_mode ( void )
{
efi_char16_t efi_SecureBoot_name [ ] = L " SecureBoot " ;
2019-04-24 13:05:46 -04:00
efi_char16_t efi_SetupMode_name [ ] = L " SecureBoot " ;
2018-11-18 04:08:12 -05:00
efi_guid_t efi_variable_guid = EFI_GLOBAL_VARIABLE_GUID ;
efi_status_t status ;
unsigned long size ;
2019-04-24 13:05:46 -04:00
u8 secboot , setupmode ;
2018-11-18 04:08:12 -05:00
size = sizeof ( secboot ) ;
2019-04-23 17:48:07 -05:00
if ( ! efi_enabled ( EFI_RUNTIME_SERVICES ) ) {
pr_info ( " ima: secureboot mode unknown, no efi \n " ) ;
return efi_secureboot_mode_unknown ;
}
2018-11-18 04:08:12 -05:00
/* Get variable contents into buffer */
status = efi . get_variable ( efi_SecureBoot_name , & efi_variable_guid ,
NULL , & size , & secboot ) ;
if ( status = = EFI_NOT_FOUND ) {
pr_info ( " ima: secureboot mode disabled \n " ) ;
return efi_secureboot_mode_disabled ;
}
if ( status ! = EFI_SUCCESS ) {
pr_info ( " ima: secureboot mode unknown \n " ) ;
return efi_secureboot_mode_unknown ;
}
2019-04-24 13:05:46 -04:00
size = sizeof ( setupmode ) ;
status = efi . get_variable ( efi_SetupMode_name , & efi_variable_guid ,
NULL , & size , & setupmode ) ;
if ( status ! = EFI_SUCCESS ) /* ignore unknown SetupMode */
setupmode = 0 ;
if ( secboot = = 0 | | setupmode = = 1 ) {
2018-11-18 04:08:12 -05:00
pr_info ( " ima: secureboot mode disabled \n " ) ;
return efi_secureboot_mode_disabled ;
}
pr_info ( " ima: secureboot mode enabled \n " ) ;
return efi_secureboot_mode_enabled ;
}
2018-10-09 23:00:33 +05:30
bool arch_ima_get_secureboot ( void )
{
2018-11-18 04:08:12 -05:00
static enum efi_secureboot_mode sb_mode ;
static bool initialized ;
if ( ! initialized & & efi_enabled ( EFI_BOOT ) ) {
sb_mode = boot_params . secure_boot ;
if ( sb_mode = = efi_secureboot_mode_unset )
sb_mode = get_sb_mode ( ) ;
initialized = true ;
}
if ( sb_mode = = efi_secureboot_mode_enabled )
2018-10-09 23:00:33 +05:30
return true ;
else
return false ;
}
2018-10-09 23:00:37 +05:30
/* secureboot arch rules */
static const char * const sb_arch_rules [ ] = {
2019-08-19 17:17:44 -07:00
# if !IS_ENABLED(CONFIG_KEXEC_SIG)
2018-10-09 23:00:37 +05:30
" appraise func=KEXEC_KERNEL_CHECK appraise_type=imasig " ,
2019-08-19 17:17:44 -07:00
# endif /* CONFIG_KEXEC_SIG */
2018-10-09 23:00:37 +05:30
" measure func=KEXEC_KERNEL_CHECK " ,
2019-01-27 19:03:45 -05:00
# if !IS_ENABLED(CONFIG_MODULE_SIG)
" appraise func=MODULE_CHECK appraise_type=imasig " ,
# endif
" measure func=MODULE_CHECK " ,
2018-10-09 23:00:37 +05:30
NULL
} ;
const char * const * arch_get_ima_policy ( void )
{
2019-01-27 19:03:45 -05:00
if ( IS_ENABLED ( CONFIG_IMA_ARCH_POLICY ) & & arch_ima_get_secureboot ( ) ) {
if ( IS_ENABLED ( CONFIG_MODULE_SIG ) )
set_module_sig_enforced ( ) ;
2018-10-09 23:00:37 +05:30
return sb_arch_rules ;
2019-01-27 19:03:45 -05:00
}
2018-10-09 23:00:37 +05:30
return NULL ;
}