mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-28 16:14:04 +02:00
SecurityPkg: Add option to reset secure boot keys.
This commit add option which allows reset content of Secure Boot keys and databases to default variables. Signed-off-by: Grzegorz Bernacki <gjb@semihalf.com> Reviewed-by: Sunny Wang <sunny.wang@arm.com> Reviewed-by: Jiewen Yao <Jiewen.yao@intel.com> Reviewed-by: Pete Batard <pete@akeo.ie> Tested-by: Pete Batard <pete@akeo.ie> # on Raspberry Pi 4
This commit is contained in:
parent
45f3dd2ce9
commit
55266a9b8a
@ -69,6 +69,12 @@ formset
|
|||||||
endif;
|
endif;
|
||||||
endif;
|
endif;
|
||||||
|
|
||||||
|
text
|
||||||
|
help = STRING_TOKEN(STR_SECURE_RESET_TO_DEFAULTS_HELP),
|
||||||
|
text = STRING_TOKEN(STR_SECURE_RESET_TO_DEFAULTS),
|
||||||
|
flags = INTERACTIVE,
|
||||||
|
key = KEY_SECURE_BOOT_RESET_TO_DEFAULT;
|
||||||
|
|
||||||
endform;
|
endform;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -110,6 +110,7 @@
|
|||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiHiiConfigAccessProtocolGuid ## PRODUCES
|
gEfiHiiConfigAccessProtocolGuid ## PRODUCES
|
||||||
gEfiDevicePathProtocolGuid ## PRODUCES
|
gEfiDevicePathProtocolGuid ## PRODUCES
|
||||||
|
gEfiHiiPopupProtocolGuid
|
||||||
|
|
||||||
[Depex]
|
[Depex]
|
||||||
gEfiHiiConfigRoutingProtocolGuid AND
|
gEfiHiiConfigRoutingProtocolGuid AND
|
||||||
|
@ -8,6 +8,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
#include "SecureBootConfigImpl.h"
|
#include "SecureBootConfigImpl.h"
|
||||||
|
#include <Protocol/HiiPopup.h>
|
||||||
#include <Library/BaseCryptLib.h>
|
#include <Library/BaseCryptLib.h>
|
||||||
#include <Library/SecureBootVariableLib.h>
|
#include <Library/SecureBootVariableLib.h>
|
||||||
#include <Library/SecureBootVariableProvisionLib.h>
|
#include <Library/SecureBootVariableProvisionLib.h>
|
||||||
@ -4155,6 +4156,131 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function reinitializes Secure Boot variables with default values.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Success to update the signature list page
|
||||||
|
@retval others Fail to delete or enroll signature data.
|
||||||
|
**/
|
||||||
|
STATIC EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
KeyEnrollReset (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT8 SetupMode;
|
||||||
|
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
Status = SetSecureBootMode (CUSTOM_SECURE_BOOT_MODE);
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear all the keys and databases
|
||||||
|
Status = DeleteDb ();
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Fail to clear DB: %r\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = DeleteDbx ();
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Fail to clear DBX: %r\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = DeleteDbt ();
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Fail to clear DBT: %r\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = DeleteKEK ();
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Fail to clear KEK: %r\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = DeletePlatformKey ();
|
||||||
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Fail to clear PK: %r\n", Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// After PK clear, Setup Mode shall be enabled
|
||||||
|
Status = GetSetupMode (&SetupMode);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot get SetupMode variable: %r\n",
|
||||||
|
Status));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SetupMode == USER_MODE) {
|
||||||
|
DEBUG((DEBUG_INFO, "Skipped - USER_MODE\n"));
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = SetSecureBootMode (CUSTOM_SECURE_BOOT_MODE);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot set CUSTOM_SECURE_BOOT_MODE: %r\n",
|
||||||
|
Status));
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enroll all the keys from default variables
|
||||||
|
Status = EnrollDbFromDefault ();
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot enroll db: %r\n", Status));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EnrollDbxFromDefault ();
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot enroll dbx: %r\n", Status));
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EnrollDbtFromDefault ();
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot enroll dbt: %r\n", Status));
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EnrollKEKFromDefault ();
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot enroll KEK: %r\n", Status));
|
||||||
|
goto cleardbs;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EnrollPKFromDefault ();
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot enroll PK: %r\n", Status));
|
||||||
|
goto clearKEK;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = SetSecureBootMode (STANDARD_SECURE_BOOT_MODE);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot set CustomMode to STANDARD_SECURE_BOOT_MODE\n"
|
||||||
|
"Please do it manually, otherwise system can be easily compromised\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
clearKEK:
|
||||||
|
DeleteKEK ();
|
||||||
|
|
||||||
|
cleardbs:
|
||||||
|
DeleteDbt ();
|
||||||
|
DeleteDbx ();
|
||||||
|
DeleteDb ();
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (SetSecureBootMode (STANDARD_SECURE_BOOT_MODE) != EFI_SUCCESS) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "Cannot set mode to Secure: %r\n", Status));
|
||||||
|
}
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function is called to provide results data to the driver.
|
This function is called to provide results data to the driver.
|
||||||
|
|
||||||
@ -4206,6 +4332,8 @@ SecureBootCallback (
|
|||||||
SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData;
|
SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData;
|
||||||
BOOLEAN GetBrowserDataResult;
|
BOOLEAN GetBrowserDataResult;
|
||||||
ENROLL_KEY_ERROR EnrollKeyErrorCode;
|
ENROLL_KEY_ERROR EnrollKeyErrorCode;
|
||||||
|
EFI_HII_POPUP_PROTOCOL *HiiPopup;
|
||||||
|
EFI_HII_POPUP_SELECTION UserSelection;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
SecureBootEnable = NULL;
|
SecureBootEnable = NULL;
|
||||||
@ -4756,6 +4884,31 @@ SecureBootCallback (
|
|||||||
FreePool (SetupMode);
|
FreePool (SetupMode);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case KEY_SECURE_BOOT_RESET_TO_DEFAULT:
|
||||||
|
{
|
||||||
|
Status = gBS->LocateProtocol (&gEfiHiiPopupProtocolGuid, NULL, (VOID **) &HiiPopup);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
Status = HiiPopup->CreatePopup (
|
||||||
|
HiiPopup,
|
||||||
|
EfiHiiPopupStyleInfo,
|
||||||
|
EfiHiiPopupTypeYesNo,
|
||||||
|
Private->HiiHandle,
|
||||||
|
STRING_TOKEN (STR_RESET_TO_DEFAULTS_POPUP),
|
||||||
|
&UserSelection
|
||||||
|
);
|
||||||
|
if (UserSelection == EfiHiiPopupSelectionYes) {
|
||||||
|
Status = KeyEnrollReset ();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Update secure boot strings after key reset
|
||||||
|
//
|
||||||
|
if (Status == EFI_SUCCESS) {
|
||||||
|
Status = UpdateSecureBootString (Private);
|
||||||
|
SecureBootExtractConfigFromVariable (Private, IfrNvData);
|
||||||
|
}
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#define KEY_VALUE_FROM_DBX_TO_LIST_FORM 0x100f
|
#define KEY_VALUE_FROM_DBX_TO_LIST_FORM 0x100f
|
||||||
|
|
||||||
|
#define KEY_SECURE_BOOT_RESET_TO_DEFAULT 0x1010
|
||||||
|
|
||||||
#define KEY_SECURE_BOOT_OPTION 0x1100
|
#define KEY_SECURE_BOOT_OPTION 0x1100
|
||||||
#define KEY_SECURE_BOOT_PK_OPTION 0x1101
|
#define KEY_SECURE_BOOT_PK_OPTION 0x1101
|
||||||
#define KEY_SECURE_BOOT_KEK_OPTION 0x1102
|
#define KEY_SECURE_BOOT_KEK_OPTION 0x1102
|
||||||
|
@ -21,6 +21,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#string STR_SECURE_BOOT_PROMPT #language en-US "Attempt Secure Boot"
|
#string STR_SECURE_BOOT_PROMPT #language en-US "Attempt Secure Boot"
|
||||||
#string STR_SECURE_BOOT_HELP #language en-US "Enable/Disable the Secure Boot feature after platform reset"
|
#string STR_SECURE_BOOT_HELP #language en-US "Enable/Disable the Secure Boot feature after platform reset"
|
||||||
|
|
||||||
|
#string STR_SECURE_RESET_TO_DEFAULTS_HELP #language en-US "Enroll keys with data from default variables"
|
||||||
|
#string STR_SECURE_RESET_TO_DEFAULTS #language en-US "Reset Secure Boot Keys"
|
||||||
|
#string STR_RESET_TO_DEFAULTS_POPUP #language en-US "Secure Boot Keys & databases will be initialized from defaults.\n Are you sure?"
|
||||||
|
|
||||||
#string STR_SECURE_BOOT_ENROLL_SIGNATURE #language en-US "Enroll Signature"
|
#string STR_SECURE_BOOT_ENROLL_SIGNATURE #language en-US "Enroll Signature"
|
||||||
#string STR_SECURE_BOOT_DELETE_SIGNATURE #language en-US "Delete Signature"
|
#string STR_SECURE_BOOT_DELETE_SIGNATURE #language en-US "Delete Signature"
|
||||||
#string STR_SECURE_BOOT_DELETE_LIST_FORM #language en-US "Delete Signature List Form"
|
#string STR_SECURE_BOOT_DELETE_LIST_FORM #language en-US "Delete Signature List Form"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user