From nobody Fri Apr 26 08:14:03 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+85612+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+85612+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1641978081; cv=none; d=zohomail.com; s=zohoarc; b=Yk7nNaJKPPd0CrwbBy8uFzGznRxanl3FJ9d0JbTM+87SBB0OGXXSxywT0Q02o5Ye9Xdekq8CcoGMRNCapZPaYGUo2k7l2LdvUWhkSdhonK6Llim/CocRfLpm8gFrZDRT33sjv9U+TAOHPSGhqPfQMXjqjVO8YzDaAqEJl8REcj8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1641978081; 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=DCRex07QKFlCKlSpHQNCXu8kBGN4y2434Xm4YMJ24ns=; b=fbcGYJiTyr53krC//5HDYVva/btAQGb7Zj02RoB61cyf7G3mk+nDvbMFwvyu8ig+teSiQ6WOOUvetAOPHaFAT3c+9/T3wFnkGlI/cG225VPo7/nQ4y8E/wOgfHIqit212+7S/l+gxgFi7r+1llW0g6J4mXabZzLrOIa2UlTurKg= 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+85612+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 164197808161294.86231607993955; Wed, 12 Jan 2022 01:01:21 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id OCPwYY1788612xoUcnDEmOqj; Wed, 12 Jan 2022 01:01:21 -0800 X-Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mx.groups.io with SMTP id smtpd.web10.20772.1641978080064905777 for ; Wed, 12 Jan 2022 01:01:20 -0800 X-IronPort-AV: E=McAfee;i="6200,9189,10224"; a="241246480" X-IronPort-AV: E=Sophos;i="5.88,282,1635231600"; d="scan'208";a="241246480" X-Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 01:01:19 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,282,1635231600"; d="scan'208";a="613509060" X-Received: from shbiosbuild1001.sh.intel.com ([10.239.132.191]) by FMSMGA003.fm.intel.com with ESMTP; 12 Jan 2022 01:01:16 -0800 From: "Long1 Huang" To: devel@edk2.groups.io Cc: Huang Long , Bob Feng , Liming Gao , Dandan Bi , Lin Z Chen , Zhuangzhi Li Subject: [edk2-devel] [PATCH] MdeModulePkg/HiiDatabaseDxe: Add Support for authenticated variable Date: Wed, 12 Jan 2022 17:06:25 +0000 Message-Id: <802446c5bddb6e7de746d733c68d92c0e09e5ca8.1642007174.git.long1.huang@intel.com> 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: a9pJcbnh4MPsuOvjUEFXtL54x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1641978081; bh=fjYMM8gtRIlPGz9yl/K4A5p4cuTbKi139WhGewe5EpU=; h=Cc:Date:From:Reply-To:Subject:To; b=V9/VULxPdvjMPhFmo++gjG3XhrvRjqh+wNRgq5ElYQPPdMXqGXI/g3TcOcR7Enu+4g6 NPTRNVedwtNRxOLBYiWLZhaW7ljMDAYOCu5oU/INFR2gXTAh6FTARrUEgfqT96MfHa6CC F+7lUQ/wiL63f7mGiprtjtrVK8tYK/ILERo= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1641978083712100002 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. Signed-off-by: Huang Long Cc: Bob Feng Cc: Liming Gao Cc: Dandan Bi Cc: Lin Z Chen Cc: Zhuangzhi Li --- .../Universal/HiiDatabaseDxe/Database.c | 130 ++++++++++++++---- .../HiiDatabaseDxe/HiiDatabaseDxe.inf | 3 + 2 files changed, 105 insertions(+), 28 deletions(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePk= g/Universal/HiiDatabaseDxe/Database.c index 0b09c24d52..c7a92d6aed 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,29 @@ 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; + VOID *ValueSource; + VOID *BitValueSource; + 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 +709,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 +793,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,8 +828,24 @@ 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; + } + + ValueSource =3D (UINT8 *)AuthVariableHeader + sizeof (AUTHENTICATED_VA= RIABLE_HEADER) + AuthVariableHeader->NameSize + IfrQuestionHdr->VarStoreInf= o.VarOffset; + if (BitFieldQuestion) { + BitValueSource =3D (UINT8 *)AuthVariableHeader + sizeof (AUTHENTICAT= ED_VARIABLE_HEADER) + AuthVariableHeader->NameSize + ByteOffset; + } + } else { + if (VariableHeader->DataSize < ByteOffset + Width) { + return EFI_INVALID_PARAMETER; + } + + ValueSource =3D (UINT8 *)VariableHeader + sizeof (VARIABLE_HEADER) + V= ariableHeader->NameSize + IfrQuestionHdr->VarStoreInfo.VarOffset; + if (BitFieldQuestion) { + BitValueSource =3D (UINT8 *)VariableHeader + sizeof (VARIABLE_HEADER= ) + VariableHeader->NameSize + ByteOffset; + } } =20 // @@ -779,11 +853,11 @@ FindQuestionDefaultSetting ( // if (ValueBuffer !=3D NULL) { if (BitFieldQuestion) { - CopyMem (&BufferValue, (UINT8 *)VariableHeader + sizeof (VARIABLE_HE= ADER) + VariableHeader->NameSize + ByteOffset, Width); + CopyMem (&BufferValue, BitValueSource, 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); + CopyMem (ValueBuffer, ValueSource, Width); } } =20 @@ -832,7 +906,7 @@ UpdateDefaultSettingInFormPackage ( // If no default setting, do nothing // if (gNvDefaultStoreSize =3D=3D 0) { - gNvDefaultStoreSize =3D PcdGetSize (PcdNvStoreDefaultValueBuffer); + gNvDefaultStoreSize =3D PcdGetExSize (&gEfiMdeModulePkgTokenSpaceGuid,= PcdNvStoreDefaultValueBuffer); } =20 if (gNvDefaultStoreSize < sizeof (PCD_NV_STORE_DEFAULT_BUFFER_HEADER)) { 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 (#85612): https://edk2.groups.io/g/devel/message/85612 Mute This Topic: https://groups.io/mt/88369479/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-