[PATCH v3 03/11] SecurityPkg: SecureBootVariableLib: Updated time based payload creator
Kun Qin
From: Kun Qin <kuqin@...>
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3909 This change updated the interface of 'CreateTimeBasedPayload' by requiring the caller to provide a timestamp, instead of relying on time protocol to be ready during runtime. It intends to extend the library availability during boot environment. Cc: Jiewen Yao <jiewen.yao@...> Cc: Jian J Wang <jian.j.wang@...> Cc: Min Xu <min.m.xu@...> Signed-off-by: Kun Qin <kun.qin@...> Reviewed-by: Jiewen Yao <Jiewen.yao@...> Acked-by: Michael Kubacki <michael.kubacki@...> --- Notes: v3: - Added reviewed-by tag [Jiewen] - Added acked-by tag [Michael Kubacki] SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.c | 53 += +++++++++++-------- SecurityPkg/Include/Library/SecureBootVariableLib.h | 9 += ++- SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf | 8 += -- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLi= b.c b/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.c index e0d137666e0e..3b33a356aba3 100644 --- a/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.c +++ b/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.c @@ -6,8 +6,10 @@ (C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>=0D Copyright (c) 2021, ARM Ltd. All rights reserved.<BR>=0D Copyright (c) 2021, Semihalf All rights reserved.<BR>=0D + Copyright (c) Microsoft Corporation.=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D **/=0D +#include <Uefi.h>=0D #include <Guid/GlobalVariable.h>=0D #include <Guid/AuthenticatedVariableFormat.h>=0D #include <Guid/ImageAuthentication.h>=0D @@ -21,6 +23,21 @@ #include <Library/SecureBootVariableLib.h>=0D #include "Library/DxeServicesLib.h"=0D =0D +// This time can be used when deleting variables, as it should be greater = than any variable time.=0D +EFI_TIME mMaxTimestamp =3D {=0D + 0xFFFF, // Year=0D + 0xFF, // Month=0D + 0xFF, // Day=0D + 0xFF, // Hour=0D + 0xFF, // Minute=0D + 0xFF, // Second=0D + 0x00,=0D + 0x00000000, // Nanosecond=0D + 0,=0D + 0,=0D + 0x00=0D +};=0D +=0D /** Creates EFI Signature List structure.=0D =0D @param[in] Data A pointer to signature data.=0D @@ -118,7 +135,7 @@ ConcatenateSigList ( =0D @param[in] KeyFileGuid A pointer to to the FFS filename GUID=0D @param[out] SigListsSize A pointer to size of signature list=0D - @param[out] SigListOut a pointer to a callee-allocated buffer w= ith signature lists=0D + @param[out] SigListsOut a pointer to a callee-allocated buffer = with signature lists=0D =0D @retval EFI_SUCCESS Create time based payload successfully.= =0D @retval EFI_NOT_FOUND Section with key has not been found.=0D @@ -210,28 +227,30 @@ SecureBootFetchData ( pointer to NULL to wrap an empty payloa= d.=0D On output, Pointer to the new payload d= ate buffer allocated from pool,=0D it's caller's responsibility to free th= e memory when finish using it.=0D + @param[in] Time Pointer to time information to created = time based payload.=0D =0D @retval EFI_SUCCESS Create time based payload successfully.= =0D @retval EFI_OUT_OF_RESOURCES There are not enough memory resources t= o create time based payload.=0D @retval EFI_INVALID_PARAMETER The parameter is invalid.=0D @retval Others Unexpected error happens.=0D =0D -**/=0D +--*/=0D EFI_STATUS=0D +EFIAPI=0D CreateTimeBasedPayload (=0D - IN OUT UINTN *DataSize,=0D - IN OUT UINT8 **Data=0D + IN OUT UINTN *DataSize,=0D + IN OUT UINT8 **Data,=0D + IN EFI_TIME *Time=0D )=0D {=0D - EFI_STATUS Status;=0D UINT8 *NewData;=0D UINT8 *Payload;=0D UINTN PayloadSize;=0D EFI_VARIABLE_AUTHENTICATION_2 *DescriptorData;=0D UINTN DescriptorSize;=0D - EFI_TIME Time;=0D =0D - if ((Data =3D=3D NULL) || (DataSize =3D=3D NULL)) {=0D + if ((Data =3D=3D NULL) || (DataSize =3D=3D NULL) || (Time =3D=3D NULL)) = {=0D + DEBUG ((DEBUG_ERROR, "%a(), invalid arg\n", __FUNCTION__));=0D return EFI_INVALID_PARAMETER;=0D }=0D =0D @@ -247,6 +266,7 @@ CreateTimeBasedPayload ( DescriptorSize =3D OFFSET_OF (EFI_VARIABLE_AUTHENTICATION_2, AuthInfo) += OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData);=0D NewData =3D (UINT8 *)AllocateZeroPool (DescriptorSize + PayloadSi= ze);=0D if (NewData =3D=3D NULL) {=0D + DEBUG ((DEBUG_ERROR, "%a() Out of resources.\n", __FUNCTION__));=0D return EFI_OUT_OF_RESOURCES;=0D }=0D =0D @@ -256,19 +276,7 @@ CreateTimeBasedPayload ( =0D DescriptorData =3D (EFI_VARIABLE_AUTHENTICATION_2 *)(NewData);=0D =0D - ZeroMem (&Time, sizeof (EFI_TIME));=0D - Status =3D gRT->GetTime (&Time, NULL);=0D - if (EFI_ERROR (Status)) {=0D - FreePool (NewData);=0D - return Status;=0D - }=0D -=0D - Time.Pad1 =3D 0;=0D - Time.Nanosecond =3D 0;=0D - Time.TimeZone =3D 0;=0D - Time.Daylight =3D 0;=0D - Time.Pad2 =3D 0;=0D - CopyMem (&DescriptorData->TimeStamp, &Time, sizeof (EFI_TIME));=0D + CopyMem (&DescriptorData->TimeStamp, Time, sizeof (EFI_TIME));=0D =0D DescriptorData->AuthInfo.Hdr.dwLength =3D OFFSET_OF (WIN_CERTIFI= CATE_UEFI_GUID, CertData);=0D DescriptorData->AuthInfo.Hdr.wRevision =3D 0x0200;=0D @@ -277,6 +285,7 @@ CreateTimeBasedPayload ( =0D if (Payload !=3D NULL) {=0D FreePool (Payload);=0D + Payload =3D NULL;=0D }=0D =0D *DataSize =3D DescriptorSize + PayloadSize;=0D @@ -296,6 +305,7 @@ CreateTimeBasedPayload ( =0D **/=0D EFI_STATUS=0D +EFIAPI=0D DeleteVariable (=0D IN CHAR16 *VariableName,=0D IN EFI_GUID *VendorGuid=0D @@ -319,7 +329,7 @@ DeleteVariable ( Attr =3D EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | E= FI_VARIABLE_BOOTSERVICE_ACCESS=0D | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;=0D =0D - Status =3D CreateTimeBasedPayload (&DataSize, &Data);=0D + Status =3D CreateTimeBasedPayload (&DataSize, &Data, &mMaxTimestamp);=0D if (EFI_ERROR (Status)) {=0D DEBUG ((DEBUG_ERROR, "Fail to create time-based data payload: %r", Sta= tus));=0D return Status;=0D @@ -351,6 +361,7 @@ DeleteVariable ( =0D **/=0D EFI_STATUS=0D +EFIAPI=0D SetSecureBootMode (=0D IN UINT8 SecureBootMode=0D )=0D diff --git a/SecurityPkg/Include/Library/SecureBootVariableLib.h b/Security= Pkg/Include/Library/SecureBootVariableLib.h index 7b7afd9cde7c..9f2d41220b70 100644 --- a/SecurityPkg/Include/Library/SecureBootVariableLib.h +++ b/SecurityPkg/Include/Library/SecureBootVariableLib.h @@ -6,6 +6,7 @@ Copyright (c) 2011 - 2018, Intel Corporation. All rights re= served.<BR> (C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>=0D Copyright (c) 2021, ARM Ltd. All rights reserved.<BR>=0D Copyright (c) 2021, Semihalf All rights reserved.<BR>=0D +Copyright (c) Microsoft Corporation.=0D SPDX-License-Identifier: BSD-2-Clause-Patent=0D =0D **/=0D @@ -24,6 +25,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent =0D --*/=0D EFI_STATUS=0D +EFIAPI=0D SetSecureBootMode (=0D IN UINT8 SecureBootMode=0D );=0D @@ -73,6 +75,7 @@ SecureBootFetchData ( pointer to NULL to wrap an empty payloa= d.=0D On output, Pointer to the new payload d= ate buffer allocated from pool,=0D it's caller's responsibility to free th= e memory when finish using it.=0D + @param[in] Time Pointer to time information to created = time based payload.=0D =0D @retval EFI_SUCCESS Create time based payload successfully.= =0D @retval EFI_OUT_OF_RESOURCES There are not enough memory resources t= o create time based payload.=0D @@ -81,9 +84,11 @@ SecureBootFetchData ( =0D --*/=0D EFI_STATUS=0D +EFIAPI=0D CreateTimeBasedPayload (=0D - IN OUT UINTN *DataSize,=0D - IN OUT UINT8 **Data=0D + IN OUT UINTN *DataSize,=0D + IN OUT UINT8 **Data,=0D + IN EFI_TIME *Time=0D );=0D =0D /**=0D diff --git a/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLi= b.inf b/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf index ed7af3dd9cd5..87db5a258021 100644 --- a/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf +++ b/SecurityPkg/Library/SecureBootVariableLib/SecureBootVariableLib.inf @@ -4,6 +4,7 @@ #=0D # Copyright (c) 2021, ARM Ltd. All rights reserved.<BR>=0D # Copyright (c) 2021, Semihalf All rights reserved.<BR>=0D +# Copyright (c) Microsoft Corporation.=0D #=0D # SPDX-License-Identifier: BSD-2-Clause-Patent=0D #=0D @@ -68,12 +69,5 @@ [Guids] ## PRODUCES ## Variable:L"CustomMode"=0D gEfiCustomModeEnableGuid=0D =0D - gEfiCertTypeRsa2048Sha256Guid ## CONSUMES=0D gEfiCertX509Guid ## CONSUMES=0D gEfiCertPkcs7Guid ## CONSUMES=0D -=0D - gDefaultPKFileGuid=0D - gDefaultKEKFileGuid=0D - gDefaultdbFileGuid=0D - gDefaultdbxFileGuid=0D - gDefaultdbtFileGuid=0D --=20 2.36.0.windows.1 |
|