From nobody Thu Apr 25 11:33:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+85447+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+85447+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1641805067; cv=none; d=zohomail.com; s=zohoarc; b=msCIllaRQjWAhh4sadwgacphAhg4A9zmcBnDKe5R8AvDBWgZJAnskkCaM3UlF2FLKo+TUFqG1hxPCK2fMbnsw0ucwVM4CwaMfPOoeE5WwKwoq9+LH7Fm+Dw95yAJgrFyVGD0zuBOJHnhdDVDNJ9q/T+m1Tt2B2I8zhfvEppcrUY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1641805067; h=Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=3Ilo4bMdd1efJ0ss8W2rGKoaT7gpsgbnF+Gv4bFuy7g=; b=Ok8r8NRzjAn4EuaC/8xy1oD3aqvjEIVasp9ajM2digc3KxAd163sMQLbqI7UpYDPc4CChvYMYD5jKAQazkzsXrRU9PL3QGd5zff+nthY93vEwCiq2HgfMqeffgh08naXv/UJxS7jXRX2diFavhn9Z8i3PVQEVNlfp/QYp8w7rSE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+85447+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 164180506785439.701263291738655; Mon, 10 Jan 2022 00:57:47 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id Cl0KYY1788612x7rGshColCF; Mon, 10 Jan 2022 00:57:47 -0800 X-Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web10.29318.1641805066605234034 for ; Mon, 10 Jan 2022 00:57:46 -0800 X-IronPort-AV: E=McAfee;i="6200,9189,10222"; a="243382880" X-IronPort-AV: E=Sophos;i="5.88,276,1635231600"; d="scan'208";a="243382880" X-Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jan 2022 00:57:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,276,1635231600"; d="scan'208";a="528193132" X-Received: from shbiosbuild1001.sh.intel.com ([10.239.132.191]) by orsmga008.jf.intel.com with ESMTP; 10 Jan 2022 00:57:43 -0800 From: "Long1 Huang" To: devel@edk2.groups.io Cc: Huang Long , Liming Gao , Chen Lin Z , Dandan Bi Subject: [edk2-devel] [PATCH] MdeModulePkg/HiiDatabaseDxe: Add Support for authenticated variable Date: Mon, 10 Jan 2022 17:02:44 +0000 Message-Id: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,long1.huang@intel.com X-Gm-Message-State: XcNyEvFytOXoDzPBBDRCbRpOx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1641805067; bh=iKCFjEqVE04whDiT1o+wyp9g6dzgQtHvIYFrkS6naOA=; h=Cc:Date:From:Reply-To:Subject:To; b=EuCTK9+wrGZmfhUfy1y+EOJ6Kt5MEzx1K+RvETdnZ/ZumH3E4wmLXt/uNFKMUXU39xw EoAaWB0ne3gfRl6LSY0BigwMRqjR6f8Py7sy4ulPR0rFRdwoeG/KgbLrhbXbIluuD+5CL pF2HRmW1F0BTGrRVJNquKEA1RzBvo6TT1nc= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1641805070052100002 Content-Type: text/plain; charset="utf-8" REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3796 Database.c: 1. Replace PcdGetExPtr with PcdGetExPtr. 2. Add FindAuthVariableData function to parse authenticated variable type = for getting a correct default value in PcdNvStoreDefaultValueBuffer. Cc: Liming Gao Cc: Chen Lin Z Cc: Dandan Bi Signed-off-by: Huang Long --- .../Universal/HiiDatabaseDxe/Database.c | 147 +++++++++++++----- .../HiiDatabaseDxe/HiiDatabaseDxe.inf | 3 + 2 files changed, 114 insertions(+), 36 deletions(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePk= g/Universal/HiiDatabaseDxe/Database.c index 0b09c24d52..c055fa0f29 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -603,6 +603,45 @@ FindVariableData ( return NULL; } =20 +/** + Find the matched authenticated variable from the input variable storage. + + @param[in] VariableStorage Point to the variable storage header. + @param[in] VarGuid A unique identifier for the variable. + @param[in] VarAttribute The attributes bitmask for the variable. + @param[in] VarName A Null-terminated ascii string that is the na= me of the variable. + + @return Pointer to the matched variable header or NULL if not found. +**/ +AUTHENTICATED_VARIABLE_HEADER * +FindAuthVariableData ( + IN VARIABLE_STORE_HEADER *VariableStorage, + IN EFI_GUID *VarGuid, + IN UINT32 VarAttribute, + IN CHAR16 *VarName + ) +{ + AUTHENTICATED_VARIABLE_HEADER *AuthVariableHeader; + AUTHENTICATED_VARIABLE_HEADER *AuthVariableEnd; + + AuthVariableEnd =3D (AUTHENTICATED_VARIABLE_HEADER *)((UINT8 *)Variab= leStorage + VariableStorage->Size); + AuthVariableHeader =3D (AUTHENTICATED_VARIABLE_HEADER *)(VariableStorage= + 1); + AuthVariableHeader =3D (AUTHENTICATED_VARIABLE_HEADER *)HEADER_ALIGN (Au= thVariableHeader); + while (AuthVariableHeader < AuthVariableEnd) { + if (CompareGuid (&AuthVariableHeader->VendorGuid, VarGuid) && + (AuthVariableHeader->Attributes =3D=3D VarAttribute) && + (StrCmp (VarName, (CHAR16 *)(AuthVariableHeader + 1)) =3D=3D 0)) + { + return AuthVariableHeader; + } + + AuthVariableHeader =3D (AUTHENTICATED_VARIABLE_HEADER *)((UINT8 *)Auth= VariableHeader + sizeof (AUTHENTICATED_VARIABLE_HEADER) + AuthVariableHeade= r->NameSize + AuthVariableHeader->DataSize); + AuthVariableHeader =3D (AUTHENTICATED_VARIABLE_HEADER *)HEADER_ALIGN (= AuthVariableHeader); + } + + return NULL; +} + /** Find question default value from PcdNvStoreDefaultValueBuffer =20 @@ -626,25 +665,27 @@ FindQuestionDefaultSetting ( IN BOOLEAN BitFieldQuestion ) { - VARIABLE_HEADER *VariableHeader; - VARIABLE_STORE_HEADER *VariableStorage; - LIST_ENTRY *Link; - VARSTORAGE_DEFAULT_DATA *Entry; - VARIABLE_STORE_HEADER *NvStoreBuffer; - UINT8 *DataBuffer; - UINT8 *BufferEnd; - BOOLEAN IsFound; - UINTN Index; - UINT32 BufferValue; - UINT32 BitFieldVal; - UINTN BitOffset; - UINTN ByteOffset; - UINTN BitWidth; - UINTN StartBit; - UINTN EndBit; - PCD_DEFAULT_DATA *DataHeader; - PCD_DEFAULT_INFO *DefaultInfo; - PCD_DATA_DELTA *DeltaData; + VARIABLE_HEADER *VariableHeader; + AUTHENTICATED_VARIABLE_HEADER *AuthVariableHeader; + VARIABLE_STORE_HEADER *VariableStorage; + LIST_ENTRY *Link; + VARSTORAGE_DEFAULT_DATA *Entry; + VARIABLE_STORE_HEADER *NvStoreBuffer; + UINT8 *DataBuffer; + UINT8 *BufferEnd; + BOOLEAN AuthFormat; + BOOLEAN IsFound; + UINTN Index; + UINT32 BufferValue; + UINT32 BitFieldVal; + UINTN BitOffset; + UINTN ByteOffset; + UINTN BitWidth; + UINTN StartBit; + UINTN EndBit; + PCD_DEFAULT_DATA *DataHeader; + PCD_DEFAULT_INFO *DefaultInfo; + PCD_DATA_DELTA *DeltaData; =20 if (gSkuId =3D=3D 0xFFFFFFFFFFFFFFFF) { gSkuId =3D LibPcdGetSku (); @@ -666,7 +707,7 @@ FindQuestionDefaultSetting ( } =20 if (Link =3D=3D &gVarStorageList) { - DataBuffer =3D (UINT8 *)PcdGetPtr (PcdNvStoreDefaultValueBuff= er); + DataBuffer =3D (UINT8 *)PcdGetExPtr (&gEfiMdeModulePkgTokenSp= aceGuid, PcdNvStoreDefaultValueBuffer); gNvDefaultStoreSize =3D ((PCD_NV_STORE_DEFAULT_BUFFER_HEADER *)DataBuf= fer)->Length; // // The first section data includes NV storage default setting. @@ -750,12 +791,27 @@ FindQuestionDefaultSetting ( return EFI_NOT_FOUND; } =20 + // + // Judge if the variable type is authenticated, default is false + // + AuthFormat =3D FALSE; + if (CompareGuid (&VariableStorage->Signature, &gEfiAuthenticatedVariable= Guid)) { + AuthFormat =3D TRUE; + } + // // Find the question default value from the variable storage // - VariableHeader =3D FindVariableData (VariableStorage, &EfiVarStore->Guid= , EfiVarStore->Attributes, (CHAR16 *)EfiVarStore->Name); - if (VariableHeader =3D=3D NULL) { - return EFI_NOT_FOUND; + if(AuthFormat) { + AuthVariableHeader =3D FindAuthVariableData (VariableStorage, &EfiVarS= tore->Guid, EfiVarStore->Attributes, (CHAR16 *)EfiVarStore->Name); + if (AuthVariableHeader =3D=3D NULL) { + return EFI_NOT_FOUND; + } + } else { + VariableHeader =3D FindVariableData (VariableStorage, &EfiVarStore->Gu= id, EfiVarStore->Attributes, (CHAR16 *)EfiVarStore->Name); + if (VariableHeader =3D=3D NULL) { + return EFI_NOT_FOUND; + } } =20 StartBit =3D 0; @@ -770,20 +826,39 @@ FindQuestionDefaultSetting ( Width =3D EndBit / 8 + 1; } =20 - if (VariableHeader->DataSize < ByteOffset + Width) { - return EFI_INVALID_PARAMETER; - } + if(AuthFormat) { + if (AuthVariableHeader->DataSize < ByteOffset + Width) { + return EFI_INVALID_PARAMETER; + } =20 - // - // Copy the question value - // - if (ValueBuffer !=3D NULL) { - if (BitFieldQuestion) { - CopyMem (&BufferValue, (UINT8 *)VariableHeader + sizeof (VARIABLE_HE= ADER) + VariableHeader->NameSize + ByteOffset, Width); - BitFieldVal =3D BitFieldRead32 (BufferValue, StartBit, EndBit); - CopyMem (ValueBuffer, &BitFieldVal, Width); - } else { - CopyMem (ValueBuffer, (UINT8 *)VariableHeader + sizeof (VARIABLE_HEA= DER) + VariableHeader->NameSize + IfrQuestionHdr->VarStoreInfo.VarOffset, W= idth); + // + // Copy the question value + // + if (ValueBuffer !=3D NULL) { + if (BitFieldQuestion) { + CopyMem (&BufferValue, (UINT8 *)AuthVariableHeader + sizeof (AUTHE= NTICATED_VARIABLE_HEADER) + AuthVariableHeader->NameSize + ByteOffset, Widt= h); + BitFieldVal =3D BitFieldRead32 (BufferValue, StartBit, EndBit); + CopyMem (ValueBuffer, &BitFieldVal, Width); + } else { + CopyMem (ValueBuffer, (UINT8 *)AuthVariableHeader + sizeof (AUTHEN= TICATED_VARIABLE_HEADER) + AuthVariableHeader->NameSize + IfrQuestionHdr->V= arStoreInfo.VarOffset, Width); + } + } + } else { + if (VariableHeader->DataSize < ByteOffset + Width) { + return EFI_INVALID_PARAMETER; + } + + // + // Copy the question value + // + if (ValueBuffer !=3D NULL) { + if (BitFieldQuestion) { + CopyMem (&BufferValue, (UINT8 *)VariableHeader + sizeof (VARIABLE_= HEADER) + VariableHeader->NameSize + ByteOffset, Width); + BitFieldVal =3D BitFieldRead32 (BufferValue, StartBit, EndBit); + CopyMem (ValueBuffer, &BitFieldVal, Width); + } else { + CopyMem (ValueBuffer, (UINT8 *)VariableHeader + sizeof (VARIABLE_H= EADER) + VariableHeader->NameSize + IfrQuestionHdr->VarStoreInfo.VarOffset,= Width); + } } } =20 diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf b/Mde= ModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf index 0116fb6ecb..dac4d614a8 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf @@ -86,6 +86,9 @@ gEfiHiiImageDecoderNameJpegGuid |gEfiMdeModulePkgTokenSpaceGuid.PcdSuppo= rtHiiImageProtocol ## SOMETIMES_CONSUMES ## GUID gEfiHiiImageDecoderNamePngGuid |gEfiMdeModulePkgTokenSpaceGuid.PcdSuppo= rtHiiImageProtocol ## SOMETIMES_CONSUMES ## GUID gEdkiiIfrBitVarstoreGuid = ## SOMETIMES_CONSUMES ## GUID + gEfiAuthenticatedVariableGuid + gEfiVariableGuid + gEfiMdeModulePkgTokenSpaceGuid =20 [Depex] TRUE --=20 2.25.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#85447): https://edk2.groups.io/g/devel/message/85447 Mute This Topic: https://groups.io/mt/88319448/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-