Hi Patrick, Current implementation does not allow to use data in EFI_VARIABLE_AUTHENTICATION_2 format as a source of default data. I will add the possibility to use that kind of data to initialize secure boot default data. thanks, greg
wt., 24 sie 2021 o 14:26 Grzegorz Bernacki <g...@semihalf.com> napisał(a): > > Hi Patrick, > > Yes, I tested the dbx enrollment, but with my own data. Please let me > try that dbx. > > thanks, > greg > > wt., 24 sie 2021 o 14:22 Patrick Rudolph > <patrick.rudo...@9elements.com> napisał(a): > > > > Hi Grzegorz, > > I tried this patch, but I cannot enroll the DBX downloaded from here: > > https://uefi.org/revocationlistfile > > > > Is it even possible with current code? Did you test DBX enrollment as well > > using the revocation list file? > > > > Regards, > > Patrick > > > > On Mon, Aug 2, 2021 at 12:47 PM Grzegorz Bernacki <g...@semihalf.com> wrote: > >> > >> This commits add library, which consist functions to > >> enrolll Secure Boot keys and initialize Secure Boot > >> default variables. Some of the functions was moved > >> from SecureBootConfigImpl.c file. > >> > >> Signed-off-by: Grzegorz Bernacki <g...@semihalf.com> > >> Reviewed-by: Sunny Wang <sunny.w...@arm.com> > >> Reviewed-by: Jiewen Yao <jiewen....@intel.com> > >> --- > >> SecurityPkg/SecurityPkg.dec > >> | 4 + > >> SecurityPkg/SecurityPkg.dsc > >> | 1 + > >> > >> SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf > >> | 80 ++++ > >> SecurityPkg/Include/Library/SecureBootVariableProvisionLib.h > >> | 134 ++++++ > >> > >> SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c > >> | 482 ++++++++++++++++++++ > >> > >> SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.uni > >> | 16 + > >> 6 files changed, 717 insertions(+) > >> create mode 100644 > >> SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf > >> create mode 100644 > >> SecurityPkg/Include/Library/SecureBootVariableProvisionLib.h > >> create mode 100644 > >> SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c > >> create mode 100644 > >> SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.uni > >> > >> diff --git a/SecurityPkg/SecurityPkg.dec b/SecurityPkg/SecurityPkg.dec > >> index 8f3710e59f..e30c39f321 100644 > >> --- a/SecurityPkg/SecurityPkg.dec > >> +++ b/SecurityPkg/SecurityPkg.dec > >> @@ -91,6 +91,10 @@ > >> ## @libraryclass Provides helper functions related to creation/removal > >> Secure Boot variables. > >> # > >> SecureBootVariableLib|Include/Library/SecureBootVariableLib.h > >> + > >> + ## @libraryclass Provides support to enroll Secure Boot keys. > >> + # > >> + > >> SecureBootVariableProvisionLib|Include/Library/SecureBootVariableProvisionLib.h > >> [Guids] > >> ## Security package token space guid. > >> # Include/Guid/SecurityPkgTokenSpace.h > >> diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc > >> index 854f250625..99c227dad2 100644 > >> --- a/SecurityPkg/SecurityPkg.dsc > >> +++ b/SecurityPkg/SecurityPkg.dsc > >> @@ -71,6 +71,7 @@ > >> > >> TcgEventLogRecordLib|SecurityPkg/Library/TcgEventLogRecordLib/TcgEventLogRecordLib.inf > >> > >> MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf > >> > >> SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf > >> + > >> SecureBootVariableProvisionLib|SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf > >> > >> [LibraryClasses.ARM] > >> # > >> diff --git > >> a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf > >> > >> b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf > >> new file mode 100644 > >> index 0000000000..a09abd29ce > >> --- /dev/null > >> +++ > >> b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.inf > >> @@ -0,0 +1,80 @@ > >> +## @file > >> +# Provides initialization of Secure Boot keys and databases. > >> +# > >> +# Copyright (c) 2021, ARM Ltd. All rights reserved.<BR> > >> +# Copyright (c) 2021, Semihalf All rights reserved.<BR> > >> +# > >> +# SPDX-License-Identifier: BSD-2-Clause-Patent > >> +# > >> +## > >> + > >> +[Defines] > >> + INF_VERSION = 0x00010005 > >> + BASE_NAME = SecureBootVariableLib > >> + MODULE_UNI_FILE = SecureBootVariableLib.uni > >> + FILE_GUID = 18192DD0-9430-45F1-80C7-5C52061CD183 > >> + MODULE_TYPE = DXE_DRIVER > >> + VERSION_STRING = 1.0 > >> + LIBRARY_CLASS = > >> SecureBootVariableProvisionLib|DXE_DRIVER DXE_RUNTIME_DRIVER > >> UEFI_APPLICATION > >> + > >> +# > >> +# The following information is for reference only and not required by the > >> build tools. > >> +# > >> +# VALID_ARCHITECTURES = IA32 X64 AARCH64 > >> +# > >> + > >> +[Sources] > >> + SecureBootVariableProvisionLib.c > >> + > >> +[Packages] > >> + MdePkg/MdePkg.dec > >> + MdeModulePkg/MdeModulePkg.dec > >> + SecurityPkg/SecurityPkg.dec > >> + CryptoPkg/CryptoPkg.dec > >> + > >> +[LibraryClasses] > >> + BaseLib > >> + BaseMemoryLib > >> + DebugLib > >> + MemoryAllocationLib > >> + BaseCryptLib > >> + DxeServicesLib > >> + SecureBootVariableLib > >> + > >> +[Guids] > >> + ## CONSUMES ## Variable:L"SetupMode" > >> + ## PRODUCES ## Variable:L"SetupMode" > >> + ## CONSUMES ## Variable:L"SecureBoot" > >> + ## PRODUCES ## Variable:L"SecureBoot" > >> + ## PRODUCES ## Variable:L"PK" > >> + ## PRODUCES ## Variable:L"KEK" > >> + ## CONSUMES ## Variable:L"PKDefault" > >> + ## CONSUMES ## Variable:L"KEKDefault" > >> + ## CONSUMES ## Variable:L"dbDefault" > >> + ## CONSUMES ## Variable:L"dbxDefault" > >> + ## CONSUMES ## Variable:L"dbtDefault" > >> + gEfiGlobalVariableGuid > >> + > >> + ## SOMETIMES_CONSUMES ## Variable:L"DB" > >> + ## SOMETIMES_CONSUMES ## Variable:L"DBX" > >> + ## SOMETIMES_CONSUMES ## Variable:L"DBT" > >> + gEfiImageSecurityDatabaseGuid > >> + > >> + ## CONSUMES ## Variable:L"SecureBootEnable" > >> + ## PRODUCES ## Variable:L"SecureBootEnable" > >> + gEfiSecureBootEnableDisableGuid > >> + > >> + ## CONSUMES ## Variable:L"CustomMode" > >> + ## PRODUCES ## Variable:L"CustomMode" > >> + gEfiCustomModeEnableGuid > >> + > >> + gEfiCertTypeRsa2048Sha256Guid ## CONSUMES > >> + gEfiCertX509Guid ## CONSUMES > >> + gEfiCertPkcs7Guid ## CONSUMES > >> + > >> + gDefaultPKFileGuid > >> + gDefaultKEKFileGuid > >> + gDefaultdbFileGuid > >> + gDefaultdbxFileGuid > >> + gDefaultdbtFileGuid > >> + > >> diff --git a/SecurityPkg/Include/Library/SecureBootVariableProvisionLib.h > >> b/SecurityPkg/Include/Library/SecureBootVariableProvisionLib.h > >> new file mode 100644 > >> index 0000000000..ba8009b5cd > >> --- /dev/null > >> +++ b/SecurityPkg/Include/Library/SecureBootVariableProvisionLib.h > >> @@ -0,0 +1,134 @@ > >> +/** @file > >> + Provides a functions to enroll keys based on default values. > >> + > >> +Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> > >> +(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR> > >> +Copyright (c) 2021, ARM Ltd. All rights reserved.<BR> > >> +Copyright (c) 2021, Semihalf All rights reserved.<BR> > >> +SPDX-License-Identifier: BSD-2-Clause-Patent > >> + > >> +**/ > >> + > >> +#ifndef SECURE_BOOT_VARIABLE_PROVISION_LIB_H_ > >> +#define SECURE_BOOT_VARIABLE_PROVISION_LIB_H_ > >> + > >> +/** > >> + Sets the content of the 'db' variable based on 'dbDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2(), GetTime() > >> and SetVariable() > >> +--*/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollDbFromDefault ( > >> + VOID > >> +); > >> + > >> +/** > >> + Sets the content of the 'dbx' variable based on 'dbxDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2(), GetTime() > >> and SetVariable() > >> +--*/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollDbxFromDefault ( > >> + VOID > >> +); > >> + > >> +/** > >> + Sets the content of the 'dbt' variable based on 'dbtDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2(), GetTime() > >> and SetVariable() > >> +--*/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollDbtFromDefault ( > >> + VOID > >> +); > >> + > >> +/** > >> + Sets the content of the 'KEK' variable based on 'KEKDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2(), GetTime() > >> and SetVariable() > >> +--*/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollKEKFromDefault ( > >> + VOID > >> +); > >> + > >> +/** > >> + Sets the content of the 'PK' variable based on 'PKDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2(), GetTime() > >> and SetVariable() > >> +--*/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollPKFromDefault ( > >> + VOID > >> +); > >> + > >> +/** > >> + Initializes PKDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +--*/ > >> +EFI_STATUS > >> +SecureBootInitPKDefault ( > >> + IN VOID > >> + ); > >> + > >> +/** > >> + Initializes KEKDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +--*/ > >> +EFI_STATUS > >> +SecureBootInitKEKDefault ( > >> + IN VOID > >> + ); > >> + > >> +/** > >> + Initializes dbDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +--*/ > >> +EFI_STATUS > >> +SecureBootInitDbDefault ( > >> + IN VOID > >> + ); > >> + > >> +/** > >> + Initializes dbtDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +--*/ > >> +EFI_STATUS > >> +SecureBootInitDbtDefault ( > >> + IN VOID > >> + ); > >> + > >> +/** > >> + Initializes dbxDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +--*/ > >> +EFI_STATUS > >> +SecureBootInitDbxDefault ( > >> + IN VOID > >> + ); > >> +#endif > >> diff --git > >> a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c > >> > >> b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c > >> new file mode 100644 > >> index 0000000000..848f7ce929 > >> --- /dev/null > >> +++ > >> b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.c > >> @@ -0,0 +1,482 @@ > >> +/** @file > >> + This library provides functions to set/clear Secure Boot > >> + keys and databases. > >> + > >> + Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> > >> + (C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR> > >> + Copyright (c) 2021, ARM Ltd. All rights reserved.<BR> > >> + Copyright (c) 2021, Semihalf All rights reserved.<BR> > >> + SPDX-License-Identifier: BSD-2-Clause-Patent > >> +**/ > >> +#include <Guid/GlobalVariable.h> > >> +#include <Guid/AuthenticatedVariableFormat.h> > >> +#include <Guid/ImageAuthentication.h> > >> +#include <Library/BaseLib.h> > >> +#include <Library/BaseMemoryLib.h> > >> +#include <Library/DebugLib.h> > >> +#include <Library/UefiLib.h> > >> +#include <Library/MemoryAllocationLib.h> > >> +#include <Library/UefiRuntimeServicesTableLib.h> > >> +#include <Library/SecureBootVariableLib.h> > >> +#include <Library/SecureBootVariableProvisionLib.h> > >> + > >> +/** > >> + Enroll a key/certificate based on a default variable. > >> + > >> + @param[in] VariableName The name of the key/database. > >> + @param[in] DefaultName The name of the default variable. > >> + @param[in] VendorGuid The namespace (ie. vendor GUID) of the > >> variable > >> + > >> + @retval EFI_OUT_OF_RESOURCES Out of memory while allocating > >> AuthHeader. > >> + @retval EFI_SUCCESS Successful enrollment. > >> + @return Error codes from GetTime () and > >> SetVariable (). > >> +**/ > >> +STATIC > >> +EFI_STATUS > >> +EnrollFromDefault ( > >> + IN CHAR16 *VariableName, > >> + IN CHAR16 *DefaultName, > >> + IN EFI_GUID *VendorGuid > >> + ) > >> +{ > >> + VOID *Data; > >> + UINTN DataSize; > >> + EFI_STATUS Status; > >> + > >> + Status = EFI_SUCCESS; > >> + > >> + DataSize = 0; > >> + Status = GetVariable2 (DefaultName, &gEfiGlobalVariableGuid, &Data, > >> &DataSize); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_ERROR, "error: GetVariable (\"%s): %r\n", > >> DefaultName, Status)); > >> + return Status; > >> + } > >> + > >> + CreateTimeBasedPayload (&DataSize, (UINT8 **)&Data); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_ERROR, "Fail to create time-based data payload: %r", > >> Status)); > >> + return Status; > >> + } > >> + > >> + // > >> + // Allocate memory for auth variable > >> + // > >> + Status = gRT->SetVariable ( > >> + VariableName, > >> + VendorGuid, > >> + (EFI_VARIABLE_NON_VOLATILE | > >> + EFI_VARIABLE_BOOTSERVICE_ACCESS | > >> + EFI_VARIABLE_RUNTIME_ACCESS | > >> + EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS), > >> + DataSize, > >> + Data > >> + ); > >> + > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_ERROR, "error: %a (\"%s\", %g): %r\n", __FUNCTION__, > >> VariableName, > >> + VendorGuid, Status)); > >> + } > >> + > >> + if (Data != NULL) { > >> + FreePool (Data); > >> + } > >> + > >> + return Status; > >> +} > >> + > >> +/** Initializes PKDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +**/ > >> +EFI_STATUS > >> +SecureBootInitPKDefault ( > >> + IN VOID > >> + ) > >> +{ > >> + EFI_SIGNATURE_LIST *EfiSig; > >> + UINTN SigListsSize; > >> + EFI_STATUS Status; > >> + UINT8 *Data; > >> + UINTN DataSize; > >> + > >> + // > >> + // Check if variable exists, if so do not change it > >> + // > >> + Status = GetVariable2 (EFI_PK_DEFAULT_VARIABLE_NAME, > >> &gEfiGlobalVariableGuid, (VOID **) &Data, &DataSize); > >> + if (Status == EFI_SUCCESS) { > >> + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", > >> EFI_PK_DEFAULT_VARIABLE_NAME)); > >> + FreePool (Data); > >> + return EFI_UNSUPPORTED; > >> + } > >> + > >> + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { > >> + return Status; > >> + } > >> + > >> + // > >> + // Variable does not exist, can be initialized > >> + // > >> + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", > >> EFI_PK_DEFAULT_VARIABLE_NAME)); > >> + > >> + Status = SecureBootFetchData (&gDefaultPKFileGuid, &SigListsSize, > >> &EfiSig); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Content for %s not found\n", > >> EFI_PK_DEFAULT_VARIABLE_NAME)); > >> + return Status; > >> + } > >> + > >> + Status = gRT->SetVariable ( > >> + EFI_PK_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid, > >> + EFI_VARIABLE_RUNTIME_ACCESS | > >> EFI_VARIABLE_BOOTSERVICE_ACCESS, > >> + SigListsSize, > >> + (VOID *)EfiSig > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Failed to set %s\n", > >> EFI_PK_DEFAULT_VARIABLE_NAME)); > >> + } > >> + > >> + FreePool (EfiSig); > >> + > >> + return Status; > >> +} > >> + > >> +/** Initializes KEKDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +**/ > >> +EFI_STATUS > >> +SecureBootInitKEKDefault ( > >> + IN VOID > >> + ) > >> +{ > >> + EFI_SIGNATURE_LIST *EfiSig; > >> + UINTN SigListsSize; > >> + EFI_STATUS Status; > >> + UINT8 *Data; > >> + UINTN DataSize; > >> + > >> + // > >> + // Check if variable exists, if so do not change it > >> + // > >> + Status = GetVariable2 (EFI_KEK_DEFAULT_VARIABLE_NAME, > >> &gEfiGlobalVariableGuid, (VOID **) &Data, &DataSize); > >> + if (Status == EFI_SUCCESS) { > >> + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", > >> EFI_KEK_DEFAULT_VARIABLE_NAME)); > >> + FreePool (Data); > >> + return EFI_UNSUPPORTED; > >> + } > >> + > >> + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { > >> + return Status; > >> + } > >> + > >> + // > >> + // Variable does not exist, can be initialized > >> + // > >> + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", > >> EFI_KEK_DEFAULT_VARIABLE_NAME)); > >> + > >> + Status = SecureBootFetchData (&gDefaultKEKFileGuid, &SigListsSize, > >> &EfiSig); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Content for %s not found\n", > >> EFI_KEK_DEFAULT_VARIABLE_NAME)); > >> + return Status; > >> + } > >> + > >> + > >> + Status = gRT->SetVariable ( > >> + EFI_KEK_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid, > >> + EFI_VARIABLE_RUNTIME_ACCESS | > >> EFI_VARIABLE_BOOTSERVICE_ACCESS, > >> + SigListsSize, > >> + (VOID *)EfiSig > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Failed to set %s\n", > >> EFI_KEK_DEFAULT_VARIABLE_NAME)); > >> + } > >> + > >> + FreePool (EfiSig); > >> + > >> + return Status; > >> +} > >> + > >> +/** Initializes dbDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +**/ > >> +EFI_STATUS > >> +SecureBootInitDbDefault ( > >> + IN VOID > >> + ) > >> +{ > >> + EFI_SIGNATURE_LIST *EfiSig; > >> + UINTN SigListsSize; > >> + EFI_STATUS Status; > >> + UINT8 *Data; > >> + UINTN DataSize; > >> + > >> + Status = GetVariable2 (EFI_DB_DEFAULT_VARIABLE_NAME, > >> &gEfiGlobalVariableGuid, (VOID **) &Data, &DataSize); > >> + if (Status == EFI_SUCCESS) { > >> + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", > >> EFI_DB_DEFAULT_VARIABLE_NAME)); > >> + FreePool (Data); > >> + return EFI_UNSUPPORTED; > >> + } > >> + > >> + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { > >> + return Status; > >> + } > >> + > >> + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", > >> EFI_DB_DEFAULT_VARIABLE_NAME)); > >> + > >> + Status = SecureBootFetchData (&gDefaultdbFileGuid, &SigListsSize, > >> &EfiSig); > >> + if (EFI_ERROR (Status)) { > >> + return Status; > >> + } > >> + > >> + Status = gRT->SetVariable ( > >> + EFI_DB_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid, > >> + EFI_VARIABLE_RUNTIME_ACCESS | > >> EFI_VARIABLE_BOOTSERVICE_ACCESS, > >> + SigListsSize, > >> + (VOID *)EfiSig > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Failed to set %s\n", > >> EFI_DB_DEFAULT_VARIABLE_NAME)); > >> + } > >> + > >> + FreePool (EfiSig); > >> + > >> + return Status; > >> +} > >> + > >> +/** Initializes dbxDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +**/ > >> +EFI_STATUS > >> +SecureBootInitDbxDefault ( > >> + IN VOID > >> + ) > >> +{ > >> + EFI_SIGNATURE_LIST *EfiSig; > >> + UINTN SigListsSize; > >> + EFI_STATUS Status; > >> + UINT8 *Data; > >> + UINTN DataSize; > >> + > >> + // > >> + // Check if variable exists, if so do not change it > >> + // > >> + Status = GetVariable2 (EFI_DBX_DEFAULT_VARIABLE_NAME, > >> &gEfiGlobalVariableGuid, (VOID **) &Data, &DataSize); > >> + if (Status == EFI_SUCCESS) { > >> + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", > >> EFI_DBX_DEFAULT_VARIABLE_NAME)); > >> + FreePool (Data); > >> + return EFI_UNSUPPORTED; > >> + } > >> + > >> + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { > >> + return Status; > >> + } > >> + > >> + // > >> + // Variable does not exist, can be initialized > >> + // > >> + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", > >> EFI_DBX_DEFAULT_VARIABLE_NAME)); > >> + > >> + Status = SecureBootFetchData (&gDefaultdbxFileGuid, &SigListsSize, > >> &EfiSig); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Content for %s not found\n", > >> EFI_DBX_DEFAULT_VARIABLE_NAME)); > >> + return Status; > >> + } > >> + > >> + Status = gRT->SetVariable ( > >> + EFI_DBX_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid, > >> + EFI_VARIABLE_RUNTIME_ACCESS | > >> EFI_VARIABLE_BOOTSERVICE_ACCESS, > >> + SigListsSize, > >> + (VOID *)EfiSig > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Failed to set %s\n", > >> EFI_DBX_DEFAULT_VARIABLE_NAME)); > >> + } > >> + > >> + FreePool (EfiSig); > >> + > >> + return Status; > >> +} > >> + > >> +/** Initializes dbtDefault variable with data from FFS section. > >> + > >> + @retval EFI_SUCCESS Variable was initialized successfully. > >> + @retval EFI_UNSUPPORTED Variable already exists. > >> +**/ > >> +EFI_STATUS > >> +SecureBootInitDbtDefault ( > >> + IN VOID > >> + ) > >> +{ > >> + EFI_SIGNATURE_LIST *EfiSig; > >> + UINTN SigListsSize; > >> + EFI_STATUS Status; > >> + UINT8 *Data; > >> + UINTN DataSize; > >> + > >> + // > >> + // Check if variable exists, if so do not change it > >> + // > >> + Status = GetVariable2 (EFI_DBT_DEFAULT_VARIABLE_NAME, > >> &gEfiGlobalVariableGuid, (VOID **) &Data, &DataSize); > >> + if (Status == EFI_SUCCESS) { > >> + DEBUG ((DEBUG_INFO, "Variable %s exists. Old value is preserved\n", > >> EFI_DBT_DEFAULT_VARIABLE_NAME)); > >> + FreePool (Data); > >> + return EFI_UNSUPPORTED; > >> + } > >> + > >> + if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) { > >> + return Status; > >> + } > >> + > >> + // > >> + // Variable does not exist, can be initialized > >> + // > >> + DEBUG ((DEBUG_INFO, "Variable %s does not exist.\n", > >> EFI_DBT_DEFAULT_VARIABLE_NAME)); > >> + > >> + Status = SecureBootFetchData (&gDefaultdbtFileGuid, &SigListsSize, > >> &EfiSig); > >> + if (EFI_ERROR (Status)) { > >> + return Status; > >> + } > >> + > >> + Status = gRT->SetVariable ( > >> + EFI_DBT_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid, > >> + EFI_VARIABLE_RUNTIME_ACCESS | > >> EFI_VARIABLE_BOOTSERVICE_ACCESS, > >> + SigListsSize, > >> + (VOID *)EfiSig > >> + ); > >> + if (EFI_ERROR (Status)) { > >> + DEBUG ((DEBUG_INFO, "Failed to set %s\n", > >> EFI_DBT_DEFAULT_VARIABLE_NAME)); > >> + } > >> + > >> + FreePool (EfiSig); > >> + > >> + return EFI_SUCCESS; > >> +} > >> + > >> +/** > >> + Sets the content of the 'db' variable based on 'dbDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2 (), GetTime > >> () and SetVariable () > >> +**/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollDbFromDefault ( > >> + VOID > >> +) > >> +{ > >> + EFI_STATUS Status; > >> + > >> + Status = EnrollFromDefault ( > >> + EFI_IMAGE_SECURITY_DATABASE, > >> + EFI_DB_DEFAULT_VARIABLE_NAME, > >> + &gEfiImageSecurityDatabaseGuid > >> + ); > >> + > >> + return Status; > >> +} > >> + > >> +/** > >> + Sets the content of the 'dbx' variable based on 'dbxDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2 (), GetTime > >> () and SetVariable () > >> +**/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollDbxFromDefault ( > >> + VOID > >> +) > >> +{ > >> + EFI_STATUS Status; > >> + > >> + Status = EnrollFromDefault ( > >> + EFI_IMAGE_SECURITY_DATABASE1, > >> + EFI_DBX_DEFAULT_VARIABLE_NAME, > >> + &gEfiImageSecurityDatabaseGuid > >> + ); > >> + > >> + return Status; > >> +} > >> + > >> +/** > >> + Sets the content of the 'dbt' variable based on 'dbtDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2 (), GetTime > >> () and SetVariable () > >> +**/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollDbtFromDefault ( > >> + VOID > >> +) > >> +{ > >> + EFI_STATUS Status; > >> + > >> + Status = EnrollFromDefault ( > >> + EFI_IMAGE_SECURITY_DATABASE2, > >> + EFI_DBT_DEFAULT_VARIABLE_NAME, > >> + &gEfiImageSecurityDatabaseGuid); > >> + > >> + return Status; > >> +} > >> + > >> +/** > >> + Sets the content of the 'KEK' variable based on 'KEKDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2 (), GetTime > >> () and SetVariable () > >> +**/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollKEKFromDefault ( > >> + VOID > >> +) > >> +{ > >> + EFI_STATUS Status; > >> + > >> + Status = EnrollFromDefault ( > >> + EFI_KEY_EXCHANGE_KEY_NAME, > >> + EFI_KEK_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid > >> + ); > >> + > >> + return Status; > >> +} > >> + > >> +/** > >> + Sets the content of the 'KEK' variable based on 'KEKDefault' variable > >> content. > >> + > >> + @retval EFI_OUT_OF_RESOURCES If memory allocation for > >> EFI_VARIABLE_AUTHENTICATION_2 fails > >> + while VendorGuid is NULL. > >> + @retval other Errors from GetVariable2 (), GetTime > >> () and SetVariable () > >> +**/ > >> +EFI_STATUS > >> +EFIAPI > >> +EnrollPKFromDefault ( > >> + VOID > >> +) > >> +{ > >> + EFI_STATUS Status; > >> + > >> + Status = EnrollFromDefault ( > >> + EFI_PLATFORM_KEY_NAME, > >> + EFI_PK_DEFAULT_VARIABLE_NAME, > >> + &gEfiGlobalVariableGuid > >> + ); > >> + > >> + return Status; > >> +} > >> diff --git > >> a/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.uni > >> > >> b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.uni > >> new file mode 100644 > >> index 0000000000..68d928ef30 > >> --- /dev/null > >> +++ > >> b/SecurityPkg/Library/SecureBootVariableProvisionLib/SecureBootVariableProvisionLib.uni > >> @@ -0,0 +1,16 @@ > >> +// /** @file > >> +// > >> +// Provides initialization of Secure Boot keys and databases. > >> +// > >> +// Copyright (c) 2021, ARM Ltd. All rights reserved.<BR> > >> +// Copyright (c) 2021, Semihalf All rights reserved.<BR> > >> +// > >> +// SPDX-License-Identifier: BSD-2-Clause-Patent > >> +// > >> +// **/ > >> + > >> + > >> +#string STR_MODULE_ABSTRACT #language en-US "Provides > >> functions to initialize PK, KEK and databases based on default variables." > >> + > >> +#string STR_MODULE_DESCRIPTION #language en-US "Provides > >> functions to initialize PK, KEK and databases based on default variables." > >> + > >> -- > >> 2.25.1 > >> > >> > >> > >> > >> > >> -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#79952): https://edk2.groups.io/g/devel/message/79952 Mute This Topic: https://groups.io/mt/84608356/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-