Message ID | 20250219102151.4000494-1-kai.kang@windriver.com |
---|---|
State | Under Review |
Delegated to: | Steve Sakoman |
Headers | show |
Series | [kirkstone,1/2] Revert "ovmf: Fix CVE-2023-45237" | expand |
Hi Kai, Not sure why, but this fails to apply for me: Applying: Revert "ovmf: Fix CVE-2023-45237" Using index info to reconstruct a base tree... error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch:1 error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch: patch does not apply error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch:1 error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch: patch does not apply error: Did you hand edit your patch? It does not apply to blobs recorded in its index. Patch failed at 0001 Revert "ovmf: Fix CVE-2023-45237" Steve On Wed, Feb 19, 2025 at 2:22 AM Kai Kang via lists.openembedded.org <kai.kang=windriver.com@lists.openembedded.org> wrote: > > From: Kai Kang <kai.kang@windriver.com> > > This reverts commit 4c2d3e37308cac98614dfafed79b7323423af8bc. > > The fix for CVE-2023-45237 causes ovmf firmware not support pxe boot > any more and no boot item in OVMF menu such as > > UEFI PXEv4 (MAC address) > > It has not been fixed by ovmf upstream and an issue has been created on > > https://github.com/tianocore/tianocore.github.io/issues/82 > > Revert the fixes for now. > > Signed-off-by: Kai Kang <kai.kang@windriver.com> > --- > > Please add option `--keep-cr` when invoke `git am`. > > .../ovmf/ovmf/CVE-2023-45237-0001.patch | 78 - > .../ovmf/ovmf/CVE-2023-45237-0002.patch | 1288 ----------------- > meta/recipes-core/ovmf/ovmf_git.bb | 2 - > 3 files changed, 1368 deletions(-) > delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch > delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch > > diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch > deleted file mode 100644 > index d1dcb8dc44..0000000000 > --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch > +++ /dev/null > @@ -1,78 +0,0 @@ > -From cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c Mon Sep 17 00:00:00 2001 > -From: Pierre Gondois <pierre.gondois@arm.com> > -Date: Fri, 11 Aug 2023 16:33:06 +0200 > -Subject: [PATCH] MdePkg/Rng: Add GUID to describe Arm Rndr Rng algorithms > - > -BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4441 > - > -The EFI_RNG_PROTOCOL can rely on the RngLib. The RngLib has multiple > -implementations, some of them are unsafe (e.g. BaseRngLibTimerLib). > -To allow the RngDxe to detect when such implementation is used, > -a GetRngGuid() function is added in a following patch. > - > -Prepare GetRngGuid() return values and add a gEfiRngAlgorithmArmRndr > -to describe a Rng algorithm accessed through Arm's RNDR instruction. > -[1] states that the implementation of this algorithm should be > -compliant to NIST SP900-80. The compliance is not guaranteed. > - > -[1] Arm Architecture Reference Manual Armv8, for A-profile architecture > -sK12.1 'Properties of the generated random number' > - > -Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> > -Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> > -Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> > -Acked-by: Ard Biesheuvel <ardb@kernel.org> > -Tested-by: Kun Qin <kun.qin@microsoft.com> > - > -CVE: CVE-2023-45237 > - > -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c] > - > -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> > ---- > - MdePkg/Include/Protocol/Rng.h | 10 ++++++++++ > - MdePkg/MdePkg.dec | 1 + > - 2 files changed, 11 insertions(+) > - > -diff --git a/MdePkg/Include/Protocol/Rng.h b/MdePkg/Include/Protocol/Rng.h > -index baf425587b..38bde53240 100644 > ---- a/MdePkg/Include/Protocol/Rng.h > -+++ b/MdePkg/Include/Protocol/Rng.h > -@@ -67,6 +67,15 @@ typedef EFI_GUID EFI_RNG_ALGORITHM; > - { \ > - 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 } \ > - } > -+/// > -+/// The Arm Architecture states the RNDR that the DRBG algorithm should be compliant > -+/// with NIST SP800-90A, while not mandating a particular algorithm, so as to be > -+/// inclusive of different geographies. > -+/// > -+#define EFI_RNG_ALGORITHM_ARM_RNDR \ > -+ { \ > -+ 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41} \ > -+ } > - > - /** > - Returns information about the random number generation implementation. > -@@ -146,5 +155,6 @@ extern EFI_GUID gEfiRngAlgorithmSp80090Ctr256Guid; > - extern EFI_GUID gEfiRngAlgorithmX9313DesGuid; > - extern EFI_GUID gEfiRngAlgorithmX931AesGuid; > - extern EFI_GUID gEfiRngAlgorithmRaw; > -+extern EFI_GUID gEfiRngAlgorithmArmRndr; > - > - #endif > -diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec > -index 59b405928b..a449dbc556 100644 > ---- a/MdePkg/MdePkg.dec > -+++ b/MdePkg/MdePkg.dec > -@@ -594,6 +594,7 @@ > - gEfiRngAlgorithmX9313DesGuid = { 0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46 }} > - gEfiRngAlgorithmX931AesGuid = { 0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9 }} > - gEfiRngAlgorithmRaw = { 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 }} > -+ gEfiRngAlgorithmArmRndr = { 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41 }} > - > - ## Include/Protocol/AdapterInformation.h > - gEfiAdapterInfoMediaStateGuid = { 0xD7C74207, 0xA831, 0x4A26, {0xB1, 0xF5, 0xD1, 0x93, 0x06, 0x5C, 0xE8, 0xB6 }} > --- > -2.40.0 > - > diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch > deleted file mode 100644 > index 722a6cd530..0000000000 > --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch > +++ /dev/null > @@ -1,1288 +0,0 @@ > -From 4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345 Mon Sep 17 00:00:00 2001 > -From: Doug Flick <dougflick@microsoft.com> > -Date: Wed, 8 May 2024 22:56:28 -0700 > -Subject: [PATCH] NetworkPkg: SECURITY PATCH CVE-2023-45237 > - > -REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4542 > - > -Bug Overview: > -PixieFail Bug #9 > -CVE-2023-45237 > -CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N > -CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) > - > -Use of a Weak PseudoRandom Number Generator > - > -Change Overview: > - > -Updates all Instances of NET_RANDOM (NetRandomInitSeed ()) to either > - > -> > -> EFI_STATUS > -> EFIAPI > -> PseudoRandomU32 ( > -> OUT UINT32 *Output > -> ); > -> > - > -or (depending on the use case) > - > -> > -> EFI_STATUS > -> EFIAPI > -> PseudoRandom ( > -> OUT VOID *Output, > -> IN UINTN OutputLength > -> ); > -> > - > -This is because the use of > - > -Example: > - > -The following code snippet PseudoRandomU32 () function is used: > - > -> > -> UINT32 Random; > -> > -> Status = PseudoRandomU32 (&Random); > -> if (EFI_ERROR (Status)) { > -> DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", > -__func__, Status)); > -> return Status; > -> } > -> > - > -This also introduces a new PCD to enable/disable the use of the > -secure implementation of algorithms for PseudoRandom () and > -instead depend on the default implementation. This may be required for > -some platforms where the UEFI Spec defined algorithms are not available. > - > -> > -> PcdEnforceSecureRngAlgorithms > -> > - > -If the platform does not have any one of the UEFI defined > -secure RNG algorithms then the driver will assert. > - > -Cc: Saloni Kasbekar <saloni.kasbekar@intel.com> > -Cc: Zachary Clark-williams <zachary.clark-williams@intel.com> > - > -Signed-off-by: Doug Flick [MSFT] <doug.edk2@gmail.com> > -Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com> > - > -CVE: CVE-2023-45237 > - > -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345] > - > -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> > ---- > - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c | 10 +- > - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c | 11 +- > - NetworkPkg/DnsDxe/DnsDhcp.c | 10 +- > - NetworkPkg/DnsDxe/DnsImpl.c | 11 +- > - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c | 10 +- > - NetworkPkg/IScsiDxe/IScsiCHAP.c | 19 ++- > - NetworkPkg/IScsiDxe/IScsiMisc.c | 14 +-- > - NetworkPkg/IScsiDxe/IScsiMisc.h | 6 +- > - NetworkPkg/Include/Library/NetLib.h | 40 +++++-- > - NetworkPkg/Ip4Dxe/Ip4Driver.c | 10 +- > - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c | 9 +- > - NetworkPkg/Ip6Dxe/Ip6Driver.c | 17 ++- > - NetworkPkg/Ip6Dxe/Ip6If.c | 12 +- > - NetworkPkg/Ip6Dxe/Ip6Mld.c | 12 +- > - NetworkPkg/Ip6Dxe/Ip6Nd.c | 33 +++++- > - NetworkPkg/Ip6Dxe/Ip6Nd.h | 8 +- > - NetworkPkg/Library/DxeNetLib/DxeNetLib.c | 130 ++++++++++++++++++--- > - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf | 14 ++- > - NetworkPkg/NetworkPkg.dec | 7 ++ > - NetworkPkg/SecurityFixes.yaml | 39 +++++++ > - NetworkPkg/TcpDxe/TcpDriver.c | 15 ++- > - NetworkPkg/TcpDxe/TcpDxe.inf | 3 + > - NetworkPkg/Udp4Dxe/Udp4Driver.c | 10 +- > - NetworkPkg/Udp6Dxe/Udp6Driver.c | 11 +- > - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c | 9 +- > - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c | 11 +- > - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c | 12 +- > - 27 files changed, 410 insertions(+), 83 deletions(-) > - > -diff --git a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > -index 8c37e93be3..892caee368 100644 > ---- a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > -+++ b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > -@@ -1,6 +1,7 @@ > - /** @file > - > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -189,6 +190,13 @@ Dhcp4CreateService ( > - { > - DHCP_SERVICE *DhcpSb; > - EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - *Service = NULL; > - DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE)); > -@@ -203,7 +211,7 @@ Dhcp4CreateService ( > - DhcpSb->Image = ImageHandle; > - InitializeListHead (&DhcpSb->Children); > - DhcpSb->DhcpState = Dhcp4Stopped; > -- DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ()); > -+ DhcpSb->Xid = Random; > - CopyMem ( > - &DhcpSb->ServiceBinding, > - &mDhcp4ServiceBindingTemplate, > -diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > -index b591a4605b..e7f2787a98 100644 > ---- a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > -+++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > -@@ -3,7 +3,7 @@ > - implementation for Dhcp6 Driver. > - > - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -123,6 +123,13 @@ Dhcp6CreateService ( > - { > - DHCP6_SERVICE *Dhcp6Srv; > - EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - *Service = NULL; > - Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE)); > -@@ -147,7 +154,7 @@ Dhcp6CreateService ( > - Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE; > - Dhcp6Srv->Controller = Controller; > - Dhcp6Srv->Image = ImageHandle; > -- Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ())); > -+ Dhcp6Srv->Xid = (0xffffff & Random); > - > - CopyMem ( > - &Dhcp6Srv->ServiceBinding, > -diff --git a/NetworkPkg/DnsDxe/DnsDhcp.c b/NetworkPkg/DnsDxe/DnsDhcp.c > -index 933565a32d..9eb3c1d2d8 100644 > ---- a/NetworkPkg/DnsDxe/DnsDhcp.c > -+++ b/NetworkPkg/DnsDxe/DnsDhcp.c > -@@ -2,6 +2,7 @@ > - Functions implementation related with DHCPv4/v6 for DNS driver. > - > - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -277,6 +278,7 @@ GetDns4ServerFromDhcp4 ( > - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; > - BOOLEAN IsDone; > - UINTN Index; > -+ UINT32 Random; > - > - Image = Instance->Service->ImageHandle; > - Controller = Instance->Service->ControllerHandle; > -@@ -292,6 +294,12 @@ GetDns4ServerFromDhcp4 ( > - Data = NULL; > - InterfaceInfo = NULL; > - > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - ZeroMem ((UINT8 *)ParaList, sizeof (ParaList)); > - > - ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA)); > -@@ -467,7 +475,7 @@ GetDns4ServerFromDhcp4 ( > - > - Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet); > - > -- Token.Packet->Dhcp4.Header.Xid = HTONL (NET_RANDOM (NetRandomInitSeed ())); > -+ Token.Packet->Dhcp4.Header.Xid = Random; > - > - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000); > - > -diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c > -index d311812800..c2629bb8df 100644 > ---- a/NetworkPkg/DnsDxe/DnsImpl.c > -+++ b/NetworkPkg/DnsDxe/DnsImpl.c > -@@ -2,6 +2,7 @@ > - DnsDxe support functions implementation. > - > - Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -1963,6 +1964,14 @@ ConstructDNSQuery ( > - NET_FRAGMENT Frag; > - DNS_HEADER *DnsHeader; > - DNS_QUERY_SECTION *DnsQuery; > -+ EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - // > - // Messages carried by UDP are restricted to 512 bytes (not counting the IP > -@@ -1977,7 +1986,7 @@ ConstructDNSQuery ( > - // Fill header > - // > - DnsHeader = (DNS_HEADER *)Frag.Bulk; > -- DnsHeader->Identification = (UINT16)NET_RANDOM (NetRandomInitSeed ()); > -+ DnsHeader->Identification = (UINT16)Random; > - DnsHeader->Flags.Uint16 = 0x0000; > - DnsHeader->Flags.Bits.RD = 1; > - DnsHeader->Flags.Bits.OpCode = DNS_FLAGS_OPCODE_STANDARD; > -diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > -index b22cef4ff5..f964515b0f 100644 > ---- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > -+++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > -@@ -2,6 +2,7 @@ > - Functions implementation related with DHCPv6 for HTTP boot driver. > - > - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -951,6 +952,7 @@ HttpBootDhcp6Sarr ( > - UINT32 OptCount; > - UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE]; > - EFI_STATUS Status; > -+ UINT32 Random; > - > - Dhcp6 = Private->Dhcp6; > - ASSERT (Dhcp6 != NULL); > -@@ -961,6 +963,12 @@ HttpBootDhcp6Sarr ( > - OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer); > - ASSERT (OptCount > 0); > - > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION)); > - if (Retransmit == NULL) { > - return EFI_OUT_OF_RESOURCES; > -@@ -976,7 +984,7 @@ HttpBootDhcp6Sarr ( > - Config.IaInfoEvent = NULL; > - Config.RapidCommit = FALSE; > - Config.ReconfigureAccept = FALSE; > -- Config.IaDescriptor.IaId = NET_RANDOM (NetRandomInitSeed ()); > -+ Config.IaDescriptor.IaId = Random; > - Config.IaDescriptor.Type = EFI_DHCP6_IA_TYPE_NA; > - Config.SolicitRetransmission = Retransmit; > - Retransmit->Irt = 4; > -diff --git a/NetworkPkg/IScsiDxe/IScsiCHAP.c b/NetworkPkg/IScsiDxe/IScsiCHAP.c > -index b507f11cd4..bebb1ac29b 100644 > ---- a/NetworkPkg/IScsiDxe/IScsiCHAP.c > -+++ b/NetworkPkg/IScsiDxe/IScsiCHAP.c > -@@ -3,6 +3,7 @@ > - Configuration. > - > - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -576,16 +577,24 @@ IScsiCHAPToSendReq ( > - // > - // CHAP_I=<I> > - // > -- IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); > -+ Status = IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); > -+ if (EFI_ERROR (Status)) { > -+ break; > -+ } > -+ > - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); > - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); > - // > - // CHAP_C=<C> > - // > -- IScsiGenRandom ( > -- (UINT8 *)AuthData->OutChallenge, > -- AuthData->Hash->DigestSize > -- ); > -+ Status = IScsiGenRandom ( > -+ (UINT8 *)AuthData->OutChallenge, > -+ AuthData->Hash->DigestSize > -+ ); > -+ if (EFI_ERROR (Status)) { > -+ break; > -+ } > -+ > - BinToHexStatus = IScsiBinToHex ( > - (UINT8 *)AuthData->OutChallenge, > - AuthData->Hash->DigestSize, > -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c > -index b3ea90158f..cd77f1a13e 100644 > ---- a/NetworkPkg/IScsiDxe/IScsiMisc.c > -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c > -@@ -2,6 +2,7 @@ > - Miscellaneous routines for iSCSI driver. > - > - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -474,20 +475,17 @@ IScsiNetNtoi ( > - @param[in, out] Rand The buffer to contain random numbers. > - @param[in] RandLength The length of the Rand buffer. > - > -+ @retval EFI_SUCCESS on success > -+ @retval others on error > -+ > - **/ > --VOID > -+EFI_STATUS > - IScsiGenRandom ( > - IN OUT UINT8 *Rand, > - IN UINTN RandLength > - ) > - { > -- UINT32 Random; > -- > -- while (RandLength > 0) { > -- Random = NET_RANDOM (NetRandomInitSeed ()); > -- *Rand++ = (UINT8)(Random); > -- RandLength--; > -- } > -+ return PseudoRandom (Rand, RandLength); > - } > - > - /** > -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h > -index a951eee70e..91b2cd2261 100644 > ---- a/NetworkPkg/IScsiDxe/IScsiMisc.h > -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h > -@@ -2,6 +2,7 @@ > - Miscellaneous definitions for iSCSI driver. > - > - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -202,8 +203,11 @@ IScsiNetNtoi ( > - @param[in, out] Rand The buffer to contain random numbers. > - @param[in] RandLength The length of the Rand buffer. > - > -+ @retval EFI_SUCCESS on success > -+ @retval others on error > -+ > - **/ > --VOID > -+EFI_STATUS > - IScsiGenRandom ( > - IN OUT UINT8 *Rand, > - IN UINTN RandLength > -diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h > -index 8c0e62b388..e8108b79db 100644 > ---- a/NetworkPkg/Include/Library/NetLib.h > -+++ b/NetworkPkg/Include/Library/NetLib.h > -@@ -3,6 +3,7 @@ > - It provides basic functions for the UEFI network stack. > - > - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -539,8 +540,6 @@ extern EFI_IPv4_ADDRESS mZeroIp4Addr; > - #define TICKS_PER_MS 10000U > - #define TICKS_PER_SECOND 10000000U > - > --#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL) > -- > - /** > - Extract a UINT32 from a byte stream. > - > -@@ -580,19 +579,40 @@ NetPutUint32 ( > - ); > - > - /** > -- Initialize a random seed using current time and monotonic count. > -+ Generate a Random output data given a length. > - > -- Get current time and monotonic count first. Then initialize a random seed > -- based on some basic mathematics operation on the hour, day, minute, second, > -- nanosecond and year of the current time and the monotonic count value. > -+ @param[out] Output - The buffer to store the generated random data. > -+ @param[in] OutputLength - The length of the output buffer. > - > -- @return The random seed initialized with current time. > -+ @retval EFI_SUCCESS On Success > -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero > -+ @retval EFI_NOT_FOUND RNG protocol not found > -+ @retval Others Error from RngProtocol->GetRNG() > - > -+ @return Status code > - **/ > --UINT32 > -+EFI_STATUS > - EFIAPI > --NetRandomInitSeed ( > -- VOID > -+PseudoRandom ( > -+ OUT VOID *Output, > -+ IN UINTN OutputLength > -+ ); > -+ > -+/** > -+ Generate a 32-bit pseudo-random number. > -+ > -+ @param[out] Output - The buffer to store the generated random number. > -+ > -+ @retval EFI_SUCCESS On Success > -+ @retval EFI_NOT_FOUND RNG protocol not found > -+ @retval Others Error from RngProtocol->GetRNG() > -+ > -+ @return Status code > -+**/ > -+EFI_STATUS > -+EFIAPI > -+PseudoRandomU32 ( > -+ OUT UINT32 *Output > - ); > - > - #define NET_LIST_USER_STRUCT(Entry, Type, Field) \ > -diff --git a/NetworkPkg/Ip4Dxe/Ip4Driver.c b/NetworkPkg/Ip4Dxe/Ip4Driver.c > -index ec483ff01f..683423f38d 100644 > ---- a/NetworkPkg/Ip4Dxe/Ip4Driver.c > -+++ b/NetworkPkg/Ip4Dxe/Ip4Driver.c > -@@ -2,6 +2,7 @@ > - The driver binding and service binding protocol for IP4 driver. > - > - Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> > - > - SPDX-License-Identifier: BSD-2-Clause-Patent > -@@ -549,11 +550,18 @@ Ip4DriverBindingStart ( > - EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; > - UINTN Index; > - IP4_CONFIG2_DATA_ITEM *DataItem; > -+ UINT32 Random; > - > - IpSb = NULL; > - Ip4Cfg2 = NULL; > - DataItem = NULL; > - > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - // > - // Test for the Ip4 service binding protocol > - // > -@@ -653,7 +661,7 @@ Ip4DriverBindingStart ( > - // > - // Initialize the IP4 ID > - // > -- mIp4Id = (UINT16)NET_RANDOM (NetRandomInitSeed ()); > -+ mIp4Id = (UINT16)Random; > - > - return Status; > - > -diff --git a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > -index 70e232ce6c..4c1354d26c 100644 > ---- a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > -+++ b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > -@@ -2276,6 +2276,13 @@ Ip6ConfigInitInstance ( > - UINTN Index; > - UINT16 IfIndex; > - IP6_CONFIG_DATA_ITEM *DataItem; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance); > - > -@@ -2381,7 +2388,7 @@ Ip6ConfigInitInstance ( > - // The NV variable is not set, so generate a random IAID, and write down the > - // fresh new configuration as the NV variable now. > - // > -- Instance->IaId = NET_RANDOM (NetRandomInitSeed ()); > -+ Instance->IaId = Random; > - > - for (Index = 0; Index < IpSb->SnpMode.HwAddressSize; Index++) { > - Instance->IaId |= (IpSb->SnpMode.CurrentAddress.Addr[Index] << ((Index << 3) & 31)); > -diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c > -index b483a7d136..cbe011dad4 100644 > ---- a/NetworkPkg/Ip6Dxe/Ip6Driver.c > -+++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c > -@@ -3,7 +3,7 @@ > - > - Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR> > - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -316,7 +316,11 @@ Ip6CreateService ( > - IpSb->CurHopLimit = IP6_HOP_LIMIT; > - IpSb->LinkMTU = IP6_MIN_LINK_MTU; > - IpSb->BaseReachableTime = IP6_REACHABLE_TIME; > -- Ip6UpdateReachableTime (IpSb); > -+ Status = Ip6UpdateReachableTime (IpSb); > -+ if (EFI_ERROR (Status)) { > -+ goto ON_ERROR; > -+ } > -+ > - // > - // RFC4861 RETRANS_TIMER: 1,000 milliseconds > - // > -@@ -516,11 +520,18 @@ Ip6DriverBindingStart ( > - EFI_STATUS Status; > - EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; > - IP6_CONFIG_DATA_ITEM *DataItem; > -+ UINT32 Random; > - > - IpSb = NULL; > - Ip6Cfg = NULL; > - DataItem = NULL; > - > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - // > - // Test for the Ip6 service binding protocol > - // > -@@ -656,7 +667,7 @@ Ip6DriverBindingStart ( > - // > - // Initialize the IP6 ID > - // > -- mIp6Id = NET_RANDOM (NetRandomInitSeed ()); > -+ mIp6Id = Random; > - > - return EFI_SUCCESS; > - > -diff --git a/NetworkPkg/Ip6Dxe/Ip6If.c b/NetworkPkg/Ip6Dxe/Ip6If.c > -index 4629c05f25..f3d11c4d21 100644 > ---- a/NetworkPkg/Ip6Dxe/Ip6If.c > -+++ b/NetworkPkg/Ip6Dxe/Ip6If.c > -@@ -2,7 +2,7 @@ > - Implement IP6 pseudo interface. > - > - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -89,6 +89,14 @@ Ip6SetAddress ( > - IP6_PREFIX_LIST_ENTRY *PrefixEntry; > - UINT64 Delay; > - IP6_DELAY_JOIN_LIST *DelayNode; > -+ EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - NET_CHECK_SIGNATURE (Interface, IP6_INTERFACE_SIGNATURE); > - > -@@ -164,7 +172,7 @@ Ip6SetAddress ( > - // Thus queue the address to be processed in Duplicate Address Detection module > - // after the delay time (in milliseconds). > - // > -- Delay = (UINT64)NET_RANDOM (NetRandomInitSeed ()); > -+ Delay = (UINT64)Random; > - Delay = MultU64x32 (Delay, IP6_ONE_SECOND_IN_MS); > - Delay = RShiftU64 (Delay, 32); > - > -diff --git a/NetworkPkg/Ip6Dxe/Ip6Mld.c b/NetworkPkg/Ip6Dxe/Ip6Mld.c > -index e6b2b653e2..498a118543 100644 > ---- a/NetworkPkg/Ip6Dxe/Ip6Mld.c > -+++ b/NetworkPkg/Ip6Dxe/Ip6Mld.c > -@@ -696,7 +696,15 @@ Ip6UpdateDelayTimer ( > - IN OUT IP6_MLD_GROUP *Group > - ) > - { > -- UINT32 Delay; > -+ UINT32 Delay; > -+ EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - // > - // If the Query packet specifies a Maximum Response Delay of zero, perform timer > -@@ -715,7 +723,7 @@ Ip6UpdateDelayTimer ( > - // is less than the remaining value of the running timer. > - // > - if ((Group->DelayTimer == 0) || (Delay < Group->DelayTimer)) { > -- Group->DelayTimer = Delay / 4294967295UL * NET_RANDOM (NetRandomInitSeed ()); > -+ Group->DelayTimer = Delay / 4294967295UL * Random; > - } > - > - return EFI_SUCCESS; > -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.c b/NetworkPkg/Ip6Dxe/Ip6Nd.c > -index c10c7017f8..72aa45c10f 100644 > ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.c > -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.c > -@@ -2,7 +2,7 @@ > - Implementation of Neighbor Discovery support routines. > - > - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -16,17 +16,28 @@ EFI_MAC_ADDRESS mZeroMacAddress; > - > - @param[in, out] IpSb Points to the IP6_SERVICE. > - > -+ @retval EFI_SUCCESS ReachableTime Updated > -+ @retval others Failed to update ReachableTime > - **/ > --VOID > -+EFI_STATUS > - Ip6UpdateReachableTime ( > - IN OUT IP6_SERVICE *IpSb > - ) > - { > -- UINT32 Random; > -+ UINT32 Random; > -+ EFI_STATUS Status; > - > -- Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > -+ Random = (Random / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; > - Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED; > - IpSb->ReachableTime = (IpSb->BaseReachableTime * Random) / IP6_RANDOM_FACTOR_SCALE; > -+ > -+ return EFI_SUCCESS; > - } > - > - /** > -@@ -972,10 +983,17 @@ Ip6InitDADProcess ( > - IP6_SERVICE *IpSb; > - EFI_STATUS Status; > - UINT32 MaxDelayTick; > -+ UINT32 Random; > - > - NET_CHECK_SIGNATURE (IpIf, IP6_INTERFACE_SIGNATURE); > - ASSERT (AddressInfo != NULL); > - > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - // > - // Do nothing if we have already started DAD on the address. > - // > -@@ -1014,7 +1032,7 @@ Ip6InitDADProcess ( > - Entry->Transmit = 0; > - Entry->Receive = 0; > - MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS; > -- Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5; > -+ Entry->RetransTick = (MaxDelayTick * ((Random % 5) + 1)) / 5; > - Entry->AddressInfo = AddressInfo; > - Entry->Callback = Callback; > - Entry->Context = Context; > -@@ -2078,7 +2096,10 @@ Ip6ProcessRouterAdvertise ( > - // in BaseReachableTime and recompute a ReachableTime. > - // > - IpSb->BaseReachableTime = ReachableTime; > -- Ip6UpdateReachableTime (IpSb); > -+ Status = Ip6UpdateReachableTime (IpSb); > -+ if (EFI_ERROR (Status)) { > -+ goto Exit; > -+ } > - } > - > - if (RetransTimer != 0) { > -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.h b/NetworkPkg/Ip6Dxe/Ip6Nd.h > -index bf64e9114e..5795e23c7d 100644 > ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.h > -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.h > -@@ -2,7 +2,7 @@ > - Definition of Neighbor Discovery support routines. > - > - Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -780,10 +780,10 @@ Ip6OnArpResolved ( > - /** > - Update the ReachableTime in IP6 service binding instance data, in milliseconds. > - > -- @param[in, out] IpSb Points to the IP6_SERVICE. > -- > -+ @retval EFI_SUCCESS ReachableTime Updated > -+ @retval others Failed to update ReachableTime > - **/ > --VOID > -+EFI_STATUS > - Ip6UpdateReachableTime ( > - IN OUT IP6_SERVICE *IpSb > - ); > -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c > -index fd4a9e15a8..01c13c08d2 100644 > ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c > -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c > -@@ -3,6 +3,7 @@ > - > - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > - (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - **/ > - > -@@ -31,6 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > - #include <Library/DevicePathLib.h> > - #include <Library/PrintLib.h> > - #include <Library/UefiLib.h> > -+#include <Protocol/Rng.h> > - > - #define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE) > - #define DEFAULT_ZERO_START ((UINTN) ~0) > -@@ -127,6 +129,25 @@ GLOBAL_REMOVE_IF_UNREFERENCED VLAN_DEVICE_PATH mNetVlanDevicePathTemplate = { > - 0 > - }; > - > -+// > -+// These represent UEFI SPEC defined algorithms that should be supported by > -+// the RNG protocol and are generally considered secure. > -+// > -+// The order of the algorithms in this array is important. This order is the order > -+// in which the algorithms will be tried by the RNG protocol. > -+// If your platform needs to use a specific algorithm for the random number generator, > -+// then you should place that algorithm first in the array. > -+// > -+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID *mSecureHashAlgorithms[] = { > -+ &gEfiRngAlgorithmSp80090Ctr256Guid, // SP800-90A DRBG CTR using AES-256 > -+ &gEfiRngAlgorithmSp80090Hmac256Guid, // SP800-90A DRBG HMAC using SHA-256 > -+ &gEfiRngAlgorithmSp80090Hash256Guid, // SP800-90A DRBG Hash using SHA-256 > -+ &gEfiRngAlgorithmArmRndr, // unspecified SP800-90A DRBG via ARM RNDR register > -+ &gEfiRngAlgorithmRaw, // Raw data from NRBG (or TRNG) > -+}; > -+ > -+#define SECURE_HASH_ALGORITHMS_SIZE (sizeof (mSecureHashAlgorithms) / sizeof (EFI_GUID *)) > -+ > - /** > - Locate the handles that support SNP, then open one of them > - to send the syslog packets. The caller isn't required to close > -@@ -884,34 +905,107 @@ Ip6Swap128 ( > - } > - > - /** > -- Initialize a random seed using current time and monotonic count. > -+ Generate a Random output data given a length. > - > -- Get current time and monotonic count first. Then initialize a random seed > -- based on some basic mathematics operation on the hour, day, minute, second, > -- nanosecond and year of the current time and the monotonic count value. > -+ @param[out] Output - The buffer to store the generated random data. > -+ @param[in] OutputLength - The length of the output buffer. > - > -- @return The random seed initialized with current time. > -+ @retval EFI_SUCCESS On Success > -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero > -+ @retval EFI_NOT_FOUND RNG protocol not found > -+ @retval Others Error from RngProtocol->GetRNG() > - > -+ @return Status code > - **/ > --UINT32 > -+EFI_STATUS > - EFIAPI > --NetRandomInitSeed ( > -- VOID > -+PseudoRandom ( > -+ OUT VOID *Output, > -+ IN UINTN OutputLength > - ) > - { > -- EFI_TIME Time; > -- UINT32 Seed; > -- UINT64 MonotonicCount; > -+ EFI_RNG_PROTOCOL *RngProtocol; > -+ EFI_STATUS Status; > -+ UINTN AlgorithmIndex; > -+ > -+ if ((Output == NULL) || (OutputLength == 0)) { > -+ return EFI_INVALID_PARAMETER; > -+ } > -+ > -+ Status = gBS->LocateProtocol (&gEfiRngProtocolGuid, NULL, (VOID **)&RngProtocol); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "Failed to locate EFI_RNG_PROTOCOL: %r\n", Status)); > -+ ASSERT_EFI_ERROR (Status); > -+ return Status; > -+ } > -+ > -+ if (PcdGetBool (PcdEnforceSecureRngAlgorithms)) { > -+ for (AlgorithmIndex = 0; AlgorithmIndex < SECURE_HASH_ALGORITHMS_SIZE; AlgorithmIndex++) { > -+ Status = RngProtocol->GetRNG (RngProtocol, mSecureHashAlgorithms[AlgorithmIndex], OutputLength, (UINT8 *)Output); > -+ if (!EFI_ERROR (Status)) { > -+ // > -+ // Secure Algorithm was supported on this platform > -+ // > -+ return EFI_SUCCESS; > -+ } else if (Status == EFI_UNSUPPORTED) { > -+ // > -+ // Secure Algorithm was not supported on this platform > -+ // > -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); > -+ > -+ // > -+ // Try the next secure algorithm > -+ // > -+ continue; > -+ } else { > -+ // > -+ // Some other error occurred > -+ // > -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); > -+ ASSERT_EFI_ERROR (Status); > -+ return Status; > -+ } > -+ } > -+ > -+ // > -+ // If we get here, we failed to generate random data using any secure algorithm > -+ // Platform owner should ensure that at least one secure algorithm is supported > -+ // > -+ ASSERT_EFI_ERROR (Status); > -+ return Status; > -+ } > -+ > -+ // > -+ // Lets try using the default algorithm (which may not be secure) > -+ // > -+ Status = RngProtocol->GetRNG (RngProtocol, NULL, OutputLength, (UINT8 *)Output); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random data: %r\n", __func__, Status)); > -+ ASSERT_EFI_ERROR (Status); > -+ return Status; > -+ } > - > -- gRT->GetTime (&Time, NULL); > -- Seed = (Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second); > -- Seed ^= Time.Nanosecond; > -- Seed ^= Time.Year << 7; > -+ return EFI_SUCCESS; > -+} > -+ > -+/** > -+ Generate a 32-bit pseudo-random number. > - > -- gBS->GetNextMonotonicCount (&MonotonicCount); > -- Seed += (UINT32)MonotonicCount; > -+ @param[out] Output - The buffer to store the generated random number. > - > -- return Seed; > -+ @retval EFI_SUCCESS On Success > -+ @retval EFI_NOT_FOUND RNG protocol not found > -+ @retval Others Error from RngProtocol->GetRNG() > -+ > -+ @return Status code > -+**/ > -+EFI_STATUS > -+EFIAPI > -+PseudoRandomU32 ( > -+ OUT UINT32 *Output > -+ ) > -+{ > -+ return PseudoRandom (Output, sizeof (*Output)); > - } > - > - /** > -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > -index 8145d256ec..a8f534a293 100644 > ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > -@@ -3,6 +3,7 @@ > - # > - # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > - # (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> > -+# Copyright (c) Microsoft Corporation > - # SPDX-License-Identifier: BSD-2-Clause-Patent > - # > - ## > -@@ -49,7 +50,11 @@ > - gEfiSmbiosTableGuid ## SOMETIMES_CONSUMES ## SystemTable > - gEfiSmbios3TableGuid ## SOMETIMES_CONSUMES ## SystemTable > - gEfiAdapterInfoMediaStateGuid ## SOMETIMES_CONSUMES > -- > -+ gEfiRngAlgorithmRaw ## CONSUMES > -+ gEfiRngAlgorithmSp80090Ctr256Guid ## CONSUMES > -+ gEfiRngAlgorithmSp80090Hmac256Guid ## CONSUMES > -+ gEfiRngAlgorithmSp80090Hash256Guid ## CONSUMES > -+ gEfiRngAlgorithmArmRndr ## CONSUMES > - > - [Protocols] > - gEfiSimpleNetworkProtocolGuid ## SOMETIMES_CONSUMES > -@@ -59,3 +64,10 @@ > - gEfiComponentNameProtocolGuid ## SOMETIMES_CONSUMES > - gEfiComponentName2ProtocolGuid ## SOMETIMES_CONSUMES > - gEfiAdapterInformationProtocolGuid ## SOMETIMES_CONSUMES > -+ gEfiRngProtocolGuid ## CONSUMES > -+ > -+[FixedPcd] > -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms ## CONSUMES > -+ > -+[Depex] > -+ gEfiRngProtocolGuid > -diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec > -index 928e84fec4..ff335e957c 100644 > ---- a/NetworkPkg/NetworkPkg.dec > -+++ b/NetworkPkg/NetworkPkg.dec > -@@ -5,6 +5,7 @@ > - # > - # Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR> > - # (C) Copyright 2015-2020 Hewlett Packard Enterprise Development LP<BR> > -+# Copyright (c) Microsoft Corporation > - # > - # SPDX-License-Identifier: BSD-2-Clause-Patent > - # > -@@ -127,6 +128,12 @@ > - # @Prompt Indicates whether SnpDxe creates event for ExitBootServices() call. > - gEfiNetworkPkgTokenSpaceGuid.PcdSnpCreateExitBootServicesEvent|TRUE|BOOLEAN|0x1000000C > - > -+ ## Enforces the use of Secure UEFI spec defined RNG algorithms for all network connections. > -+ # TRUE - Enforce the use of Secure UEFI spec defined RNG algorithms. > -+ # FALSE - Do not enforce and depend on the default implementation of RNG algorithm from the provider. > -+ # @Prompt Enforce the use of Secure UEFI spec defined RNG algorithms. > -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms|TRUE|BOOLEAN|0x1000000D > -+ > - [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] > - ## IPv6 DHCP Unique Identifier (DUID) Type configuration (From RFCs 3315 and 6355). > - # 01 = DUID Based on Link-layer Address Plus Time [DUID-LLT] > -diff --git a/NetworkPkg/SecurityFixes.yaml b/NetworkPkg/SecurityFixes.yaml > -index 7e900483fe..2b2c794697 100644 > ---- a/NetworkPkg/SecurityFixes.yaml > -+++ b/NetworkPkg/SecurityFixes.yaml > -@@ -121,3 +121,42 @@ CVE_2023_45235: > - - http://www.openwall.com/lists/oss-security/2024/01/16/2 > - - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html > - - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html > -+CVE_2023_45237: > -+ commit_titles: > -+ - "NetworkPkg:: SECURITY PATCH CVE 2023-45237" > -+ cve: CVE-2023-45237 > -+ date_reported: 2023-08-28 13:56 UTC > -+ description: "Bug 09 - Use of a Weak PseudoRandom Number Generator" > -+ note: > -+ files_impacted: > -+ - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > -+ - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > -+ - NetworkPkg/DnsDxe/DnsDhcp.c > -+ - NetworkPkg/DnsDxe/DnsImpl.c > -+ - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > -+ - NetworkPkg/IScsiDxe/IScsiCHAP.c > -+ - NetworkPkg/IScsiDxe/IScsiMisc.c > -+ - NetworkPkg/IScsiDxe/IScsiMisc.h > -+ - NetworkPkg/Include/Library/NetLib.h > -+ - NetworkPkg/Ip4Dxe/Ip4Driver.c > -+ - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > -+ - NetworkPkg/Ip6Dxe/Ip6Driver.c > -+ - NetworkPkg/Ip6Dxe/Ip6If.c > -+ - NetworkPkg/Ip6Dxe/Ip6Mld.c > -+ - NetworkPkg/Ip6Dxe/Ip6Nd.c > -+ - NetworkPkg/Ip6Dxe/Ip6Nd.h > -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.c > -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > -+ - NetworkPkg/NetworkPkg.dec > -+ - NetworkPkg/TcpDxe/TcpDriver.c > -+ - NetworkPkg/Udp4Dxe/Udp4Driver.c > -+ - NetworkPkg/Udp6Dxe/Udp6Driver.c > -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > -+ links: > -+ - https://bugzilla.tianocore.org/show_bug.cgi?id=4542 > -+ - https://nvd.nist.gov/vuln/detail/CVE-2023-45237 > -+ - http://www.openwall.com/lists/oss-security/2024/01/16/2 > -+ - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html > -+ - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html > -diff --git a/NetworkPkg/TcpDxe/TcpDriver.c b/NetworkPkg/TcpDxe/TcpDriver.c > -index 98a90e0210..8fe6badd68 100644 > ---- a/NetworkPkg/TcpDxe/TcpDriver.c > -+++ b/NetworkPkg/TcpDxe/TcpDriver.c > -@@ -2,7 +2,7 @@ > - The driver binding and service binding protocol for the TCP driver. > - > - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -163,7 +163,13 @@ TcpDriverEntryPoint ( > - ) > - { > - EFI_STATUS Status; > -- UINT32 Seed; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a Failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - // > - // Install the TCP Driver Binding Protocol > -@@ -203,9 +209,8 @@ TcpDriverEntryPoint ( > - // > - // Initialize ISS and random port. > - // > -- Seed = NetRandomInitSeed (); > -- mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; > -- mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (NET_RANDOM (Seed) % TCP_PORT_KNOWN)); > -+ mTcpGlobalIss = Random % mTcpGlobalIss; > -+ mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (Random % TCP_PORT_KNOWN)); > - mTcp6RandomPort = mTcp4RandomPort; > - > - return EFI_SUCCESS; > -diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf > -index c0acbdca57..cf5423f4c5 100644 > ---- a/NetworkPkg/TcpDxe/TcpDxe.inf > -+++ b/NetworkPkg/TcpDxe/TcpDxe.inf > -@@ -82,5 +82,8 @@ > - gEfiTcp6ProtocolGuid ## BY_START > - gEfiTcp6ServiceBindingProtocolGuid ## BY_START > - > -+[Depex] > -+ gEfiHash2ServiceBindingProtocolGuid > -+ > - [UserExtensions.TianoCore."ExtraFiles"] > - TcpDxeExtra.uni > -diff --git a/NetworkPkg/Udp4Dxe/Udp4Driver.c b/NetworkPkg/Udp4Dxe/Udp4Driver.c > -index cb917fcfc9..c7ea16f4cd 100644 > ---- a/NetworkPkg/Udp4Dxe/Udp4Driver.c > -+++ b/NetworkPkg/Udp4Dxe/Udp4Driver.c > -@@ -1,6 +1,7 @@ > - /** @file > - > - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > -+Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -555,6 +556,13 @@ Udp4DriverEntryPoint ( > - ) > - { > - EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - // > - // Install the Udp4DriverBinding and Udp4ComponentName protocols. > -@@ -571,7 +579,7 @@ Udp4DriverEntryPoint ( > - // > - // Initialize the UDP random port. > - // > -- mUdp4RandomPort = (UINT16)(((UINT16)NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); > -+ mUdp4RandomPort = (UINT16)(((UINT16)Random) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); > - } > - > - return Status; > -diff --git a/NetworkPkg/Udp6Dxe/Udp6Driver.c b/NetworkPkg/Udp6Dxe/Udp6Driver.c > -index ae96fb9966..edb758d57c 100644 > ---- a/NetworkPkg/Udp6Dxe/Udp6Driver.c > -+++ b/NetworkPkg/Udp6Dxe/Udp6Driver.c > -@@ -2,7 +2,7 @@ > - Driver Binding functions and Service Binding functions for the Network driver module. > - > - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -596,6 +596,13 @@ Udp6DriverEntryPoint ( > - ) > - { > - EFI_STATUS Status; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > - > - // > - // Install the Udp6DriverBinding and Udp6ComponentName protocols. > -@@ -614,7 +621,7 @@ Udp6DriverEntryPoint ( > - // Initialize the UDP random port. > - // > - mUdp6RandomPort = (UINT16)( > -- ((UINT16)NetRandomInitSeed ()) % > -+ ((UINT16)Random) % > - UDP6_PORT_KNOWN + > - UDP6_PORT_KNOWN > - ); > -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > -index 91146b78cb..452038c219 100644 > ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > -@@ -2,7 +2,7 @@ > - Functions implementation related with DHCPv4 for UefiPxeBc Driver. > - > - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > -- > -+ Copyright (c) Microsoft Corporation > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - **/ > -@@ -1381,6 +1381,12 @@ PxeBcDhcp4Discover ( > - UINT8 VendorOptLen; > - UINT32 Xid; > - > -+ Status = PseudoRandomU32 (&Xid); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - Mode = Private->PxeBc.Mode; > - Dhcp4 = Private->Dhcp4; > - Status = EFI_SUCCESS; > -@@ -1471,7 +1477,6 @@ PxeBcDhcp4Discover ( > - // > - // Set fields of the token for the request packet. > - // > -- Xid = NET_RANDOM (NetRandomInitSeed ()); > - Token.Packet->Dhcp4.Header.Xid = HTONL (Xid); > - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)((IsBCast) ? 0x8000 : 0x0)); > - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); > -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > -index 7fd1281c11..bcabbd2219 100644 > ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > -@@ -2180,7 +2180,7 @@ PxeBcDhcp6Discover ( > - UINTN ReadSize; > - UINT16 OpCode; > - UINT16 OpLen; > -- UINT32 Xid; > -+ UINT32 Random; > - EFI_STATUS Status; > - UINTN DiscoverLenNeeded; > - > -@@ -2198,6 +2198,12 @@ PxeBcDhcp6Discover ( > - return EFI_DEVICE_ERROR; > - } > - > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > -+ return Status; > -+ } > -+ > - DiscoverLenNeeded = sizeof (EFI_PXE_BASE_CODE_DHCPV6_PACKET); > - Discover = AllocateZeroPool (DiscoverLenNeeded); > - if (Discover == NULL) { > -@@ -2207,8 +2213,7 @@ PxeBcDhcp6Discover ( > - // > - // Build the discover packet by the cached request packet before. > - // > -- Xid = NET_RANDOM (NetRandomInitSeed ()); > -- Discover->TransactionId = HTONL (Xid); > -+ Discover->TransactionId = HTONL (Random); > - Discover->MessageType = Request->Dhcp6.Header.MessageType; > - RequestOpt = Request->Dhcp6.Option; > - DiscoverOpt = Discover->DhcpOptions; > -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > -index d84aca7e85..4cd915b411 100644 > ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > -@@ -3,6 +3,7 @@ > - > - (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> > - Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR> > -+ Copyright (c) Microsoft Corporation > - > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > -@@ -892,6 +893,13 @@ PxeBcCreateIp6Children ( > - PXEBC_PRIVATE_PROTOCOL *Id; > - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; > - UINTN Index; > -+ UINT32 Random; > -+ > -+ Status = PseudoRandomU32 (&Random); > -+ if (EFI_ERROR (Status)) { > -+ DEBUG ((DEBUG_ERROR, "Failed to generate random number using EFI_RNG_PROTOCOL: %r\n", Status)); > -+ return Status; > -+ } > - > - if (Private->Ip6Nic != NULL) { > - // > -@@ -935,9 +943,9 @@ PxeBcCreateIp6Children ( > - } > - > - // > -- // Generate a random IAID for the Dhcp6 assigned address. > -+ // Set a random IAID for the Dhcp6 assigned address. > - // > -- Private->IaId = NET_RANDOM (NetRandomInitSeed ()); > -+ Private->IaId = Random; > - if (Private->Snp != NULL) { > - for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) { > - Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31)); > --- > -2.40.0 > - > diff --git a/meta/recipes-core/ovmf/ovmf_git.bb b/meta/recipes-core/ovmf/ovmf_git.bb > index d52e3f4971..bb345688ac 100644 > --- a/meta/recipes-core/ovmf/ovmf_git.bb > +++ b/meta/recipes-core/ovmf/ovmf_git.bb > @@ -47,8 +47,6 @@ SRC_URI = "gitsm://github.com/tianocore/edk2.git;branch=master;protocol=https \ > file://CVE-2023-45229-0002.patch \ > file://CVE-2023-45229-0003.patch \ > file://CVE-2023-45229-0004.patch \ > - file://CVE-2023-45237-0001.patch \ > - file://CVE-2023-45237-0002.patch \ > file://CVE-2023-45236.patch \ > file://CVE-2022-36765-0001.patch \ > file://CVE-2022-36765-0002.patch \ > -- > 2.34.1 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#211699): https://lists.openembedded.org/g/openembedded-core/message/211699 > Mute This Topic: https://lists.openembedded.org/mt/111267276/3620601 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [steve@sakoman.com] > -=-=-=-=-=-=-=-=-=-=-=- >
On 2/19/25 23:19, Steve Sakoman wrote: > Hi Kai, > > Not sure why, but this fails to apply for me: > > Applying: Revert "ovmf: Fix CVE-2023-45237" > Using index info to reconstruct a base tree... > error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch:1 > error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch: patch > does not apply > error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch:1 > error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch: patch > does not apply > error: Did you hand edit your patch? > It does not apply to blobs recorded in its index. > Patch failed at 0001 Revert "ovmf: Fix CVE-2023-45237" Hi Steve, How about try option `--keep-cr` with git am as I mentioned in the patch file? Regards, Kai > > Steve > > On Wed, Feb 19, 2025 at 2:22 AM Kai Kang via lists.openembedded.org > <kai.kang=windriver.com@lists.openembedded.org> wrote: >> From: Kai Kang <kai.kang@windriver.com> >> >> This reverts commit 4c2d3e37308cac98614dfafed79b7323423af8bc. >> >> The fix for CVE-2023-45237 causes ovmf firmware not support pxe boot >> any more and no boot item in OVMF menu such as >> >> UEFI PXEv4 (MAC address) >> >> It has not been fixed by ovmf upstream and an issue has been created on >> >> https://github.com/tianocore/tianocore.github.io/issues/82 >> >> Revert the fixes for now. >> >> Signed-off-by: Kai Kang <kai.kang@windriver.com> >> --- >> >> Please add option `--keep-cr` when invoke `git am`. >> >> .../ovmf/ovmf/CVE-2023-45237-0001.patch | 78 - >> .../ovmf/ovmf/CVE-2023-45237-0002.patch | 1288 ----------------- >> meta/recipes-core/ovmf/ovmf_git.bb | 2 - >> 3 files changed, 1368 deletions(-) >> delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch >> delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch >> >> diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch >> deleted file mode 100644 >> index d1dcb8dc44..0000000000 >> --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch >> +++ /dev/null >> @@ -1,78 +0,0 @@ >> -From cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c Mon Sep 17 00:00:00 2001 >> -From: Pierre Gondois <pierre.gondois@arm.com> >> -Date: Fri, 11 Aug 2023 16:33:06 +0200 >> -Subject: [PATCH] MdePkg/Rng: Add GUID to describe Arm Rndr Rng algorithms >> - >> -BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4441 >> - >> -The EFI_RNG_PROTOCOL can rely on the RngLib. The RngLib has multiple >> -implementations, some of them are unsafe (e.g. BaseRngLibTimerLib). >> -To allow the RngDxe to detect when such implementation is used, >> -a GetRngGuid() function is added in a following patch. >> - >> -Prepare GetRngGuid() return values and add a gEfiRngAlgorithmArmRndr >> -to describe a Rng algorithm accessed through Arm's RNDR instruction. >> -[1] states that the implementation of this algorithm should be >> -compliant to NIST SP900-80. The compliance is not guaranteed. >> - >> -[1] Arm Architecture Reference Manual Armv8, for A-profile architecture >> -sK12.1 'Properties of the generated random number' >> - >> -Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> >> -Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> >> -Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> >> -Acked-by: Ard Biesheuvel <ardb@kernel.org> >> -Tested-by: Kun Qin <kun.qin@microsoft.com> >> - >> -CVE: CVE-2023-45237 >> - >> -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c] >> - >> -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> >> ---- >> - MdePkg/Include/Protocol/Rng.h | 10 ++++++++++ >> - MdePkg/MdePkg.dec | 1 + >> - 2 files changed, 11 insertions(+) >> - >> -diff --git a/MdePkg/Include/Protocol/Rng.h b/MdePkg/Include/Protocol/Rng.h >> -index baf425587b..38bde53240 100644 >> ---- a/MdePkg/Include/Protocol/Rng.h >> -+++ b/MdePkg/Include/Protocol/Rng.h >> -@@ -67,6 +67,15 @@ typedef EFI_GUID EFI_RNG_ALGORITHM; >> - { \ >> - 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 } \ >> - } >> -+/// >> -+/// The Arm Architecture states the RNDR that the DRBG algorithm should be compliant >> -+/// with NIST SP800-90A, while not mandating a particular algorithm, so as to be >> -+/// inclusive of different geographies. >> -+/// >> -+#define EFI_RNG_ALGORITHM_ARM_RNDR \ >> -+ { \ >> -+ 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41} \ >> -+ } >> - >> - /** >> - Returns information about the random number generation implementation. >> -@@ -146,5 +155,6 @@ extern EFI_GUID gEfiRngAlgorithmSp80090Ctr256Guid; >> - extern EFI_GUID gEfiRngAlgorithmX9313DesGuid; >> - extern EFI_GUID gEfiRngAlgorithmX931AesGuid; >> - extern EFI_GUID gEfiRngAlgorithmRaw; >> -+extern EFI_GUID gEfiRngAlgorithmArmRndr; >> - >> - #endif >> -diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec >> -index 59b405928b..a449dbc556 100644 >> ---- a/MdePkg/MdePkg.dec >> -+++ b/MdePkg/MdePkg.dec >> -@@ -594,6 +594,7 @@ >> - gEfiRngAlgorithmX9313DesGuid = { 0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46 }} >> - gEfiRngAlgorithmX931AesGuid = { 0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9 }} >> - gEfiRngAlgorithmRaw = { 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 }} >> -+ gEfiRngAlgorithmArmRndr = { 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41 }} >> - >> - ## Include/Protocol/AdapterInformation.h >> - gEfiAdapterInfoMediaStateGuid = { 0xD7C74207, 0xA831, 0x4A26, {0xB1, 0xF5, 0xD1, 0x93, 0x06, 0x5C, 0xE8, 0xB6 }} >> --- >> -2.40.0 >> - >> diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch >> deleted file mode 100644 >> index 722a6cd530..0000000000 >> --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch >> +++ /dev/null >> @@ -1,1288 +0,0 @@ >> -From 4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345 Mon Sep 17 00:00:00 2001 >> -From: Doug Flick <dougflick@microsoft.com> >> -Date: Wed, 8 May 2024 22:56:28 -0700 >> -Subject: [PATCH] NetworkPkg: SECURITY PATCH CVE-2023-45237 >> - >> -REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4542 >> - >> -Bug Overview: >> -PixieFail Bug #9 >> -CVE-2023-45237 >> -CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N >> -CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) >> - >> -Use of a Weak PseudoRandom Number Generator >> - >> -Change Overview: >> - >> -Updates all Instances of NET_RANDOM (NetRandomInitSeed ()) to either >> - >> -> >> -> EFI_STATUS >> -> EFIAPI >> -> PseudoRandomU32 ( >> -> OUT UINT32 *Output >> -> ); >> -> >> - >> -or (depending on the use case) >> - >> -> >> -> EFI_STATUS >> -> EFIAPI >> -> PseudoRandom ( >> -> OUT VOID *Output, >> -> IN UINTN OutputLength >> -> ); >> -> >> - >> -This is because the use of >> - >> -Example: >> - >> -The following code snippet PseudoRandomU32 () function is used: >> - >> -> >> -> UINT32 Random; >> -> >> -> Status = PseudoRandomU32 (&Random); >> -> if (EFI_ERROR (Status)) { >> -> DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", >> -__func__, Status)); >> -> return Status; >> -> } >> -> >> - >> -This also introduces a new PCD to enable/disable the use of the >> -secure implementation of algorithms for PseudoRandom () and >> -instead depend on the default implementation. This may be required for >> -some platforms where the UEFI Spec defined algorithms are not available. >> - >> -> >> -> PcdEnforceSecureRngAlgorithms >> -> >> - >> -If the platform does not have any one of the UEFI defined >> -secure RNG algorithms then the driver will assert. >> - >> -Cc: Saloni Kasbekar <saloni.kasbekar@intel.com> >> -Cc: Zachary Clark-williams <zachary.clark-williams@intel.com> >> - >> -Signed-off-by: Doug Flick [MSFT] <doug.edk2@gmail.com> >> -Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com> >> - >> -CVE: CVE-2023-45237 >> - >> -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345] >> - >> -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> >> ---- >> - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c | 10 +- >> - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c | 11 +- >> - NetworkPkg/DnsDxe/DnsDhcp.c | 10 +- >> - NetworkPkg/DnsDxe/DnsImpl.c | 11 +- >> - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c | 10 +- >> - NetworkPkg/IScsiDxe/IScsiCHAP.c | 19 ++- >> - NetworkPkg/IScsiDxe/IScsiMisc.c | 14 +-- >> - NetworkPkg/IScsiDxe/IScsiMisc.h | 6 +- >> - NetworkPkg/Include/Library/NetLib.h | 40 +++++-- >> - NetworkPkg/Ip4Dxe/Ip4Driver.c | 10 +- >> - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c | 9 +- >> - NetworkPkg/Ip6Dxe/Ip6Driver.c | 17 ++- >> - NetworkPkg/Ip6Dxe/Ip6If.c | 12 +- >> - NetworkPkg/Ip6Dxe/Ip6Mld.c | 12 +- >> - NetworkPkg/Ip6Dxe/Ip6Nd.c | 33 +++++- >> - NetworkPkg/Ip6Dxe/Ip6Nd.h | 8 +- >> - NetworkPkg/Library/DxeNetLib/DxeNetLib.c | 130 ++++++++++++++++++--- >> - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf | 14 ++- >> - NetworkPkg/NetworkPkg.dec | 7 ++ >> - NetworkPkg/SecurityFixes.yaml | 39 +++++++ >> - NetworkPkg/TcpDxe/TcpDriver.c | 15 ++- >> - NetworkPkg/TcpDxe/TcpDxe.inf | 3 + >> - NetworkPkg/Udp4Dxe/Udp4Driver.c | 10 +- >> - NetworkPkg/Udp6Dxe/Udp6Driver.c | 11 +- >> - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c | 9 +- >> - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c | 11 +- >> - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c | 12 +- >> - 27 files changed, 410 insertions(+), 83 deletions(-) >> - >> -diff --git a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >> -index 8c37e93be3..892caee368 100644 >> ---- a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >> -+++ b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >> -@@ -1,6 +1,7 @@ >> - /** @file >> - >> - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -189,6 +190,13 @@ Dhcp4CreateService ( >> - { >> - DHCP_SERVICE *DhcpSb; >> - EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - *Service = NULL; >> - DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE)); >> -@@ -203,7 +211,7 @@ Dhcp4CreateService ( >> - DhcpSb->Image = ImageHandle; >> - InitializeListHead (&DhcpSb->Children); >> - DhcpSb->DhcpState = Dhcp4Stopped; >> -- DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ()); >> -+ DhcpSb->Xid = Random; >> - CopyMem ( >> - &DhcpSb->ServiceBinding, >> - &mDhcp4ServiceBindingTemplate, >> -diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >> -index b591a4605b..e7f2787a98 100644 >> ---- a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >> -+++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >> -@@ -3,7 +3,7 @@ >> - implementation for Dhcp6 Driver. >> - >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -123,6 +123,13 @@ Dhcp6CreateService ( >> - { >> - DHCP6_SERVICE *Dhcp6Srv; >> - EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - *Service = NULL; >> - Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE)); >> -@@ -147,7 +154,7 @@ Dhcp6CreateService ( >> - Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE; >> - Dhcp6Srv->Controller = Controller; >> - Dhcp6Srv->Image = ImageHandle; >> -- Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ())); >> -+ Dhcp6Srv->Xid = (0xffffff & Random); >> - >> - CopyMem ( >> - &Dhcp6Srv->ServiceBinding, >> -diff --git a/NetworkPkg/DnsDxe/DnsDhcp.c b/NetworkPkg/DnsDxe/DnsDhcp.c >> -index 933565a32d..9eb3c1d2d8 100644 >> ---- a/NetworkPkg/DnsDxe/DnsDhcp.c >> -+++ b/NetworkPkg/DnsDxe/DnsDhcp.c >> -@@ -2,6 +2,7 @@ >> - Functions implementation related with DHCPv4/v6 for DNS driver. >> - >> - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -277,6 +278,7 @@ GetDns4ServerFromDhcp4 ( >> - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; >> - BOOLEAN IsDone; >> - UINTN Index; >> -+ UINT32 Random; >> - >> - Image = Instance->Service->ImageHandle; >> - Controller = Instance->Service->ControllerHandle; >> -@@ -292,6 +294,12 @@ GetDns4ServerFromDhcp4 ( >> - Data = NULL; >> - InterfaceInfo = NULL; >> - >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - ZeroMem ((UINT8 *)ParaList, sizeof (ParaList)); >> - >> - ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA)); >> -@@ -467,7 +475,7 @@ GetDns4ServerFromDhcp4 ( >> - >> - Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet); >> - >> -- Token.Packet->Dhcp4.Header.Xid = HTONL (NET_RANDOM (NetRandomInitSeed ())); >> -+ Token.Packet->Dhcp4.Header.Xid = Random; >> - >> - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000); >> - >> -diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c >> -index d311812800..c2629bb8df 100644 >> ---- a/NetworkPkg/DnsDxe/DnsImpl.c >> -+++ b/NetworkPkg/DnsDxe/DnsImpl.c >> -@@ -2,6 +2,7 @@ >> - DnsDxe support functions implementation. >> - >> - Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -1963,6 +1964,14 @@ ConstructDNSQuery ( >> - NET_FRAGMENT Frag; >> - DNS_HEADER *DnsHeader; >> - DNS_QUERY_SECTION *DnsQuery; >> -+ EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - // >> - // Messages carried by UDP are restricted to 512 bytes (not counting the IP >> -@@ -1977,7 +1986,7 @@ ConstructDNSQuery ( >> - // Fill header >> - // >> - DnsHeader = (DNS_HEADER *)Frag.Bulk; >> -- DnsHeader->Identification = (UINT16)NET_RANDOM (NetRandomInitSeed ()); >> -+ DnsHeader->Identification = (UINT16)Random; >> - DnsHeader->Flags.Uint16 = 0x0000; >> - DnsHeader->Flags.Bits.RD = 1; >> - DnsHeader->Flags.Bits.OpCode = DNS_FLAGS_OPCODE_STANDARD; >> -diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >> -index b22cef4ff5..f964515b0f 100644 >> ---- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >> -+++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >> -@@ -2,6 +2,7 @@ >> - Functions implementation related with DHCPv6 for HTTP boot driver. >> - >> - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -951,6 +952,7 @@ HttpBootDhcp6Sarr ( >> - UINT32 OptCount; >> - UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE]; >> - EFI_STATUS Status; >> -+ UINT32 Random; >> - >> - Dhcp6 = Private->Dhcp6; >> - ASSERT (Dhcp6 != NULL); >> -@@ -961,6 +963,12 @@ HttpBootDhcp6Sarr ( >> - OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer); >> - ASSERT (OptCount > 0); >> - >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION)); >> - if (Retransmit == NULL) { >> - return EFI_OUT_OF_RESOURCES; >> -@@ -976,7 +984,7 @@ HttpBootDhcp6Sarr ( >> - Config.IaInfoEvent = NULL; >> - Config.RapidCommit = FALSE; >> - Config.ReconfigureAccept = FALSE; >> -- Config.IaDescriptor.IaId = NET_RANDOM (NetRandomInitSeed ()); >> -+ Config.IaDescriptor.IaId = Random; >> - Config.IaDescriptor.Type = EFI_DHCP6_IA_TYPE_NA; >> - Config.SolicitRetransmission = Retransmit; >> - Retransmit->Irt = 4; >> -diff --git a/NetworkPkg/IScsiDxe/IScsiCHAP.c b/NetworkPkg/IScsiDxe/IScsiCHAP.c >> -index b507f11cd4..bebb1ac29b 100644 >> ---- a/NetworkPkg/IScsiDxe/IScsiCHAP.c >> -+++ b/NetworkPkg/IScsiDxe/IScsiCHAP.c >> -@@ -3,6 +3,7 @@ >> - Configuration. >> - >> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -576,16 +577,24 @@ IScsiCHAPToSendReq ( >> - // >> - // CHAP_I=<I> >> - // >> -- IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); >> -+ Status = IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); >> -+ if (EFI_ERROR (Status)) { >> -+ break; >> -+ } >> -+ >> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); >> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); >> - // >> - // CHAP_C=<C> >> - // >> -- IScsiGenRandom ( >> -- (UINT8 *)AuthData->OutChallenge, >> -- AuthData->Hash->DigestSize >> -- ); >> -+ Status = IScsiGenRandom ( >> -+ (UINT8 *)AuthData->OutChallenge, >> -+ AuthData->Hash->DigestSize >> -+ ); >> -+ if (EFI_ERROR (Status)) { >> -+ break; >> -+ } >> -+ >> - BinToHexStatus = IScsiBinToHex ( >> - (UINT8 *)AuthData->OutChallenge, >> - AuthData->Hash->DigestSize, >> -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c >> -index b3ea90158f..cd77f1a13e 100644 >> ---- a/NetworkPkg/IScsiDxe/IScsiMisc.c >> -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c >> -@@ -2,6 +2,7 @@ >> - Miscellaneous routines for iSCSI driver. >> - >> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -474,20 +475,17 @@ IScsiNetNtoi ( >> - @param[in, out] Rand The buffer to contain random numbers. >> - @param[in] RandLength The length of the Rand buffer. >> - >> -+ @retval EFI_SUCCESS on success >> -+ @retval others on error >> -+ >> - **/ >> --VOID >> -+EFI_STATUS >> - IScsiGenRandom ( >> - IN OUT UINT8 *Rand, >> - IN UINTN RandLength >> - ) >> - { >> -- UINT32 Random; >> -- >> -- while (RandLength > 0) { >> -- Random = NET_RANDOM (NetRandomInitSeed ()); >> -- *Rand++ = (UINT8)(Random); >> -- RandLength--; >> -- } >> -+ return PseudoRandom (Rand, RandLength); >> - } >> - >> - /** >> -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h >> -index a951eee70e..91b2cd2261 100644 >> ---- a/NetworkPkg/IScsiDxe/IScsiMisc.h >> -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h >> -@@ -2,6 +2,7 @@ >> - Miscellaneous definitions for iSCSI driver. >> - >> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -202,8 +203,11 @@ IScsiNetNtoi ( >> - @param[in, out] Rand The buffer to contain random numbers. >> - @param[in] RandLength The length of the Rand buffer. >> - >> -+ @retval EFI_SUCCESS on success >> -+ @retval others on error >> -+ >> - **/ >> --VOID >> -+EFI_STATUS >> - IScsiGenRandom ( >> - IN OUT UINT8 *Rand, >> - IN UINTN RandLength >> -diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h >> -index 8c0e62b388..e8108b79db 100644 >> ---- a/NetworkPkg/Include/Library/NetLib.h >> -+++ b/NetworkPkg/Include/Library/NetLib.h >> -@@ -3,6 +3,7 @@ >> - It provides basic functions for the UEFI network stack. >> - >> - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -539,8 +540,6 @@ extern EFI_IPv4_ADDRESS mZeroIp4Addr; >> - #define TICKS_PER_MS 10000U >> - #define TICKS_PER_SECOND 10000000U >> - >> --#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL) >> -- >> - /** >> - Extract a UINT32 from a byte stream. >> - >> -@@ -580,19 +579,40 @@ NetPutUint32 ( >> - ); >> - >> - /** >> -- Initialize a random seed using current time and monotonic count. >> -+ Generate a Random output data given a length. >> - >> -- Get current time and monotonic count first. Then initialize a random seed >> -- based on some basic mathematics operation on the hour, day, minute, second, >> -- nanosecond and year of the current time and the monotonic count value. >> -+ @param[out] Output - The buffer to store the generated random data. >> -+ @param[in] OutputLength - The length of the output buffer. >> - >> -- @return The random seed initialized with current time. >> -+ @retval EFI_SUCCESS On Success >> -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero >> -+ @retval EFI_NOT_FOUND RNG protocol not found >> -+ @retval Others Error from RngProtocol->GetRNG() >> - >> -+ @return Status code >> - **/ >> --UINT32 >> -+EFI_STATUS >> - EFIAPI >> --NetRandomInitSeed ( >> -- VOID >> -+PseudoRandom ( >> -+ OUT VOID *Output, >> -+ IN UINTN OutputLength >> -+ ); >> -+ >> -+/** >> -+ Generate a 32-bit pseudo-random number. >> -+ >> -+ @param[out] Output - The buffer to store the generated random number. >> -+ >> -+ @retval EFI_SUCCESS On Success >> -+ @retval EFI_NOT_FOUND RNG protocol not found >> -+ @retval Others Error from RngProtocol->GetRNG() >> -+ >> -+ @return Status code >> -+**/ >> -+EFI_STATUS >> -+EFIAPI >> -+PseudoRandomU32 ( >> -+ OUT UINT32 *Output >> - ); >> - >> - #define NET_LIST_USER_STRUCT(Entry, Type, Field) \ >> -diff --git a/NetworkPkg/Ip4Dxe/Ip4Driver.c b/NetworkPkg/Ip4Dxe/Ip4Driver.c >> -index ec483ff01f..683423f38d 100644 >> ---- a/NetworkPkg/Ip4Dxe/Ip4Driver.c >> -+++ b/NetworkPkg/Ip4Dxe/Ip4Driver.c >> -@@ -2,6 +2,7 @@ >> - The driver binding and service binding protocol for IP4 driver. >> - >> - Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> >> - >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> -@@ -549,11 +550,18 @@ Ip4DriverBindingStart ( >> - EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; >> - UINTN Index; >> - IP4_CONFIG2_DATA_ITEM *DataItem; >> -+ UINT32 Random; >> - >> - IpSb = NULL; >> - Ip4Cfg2 = NULL; >> - DataItem = NULL; >> - >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - // >> - // Test for the Ip4 service binding protocol >> - // >> -@@ -653,7 +661,7 @@ Ip4DriverBindingStart ( >> - // >> - // Initialize the IP4 ID >> - // >> -- mIp4Id = (UINT16)NET_RANDOM (NetRandomInitSeed ()); >> -+ mIp4Id = (UINT16)Random; >> - >> - return Status; >> - >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >> -index 70e232ce6c..4c1354d26c 100644 >> ---- a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >> -+++ b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >> -@@ -2276,6 +2276,13 @@ Ip6ConfigInitInstance ( >> - UINTN Index; >> - UINT16 IfIndex; >> - IP6_CONFIG_DATA_ITEM *DataItem; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance); >> - >> -@@ -2381,7 +2388,7 @@ Ip6ConfigInitInstance ( >> - // The NV variable is not set, so generate a random IAID, and write down the >> - // fresh new configuration as the NV variable now. >> - // >> -- Instance->IaId = NET_RANDOM (NetRandomInitSeed ()); >> -+ Instance->IaId = Random; >> - >> - for (Index = 0; Index < IpSb->SnpMode.HwAddressSize; Index++) { >> - Instance->IaId |= (IpSb->SnpMode.CurrentAddress.Addr[Index] << ((Index << 3) & 31)); >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c >> -index b483a7d136..cbe011dad4 100644 >> ---- a/NetworkPkg/Ip6Dxe/Ip6Driver.c >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c >> -@@ -3,7 +3,7 @@ >> - >> - Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR> >> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -316,7 +316,11 @@ Ip6CreateService ( >> - IpSb->CurHopLimit = IP6_HOP_LIMIT; >> - IpSb->LinkMTU = IP6_MIN_LINK_MTU; >> - IpSb->BaseReachableTime = IP6_REACHABLE_TIME; >> -- Ip6UpdateReachableTime (IpSb); >> -+ Status = Ip6UpdateReachableTime (IpSb); >> -+ if (EFI_ERROR (Status)) { >> -+ goto ON_ERROR; >> -+ } >> -+ >> - // >> - // RFC4861 RETRANS_TIMER: 1,000 milliseconds >> - // >> -@@ -516,11 +520,18 @@ Ip6DriverBindingStart ( >> - EFI_STATUS Status; >> - EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; >> - IP6_CONFIG_DATA_ITEM *DataItem; >> -+ UINT32 Random; >> - >> - IpSb = NULL; >> - Ip6Cfg = NULL; >> - DataItem = NULL; >> - >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - // >> - // Test for the Ip6 service binding protocol >> - // >> -@@ -656,7 +667,7 @@ Ip6DriverBindingStart ( >> - // >> - // Initialize the IP6 ID >> - // >> -- mIp6Id = NET_RANDOM (NetRandomInitSeed ()); >> -+ mIp6Id = Random; >> - >> - return EFI_SUCCESS; >> - >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6If.c b/NetworkPkg/Ip6Dxe/Ip6If.c >> -index 4629c05f25..f3d11c4d21 100644 >> ---- a/NetworkPkg/Ip6Dxe/Ip6If.c >> -+++ b/NetworkPkg/Ip6Dxe/Ip6If.c >> -@@ -2,7 +2,7 @@ >> - Implement IP6 pseudo interface. >> - >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -89,6 +89,14 @@ Ip6SetAddress ( >> - IP6_PREFIX_LIST_ENTRY *PrefixEntry; >> - UINT64 Delay; >> - IP6_DELAY_JOIN_LIST *DelayNode; >> -+ EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - NET_CHECK_SIGNATURE (Interface, IP6_INTERFACE_SIGNATURE); >> - >> -@@ -164,7 +172,7 @@ Ip6SetAddress ( >> - // Thus queue the address to be processed in Duplicate Address Detection module >> - // after the delay time (in milliseconds). >> - // >> -- Delay = (UINT64)NET_RANDOM (NetRandomInitSeed ()); >> -+ Delay = (UINT64)Random; >> - Delay = MultU64x32 (Delay, IP6_ONE_SECOND_IN_MS); >> - Delay = RShiftU64 (Delay, 32); >> - >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Mld.c b/NetworkPkg/Ip6Dxe/Ip6Mld.c >> -index e6b2b653e2..498a118543 100644 >> ---- a/NetworkPkg/Ip6Dxe/Ip6Mld.c >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Mld.c >> -@@ -696,7 +696,15 @@ Ip6UpdateDelayTimer ( >> - IN OUT IP6_MLD_GROUP *Group >> - ) >> - { >> -- UINT32 Delay; >> -+ UINT32 Delay; >> -+ EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - // >> - // If the Query packet specifies a Maximum Response Delay of zero, perform timer >> -@@ -715,7 +723,7 @@ Ip6UpdateDelayTimer ( >> - // is less than the remaining value of the running timer. >> - // >> - if ((Group->DelayTimer == 0) || (Delay < Group->DelayTimer)) { >> -- Group->DelayTimer = Delay / 4294967295UL * NET_RANDOM (NetRandomInitSeed ()); >> -+ Group->DelayTimer = Delay / 4294967295UL * Random; >> - } >> - >> - return EFI_SUCCESS; >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.c b/NetworkPkg/Ip6Dxe/Ip6Nd.c >> -index c10c7017f8..72aa45c10f 100644 >> ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.c >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.c >> -@@ -2,7 +2,7 @@ >> - Implementation of Neighbor Discovery support routines. >> - >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -16,17 +16,28 @@ EFI_MAC_ADDRESS mZeroMacAddress; >> - >> - @param[in, out] IpSb Points to the IP6_SERVICE. >> - >> -+ @retval EFI_SUCCESS ReachableTime Updated >> -+ @retval others Failed to update ReachableTime >> - **/ >> --VOID >> -+EFI_STATUS >> - Ip6UpdateReachableTime ( >> - IN OUT IP6_SERVICE *IpSb >> - ) >> - { >> -- UINT32 Random; >> -+ UINT32 Random; >> -+ EFI_STATUS Status; >> - >> -- Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> -+ Random = (Random / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; >> - Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED; >> - IpSb->ReachableTime = (IpSb->BaseReachableTime * Random) / IP6_RANDOM_FACTOR_SCALE; >> -+ >> -+ return EFI_SUCCESS; >> - } >> - >> - /** >> -@@ -972,10 +983,17 @@ Ip6InitDADProcess ( >> - IP6_SERVICE *IpSb; >> - EFI_STATUS Status; >> - UINT32 MaxDelayTick; >> -+ UINT32 Random; >> - >> - NET_CHECK_SIGNATURE (IpIf, IP6_INTERFACE_SIGNATURE); >> - ASSERT (AddressInfo != NULL); >> - >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - // >> - // Do nothing if we have already started DAD on the address. >> - // >> -@@ -1014,7 +1032,7 @@ Ip6InitDADProcess ( >> - Entry->Transmit = 0; >> - Entry->Receive = 0; >> - MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS; >> -- Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5; >> -+ Entry->RetransTick = (MaxDelayTick * ((Random % 5) + 1)) / 5; >> - Entry->AddressInfo = AddressInfo; >> - Entry->Callback = Callback; >> - Entry->Context = Context; >> -@@ -2078,7 +2096,10 @@ Ip6ProcessRouterAdvertise ( >> - // in BaseReachableTime and recompute a ReachableTime. >> - // >> - IpSb->BaseReachableTime = ReachableTime; >> -- Ip6UpdateReachableTime (IpSb); >> -+ Status = Ip6UpdateReachableTime (IpSb); >> -+ if (EFI_ERROR (Status)) { >> -+ goto Exit; >> -+ } >> - } >> - >> - if (RetransTimer != 0) { >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.h b/NetworkPkg/Ip6Dxe/Ip6Nd.h >> -index bf64e9114e..5795e23c7d 100644 >> ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.h >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.h >> -@@ -2,7 +2,7 @@ >> - Definition of Neighbor Discovery support routines. >> - >> - Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -780,10 +780,10 @@ Ip6OnArpResolved ( >> - /** >> - Update the ReachableTime in IP6 service binding instance data, in milliseconds. >> - >> -- @param[in, out] IpSb Points to the IP6_SERVICE. >> -- >> -+ @retval EFI_SUCCESS ReachableTime Updated >> -+ @retval others Failed to update ReachableTime >> - **/ >> --VOID >> -+EFI_STATUS >> - Ip6UpdateReachableTime ( >> - IN OUT IP6_SERVICE *IpSb >> - ); >> -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c >> -index fd4a9e15a8..01c13c08d2 100644 >> ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c >> -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c >> -@@ -3,6 +3,7 @@ >> - >> - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> >> - (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - **/ >> - >> -@@ -31,6 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent >> - #include <Library/DevicePathLib.h> >> - #include <Library/PrintLib.h> >> - #include <Library/UefiLib.h> >> -+#include <Protocol/Rng.h> >> - >> - #define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE) >> - #define DEFAULT_ZERO_START ((UINTN) ~0) >> -@@ -127,6 +129,25 @@ GLOBAL_REMOVE_IF_UNREFERENCED VLAN_DEVICE_PATH mNetVlanDevicePathTemplate = { >> - 0 >> - }; >> - >> -+// >> -+// These represent UEFI SPEC defined algorithms that should be supported by >> -+// the RNG protocol and are generally considered secure. >> -+// >> -+// The order of the algorithms in this array is important. This order is the order >> -+// in which the algorithms will be tried by the RNG protocol. >> -+// If your platform needs to use a specific algorithm for the random number generator, >> -+// then you should place that algorithm first in the array. >> -+// >> -+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID *mSecureHashAlgorithms[] = { >> -+ &gEfiRngAlgorithmSp80090Ctr256Guid, // SP800-90A DRBG CTR using AES-256 >> -+ &gEfiRngAlgorithmSp80090Hmac256Guid, // SP800-90A DRBG HMAC using SHA-256 >> -+ &gEfiRngAlgorithmSp80090Hash256Guid, // SP800-90A DRBG Hash using SHA-256 >> -+ &gEfiRngAlgorithmArmRndr, // unspecified SP800-90A DRBG via ARM RNDR register >> -+ &gEfiRngAlgorithmRaw, // Raw data from NRBG (or TRNG) >> -+}; >> -+ >> -+#define SECURE_HASH_ALGORITHMS_SIZE (sizeof (mSecureHashAlgorithms) / sizeof (EFI_GUID *)) >> -+ >> - /** >> - Locate the handles that support SNP, then open one of them >> - to send the syslog packets. The caller isn't required to close >> -@@ -884,34 +905,107 @@ Ip6Swap128 ( >> - } >> - >> - /** >> -- Initialize a random seed using current time and monotonic count. >> -+ Generate a Random output data given a length. >> - >> -- Get current time and monotonic count first. Then initialize a random seed >> -- based on some basic mathematics operation on the hour, day, minute, second, >> -- nanosecond and year of the current time and the monotonic count value. >> -+ @param[out] Output - The buffer to store the generated random data. >> -+ @param[in] OutputLength - The length of the output buffer. >> - >> -- @return The random seed initialized with current time. >> -+ @retval EFI_SUCCESS On Success >> -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero >> -+ @retval EFI_NOT_FOUND RNG protocol not found >> -+ @retval Others Error from RngProtocol->GetRNG() >> - >> -+ @return Status code >> - **/ >> --UINT32 >> -+EFI_STATUS >> - EFIAPI >> --NetRandomInitSeed ( >> -- VOID >> -+PseudoRandom ( >> -+ OUT VOID *Output, >> -+ IN UINTN OutputLength >> - ) >> - { >> -- EFI_TIME Time; >> -- UINT32 Seed; >> -- UINT64 MonotonicCount; >> -+ EFI_RNG_PROTOCOL *RngProtocol; >> -+ EFI_STATUS Status; >> -+ UINTN AlgorithmIndex; >> -+ >> -+ if ((Output == NULL) || (OutputLength == 0)) { >> -+ return EFI_INVALID_PARAMETER; >> -+ } >> -+ >> -+ Status = gBS->LocateProtocol (&gEfiRngProtocolGuid, NULL, (VOID **)&RngProtocol); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "Failed to locate EFI_RNG_PROTOCOL: %r\n", Status)); >> -+ ASSERT_EFI_ERROR (Status); >> -+ return Status; >> -+ } >> -+ >> -+ if (PcdGetBool (PcdEnforceSecureRngAlgorithms)) { >> -+ for (AlgorithmIndex = 0; AlgorithmIndex < SECURE_HASH_ALGORITHMS_SIZE; AlgorithmIndex++) { >> -+ Status = RngProtocol->GetRNG (RngProtocol, mSecureHashAlgorithms[AlgorithmIndex], OutputLength, (UINT8 *)Output); >> -+ if (!EFI_ERROR (Status)) { >> -+ // >> -+ // Secure Algorithm was supported on this platform >> -+ // >> -+ return EFI_SUCCESS; >> -+ } else if (Status == EFI_UNSUPPORTED) { >> -+ // >> -+ // Secure Algorithm was not supported on this platform >> -+ // >> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); >> -+ >> -+ // >> -+ // Try the next secure algorithm >> -+ // >> -+ continue; >> -+ } else { >> -+ // >> -+ // Some other error occurred >> -+ // >> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); >> -+ ASSERT_EFI_ERROR (Status); >> -+ return Status; >> -+ } >> -+ } >> -+ >> -+ // >> -+ // If we get here, we failed to generate random data using any secure algorithm >> -+ // Platform owner should ensure that at least one secure algorithm is supported >> -+ // >> -+ ASSERT_EFI_ERROR (Status); >> -+ return Status; >> -+ } >> -+ >> -+ // >> -+ // Lets try using the default algorithm (which may not be secure) >> -+ // >> -+ Status = RngProtocol->GetRNG (RngProtocol, NULL, OutputLength, (UINT8 *)Output); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random data: %r\n", __func__, Status)); >> -+ ASSERT_EFI_ERROR (Status); >> -+ return Status; >> -+ } >> - >> -- gRT->GetTime (&Time, NULL); >> -- Seed = (Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second); >> -- Seed ^= Time.Nanosecond; >> -- Seed ^= Time.Year << 7; >> -+ return EFI_SUCCESS; >> -+} >> -+ >> -+/** >> -+ Generate a 32-bit pseudo-random number. >> - >> -- gBS->GetNextMonotonicCount (&MonotonicCount); >> -- Seed += (UINT32)MonotonicCount; >> -+ @param[out] Output - The buffer to store the generated random number. >> - >> -- return Seed; >> -+ @retval EFI_SUCCESS On Success >> -+ @retval EFI_NOT_FOUND RNG protocol not found >> -+ @retval Others Error from RngProtocol->GetRNG() >> -+ >> -+ @return Status code >> -+**/ >> -+EFI_STATUS >> -+EFIAPI >> -+PseudoRandomU32 ( >> -+ OUT UINT32 *Output >> -+ ) >> -+{ >> -+ return PseudoRandom (Output, sizeof (*Output)); >> - } >> - >> - /** >> -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >> -index 8145d256ec..a8f534a293 100644 >> ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >> -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >> -@@ -3,6 +3,7 @@ >> - # >> - # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >> - # (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> >> -+# Copyright (c) Microsoft Corporation >> - # SPDX-License-Identifier: BSD-2-Clause-Patent >> - # >> - ## >> -@@ -49,7 +50,11 @@ >> - gEfiSmbiosTableGuid ## SOMETIMES_CONSUMES ## SystemTable >> - gEfiSmbios3TableGuid ## SOMETIMES_CONSUMES ## SystemTable >> - gEfiAdapterInfoMediaStateGuid ## SOMETIMES_CONSUMES >> -- >> -+ gEfiRngAlgorithmRaw ## CONSUMES >> -+ gEfiRngAlgorithmSp80090Ctr256Guid ## CONSUMES >> -+ gEfiRngAlgorithmSp80090Hmac256Guid ## CONSUMES >> -+ gEfiRngAlgorithmSp80090Hash256Guid ## CONSUMES >> -+ gEfiRngAlgorithmArmRndr ## CONSUMES >> - >> - [Protocols] >> - gEfiSimpleNetworkProtocolGuid ## SOMETIMES_CONSUMES >> -@@ -59,3 +64,10 @@ >> - gEfiComponentNameProtocolGuid ## SOMETIMES_CONSUMES >> - gEfiComponentName2ProtocolGuid ## SOMETIMES_CONSUMES >> - gEfiAdapterInformationProtocolGuid ## SOMETIMES_CONSUMES >> -+ gEfiRngProtocolGuid ## CONSUMES >> -+ >> -+[FixedPcd] >> -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms ## CONSUMES >> -+ >> -+[Depex] >> -+ gEfiRngProtocolGuid >> -diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec >> -index 928e84fec4..ff335e957c 100644 >> ---- a/NetworkPkg/NetworkPkg.dec >> -+++ b/NetworkPkg/NetworkPkg.dec >> -@@ -5,6 +5,7 @@ >> - # >> - # Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR> >> - # (C) Copyright 2015-2020 Hewlett Packard Enterprise Development LP<BR> >> -+# Copyright (c) Microsoft Corporation >> - # >> - # SPDX-License-Identifier: BSD-2-Clause-Patent >> - # >> -@@ -127,6 +128,12 @@ >> - # @Prompt Indicates whether SnpDxe creates event for ExitBootServices() call. >> - gEfiNetworkPkgTokenSpaceGuid.PcdSnpCreateExitBootServicesEvent|TRUE|BOOLEAN|0x1000000C >> - >> -+ ## Enforces the use of Secure UEFI spec defined RNG algorithms for all network connections. >> -+ # TRUE - Enforce the use of Secure UEFI spec defined RNG algorithms. >> -+ # FALSE - Do not enforce and depend on the default implementation of RNG algorithm from the provider. >> -+ # @Prompt Enforce the use of Secure UEFI spec defined RNG algorithms. >> -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms|TRUE|BOOLEAN|0x1000000D >> -+ >> - [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] >> - ## IPv6 DHCP Unique Identifier (DUID) Type configuration (From RFCs 3315 and 6355). >> - # 01 = DUID Based on Link-layer Address Plus Time [DUID-LLT] >> -diff --git a/NetworkPkg/SecurityFixes.yaml b/NetworkPkg/SecurityFixes.yaml >> -index 7e900483fe..2b2c794697 100644 >> ---- a/NetworkPkg/SecurityFixes.yaml >> -+++ b/NetworkPkg/SecurityFixes.yaml >> -@@ -121,3 +121,42 @@ CVE_2023_45235: >> - - http://www.openwall.com/lists/oss-security/2024/01/16/2 >> - - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html >> - - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html >> -+CVE_2023_45237: >> -+ commit_titles: >> -+ - "NetworkPkg:: SECURITY PATCH CVE 2023-45237" >> -+ cve: CVE-2023-45237 >> -+ date_reported: 2023-08-28 13:56 UTC >> -+ description: "Bug 09 - Use of a Weak PseudoRandom Number Generator" >> -+ note: >> -+ files_impacted: >> -+ - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >> -+ - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >> -+ - NetworkPkg/DnsDxe/DnsDhcp.c >> -+ - NetworkPkg/DnsDxe/DnsImpl.c >> -+ - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >> -+ - NetworkPkg/IScsiDxe/IScsiCHAP.c >> -+ - NetworkPkg/IScsiDxe/IScsiMisc.c >> -+ - NetworkPkg/IScsiDxe/IScsiMisc.h >> -+ - NetworkPkg/Include/Library/NetLib.h >> -+ - NetworkPkg/Ip4Dxe/Ip4Driver.c >> -+ - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >> -+ - NetworkPkg/Ip6Dxe/Ip6Driver.c >> -+ - NetworkPkg/Ip6Dxe/Ip6If.c >> -+ - NetworkPkg/Ip6Dxe/Ip6Mld.c >> -+ - NetworkPkg/Ip6Dxe/Ip6Nd.c >> -+ - NetworkPkg/Ip6Dxe/Ip6Nd.h >> -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.c >> -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >> -+ - NetworkPkg/NetworkPkg.dec >> -+ - NetworkPkg/TcpDxe/TcpDriver.c >> -+ - NetworkPkg/Udp4Dxe/Udp4Driver.c >> -+ - NetworkPkg/Udp6Dxe/Udp6Driver.c >> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >> -+ links: >> -+ - https://bugzilla.tianocore.org/show_bug.cgi?id=4542 >> -+ - https://nvd.nist.gov/vuln/detail/CVE-2023-45237 >> -+ - http://www.openwall.com/lists/oss-security/2024/01/16/2 >> -+ - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html >> -+ - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html >> -diff --git a/NetworkPkg/TcpDxe/TcpDriver.c b/NetworkPkg/TcpDxe/TcpDriver.c >> -index 98a90e0210..8fe6badd68 100644 >> ---- a/NetworkPkg/TcpDxe/TcpDriver.c >> -+++ b/NetworkPkg/TcpDxe/TcpDriver.c >> -@@ -2,7 +2,7 @@ >> - The driver binding and service binding protocol for the TCP driver. >> - >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -163,7 +163,13 @@ TcpDriverEntryPoint ( >> - ) >> - { >> - EFI_STATUS Status; >> -- UINT32 Seed; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a Failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - // >> - // Install the TCP Driver Binding Protocol >> -@@ -203,9 +209,8 @@ TcpDriverEntryPoint ( >> - // >> - // Initialize ISS and random port. >> - // >> -- Seed = NetRandomInitSeed (); >> -- mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; >> -- mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (NET_RANDOM (Seed) % TCP_PORT_KNOWN)); >> -+ mTcpGlobalIss = Random % mTcpGlobalIss; >> -+ mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (Random % TCP_PORT_KNOWN)); >> - mTcp6RandomPort = mTcp4RandomPort; >> - >> - return EFI_SUCCESS; >> -diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf >> -index c0acbdca57..cf5423f4c5 100644 >> ---- a/NetworkPkg/TcpDxe/TcpDxe.inf >> -+++ b/NetworkPkg/TcpDxe/TcpDxe.inf >> -@@ -82,5 +82,8 @@ >> - gEfiTcp6ProtocolGuid ## BY_START >> - gEfiTcp6ServiceBindingProtocolGuid ## BY_START >> - >> -+[Depex] >> -+ gEfiHash2ServiceBindingProtocolGuid >> -+ >> - [UserExtensions.TianoCore."ExtraFiles"] >> - TcpDxeExtra.uni >> -diff --git a/NetworkPkg/Udp4Dxe/Udp4Driver.c b/NetworkPkg/Udp4Dxe/Udp4Driver.c >> -index cb917fcfc9..c7ea16f4cd 100644 >> ---- a/NetworkPkg/Udp4Dxe/Udp4Driver.c >> -+++ b/NetworkPkg/Udp4Dxe/Udp4Driver.c >> -@@ -1,6 +1,7 @@ >> - /** @file >> - >> - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >> -+Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -555,6 +556,13 @@ Udp4DriverEntryPoint ( >> - ) >> - { >> - EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - // >> - // Install the Udp4DriverBinding and Udp4ComponentName protocols. >> -@@ -571,7 +579,7 @@ Udp4DriverEntryPoint ( >> - // >> - // Initialize the UDP random port. >> - // >> -- mUdp4RandomPort = (UINT16)(((UINT16)NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); >> -+ mUdp4RandomPort = (UINT16)(((UINT16)Random) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); >> - } >> - >> - return Status; >> -diff --git a/NetworkPkg/Udp6Dxe/Udp6Driver.c b/NetworkPkg/Udp6Dxe/Udp6Driver.c >> -index ae96fb9966..edb758d57c 100644 >> ---- a/NetworkPkg/Udp6Dxe/Udp6Driver.c >> -+++ b/NetworkPkg/Udp6Dxe/Udp6Driver.c >> -@@ -2,7 +2,7 @@ >> - Driver Binding functions and Service Binding functions for the Network driver module. >> - >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -596,6 +596,13 @@ Udp6DriverEntryPoint ( >> - ) >> - { >> - EFI_STATUS Status; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> - >> - // >> - // Install the Udp6DriverBinding and Udp6ComponentName protocols. >> -@@ -614,7 +621,7 @@ Udp6DriverEntryPoint ( >> - // Initialize the UDP random port. >> - // >> - mUdp6RandomPort = (UINT16)( >> -- ((UINT16)NetRandomInitSeed ()) % >> -+ ((UINT16)Random) % >> - UDP6_PORT_KNOWN + >> - UDP6_PORT_KNOWN >> - ); >> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >> -index 91146b78cb..452038c219 100644 >> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >> -@@ -2,7 +2,7 @@ >> - Functions implementation related with DHCPv4 for UefiPxeBc Driver. >> - >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >> -- >> -+ Copyright (c) Microsoft Corporation >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - **/ >> -@@ -1381,6 +1381,12 @@ PxeBcDhcp4Discover ( >> - UINT8 VendorOptLen; >> - UINT32 Xid; >> - >> -+ Status = PseudoRandomU32 (&Xid); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - Mode = Private->PxeBc.Mode; >> - Dhcp4 = Private->Dhcp4; >> - Status = EFI_SUCCESS; >> -@@ -1471,7 +1477,6 @@ PxeBcDhcp4Discover ( >> - // >> - // Set fields of the token for the request packet. >> - // >> -- Xid = NET_RANDOM (NetRandomInitSeed ()); >> - Token.Packet->Dhcp4.Header.Xid = HTONL (Xid); >> - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)((IsBCast) ? 0x8000 : 0x0)); >> - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); >> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >> -index 7fd1281c11..bcabbd2219 100644 >> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >> -@@ -2180,7 +2180,7 @@ PxeBcDhcp6Discover ( >> - UINTN ReadSize; >> - UINT16 OpCode; >> - UINT16 OpLen; >> -- UINT32 Xid; >> -+ UINT32 Random; >> - EFI_STATUS Status; >> - UINTN DiscoverLenNeeded; >> - >> -@@ -2198,6 +2198,12 @@ PxeBcDhcp6Discover ( >> - return EFI_DEVICE_ERROR; >> - } >> - >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >> -+ return Status; >> -+ } >> -+ >> - DiscoverLenNeeded = sizeof (EFI_PXE_BASE_CODE_DHCPV6_PACKET); >> - Discover = AllocateZeroPool (DiscoverLenNeeded); >> - if (Discover == NULL) { >> -@@ -2207,8 +2213,7 @@ PxeBcDhcp6Discover ( >> - // >> - // Build the discover packet by the cached request packet before. >> - // >> -- Xid = NET_RANDOM (NetRandomInitSeed ()); >> -- Discover->TransactionId = HTONL (Xid); >> -+ Discover->TransactionId = HTONL (Random); >> - Discover->MessageType = Request->Dhcp6.Header.MessageType; >> - RequestOpt = Request->Dhcp6.Option; >> - DiscoverOpt = Discover->DhcpOptions; >> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >> -index d84aca7e85..4cd915b411 100644 >> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >> -@@ -3,6 +3,7 @@ >> - >> - (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> >> - Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR> >> -+ Copyright (c) Microsoft Corporation >> - >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> -@@ -892,6 +893,13 @@ PxeBcCreateIp6Children ( >> - PXEBC_PRIVATE_PROTOCOL *Id; >> - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; >> - UINTN Index; >> -+ UINT32 Random; >> -+ >> -+ Status = PseudoRandomU32 (&Random); >> -+ if (EFI_ERROR (Status)) { >> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random number using EFI_RNG_PROTOCOL: %r\n", Status)); >> -+ return Status; >> -+ } >> - >> - if (Private->Ip6Nic != NULL) { >> - // >> -@@ -935,9 +943,9 @@ PxeBcCreateIp6Children ( >> - } >> - >> - // >> -- // Generate a random IAID for the Dhcp6 assigned address. >> -+ // Set a random IAID for the Dhcp6 assigned address. >> - // >> -- Private->IaId = NET_RANDOM (NetRandomInitSeed ()); >> -+ Private->IaId = Random; >> - if (Private->Snp != NULL) { >> - for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) { >> - Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31)); >> --- >> -2.40.0 >> - >> diff --git a/meta/recipes-core/ovmf/ovmf_git.bb b/meta/recipes-core/ovmf/ovmf_git.bb >> index d52e3f4971..bb345688ac 100644 >> --- a/meta/recipes-core/ovmf/ovmf_git.bb >> +++ b/meta/recipes-core/ovmf/ovmf_git.bb >> @@ -47,8 +47,6 @@ SRC_URI = "gitsm://github.com/tianocore/edk2.git;branch=master;protocol=https \ >> file://CVE-2023-45229-0002.patch \ >> file://CVE-2023-45229-0003.patch \ >> file://CVE-2023-45229-0004.patch \ >> - file://CVE-2023-45237-0001.patch \ >> - file://CVE-2023-45237-0002.patch \ >> file://CVE-2023-45236.patch \ >> file://CVE-2022-36765-0001.patch \ >> file://CVE-2022-36765-0002.patch \ >> -- >> 2.34.1 >> >> >> -=-=-=-=-=-=-=-=-=-=-=- >> Links: You receive all messages sent to this group. >> View/Reply Online (#211699): https://lists.openembedded.org/g/openembedded-core/message/211699 >> Mute This Topic: https://lists.openembedded.org/mt/111267276/3620601 >> Group Owner: openembedded-core+owner@lists.openembedded.org >> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [steve@sakoman.com] >> -=-=-=-=-=-=-=-=-=-=-=- >>
On Wed, Feb 19, 2025 at 10:03 PM Kai <kai.kang@windriver.com> wrote: > > On 2/19/25 23:19, Steve Sakoman wrote: > > Hi Kai, > > > > Not sure why, but this fails to apply for me: > > > > Applying: Revert "ovmf: Fix CVE-2023-45237" > > Using index info to reconstruct a base tree... > > error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch:1 > > error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch: patch > > does not apply > > error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch:1 > > error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch: patch > > does not apply > > error: Did you hand edit your patch? > > It does not apply to blobs recorded in its index. > > Patch failed at 0001 Revert "ovmf: Fix CVE-2023-45237" > > Hi Steve, > > How about try option `--keep-cr` with git am as I mentioned in the patch > file? I did use that option: $ git am --keep-cr ~/Downloads/kirkstone-1-2-Revert-ovmf-Fix-CVE-2023-45237.patch Applying: Revert "ovmf: Fix CVE-2023-45237" error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch:1 error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch: patch does not apply error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch:1 error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch: patch does not apply Patch failed at 0001 Revert "ovmf: Fix CVE-2023-45237" hint: Use 'git am --show-current-patch=diff' to see the failed patch When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". I'll just directly revert these two commits and copy/paste your text into the revert message. Steve > > On Wed, Feb 19, 2025 at 2:22 AM Kai Kang via lists.openembedded.org > > <kai.kang=windriver.com@lists.openembedded.org> wrote: > >> From: Kai Kang <kai.kang@windriver.com> > >> > >> This reverts commit 4c2d3e37308cac98614dfafed79b7323423af8bc. > >> > >> The fix for CVE-2023-45237 causes ovmf firmware not support pxe boot > >> any more and no boot item in OVMF menu such as > >> > >> UEFI PXEv4 (MAC address) > >> > >> It has not been fixed by ovmf upstream and an issue has been created on > >> > >> https://github.com/tianocore/tianocore.github.io/issues/82 > >> > >> Revert the fixes for now. > >> > >> Signed-off-by: Kai Kang <kai.kang@windriver.com> > >> --- > >> > >> Please add option `--keep-cr` when invoke `git am`. > >> > >> .../ovmf/ovmf/CVE-2023-45237-0001.patch | 78 - > >> .../ovmf/ovmf/CVE-2023-45237-0002.patch | 1288 ----------------- > >> meta/recipes-core/ovmf/ovmf_git.bb | 2 - > >> 3 files changed, 1368 deletions(-) > >> delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch > >> delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch > >> > >> diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch > >> deleted file mode 100644 > >> index d1dcb8dc44..0000000000 > >> --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch > >> +++ /dev/null > >> @@ -1,78 +0,0 @@ > >> -From cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c Mon Sep 17 00:00:00 2001 > >> -From: Pierre Gondois <pierre.gondois@arm.com> > >> -Date: Fri, 11 Aug 2023 16:33:06 +0200 > >> -Subject: [PATCH] MdePkg/Rng: Add GUID to describe Arm Rndr Rng algorithms > >> - > >> -BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4441 > >> - > >> -The EFI_RNG_PROTOCOL can rely on the RngLib. The RngLib has multiple > >> -implementations, some of them are unsafe (e.g. BaseRngLibTimerLib). > >> -To allow the RngDxe to detect when such implementation is used, > >> -a GetRngGuid() function is added in a following patch. > >> - > >> -Prepare GetRngGuid() return values and add a gEfiRngAlgorithmArmRndr > >> -to describe a Rng algorithm accessed through Arm's RNDR instruction. > >> -[1] states that the implementation of this algorithm should be > >> -compliant to NIST SP900-80. The compliance is not guaranteed. > >> - > >> -[1] Arm Architecture Reference Manual Armv8, for A-profile architecture > >> -sK12.1 'Properties of the generated random number' > >> - > >> -Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> > >> -Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> > >> -Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> > >> -Acked-by: Ard Biesheuvel <ardb@kernel.org> > >> -Tested-by: Kun Qin <kun.qin@microsoft.com> > >> - > >> -CVE: CVE-2023-45237 > >> - > >> -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c] > >> - > >> -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> > >> ---- > >> - MdePkg/Include/Protocol/Rng.h | 10 ++++++++++ > >> - MdePkg/MdePkg.dec | 1 + > >> - 2 files changed, 11 insertions(+) > >> - > >> -diff --git a/MdePkg/Include/Protocol/Rng.h b/MdePkg/Include/Protocol/Rng.h > >> -index baf425587b..38bde53240 100644 > >> ---- a/MdePkg/Include/Protocol/Rng.h > >> -+++ b/MdePkg/Include/Protocol/Rng.h > >> -@@ -67,6 +67,15 @@ typedef EFI_GUID EFI_RNG_ALGORITHM; > >> - { \ > >> - 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 } \ > >> - } > >> -+/// > >> -+/// The Arm Architecture states the RNDR that the DRBG algorithm should be compliant > >> -+/// with NIST SP800-90A, while not mandating a particular algorithm, so as to be > >> -+/// inclusive of different geographies. > >> -+/// > >> -+#define EFI_RNG_ALGORITHM_ARM_RNDR \ > >> -+ { \ > >> -+ 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41} \ > >> -+ } > >> - > >> - /** > >> - Returns information about the random number generation implementation. > >> -@@ -146,5 +155,6 @@ extern EFI_GUID gEfiRngAlgorithmSp80090Ctr256Guid; > >> - extern EFI_GUID gEfiRngAlgorithmX9313DesGuid; > >> - extern EFI_GUID gEfiRngAlgorithmX931AesGuid; > >> - extern EFI_GUID gEfiRngAlgorithmRaw; > >> -+extern EFI_GUID gEfiRngAlgorithmArmRndr; > >> - > >> - #endif > >> -diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec > >> -index 59b405928b..a449dbc556 100644 > >> ---- a/MdePkg/MdePkg.dec > >> -+++ b/MdePkg/MdePkg.dec > >> -@@ -594,6 +594,7 @@ > >> - gEfiRngAlgorithmX9313DesGuid = { 0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46 }} > >> - gEfiRngAlgorithmX931AesGuid = { 0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9 }} > >> - gEfiRngAlgorithmRaw = { 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 }} > >> -+ gEfiRngAlgorithmArmRndr = { 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41 }} > >> - > >> - ## Include/Protocol/AdapterInformation.h > >> - gEfiAdapterInfoMediaStateGuid = { 0xD7C74207, 0xA831, 0x4A26, {0xB1, 0xF5, 0xD1, 0x93, 0x06, 0x5C, 0xE8, 0xB6 }} > >> --- > >> -2.40.0 > >> - > >> diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch > >> deleted file mode 100644 > >> index 722a6cd530..0000000000 > >> --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch > >> +++ /dev/null > >> @@ -1,1288 +0,0 @@ > >> -From 4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345 Mon Sep 17 00:00:00 2001 > >> -From: Doug Flick <dougflick@microsoft.com> > >> -Date: Wed, 8 May 2024 22:56:28 -0700 > >> -Subject: [PATCH] NetworkPkg: SECURITY PATCH CVE-2023-45237 > >> - > >> -REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4542 > >> - > >> -Bug Overview: > >> -PixieFail Bug #9 > >> -CVE-2023-45237 > >> -CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N > >> -CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) > >> - > >> -Use of a Weak PseudoRandom Number Generator > >> - > >> -Change Overview: > >> - > >> -Updates all Instances of NET_RANDOM (NetRandomInitSeed ()) to either > >> - > >> -> > >> -> EFI_STATUS > >> -> EFIAPI > >> -> PseudoRandomU32 ( > >> -> OUT UINT32 *Output > >> -> ); > >> -> > >> - > >> -or (depending on the use case) > >> - > >> -> > >> -> EFI_STATUS > >> -> EFIAPI > >> -> PseudoRandom ( > >> -> OUT VOID *Output, > >> -> IN UINTN OutputLength > >> -> ); > >> -> > >> - > >> -This is because the use of > >> - > >> -Example: > >> - > >> -The following code snippet PseudoRandomU32 () function is used: > >> - > >> -> > >> -> UINT32 Random; > >> -> > >> -> Status = PseudoRandomU32 (&Random); > >> -> if (EFI_ERROR (Status)) { > >> -> DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", > >> -__func__, Status)); > >> -> return Status; > >> -> } > >> -> > >> - > >> -This also introduces a new PCD to enable/disable the use of the > >> -secure implementation of algorithms for PseudoRandom () and > >> -instead depend on the default implementation. This may be required for > >> -some platforms where the UEFI Spec defined algorithms are not available. > >> - > >> -> > >> -> PcdEnforceSecureRngAlgorithms > >> -> > >> - > >> -If the platform does not have any one of the UEFI defined > >> -secure RNG algorithms then the driver will assert. > >> - > >> -Cc: Saloni Kasbekar <saloni.kasbekar@intel.com> > >> -Cc: Zachary Clark-williams <zachary.clark-williams@intel.com> > >> - > >> -Signed-off-by: Doug Flick [MSFT] <doug.edk2@gmail.com> > >> -Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com> > >> - > >> -CVE: CVE-2023-45237 > >> - > >> -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345] > >> - > >> -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> > >> ---- > >> - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c | 10 +- > >> - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c | 11 +- > >> - NetworkPkg/DnsDxe/DnsDhcp.c | 10 +- > >> - NetworkPkg/DnsDxe/DnsImpl.c | 11 +- > >> - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c | 10 +- > >> - NetworkPkg/IScsiDxe/IScsiCHAP.c | 19 ++- > >> - NetworkPkg/IScsiDxe/IScsiMisc.c | 14 +-- > >> - NetworkPkg/IScsiDxe/IScsiMisc.h | 6 +- > >> - NetworkPkg/Include/Library/NetLib.h | 40 +++++-- > >> - NetworkPkg/Ip4Dxe/Ip4Driver.c | 10 +- > >> - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c | 9 +- > >> - NetworkPkg/Ip6Dxe/Ip6Driver.c | 17 ++- > >> - NetworkPkg/Ip6Dxe/Ip6If.c | 12 +- > >> - NetworkPkg/Ip6Dxe/Ip6Mld.c | 12 +- > >> - NetworkPkg/Ip6Dxe/Ip6Nd.c | 33 +++++- > >> - NetworkPkg/Ip6Dxe/Ip6Nd.h | 8 +- > >> - NetworkPkg/Library/DxeNetLib/DxeNetLib.c | 130 ++++++++++++++++++--- > >> - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf | 14 ++- > >> - NetworkPkg/NetworkPkg.dec | 7 ++ > >> - NetworkPkg/SecurityFixes.yaml | 39 +++++++ > >> - NetworkPkg/TcpDxe/TcpDriver.c | 15 ++- > >> - NetworkPkg/TcpDxe/TcpDxe.inf | 3 + > >> - NetworkPkg/Udp4Dxe/Udp4Driver.c | 10 +- > >> - NetworkPkg/Udp6Dxe/Udp6Driver.c | 11 +- > >> - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c | 9 +- > >> - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c | 11 +- > >> - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c | 12 +- > >> - 27 files changed, 410 insertions(+), 83 deletions(-) > >> - > >> -diff --git a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > >> -index 8c37e93be3..892caee368 100644 > >> ---- a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > >> -+++ b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > >> -@@ -1,6 +1,7 @@ > >> - /** @file > >> - > >> - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -189,6 +190,13 @@ Dhcp4CreateService ( > >> - { > >> - DHCP_SERVICE *DhcpSb; > >> - EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - *Service = NULL; > >> - DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE)); > >> -@@ -203,7 +211,7 @@ Dhcp4CreateService ( > >> - DhcpSb->Image = ImageHandle; > >> - InitializeListHead (&DhcpSb->Children); > >> - DhcpSb->DhcpState = Dhcp4Stopped; > >> -- DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ()); > >> -+ DhcpSb->Xid = Random; > >> - CopyMem ( > >> - &DhcpSb->ServiceBinding, > >> - &mDhcp4ServiceBindingTemplate, > >> -diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > >> -index b591a4605b..e7f2787a98 100644 > >> ---- a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > >> -+++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > >> -@@ -3,7 +3,7 @@ > >> - implementation for Dhcp6 Driver. > >> - > >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -123,6 +123,13 @@ Dhcp6CreateService ( > >> - { > >> - DHCP6_SERVICE *Dhcp6Srv; > >> - EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - *Service = NULL; > >> - Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE)); > >> -@@ -147,7 +154,7 @@ Dhcp6CreateService ( > >> - Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE; > >> - Dhcp6Srv->Controller = Controller; > >> - Dhcp6Srv->Image = ImageHandle; > >> -- Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ())); > >> -+ Dhcp6Srv->Xid = (0xffffff & Random); > >> - > >> - CopyMem ( > >> - &Dhcp6Srv->ServiceBinding, > >> -diff --git a/NetworkPkg/DnsDxe/DnsDhcp.c b/NetworkPkg/DnsDxe/DnsDhcp.c > >> -index 933565a32d..9eb3c1d2d8 100644 > >> ---- a/NetworkPkg/DnsDxe/DnsDhcp.c > >> -+++ b/NetworkPkg/DnsDxe/DnsDhcp.c > >> -@@ -2,6 +2,7 @@ > >> - Functions implementation related with DHCPv4/v6 for DNS driver. > >> - > >> - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -277,6 +278,7 @@ GetDns4ServerFromDhcp4 ( > >> - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; > >> - BOOLEAN IsDone; > >> - UINTN Index; > >> -+ UINT32 Random; > >> - > >> - Image = Instance->Service->ImageHandle; > >> - Controller = Instance->Service->ControllerHandle; > >> -@@ -292,6 +294,12 @@ GetDns4ServerFromDhcp4 ( > >> - Data = NULL; > >> - InterfaceInfo = NULL; > >> - > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - ZeroMem ((UINT8 *)ParaList, sizeof (ParaList)); > >> - > >> - ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA)); > >> -@@ -467,7 +475,7 @@ GetDns4ServerFromDhcp4 ( > >> - > >> - Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet); > >> - > >> -- Token.Packet->Dhcp4.Header.Xid = HTONL (NET_RANDOM (NetRandomInitSeed ())); > >> -+ Token.Packet->Dhcp4.Header.Xid = Random; > >> - > >> - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000); > >> - > >> -diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c > >> -index d311812800..c2629bb8df 100644 > >> ---- a/NetworkPkg/DnsDxe/DnsImpl.c > >> -+++ b/NetworkPkg/DnsDxe/DnsImpl.c > >> -@@ -2,6 +2,7 @@ > >> - DnsDxe support functions implementation. > >> - > >> - Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -1963,6 +1964,14 @@ ConstructDNSQuery ( > >> - NET_FRAGMENT Frag; > >> - DNS_HEADER *DnsHeader; > >> - DNS_QUERY_SECTION *DnsQuery; > >> -+ EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - // > >> - // Messages carried by UDP are restricted to 512 bytes (not counting the IP > >> -@@ -1977,7 +1986,7 @@ ConstructDNSQuery ( > >> - // Fill header > >> - // > >> - DnsHeader = (DNS_HEADER *)Frag.Bulk; > >> -- DnsHeader->Identification = (UINT16)NET_RANDOM (NetRandomInitSeed ()); > >> -+ DnsHeader->Identification = (UINT16)Random; > >> - DnsHeader->Flags.Uint16 = 0x0000; > >> - DnsHeader->Flags.Bits.RD = 1; > >> - DnsHeader->Flags.Bits.OpCode = DNS_FLAGS_OPCODE_STANDARD; > >> -diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > >> -index b22cef4ff5..f964515b0f 100644 > >> ---- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > >> -+++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > >> -@@ -2,6 +2,7 @@ > >> - Functions implementation related with DHCPv6 for HTTP boot driver. > >> - > >> - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -951,6 +952,7 @@ HttpBootDhcp6Sarr ( > >> - UINT32 OptCount; > >> - UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE]; > >> - EFI_STATUS Status; > >> -+ UINT32 Random; > >> - > >> - Dhcp6 = Private->Dhcp6; > >> - ASSERT (Dhcp6 != NULL); > >> -@@ -961,6 +963,12 @@ HttpBootDhcp6Sarr ( > >> - OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer); > >> - ASSERT (OptCount > 0); > >> - > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION)); > >> - if (Retransmit == NULL) { > >> - return EFI_OUT_OF_RESOURCES; > >> -@@ -976,7 +984,7 @@ HttpBootDhcp6Sarr ( > >> - Config.IaInfoEvent = NULL; > >> - Config.RapidCommit = FALSE; > >> - Config.ReconfigureAccept = FALSE; > >> -- Config.IaDescriptor.IaId = NET_RANDOM (NetRandomInitSeed ()); > >> -+ Config.IaDescriptor.IaId = Random; > >> - Config.IaDescriptor.Type = EFI_DHCP6_IA_TYPE_NA; > >> - Config.SolicitRetransmission = Retransmit; > >> - Retransmit->Irt = 4; > >> -diff --git a/NetworkPkg/IScsiDxe/IScsiCHAP.c b/NetworkPkg/IScsiDxe/IScsiCHAP.c > >> -index b507f11cd4..bebb1ac29b 100644 > >> ---- a/NetworkPkg/IScsiDxe/IScsiCHAP.c > >> -+++ b/NetworkPkg/IScsiDxe/IScsiCHAP.c > >> -@@ -3,6 +3,7 @@ > >> - Configuration. > >> - > >> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -576,16 +577,24 @@ IScsiCHAPToSendReq ( > >> - // > >> - // CHAP_I=<I> > >> - // > >> -- IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); > >> -+ Status = IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); > >> -+ if (EFI_ERROR (Status)) { > >> -+ break; > >> -+ } > >> -+ > >> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); > >> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); > >> - // > >> - // CHAP_C=<C> > >> - // > >> -- IScsiGenRandom ( > >> -- (UINT8 *)AuthData->OutChallenge, > >> -- AuthData->Hash->DigestSize > >> -- ); > >> -+ Status = IScsiGenRandom ( > >> -+ (UINT8 *)AuthData->OutChallenge, > >> -+ AuthData->Hash->DigestSize > >> -+ ); > >> -+ if (EFI_ERROR (Status)) { > >> -+ break; > >> -+ } > >> -+ > >> - BinToHexStatus = IScsiBinToHex ( > >> - (UINT8 *)AuthData->OutChallenge, > >> - AuthData->Hash->DigestSize, > >> -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c > >> -index b3ea90158f..cd77f1a13e 100644 > >> ---- a/NetworkPkg/IScsiDxe/IScsiMisc.c > >> -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c > >> -@@ -2,6 +2,7 @@ > >> - Miscellaneous routines for iSCSI driver. > >> - > >> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -474,20 +475,17 @@ IScsiNetNtoi ( > >> - @param[in, out] Rand The buffer to contain random numbers. > >> - @param[in] RandLength The length of the Rand buffer. > >> - > >> -+ @retval EFI_SUCCESS on success > >> -+ @retval others on error > >> -+ > >> - **/ > >> --VOID > >> -+EFI_STATUS > >> - IScsiGenRandom ( > >> - IN OUT UINT8 *Rand, > >> - IN UINTN RandLength > >> - ) > >> - { > >> -- UINT32 Random; > >> -- > >> -- while (RandLength > 0) { > >> -- Random = NET_RANDOM (NetRandomInitSeed ()); > >> -- *Rand++ = (UINT8)(Random); > >> -- RandLength--; > >> -- } > >> -+ return PseudoRandom (Rand, RandLength); > >> - } > >> - > >> - /** > >> -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h > >> -index a951eee70e..91b2cd2261 100644 > >> ---- a/NetworkPkg/IScsiDxe/IScsiMisc.h > >> -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h > >> -@@ -2,6 +2,7 @@ > >> - Miscellaneous definitions for iSCSI driver. > >> - > >> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -202,8 +203,11 @@ IScsiNetNtoi ( > >> - @param[in, out] Rand The buffer to contain random numbers. > >> - @param[in] RandLength The length of the Rand buffer. > >> - > >> -+ @retval EFI_SUCCESS on success > >> -+ @retval others on error > >> -+ > >> - **/ > >> --VOID > >> -+EFI_STATUS > >> - IScsiGenRandom ( > >> - IN OUT UINT8 *Rand, > >> - IN UINTN RandLength > >> -diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h > >> -index 8c0e62b388..e8108b79db 100644 > >> ---- a/NetworkPkg/Include/Library/NetLib.h > >> -+++ b/NetworkPkg/Include/Library/NetLib.h > >> -@@ -3,6 +3,7 @@ > >> - It provides basic functions for the UEFI network stack. > >> - > >> - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -539,8 +540,6 @@ extern EFI_IPv4_ADDRESS mZeroIp4Addr; > >> - #define TICKS_PER_MS 10000U > >> - #define TICKS_PER_SECOND 10000000U > >> - > >> --#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL) > >> -- > >> - /** > >> - Extract a UINT32 from a byte stream. > >> - > >> -@@ -580,19 +579,40 @@ NetPutUint32 ( > >> - ); > >> - > >> - /** > >> -- Initialize a random seed using current time and monotonic count. > >> -+ Generate a Random output data given a length. > >> - > >> -- Get current time and monotonic count first. Then initialize a random seed > >> -- based on some basic mathematics operation on the hour, day, minute, second, > >> -- nanosecond and year of the current time and the monotonic count value. > >> -+ @param[out] Output - The buffer to store the generated random data. > >> -+ @param[in] OutputLength - The length of the output buffer. > >> - > >> -- @return The random seed initialized with current time. > >> -+ @retval EFI_SUCCESS On Success > >> -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero > >> -+ @retval EFI_NOT_FOUND RNG protocol not found > >> -+ @retval Others Error from RngProtocol->GetRNG() > >> - > >> -+ @return Status code > >> - **/ > >> --UINT32 > >> -+EFI_STATUS > >> - EFIAPI > >> --NetRandomInitSeed ( > >> -- VOID > >> -+PseudoRandom ( > >> -+ OUT VOID *Output, > >> -+ IN UINTN OutputLength > >> -+ ); > >> -+ > >> -+/** > >> -+ Generate a 32-bit pseudo-random number. > >> -+ > >> -+ @param[out] Output - The buffer to store the generated random number. > >> -+ > >> -+ @retval EFI_SUCCESS On Success > >> -+ @retval EFI_NOT_FOUND RNG protocol not found > >> -+ @retval Others Error from RngProtocol->GetRNG() > >> -+ > >> -+ @return Status code > >> -+**/ > >> -+EFI_STATUS > >> -+EFIAPI > >> -+PseudoRandomU32 ( > >> -+ OUT UINT32 *Output > >> - ); > >> - > >> - #define NET_LIST_USER_STRUCT(Entry, Type, Field) \ > >> -diff --git a/NetworkPkg/Ip4Dxe/Ip4Driver.c b/NetworkPkg/Ip4Dxe/Ip4Driver.c > >> -index ec483ff01f..683423f38d 100644 > >> ---- a/NetworkPkg/Ip4Dxe/Ip4Driver.c > >> -+++ b/NetworkPkg/Ip4Dxe/Ip4Driver.c > >> -@@ -2,6 +2,7 @@ > >> - The driver binding and service binding protocol for IP4 driver. > >> - > >> - Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> > >> - > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> -@@ -549,11 +550,18 @@ Ip4DriverBindingStart ( > >> - EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; > >> - UINTN Index; > >> - IP4_CONFIG2_DATA_ITEM *DataItem; > >> -+ UINT32 Random; > >> - > >> - IpSb = NULL; > >> - Ip4Cfg2 = NULL; > >> - DataItem = NULL; > >> - > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - // > >> - // Test for the Ip4 service binding protocol > >> - // > >> -@@ -653,7 +661,7 @@ Ip4DriverBindingStart ( > >> - // > >> - // Initialize the IP4 ID > >> - // > >> -- mIp4Id = (UINT16)NET_RANDOM (NetRandomInitSeed ()); > >> -+ mIp4Id = (UINT16)Random; > >> - > >> - return Status; > >> - > >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > >> -index 70e232ce6c..4c1354d26c 100644 > >> ---- a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > >> -+++ b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > >> -@@ -2276,6 +2276,13 @@ Ip6ConfigInitInstance ( > >> - UINTN Index; > >> - UINT16 IfIndex; > >> - IP6_CONFIG_DATA_ITEM *DataItem; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance); > >> - > >> -@@ -2381,7 +2388,7 @@ Ip6ConfigInitInstance ( > >> - // The NV variable is not set, so generate a random IAID, and write down the > >> - // fresh new configuration as the NV variable now. > >> - // > >> -- Instance->IaId = NET_RANDOM (NetRandomInitSeed ()); > >> -+ Instance->IaId = Random; > >> - > >> - for (Index = 0; Index < IpSb->SnpMode.HwAddressSize; Index++) { > >> - Instance->IaId |= (IpSb->SnpMode.CurrentAddress.Addr[Index] << ((Index << 3) & 31)); > >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c > >> -index b483a7d136..cbe011dad4 100644 > >> ---- a/NetworkPkg/Ip6Dxe/Ip6Driver.c > >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c > >> -@@ -3,7 +3,7 @@ > >> - > >> - Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR> > >> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -316,7 +316,11 @@ Ip6CreateService ( > >> - IpSb->CurHopLimit = IP6_HOP_LIMIT; > >> - IpSb->LinkMTU = IP6_MIN_LINK_MTU; > >> - IpSb->BaseReachableTime = IP6_REACHABLE_TIME; > >> -- Ip6UpdateReachableTime (IpSb); > >> -+ Status = Ip6UpdateReachableTime (IpSb); > >> -+ if (EFI_ERROR (Status)) { > >> -+ goto ON_ERROR; > >> -+ } > >> -+ > >> - // > >> - // RFC4861 RETRANS_TIMER: 1,000 milliseconds > >> - // > >> -@@ -516,11 +520,18 @@ Ip6DriverBindingStart ( > >> - EFI_STATUS Status; > >> - EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; > >> - IP6_CONFIG_DATA_ITEM *DataItem; > >> -+ UINT32 Random; > >> - > >> - IpSb = NULL; > >> - Ip6Cfg = NULL; > >> - DataItem = NULL; > >> - > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - // > >> - // Test for the Ip6 service binding protocol > >> - // > >> -@@ -656,7 +667,7 @@ Ip6DriverBindingStart ( > >> - // > >> - // Initialize the IP6 ID > >> - // > >> -- mIp6Id = NET_RANDOM (NetRandomInitSeed ()); > >> -+ mIp6Id = Random; > >> - > >> - return EFI_SUCCESS; > >> - > >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6If.c b/NetworkPkg/Ip6Dxe/Ip6If.c > >> -index 4629c05f25..f3d11c4d21 100644 > >> ---- a/NetworkPkg/Ip6Dxe/Ip6If.c > >> -+++ b/NetworkPkg/Ip6Dxe/Ip6If.c > >> -@@ -2,7 +2,7 @@ > >> - Implement IP6 pseudo interface. > >> - > >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -89,6 +89,14 @@ Ip6SetAddress ( > >> - IP6_PREFIX_LIST_ENTRY *PrefixEntry; > >> - UINT64 Delay; > >> - IP6_DELAY_JOIN_LIST *DelayNode; > >> -+ EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - NET_CHECK_SIGNATURE (Interface, IP6_INTERFACE_SIGNATURE); > >> - > >> -@@ -164,7 +172,7 @@ Ip6SetAddress ( > >> - // Thus queue the address to be processed in Duplicate Address Detection module > >> - // after the delay time (in milliseconds). > >> - // > >> -- Delay = (UINT64)NET_RANDOM (NetRandomInitSeed ()); > >> -+ Delay = (UINT64)Random; > >> - Delay = MultU64x32 (Delay, IP6_ONE_SECOND_IN_MS); > >> - Delay = RShiftU64 (Delay, 32); > >> - > >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Mld.c b/NetworkPkg/Ip6Dxe/Ip6Mld.c > >> -index e6b2b653e2..498a118543 100644 > >> ---- a/NetworkPkg/Ip6Dxe/Ip6Mld.c > >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Mld.c > >> -@@ -696,7 +696,15 @@ Ip6UpdateDelayTimer ( > >> - IN OUT IP6_MLD_GROUP *Group > >> - ) > >> - { > >> -- UINT32 Delay; > >> -+ UINT32 Delay; > >> -+ EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - // > >> - // If the Query packet specifies a Maximum Response Delay of zero, perform timer > >> -@@ -715,7 +723,7 @@ Ip6UpdateDelayTimer ( > >> - // is less than the remaining value of the running timer. > >> - // > >> - if ((Group->DelayTimer == 0) || (Delay < Group->DelayTimer)) { > >> -- Group->DelayTimer = Delay / 4294967295UL * NET_RANDOM (NetRandomInitSeed ()); > >> -+ Group->DelayTimer = Delay / 4294967295UL * Random; > >> - } > >> - > >> - return EFI_SUCCESS; > >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.c b/NetworkPkg/Ip6Dxe/Ip6Nd.c > >> -index c10c7017f8..72aa45c10f 100644 > >> ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.c > >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.c > >> -@@ -2,7 +2,7 @@ > >> - Implementation of Neighbor Discovery support routines. > >> - > >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -16,17 +16,28 @@ EFI_MAC_ADDRESS mZeroMacAddress; > >> - > >> - @param[in, out] IpSb Points to the IP6_SERVICE. > >> - > >> -+ @retval EFI_SUCCESS ReachableTime Updated > >> -+ @retval others Failed to update ReachableTime > >> - **/ > >> --VOID > >> -+EFI_STATUS > >> - Ip6UpdateReachableTime ( > >> - IN OUT IP6_SERVICE *IpSb > >> - ) > >> - { > >> -- UINT32 Random; > >> -+ UINT32 Random; > >> -+ EFI_STATUS Status; > >> - > >> -- Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> -+ Random = (Random / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; > >> - Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED; > >> - IpSb->ReachableTime = (IpSb->BaseReachableTime * Random) / IP6_RANDOM_FACTOR_SCALE; > >> -+ > >> -+ return EFI_SUCCESS; > >> - } > >> - > >> - /** > >> -@@ -972,10 +983,17 @@ Ip6InitDADProcess ( > >> - IP6_SERVICE *IpSb; > >> - EFI_STATUS Status; > >> - UINT32 MaxDelayTick; > >> -+ UINT32 Random; > >> - > >> - NET_CHECK_SIGNATURE (IpIf, IP6_INTERFACE_SIGNATURE); > >> - ASSERT (AddressInfo != NULL); > >> - > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - // > >> - // Do nothing if we have already started DAD on the address. > >> - // > >> -@@ -1014,7 +1032,7 @@ Ip6InitDADProcess ( > >> - Entry->Transmit = 0; > >> - Entry->Receive = 0; > >> - MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS; > >> -- Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5; > >> -+ Entry->RetransTick = (MaxDelayTick * ((Random % 5) + 1)) / 5; > >> - Entry->AddressInfo = AddressInfo; > >> - Entry->Callback = Callback; > >> - Entry->Context = Context; > >> -@@ -2078,7 +2096,10 @@ Ip6ProcessRouterAdvertise ( > >> - // in BaseReachableTime and recompute a ReachableTime. > >> - // > >> - IpSb->BaseReachableTime = ReachableTime; > >> -- Ip6UpdateReachableTime (IpSb); > >> -+ Status = Ip6UpdateReachableTime (IpSb); > >> -+ if (EFI_ERROR (Status)) { > >> -+ goto Exit; > >> -+ } > >> - } > >> - > >> - if (RetransTimer != 0) { > >> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.h b/NetworkPkg/Ip6Dxe/Ip6Nd.h > >> -index bf64e9114e..5795e23c7d 100644 > >> ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.h > >> -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.h > >> -@@ -2,7 +2,7 @@ > >> - Definition of Neighbor Discovery support routines. > >> - > >> - Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -780,10 +780,10 @@ Ip6OnArpResolved ( > >> - /** > >> - Update the ReachableTime in IP6 service binding instance data, in milliseconds. > >> - > >> -- @param[in, out] IpSb Points to the IP6_SERVICE. > >> -- > >> -+ @retval EFI_SUCCESS ReachableTime Updated > >> -+ @retval others Failed to update ReachableTime > >> - **/ > >> --VOID > >> -+EFI_STATUS > >> - Ip6UpdateReachableTime ( > >> - IN OUT IP6_SERVICE *IpSb > >> - ); > >> -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c > >> -index fd4a9e15a8..01c13c08d2 100644 > >> ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c > >> -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c > >> -@@ -3,6 +3,7 @@ > >> - > >> - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> > >> - (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - **/ > >> - > >> -@@ -31,6 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > >> - #include <Library/DevicePathLib.h> > >> - #include <Library/PrintLib.h> > >> - #include <Library/UefiLib.h> > >> -+#include <Protocol/Rng.h> > >> - > >> - #define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE) > >> - #define DEFAULT_ZERO_START ((UINTN) ~0) > >> -@@ -127,6 +129,25 @@ GLOBAL_REMOVE_IF_UNREFERENCED VLAN_DEVICE_PATH mNetVlanDevicePathTemplate = { > >> - 0 > >> - }; > >> - > >> -+// > >> -+// These represent UEFI SPEC defined algorithms that should be supported by > >> -+// the RNG protocol and are generally considered secure. > >> -+// > >> -+// The order of the algorithms in this array is important. This order is the order > >> -+// in which the algorithms will be tried by the RNG protocol. > >> -+// If your platform needs to use a specific algorithm for the random number generator, > >> -+// then you should place that algorithm first in the array. > >> -+// > >> -+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID *mSecureHashAlgorithms[] = { > >> -+ &gEfiRngAlgorithmSp80090Ctr256Guid, // SP800-90A DRBG CTR using AES-256 > >> -+ &gEfiRngAlgorithmSp80090Hmac256Guid, // SP800-90A DRBG HMAC using SHA-256 > >> -+ &gEfiRngAlgorithmSp80090Hash256Guid, // SP800-90A DRBG Hash using SHA-256 > >> -+ &gEfiRngAlgorithmArmRndr, // unspecified SP800-90A DRBG via ARM RNDR register > >> -+ &gEfiRngAlgorithmRaw, // Raw data from NRBG (or TRNG) > >> -+}; > >> -+ > >> -+#define SECURE_HASH_ALGORITHMS_SIZE (sizeof (mSecureHashAlgorithms) / sizeof (EFI_GUID *)) > >> -+ > >> - /** > >> - Locate the handles that support SNP, then open one of them > >> - to send the syslog packets. The caller isn't required to close > >> -@@ -884,34 +905,107 @@ Ip6Swap128 ( > >> - } > >> - > >> - /** > >> -- Initialize a random seed using current time and monotonic count. > >> -+ Generate a Random output data given a length. > >> - > >> -- Get current time and monotonic count first. Then initialize a random seed > >> -- based on some basic mathematics operation on the hour, day, minute, second, > >> -- nanosecond and year of the current time and the monotonic count value. > >> -+ @param[out] Output - The buffer to store the generated random data. > >> -+ @param[in] OutputLength - The length of the output buffer. > >> - > >> -- @return The random seed initialized with current time. > >> -+ @retval EFI_SUCCESS On Success > >> -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero > >> -+ @retval EFI_NOT_FOUND RNG protocol not found > >> -+ @retval Others Error from RngProtocol->GetRNG() > >> - > >> -+ @return Status code > >> - **/ > >> --UINT32 > >> -+EFI_STATUS > >> - EFIAPI > >> --NetRandomInitSeed ( > >> -- VOID > >> -+PseudoRandom ( > >> -+ OUT VOID *Output, > >> -+ IN UINTN OutputLength > >> - ) > >> - { > >> -- EFI_TIME Time; > >> -- UINT32 Seed; > >> -- UINT64 MonotonicCount; > >> -+ EFI_RNG_PROTOCOL *RngProtocol; > >> -+ EFI_STATUS Status; > >> -+ UINTN AlgorithmIndex; > >> -+ > >> -+ if ((Output == NULL) || (OutputLength == 0)) { > >> -+ return EFI_INVALID_PARAMETER; > >> -+ } > >> -+ > >> -+ Status = gBS->LocateProtocol (&gEfiRngProtocolGuid, NULL, (VOID **)&RngProtocol); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "Failed to locate EFI_RNG_PROTOCOL: %r\n", Status)); > >> -+ ASSERT_EFI_ERROR (Status); > >> -+ return Status; > >> -+ } > >> -+ > >> -+ if (PcdGetBool (PcdEnforceSecureRngAlgorithms)) { > >> -+ for (AlgorithmIndex = 0; AlgorithmIndex < SECURE_HASH_ALGORITHMS_SIZE; AlgorithmIndex++) { > >> -+ Status = RngProtocol->GetRNG (RngProtocol, mSecureHashAlgorithms[AlgorithmIndex], OutputLength, (UINT8 *)Output); > >> -+ if (!EFI_ERROR (Status)) { > >> -+ // > >> -+ // Secure Algorithm was supported on this platform > >> -+ // > >> -+ return EFI_SUCCESS; > >> -+ } else if (Status == EFI_UNSUPPORTED) { > >> -+ // > >> -+ // Secure Algorithm was not supported on this platform > >> -+ // > >> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); > >> -+ > >> -+ // > >> -+ // Try the next secure algorithm > >> -+ // > >> -+ continue; > >> -+ } else { > >> -+ // > >> -+ // Some other error occurred > >> -+ // > >> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); > >> -+ ASSERT_EFI_ERROR (Status); > >> -+ return Status; > >> -+ } > >> -+ } > >> -+ > >> -+ // > >> -+ // If we get here, we failed to generate random data using any secure algorithm > >> -+ // Platform owner should ensure that at least one secure algorithm is supported > >> -+ // > >> -+ ASSERT_EFI_ERROR (Status); > >> -+ return Status; > >> -+ } > >> -+ > >> -+ // > >> -+ // Lets try using the default algorithm (which may not be secure) > >> -+ // > >> -+ Status = RngProtocol->GetRNG (RngProtocol, NULL, OutputLength, (UINT8 *)Output); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random data: %r\n", __func__, Status)); > >> -+ ASSERT_EFI_ERROR (Status); > >> -+ return Status; > >> -+ } > >> - > >> -- gRT->GetTime (&Time, NULL); > >> -- Seed = (Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second); > >> -- Seed ^= Time.Nanosecond; > >> -- Seed ^= Time.Year << 7; > >> -+ return EFI_SUCCESS; > >> -+} > >> -+ > >> -+/** > >> -+ Generate a 32-bit pseudo-random number. > >> - > >> -- gBS->GetNextMonotonicCount (&MonotonicCount); > >> -- Seed += (UINT32)MonotonicCount; > >> -+ @param[out] Output - The buffer to store the generated random number. > >> - > >> -- return Seed; > >> -+ @retval EFI_SUCCESS On Success > >> -+ @retval EFI_NOT_FOUND RNG protocol not found > >> -+ @retval Others Error from RngProtocol->GetRNG() > >> -+ > >> -+ @return Status code > >> -+**/ > >> -+EFI_STATUS > >> -+EFIAPI > >> -+PseudoRandomU32 ( > >> -+ OUT UINT32 *Output > >> -+ ) > >> -+{ > >> -+ return PseudoRandom (Output, sizeof (*Output)); > >> - } > >> - > >> - /** > >> -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > >> -index 8145d256ec..a8f534a293 100644 > >> ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > >> -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > >> -@@ -3,6 +3,7 @@ > >> - # > >> - # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > >> - # (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> > >> -+# Copyright (c) Microsoft Corporation > >> - # SPDX-License-Identifier: BSD-2-Clause-Patent > >> - # > >> - ## > >> -@@ -49,7 +50,11 @@ > >> - gEfiSmbiosTableGuid ## SOMETIMES_CONSUMES ## SystemTable > >> - gEfiSmbios3TableGuid ## SOMETIMES_CONSUMES ## SystemTable > >> - gEfiAdapterInfoMediaStateGuid ## SOMETIMES_CONSUMES > >> -- > >> -+ gEfiRngAlgorithmRaw ## CONSUMES > >> -+ gEfiRngAlgorithmSp80090Ctr256Guid ## CONSUMES > >> -+ gEfiRngAlgorithmSp80090Hmac256Guid ## CONSUMES > >> -+ gEfiRngAlgorithmSp80090Hash256Guid ## CONSUMES > >> -+ gEfiRngAlgorithmArmRndr ## CONSUMES > >> - > >> - [Protocols] > >> - gEfiSimpleNetworkProtocolGuid ## SOMETIMES_CONSUMES > >> -@@ -59,3 +64,10 @@ > >> - gEfiComponentNameProtocolGuid ## SOMETIMES_CONSUMES > >> - gEfiComponentName2ProtocolGuid ## SOMETIMES_CONSUMES > >> - gEfiAdapterInformationProtocolGuid ## SOMETIMES_CONSUMES > >> -+ gEfiRngProtocolGuid ## CONSUMES > >> -+ > >> -+[FixedPcd] > >> -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms ## CONSUMES > >> -+ > >> -+[Depex] > >> -+ gEfiRngProtocolGuid > >> -diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec > >> -index 928e84fec4..ff335e957c 100644 > >> ---- a/NetworkPkg/NetworkPkg.dec > >> -+++ b/NetworkPkg/NetworkPkg.dec > >> -@@ -5,6 +5,7 @@ > >> - # > >> - # Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR> > >> - # (C) Copyright 2015-2020 Hewlett Packard Enterprise Development LP<BR> > >> -+# Copyright (c) Microsoft Corporation > >> - # > >> - # SPDX-License-Identifier: BSD-2-Clause-Patent > >> - # > >> -@@ -127,6 +128,12 @@ > >> - # @Prompt Indicates whether SnpDxe creates event for ExitBootServices() call. > >> - gEfiNetworkPkgTokenSpaceGuid.PcdSnpCreateExitBootServicesEvent|TRUE|BOOLEAN|0x1000000C > >> - > >> -+ ## Enforces the use of Secure UEFI spec defined RNG algorithms for all network connections. > >> -+ # TRUE - Enforce the use of Secure UEFI spec defined RNG algorithms. > >> -+ # FALSE - Do not enforce and depend on the default implementation of RNG algorithm from the provider. > >> -+ # @Prompt Enforce the use of Secure UEFI spec defined RNG algorithms. > >> -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms|TRUE|BOOLEAN|0x1000000D > >> -+ > >> - [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] > >> - ## IPv6 DHCP Unique Identifier (DUID) Type configuration (From RFCs 3315 and 6355). > >> - # 01 = DUID Based on Link-layer Address Plus Time [DUID-LLT] > >> -diff --git a/NetworkPkg/SecurityFixes.yaml b/NetworkPkg/SecurityFixes.yaml > >> -index 7e900483fe..2b2c794697 100644 > >> ---- a/NetworkPkg/SecurityFixes.yaml > >> -+++ b/NetworkPkg/SecurityFixes.yaml > >> -@@ -121,3 +121,42 @@ CVE_2023_45235: > >> - - http://www.openwall.com/lists/oss-security/2024/01/16/2 > >> - - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html > >> - - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html > >> -+CVE_2023_45237: > >> -+ commit_titles: > >> -+ - "NetworkPkg:: SECURITY PATCH CVE 2023-45237" > >> -+ cve: CVE-2023-45237 > >> -+ date_reported: 2023-08-28 13:56 UTC > >> -+ description: "Bug 09 - Use of a Weak PseudoRandom Number Generator" > >> -+ note: > >> -+ files_impacted: > >> -+ - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c > >> -+ - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c > >> -+ - NetworkPkg/DnsDxe/DnsDhcp.c > >> -+ - NetworkPkg/DnsDxe/DnsImpl.c > >> -+ - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c > >> -+ - NetworkPkg/IScsiDxe/IScsiCHAP.c > >> -+ - NetworkPkg/IScsiDxe/IScsiMisc.c > >> -+ - NetworkPkg/IScsiDxe/IScsiMisc.h > >> -+ - NetworkPkg/Include/Library/NetLib.h > >> -+ - NetworkPkg/Ip4Dxe/Ip4Driver.c > >> -+ - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c > >> -+ - NetworkPkg/Ip6Dxe/Ip6Driver.c > >> -+ - NetworkPkg/Ip6Dxe/Ip6If.c > >> -+ - NetworkPkg/Ip6Dxe/Ip6Mld.c > >> -+ - NetworkPkg/Ip6Dxe/Ip6Nd.c > >> -+ - NetworkPkg/Ip6Dxe/Ip6Nd.h > >> -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.c > >> -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf > >> -+ - NetworkPkg/NetworkPkg.dec > >> -+ - NetworkPkg/TcpDxe/TcpDriver.c > >> -+ - NetworkPkg/Udp4Dxe/Udp4Driver.c > >> -+ - NetworkPkg/Udp6Dxe/Udp6Driver.c > >> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > >> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > >> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > >> -+ links: > >> -+ - https://bugzilla.tianocore.org/show_bug.cgi?id=4542 > >> -+ - https://nvd.nist.gov/vuln/detail/CVE-2023-45237 > >> -+ - http://www.openwall.com/lists/oss-security/2024/01/16/2 > >> -+ - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html > >> -+ - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html > >> -diff --git a/NetworkPkg/TcpDxe/TcpDriver.c b/NetworkPkg/TcpDxe/TcpDriver.c > >> -index 98a90e0210..8fe6badd68 100644 > >> ---- a/NetworkPkg/TcpDxe/TcpDriver.c > >> -+++ b/NetworkPkg/TcpDxe/TcpDriver.c > >> -@@ -2,7 +2,7 @@ > >> - The driver binding and service binding protocol for the TCP driver. > >> - > >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -163,7 +163,13 @@ TcpDriverEntryPoint ( > >> - ) > >> - { > >> - EFI_STATUS Status; > >> -- UINT32 Seed; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a Failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - // > >> - // Install the TCP Driver Binding Protocol > >> -@@ -203,9 +209,8 @@ TcpDriverEntryPoint ( > >> - // > >> - // Initialize ISS and random port. > >> - // > >> -- Seed = NetRandomInitSeed (); > >> -- mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; > >> -- mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (NET_RANDOM (Seed) % TCP_PORT_KNOWN)); > >> -+ mTcpGlobalIss = Random % mTcpGlobalIss; > >> -+ mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (Random % TCP_PORT_KNOWN)); > >> - mTcp6RandomPort = mTcp4RandomPort; > >> - > >> - return EFI_SUCCESS; > >> -diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf > >> -index c0acbdca57..cf5423f4c5 100644 > >> ---- a/NetworkPkg/TcpDxe/TcpDxe.inf > >> -+++ b/NetworkPkg/TcpDxe/TcpDxe.inf > >> -@@ -82,5 +82,8 @@ > >> - gEfiTcp6ProtocolGuid ## BY_START > >> - gEfiTcp6ServiceBindingProtocolGuid ## BY_START > >> - > >> -+[Depex] > >> -+ gEfiHash2ServiceBindingProtocolGuid > >> -+ > >> - [UserExtensions.TianoCore."ExtraFiles"] > >> - TcpDxeExtra.uni > >> -diff --git a/NetworkPkg/Udp4Dxe/Udp4Driver.c b/NetworkPkg/Udp4Dxe/Udp4Driver.c > >> -index cb917fcfc9..c7ea16f4cd 100644 > >> ---- a/NetworkPkg/Udp4Dxe/Udp4Driver.c > >> -+++ b/NetworkPkg/Udp4Dxe/Udp4Driver.c > >> -@@ -1,6 +1,7 @@ > >> - /** @file > >> - > >> - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> > >> -+Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -555,6 +556,13 @@ Udp4DriverEntryPoint ( > >> - ) > >> - { > >> - EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - // > >> - // Install the Udp4DriverBinding and Udp4ComponentName protocols. > >> -@@ -571,7 +579,7 @@ Udp4DriverEntryPoint ( > >> - // > >> - // Initialize the UDP random port. > >> - // > >> -- mUdp4RandomPort = (UINT16)(((UINT16)NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); > >> -+ mUdp4RandomPort = (UINT16)(((UINT16)Random) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); > >> - } > >> - > >> - return Status; > >> -diff --git a/NetworkPkg/Udp6Dxe/Udp6Driver.c b/NetworkPkg/Udp6Dxe/Udp6Driver.c > >> -index ae96fb9966..edb758d57c 100644 > >> ---- a/NetworkPkg/Udp6Dxe/Udp6Driver.c > >> -+++ b/NetworkPkg/Udp6Dxe/Udp6Driver.c > >> -@@ -2,7 +2,7 @@ > >> - Driver Binding functions and Service Binding functions for the Network driver module. > >> - > >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -596,6 +596,13 @@ Udp6DriverEntryPoint ( > >> - ) > >> - { > >> - EFI_STATUS Status; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> - > >> - // > >> - // Install the Udp6DriverBinding and Udp6ComponentName protocols. > >> -@@ -614,7 +621,7 @@ Udp6DriverEntryPoint ( > >> - // Initialize the UDP random port. > >> - // > >> - mUdp6RandomPort = (UINT16)( > >> -- ((UINT16)NetRandomInitSeed ()) % > >> -+ ((UINT16)Random) % > >> - UDP6_PORT_KNOWN + > >> - UDP6_PORT_KNOWN > >> - ); > >> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > >> -index 91146b78cb..452038c219 100644 > >> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > >> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c > >> -@@ -2,7 +2,7 @@ > >> - Functions implementation related with DHCPv4 for UefiPxeBc Driver. > >> - > >> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> > >> -- > >> -+ Copyright (c) Microsoft Corporation > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> - **/ > >> -@@ -1381,6 +1381,12 @@ PxeBcDhcp4Discover ( > >> - UINT8 VendorOptLen; > >> - UINT32 Xid; > >> - > >> -+ Status = PseudoRandomU32 (&Xid); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - Mode = Private->PxeBc.Mode; > >> - Dhcp4 = Private->Dhcp4; > >> - Status = EFI_SUCCESS; > >> -@@ -1471,7 +1477,6 @@ PxeBcDhcp4Discover ( > >> - // > >> - // Set fields of the token for the request packet. > >> - // > >> -- Xid = NET_RANDOM (NetRandomInitSeed ()); > >> - Token.Packet->Dhcp4.Header.Xid = HTONL (Xid); > >> - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)((IsBCast) ? 0x8000 : 0x0)); > >> - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); > >> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > >> -index 7fd1281c11..bcabbd2219 100644 > >> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > >> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c > >> -@@ -2180,7 +2180,7 @@ PxeBcDhcp6Discover ( > >> - UINTN ReadSize; > >> - UINT16 OpCode; > >> - UINT16 OpLen; > >> -- UINT32 Xid; > >> -+ UINT32 Random; > >> - EFI_STATUS Status; > >> - UINTN DiscoverLenNeeded; > >> - > >> -@@ -2198,6 +2198,12 @@ PxeBcDhcp6Discover ( > >> - return EFI_DEVICE_ERROR; > >> - } > >> - > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); > >> -+ return Status; > >> -+ } > >> -+ > >> - DiscoverLenNeeded = sizeof (EFI_PXE_BASE_CODE_DHCPV6_PACKET); > >> - Discover = AllocateZeroPool (DiscoverLenNeeded); > >> - if (Discover == NULL) { > >> -@@ -2207,8 +2213,7 @@ PxeBcDhcp6Discover ( > >> - // > >> - // Build the discover packet by the cached request packet before. > >> - // > >> -- Xid = NET_RANDOM (NetRandomInitSeed ()); > >> -- Discover->TransactionId = HTONL (Xid); > >> -+ Discover->TransactionId = HTONL (Random); > >> - Discover->MessageType = Request->Dhcp6.Header.MessageType; > >> - RequestOpt = Request->Dhcp6.Option; > >> - DiscoverOpt = Discover->DhcpOptions; > >> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > >> -index d84aca7e85..4cd915b411 100644 > >> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > >> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c > >> -@@ -3,6 +3,7 @@ > >> - > >> - (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> > >> - Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR> > >> -+ Copyright (c) Microsoft Corporation > >> - > >> - SPDX-License-Identifier: BSD-2-Clause-Patent > >> - > >> -@@ -892,6 +893,13 @@ PxeBcCreateIp6Children ( > >> - PXEBC_PRIVATE_PROTOCOL *Id; > >> - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; > >> - UINTN Index; > >> -+ UINT32 Random; > >> -+ > >> -+ Status = PseudoRandomU32 (&Random); > >> -+ if (EFI_ERROR (Status)) { > >> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random number using EFI_RNG_PROTOCOL: %r\n", Status)); > >> -+ return Status; > >> -+ } > >> - > >> - if (Private->Ip6Nic != NULL) { > >> - // > >> -@@ -935,9 +943,9 @@ PxeBcCreateIp6Children ( > >> - } > >> - > >> - // > >> -- // Generate a random IAID for the Dhcp6 assigned address. > >> -+ // Set a random IAID for the Dhcp6 assigned address. > >> - // > >> -- Private->IaId = NET_RANDOM (NetRandomInitSeed ()); > >> -+ Private->IaId = Random; > >> - if (Private->Snp != NULL) { > >> - for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) { > >> - Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31)); > >> --- > >> -2.40.0 > >> - > >> diff --git a/meta/recipes-core/ovmf/ovmf_git.bb b/meta/recipes-core/ovmf/ovmf_git.bb > >> index d52e3f4971..bb345688ac 100644 > >> --- a/meta/recipes-core/ovmf/ovmf_git.bb > >> +++ b/meta/recipes-core/ovmf/ovmf_git.bb > >> @@ -47,8 +47,6 @@ SRC_URI = "gitsm://github.com/tianocore/edk2.git;branch=master;protocol=https \ > >> file://CVE-2023-45229-0002.patch \ > >> file://CVE-2023-45229-0003.patch \ > >> file://CVE-2023-45229-0004.patch \ > >> - file://CVE-2023-45237-0001.patch \ > >> - file://CVE-2023-45237-0002.patch \ > >> file://CVE-2023-45236.patch \ > >> file://CVE-2022-36765-0001.patch \ > >> file://CVE-2022-36765-0002.patch \ > >> -- > >> 2.34.1 > >> > >> > >> -=-=-=-=-=-=-=-=-=-=-=- > >> Links: You receive all messages sent to this group. > >> View/Reply Online (#211699): https://lists.openembedded.org/g/openembedded-core/message/211699 > >> Mute This Topic: https://lists.openembedded.org/mt/111267276/3620601 > >> Group Owner: openembedded-core+owner@lists.openembedded.org > >> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [steve@sakoman.com] > >> -=-=-=-=-=-=-=-=-=-=-=- > >> > > -- > Kai Kang > Wind River Linux >
On 2/20/25 22:27, Steve Sakoman wrote: > On Wed, Feb 19, 2025 at 10:03 PM Kai <kai.kang@windriver.com> wrote: >> On 2/19/25 23:19, Steve Sakoman wrote: >>> Hi Kai, >>> >>> Not sure why, but this fails to apply for me: >>> >>> Applying: Revert "ovmf: Fix CVE-2023-45237" >>> Using index info to reconstruct a base tree... >>> error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch:1 >>> error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch: patch >>> does not apply >>> error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch:1 >>> error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch: patch >>> does not apply >>> error: Did you hand edit your patch? >>> It does not apply to blobs recorded in its index. >>> Patch failed at 0001 Revert "ovmf: Fix CVE-2023-45237" >> Hi Steve, >> >> How about try option `--keep-cr` with git am as I mentioned in the patch >> file? > I did use that option: > > $ git am --keep-cr > ~/Downloads/kirkstone-1-2-Revert-ovmf-Fix-CVE-2023-45237.patch > Applying: Revert "ovmf: Fix CVE-2023-45237" > error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch:1 > error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch: patch > does not apply > error: patch failed: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch:1 > error: meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch: patch > does not apply > Patch failed at 0001 Revert "ovmf: Fix CVE-2023-45237" > hint: Use 'git am --show-current-patch=diff' to see the failed patch > When you have resolved this problem, run "git am --continue". > If you prefer to skip this patch, run "git am --skip" instead. > To restore the original branch and stop patching, run "git am --abort". > > I'll just directly revert these two commits and copy/paste your text > into the revert message. Thanks a lot. Kai > > Steve > >>> On Wed, Feb 19, 2025 at 2:22 AM Kai Kang via lists.openembedded.org >>> <kai.kang=windriver.com@lists.openembedded.org> wrote: >>>> From: Kai Kang <kai.kang@windriver.com> >>>> >>>> This reverts commit 4c2d3e37308cac98614dfafed79b7323423af8bc. >>>> >>>> The fix for CVE-2023-45237 causes ovmf firmware not support pxe boot >>>> any more and no boot item in OVMF menu such as >>>> >>>> UEFI PXEv4 (MAC address) >>>> >>>> It has not been fixed by ovmf upstream and an issue has been created on >>>> >>>> https://github.com/tianocore/tianocore.github.io/issues/82 >>>> >>>> Revert the fixes for now. >>>> >>>> Signed-off-by: Kai Kang <kai.kang@windriver.com> >>>> --- >>>> >>>> Please add option `--keep-cr` when invoke `git am`. >>>> >>>> .../ovmf/ovmf/CVE-2023-45237-0001.patch | 78 - >>>> .../ovmf/ovmf/CVE-2023-45237-0002.patch | 1288 ----------------- >>>> meta/recipes-core/ovmf/ovmf_git.bb | 2 - >>>> 3 files changed, 1368 deletions(-) >>>> delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch >>>> delete mode 100644 meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch >>>> >>>> diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch >>>> deleted file mode 100644 >>>> index d1dcb8dc44..0000000000 >>>> --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch >>>> +++ /dev/null >>>> @@ -1,78 +0,0 @@ >>>> -From cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c Mon Sep 17 00:00:00 2001 >>>> -From: Pierre Gondois <pierre.gondois@arm.com> >>>> -Date: Fri, 11 Aug 2023 16:33:06 +0200 >>>> -Subject: [PATCH] MdePkg/Rng: Add GUID to describe Arm Rndr Rng algorithms >>>> - >>>> -BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4441 >>>> - >>>> -The EFI_RNG_PROTOCOL can rely on the RngLib. The RngLib has multiple >>>> -implementations, some of them are unsafe (e.g. BaseRngLibTimerLib). >>>> -To allow the RngDxe to detect when such implementation is used, >>>> -a GetRngGuid() function is added in a following patch. >>>> - >>>> -Prepare GetRngGuid() return values and add a gEfiRngAlgorithmArmRndr >>>> -to describe a Rng algorithm accessed through Arm's RNDR instruction. >>>> -[1] states that the implementation of this algorithm should be >>>> -compliant to NIST SP900-80. The compliance is not guaranteed. >>>> - >>>> -[1] Arm Architecture Reference Manual Armv8, for A-profile architecture >>>> -sK12.1 'Properties of the generated random number' >>>> - >>>> -Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> >>>> -Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> >>>> -Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> >>>> -Acked-by: Ard Biesheuvel <ardb@kernel.org> >>>> -Tested-by: Kun Qin <kun.qin@microsoft.com> >>>> - >>>> -CVE: CVE-2023-45237 >>>> - >>>> -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c] >>>> - >>>> -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> >>>> ---- >>>> - MdePkg/Include/Protocol/Rng.h | 10 ++++++++++ >>>> - MdePkg/MdePkg.dec | 1 + >>>> - 2 files changed, 11 insertions(+) >>>> - >>>> -diff --git a/MdePkg/Include/Protocol/Rng.h b/MdePkg/Include/Protocol/Rng.h >>>> -index baf425587b..38bde53240 100644 >>>> ---- a/MdePkg/Include/Protocol/Rng.h >>>> -+++ b/MdePkg/Include/Protocol/Rng.h >>>> -@@ -67,6 +67,15 @@ typedef EFI_GUID EFI_RNG_ALGORITHM; >>>> - { \ >>>> - 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 } \ >>>> - } >>>> -+/// >>>> -+/// The Arm Architecture states the RNDR that the DRBG algorithm should be compliant >>>> -+/// with NIST SP800-90A, while not mandating a particular algorithm, so as to be >>>> -+/// inclusive of different geographies. >>>> -+/// >>>> -+#define EFI_RNG_ALGORITHM_ARM_RNDR \ >>>> -+ { \ >>>> -+ 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41} \ >>>> -+ } >>>> - >>>> - /** >>>> - Returns information about the random number generation implementation. >>>> -@@ -146,5 +155,6 @@ extern EFI_GUID gEfiRngAlgorithmSp80090Ctr256Guid; >>>> - extern EFI_GUID gEfiRngAlgorithmX9313DesGuid; >>>> - extern EFI_GUID gEfiRngAlgorithmX931AesGuid; >>>> - extern EFI_GUID gEfiRngAlgorithmRaw; >>>> -+extern EFI_GUID gEfiRngAlgorithmArmRndr; >>>> - >>>> - #endif >>>> -diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec >>>> -index 59b405928b..a449dbc556 100644 >>>> ---- a/MdePkg/MdePkg.dec >>>> -+++ b/MdePkg/MdePkg.dec >>>> -@@ -594,6 +594,7 @@ >>>> - gEfiRngAlgorithmX9313DesGuid = { 0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46 }} >>>> - gEfiRngAlgorithmX931AesGuid = { 0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9 }} >>>> - gEfiRngAlgorithmRaw = { 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 }} >>>> -+ gEfiRngAlgorithmArmRndr = { 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41 }} >>>> - >>>> - ## Include/Protocol/AdapterInformation.h >>>> - gEfiAdapterInfoMediaStateGuid = { 0xD7C74207, 0xA831, 0x4A26, {0xB1, 0xF5, 0xD1, 0x93, 0x06, 0x5C, 0xE8, 0xB6 }} >>>> --- >>>> -2.40.0 >>>> - >>>> diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch >>>> deleted file mode 100644 >>>> index 722a6cd530..0000000000 >>>> --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch >>>> +++ /dev/null >>>> @@ -1,1288 +0,0 @@ >>>> -From 4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345 Mon Sep 17 00:00:00 2001 >>>> -From: Doug Flick <dougflick@microsoft.com> >>>> -Date: Wed, 8 May 2024 22:56:28 -0700 >>>> -Subject: [PATCH] NetworkPkg: SECURITY PATCH CVE-2023-45237 >>>> - >>>> -REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4542 >>>> - >>>> -Bug Overview: >>>> -PixieFail Bug #9 >>>> -CVE-2023-45237 >>>> -CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N >>>> -CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) >>>> - >>>> -Use of a Weak PseudoRandom Number Generator >>>> - >>>> -Change Overview: >>>> - >>>> -Updates all Instances of NET_RANDOM (NetRandomInitSeed ()) to either >>>> - >>>> -> >>>> -> EFI_STATUS >>>> -> EFIAPI >>>> -> PseudoRandomU32 ( >>>> -> OUT UINT32 *Output >>>> -> ); >>>> -> >>>> - >>>> -or (depending on the use case) >>>> - >>>> -> >>>> -> EFI_STATUS >>>> -> EFIAPI >>>> -> PseudoRandom ( >>>> -> OUT VOID *Output, >>>> -> IN UINTN OutputLength >>>> -> ); >>>> -> >>>> - >>>> -This is because the use of >>>> - >>>> -Example: >>>> - >>>> -The following code snippet PseudoRandomU32 () function is used: >>>> - >>>> -> >>>> -> UINT32 Random; >>>> -> >>>> -> Status = PseudoRandomU32 (&Random); >>>> -> if (EFI_ERROR (Status)) { >>>> -> DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", >>>> -__func__, Status)); >>>> -> return Status; >>>> -> } >>>> -> >>>> - >>>> -This also introduces a new PCD to enable/disable the use of the >>>> -secure implementation of algorithms for PseudoRandom () and >>>> -instead depend on the default implementation. This may be required for >>>> -some platforms where the UEFI Spec defined algorithms are not available. >>>> - >>>> -> >>>> -> PcdEnforceSecureRngAlgorithms >>>> -> >>>> - >>>> -If the platform does not have any one of the UEFI defined >>>> -secure RNG algorithms then the driver will assert. >>>> - >>>> -Cc: Saloni Kasbekar <saloni.kasbekar@intel.com> >>>> -Cc: Zachary Clark-williams <zachary.clark-williams@intel.com> >>>> - >>>> -Signed-off-by: Doug Flick [MSFT] <doug.edk2@gmail.com> >>>> -Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com> >>>> - >>>> -CVE: CVE-2023-45237 >>>> - >>>> -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345] >>>> - >>>> -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> >>>> ---- >>>> - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c | 10 +- >>>> - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c | 11 +- >>>> - NetworkPkg/DnsDxe/DnsDhcp.c | 10 +- >>>> - NetworkPkg/DnsDxe/DnsImpl.c | 11 +- >>>> - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c | 10 +- >>>> - NetworkPkg/IScsiDxe/IScsiCHAP.c | 19 ++- >>>> - NetworkPkg/IScsiDxe/IScsiMisc.c | 14 +-- >>>> - NetworkPkg/IScsiDxe/IScsiMisc.h | 6 +- >>>> - NetworkPkg/Include/Library/NetLib.h | 40 +++++-- >>>> - NetworkPkg/Ip4Dxe/Ip4Driver.c | 10 +- >>>> - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c | 9 +- >>>> - NetworkPkg/Ip6Dxe/Ip6Driver.c | 17 ++- >>>> - NetworkPkg/Ip6Dxe/Ip6If.c | 12 +- >>>> - NetworkPkg/Ip6Dxe/Ip6Mld.c | 12 +- >>>> - NetworkPkg/Ip6Dxe/Ip6Nd.c | 33 +++++- >>>> - NetworkPkg/Ip6Dxe/Ip6Nd.h | 8 +- >>>> - NetworkPkg/Library/DxeNetLib/DxeNetLib.c | 130 ++++++++++++++++++--- >>>> - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf | 14 ++- >>>> - NetworkPkg/NetworkPkg.dec | 7 ++ >>>> - NetworkPkg/SecurityFixes.yaml | 39 +++++++ >>>> - NetworkPkg/TcpDxe/TcpDriver.c | 15 ++- >>>> - NetworkPkg/TcpDxe/TcpDxe.inf | 3 + >>>> - NetworkPkg/Udp4Dxe/Udp4Driver.c | 10 +- >>>> - NetworkPkg/Udp6Dxe/Udp6Driver.c | 11 +- >>>> - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c | 9 +- >>>> - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c | 11 +- >>>> - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c | 12 +- >>>> - 27 files changed, 410 insertions(+), 83 deletions(-) >>>> - >>>> -diff --git a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >>>> -index 8c37e93be3..892caee368 100644 >>>> ---- a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >>>> -+++ b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >>>> -@@ -1,6 +1,7 @@ >>>> - /** @file >>>> - >>>> - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -189,6 +190,13 @@ Dhcp4CreateService ( >>>> - { >>>> - DHCP_SERVICE *DhcpSb; >>>> - EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - *Service = NULL; >>>> - DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE)); >>>> -@@ -203,7 +211,7 @@ Dhcp4CreateService ( >>>> - DhcpSb->Image = ImageHandle; >>>> - InitializeListHead (&DhcpSb->Children); >>>> - DhcpSb->DhcpState = Dhcp4Stopped; >>>> -- DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ()); >>>> -+ DhcpSb->Xid = Random; >>>> - CopyMem ( >>>> - &DhcpSb->ServiceBinding, >>>> - &mDhcp4ServiceBindingTemplate, >>>> -diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >>>> -index b591a4605b..e7f2787a98 100644 >>>> ---- a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >>>> -+++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >>>> -@@ -3,7 +3,7 @@ >>>> - implementation for Dhcp6 Driver. >>>> - >>>> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -123,6 +123,13 @@ Dhcp6CreateService ( >>>> - { >>>> - DHCP6_SERVICE *Dhcp6Srv; >>>> - EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - *Service = NULL; >>>> - Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE)); >>>> -@@ -147,7 +154,7 @@ Dhcp6CreateService ( >>>> - Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE; >>>> - Dhcp6Srv->Controller = Controller; >>>> - Dhcp6Srv->Image = ImageHandle; >>>> -- Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ())); >>>> -+ Dhcp6Srv->Xid = (0xffffff & Random); >>>> - >>>> - CopyMem ( >>>> - &Dhcp6Srv->ServiceBinding, >>>> -diff --git a/NetworkPkg/DnsDxe/DnsDhcp.c b/NetworkPkg/DnsDxe/DnsDhcp.c >>>> -index 933565a32d..9eb3c1d2d8 100644 >>>> ---- a/NetworkPkg/DnsDxe/DnsDhcp.c >>>> -+++ b/NetworkPkg/DnsDxe/DnsDhcp.c >>>> -@@ -2,6 +2,7 @@ >>>> - Functions implementation related with DHCPv4/v6 for DNS driver. >>>> - >>>> - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -277,6 +278,7 @@ GetDns4ServerFromDhcp4 ( >>>> - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; >>>> - BOOLEAN IsDone; >>>> - UINTN Index; >>>> -+ UINT32 Random; >>>> - >>>> - Image = Instance->Service->ImageHandle; >>>> - Controller = Instance->Service->ControllerHandle; >>>> -@@ -292,6 +294,12 @@ GetDns4ServerFromDhcp4 ( >>>> - Data = NULL; >>>> - InterfaceInfo = NULL; >>>> - >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - ZeroMem ((UINT8 *)ParaList, sizeof (ParaList)); >>>> - >>>> - ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA)); >>>> -@@ -467,7 +475,7 @@ GetDns4ServerFromDhcp4 ( >>>> - >>>> - Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet); >>>> - >>>> -- Token.Packet->Dhcp4.Header.Xid = HTONL (NET_RANDOM (NetRandomInitSeed ())); >>>> -+ Token.Packet->Dhcp4.Header.Xid = Random; >>>> - >>>> - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000); >>>> - >>>> -diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c >>>> -index d311812800..c2629bb8df 100644 >>>> ---- a/NetworkPkg/DnsDxe/DnsImpl.c >>>> -+++ b/NetworkPkg/DnsDxe/DnsImpl.c >>>> -@@ -2,6 +2,7 @@ >>>> - DnsDxe support functions implementation. >>>> - >>>> - Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -1963,6 +1964,14 @@ ConstructDNSQuery ( >>>> - NET_FRAGMENT Frag; >>>> - DNS_HEADER *DnsHeader; >>>> - DNS_QUERY_SECTION *DnsQuery; >>>> -+ EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - // >>>> - // Messages carried by UDP are restricted to 512 bytes (not counting the IP >>>> -@@ -1977,7 +1986,7 @@ ConstructDNSQuery ( >>>> - // Fill header >>>> - // >>>> - DnsHeader = (DNS_HEADER *)Frag.Bulk; >>>> -- DnsHeader->Identification = (UINT16)NET_RANDOM (NetRandomInitSeed ()); >>>> -+ DnsHeader->Identification = (UINT16)Random; >>>> - DnsHeader->Flags.Uint16 = 0x0000; >>>> - DnsHeader->Flags.Bits.RD = 1; >>>> - DnsHeader->Flags.Bits.OpCode = DNS_FLAGS_OPCODE_STANDARD; >>>> -diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >>>> -index b22cef4ff5..f964515b0f 100644 >>>> ---- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >>>> -+++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >>>> -@@ -2,6 +2,7 @@ >>>> - Functions implementation related with DHCPv6 for HTTP boot driver. >>>> - >>>> - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -951,6 +952,7 @@ HttpBootDhcp6Sarr ( >>>> - UINT32 OptCount; >>>> - UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE]; >>>> - EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> - >>>> - Dhcp6 = Private->Dhcp6; >>>> - ASSERT (Dhcp6 != NULL); >>>> -@@ -961,6 +963,12 @@ HttpBootDhcp6Sarr ( >>>> - OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer); >>>> - ASSERT (OptCount > 0); >>>> - >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION)); >>>> - if (Retransmit == NULL) { >>>> - return EFI_OUT_OF_RESOURCES; >>>> -@@ -976,7 +984,7 @@ HttpBootDhcp6Sarr ( >>>> - Config.IaInfoEvent = NULL; >>>> - Config.RapidCommit = FALSE; >>>> - Config.ReconfigureAccept = FALSE; >>>> -- Config.IaDescriptor.IaId = NET_RANDOM (NetRandomInitSeed ()); >>>> -+ Config.IaDescriptor.IaId = Random; >>>> - Config.IaDescriptor.Type = EFI_DHCP6_IA_TYPE_NA; >>>> - Config.SolicitRetransmission = Retransmit; >>>> - Retransmit->Irt = 4; >>>> -diff --git a/NetworkPkg/IScsiDxe/IScsiCHAP.c b/NetworkPkg/IScsiDxe/IScsiCHAP.c >>>> -index b507f11cd4..bebb1ac29b 100644 >>>> ---- a/NetworkPkg/IScsiDxe/IScsiCHAP.c >>>> -+++ b/NetworkPkg/IScsiDxe/IScsiCHAP.c >>>> -@@ -3,6 +3,7 @@ >>>> - Configuration. >>>> - >>>> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -576,16 +577,24 @@ IScsiCHAPToSendReq ( >>>> - // >>>> - // CHAP_I=<I> >>>> - // >>>> -- IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); >>>> -+ Status = IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ break; >>>> -+ } >>>> -+ >>>> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); >>>> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); >>>> - // >>>> - // CHAP_C=<C> >>>> - // >>>> -- IScsiGenRandom ( >>>> -- (UINT8 *)AuthData->OutChallenge, >>>> -- AuthData->Hash->DigestSize >>>> -- ); >>>> -+ Status = IScsiGenRandom ( >>>> -+ (UINT8 *)AuthData->OutChallenge, >>>> -+ AuthData->Hash->DigestSize >>>> -+ ); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ break; >>>> -+ } >>>> -+ >>>> - BinToHexStatus = IScsiBinToHex ( >>>> - (UINT8 *)AuthData->OutChallenge, >>>> - AuthData->Hash->DigestSize, >>>> -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c >>>> -index b3ea90158f..cd77f1a13e 100644 >>>> ---- a/NetworkPkg/IScsiDxe/IScsiMisc.c >>>> -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c >>>> -@@ -2,6 +2,7 @@ >>>> - Miscellaneous routines for iSCSI driver. >>>> - >>>> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -474,20 +475,17 @@ IScsiNetNtoi ( >>>> - @param[in, out] Rand The buffer to contain random numbers. >>>> - @param[in] RandLength The length of the Rand buffer. >>>> - >>>> -+ @retval EFI_SUCCESS on success >>>> -+ @retval others on error >>>> -+ >>>> - **/ >>>> --VOID >>>> -+EFI_STATUS >>>> - IScsiGenRandom ( >>>> - IN OUT UINT8 *Rand, >>>> - IN UINTN RandLength >>>> - ) >>>> - { >>>> -- UINT32 Random; >>>> -- >>>> -- while (RandLength > 0) { >>>> -- Random = NET_RANDOM (NetRandomInitSeed ()); >>>> -- *Rand++ = (UINT8)(Random); >>>> -- RandLength--; >>>> -- } >>>> -+ return PseudoRandom (Rand, RandLength); >>>> - } >>>> - >>>> - /** >>>> -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h >>>> -index a951eee70e..91b2cd2261 100644 >>>> ---- a/NetworkPkg/IScsiDxe/IScsiMisc.h >>>> -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h >>>> -@@ -2,6 +2,7 @@ >>>> - Miscellaneous definitions for iSCSI driver. >>>> - >>>> - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -202,8 +203,11 @@ IScsiNetNtoi ( >>>> - @param[in, out] Rand The buffer to contain random numbers. >>>> - @param[in] RandLength The length of the Rand buffer. >>>> - >>>> -+ @retval EFI_SUCCESS on success >>>> -+ @retval others on error >>>> -+ >>>> - **/ >>>> --VOID >>>> -+EFI_STATUS >>>> - IScsiGenRandom ( >>>> - IN OUT UINT8 *Rand, >>>> - IN UINTN RandLength >>>> -diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h >>>> -index 8c0e62b388..e8108b79db 100644 >>>> ---- a/NetworkPkg/Include/Library/NetLib.h >>>> -+++ b/NetworkPkg/Include/Library/NetLib.h >>>> -@@ -3,6 +3,7 @@ >>>> - It provides basic functions for the UEFI network stack. >>>> - >>>> - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -539,8 +540,6 @@ extern EFI_IPv4_ADDRESS mZeroIp4Addr; >>>> - #define TICKS_PER_MS 10000U >>>> - #define TICKS_PER_SECOND 10000000U >>>> - >>>> --#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL) >>>> -- >>>> - /** >>>> - Extract a UINT32 from a byte stream. >>>> - >>>> -@@ -580,19 +579,40 @@ NetPutUint32 ( >>>> - ); >>>> - >>>> - /** >>>> -- Initialize a random seed using current time and monotonic count. >>>> -+ Generate a Random output data given a length. >>>> - >>>> -- Get current time and monotonic count first. Then initialize a random seed >>>> -- based on some basic mathematics operation on the hour, day, minute, second, >>>> -- nanosecond and year of the current time and the monotonic count value. >>>> -+ @param[out] Output - The buffer to store the generated random data. >>>> -+ @param[in] OutputLength - The length of the output buffer. >>>> - >>>> -- @return The random seed initialized with current time. >>>> -+ @retval EFI_SUCCESS On Success >>>> -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero >>>> -+ @retval EFI_NOT_FOUND RNG protocol not found >>>> -+ @retval Others Error from RngProtocol->GetRNG() >>>> - >>>> -+ @return Status code >>>> - **/ >>>> --UINT32 >>>> -+EFI_STATUS >>>> - EFIAPI >>>> --NetRandomInitSeed ( >>>> -- VOID >>>> -+PseudoRandom ( >>>> -+ OUT VOID *Output, >>>> -+ IN UINTN OutputLength >>>> -+ ); >>>> -+ >>>> -+/** >>>> -+ Generate a 32-bit pseudo-random number. >>>> -+ >>>> -+ @param[out] Output - The buffer to store the generated random number. >>>> -+ >>>> -+ @retval EFI_SUCCESS On Success >>>> -+ @retval EFI_NOT_FOUND RNG protocol not found >>>> -+ @retval Others Error from RngProtocol->GetRNG() >>>> -+ >>>> -+ @return Status code >>>> -+**/ >>>> -+EFI_STATUS >>>> -+EFIAPI >>>> -+PseudoRandomU32 ( >>>> -+ OUT UINT32 *Output >>>> - ); >>>> - >>>> - #define NET_LIST_USER_STRUCT(Entry, Type, Field) \ >>>> -diff --git a/NetworkPkg/Ip4Dxe/Ip4Driver.c b/NetworkPkg/Ip4Dxe/Ip4Driver.c >>>> -index ec483ff01f..683423f38d 100644 >>>> ---- a/NetworkPkg/Ip4Dxe/Ip4Driver.c >>>> -+++ b/NetworkPkg/Ip4Dxe/Ip4Driver.c >>>> -@@ -2,6 +2,7 @@ >>>> - The driver binding and service binding protocol for IP4 driver. >>>> - >>>> - Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> >>>> - >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> -@@ -549,11 +550,18 @@ Ip4DriverBindingStart ( >>>> - EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; >>>> - UINTN Index; >>>> - IP4_CONFIG2_DATA_ITEM *DataItem; >>>> -+ UINT32 Random; >>>> - >>>> - IpSb = NULL; >>>> - Ip4Cfg2 = NULL; >>>> - DataItem = NULL; >>>> - >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - // >>>> - // Test for the Ip4 service binding protocol >>>> - // >>>> -@@ -653,7 +661,7 @@ Ip4DriverBindingStart ( >>>> - // >>>> - // Initialize the IP4 ID >>>> - // >>>> -- mIp4Id = (UINT16)NET_RANDOM (NetRandomInitSeed ()); >>>> -+ mIp4Id = (UINT16)Random; >>>> - >>>> - return Status; >>>> - >>>> -diff --git a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >>>> -index 70e232ce6c..4c1354d26c 100644 >>>> ---- a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >>>> -+++ b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >>>> -@@ -2276,6 +2276,13 @@ Ip6ConfigInitInstance ( >>>> - UINTN Index; >>>> - UINT16 IfIndex; >>>> - IP6_CONFIG_DATA_ITEM *DataItem; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance); >>>> - >>>> -@@ -2381,7 +2388,7 @@ Ip6ConfigInitInstance ( >>>> - // The NV variable is not set, so generate a random IAID, and write down the >>>> - // fresh new configuration as the NV variable now. >>>> - // >>>> -- Instance->IaId = NET_RANDOM (NetRandomInitSeed ()); >>>> -+ Instance->IaId = Random; >>>> - >>>> - for (Index = 0; Index < IpSb->SnpMode.HwAddressSize; Index++) { >>>> - Instance->IaId |= (IpSb->SnpMode.CurrentAddress.Addr[Index] << ((Index << 3) & 31)); >>>> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c >>>> -index b483a7d136..cbe011dad4 100644 >>>> ---- a/NetworkPkg/Ip6Dxe/Ip6Driver.c >>>> -+++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c >>>> -@@ -3,7 +3,7 @@ >>>> - >>>> - Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR> >>>> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -316,7 +316,11 @@ Ip6CreateService ( >>>> - IpSb->CurHopLimit = IP6_HOP_LIMIT; >>>> - IpSb->LinkMTU = IP6_MIN_LINK_MTU; >>>> - IpSb->BaseReachableTime = IP6_REACHABLE_TIME; >>>> -- Ip6UpdateReachableTime (IpSb); >>>> -+ Status = Ip6UpdateReachableTime (IpSb); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ goto ON_ERROR; >>>> -+ } >>>> -+ >>>> - // >>>> - // RFC4861 RETRANS_TIMER: 1,000 milliseconds >>>> - // >>>> -@@ -516,11 +520,18 @@ Ip6DriverBindingStart ( >>>> - EFI_STATUS Status; >>>> - EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; >>>> - IP6_CONFIG_DATA_ITEM *DataItem; >>>> -+ UINT32 Random; >>>> - >>>> - IpSb = NULL; >>>> - Ip6Cfg = NULL; >>>> - DataItem = NULL; >>>> - >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - // >>>> - // Test for the Ip6 service binding protocol >>>> - // >>>> -@@ -656,7 +667,7 @@ Ip6DriverBindingStart ( >>>> - // >>>> - // Initialize the IP6 ID >>>> - // >>>> -- mIp6Id = NET_RANDOM (NetRandomInitSeed ()); >>>> -+ mIp6Id = Random; >>>> - >>>> - return EFI_SUCCESS; >>>> - >>>> -diff --git a/NetworkPkg/Ip6Dxe/Ip6If.c b/NetworkPkg/Ip6Dxe/Ip6If.c >>>> -index 4629c05f25..f3d11c4d21 100644 >>>> ---- a/NetworkPkg/Ip6Dxe/Ip6If.c >>>> -+++ b/NetworkPkg/Ip6Dxe/Ip6If.c >>>> -@@ -2,7 +2,7 @@ >>>> - Implement IP6 pseudo interface. >>>> - >>>> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -89,6 +89,14 @@ Ip6SetAddress ( >>>> - IP6_PREFIX_LIST_ENTRY *PrefixEntry; >>>> - UINT64 Delay; >>>> - IP6_DELAY_JOIN_LIST *DelayNode; >>>> -+ EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - NET_CHECK_SIGNATURE (Interface, IP6_INTERFACE_SIGNATURE); >>>> - >>>> -@@ -164,7 +172,7 @@ Ip6SetAddress ( >>>> - // Thus queue the address to be processed in Duplicate Address Detection module >>>> - // after the delay time (in milliseconds). >>>> - // >>>> -- Delay = (UINT64)NET_RANDOM (NetRandomInitSeed ()); >>>> -+ Delay = (UINT64)Random; >>>> - Delay = MultU64x32 (Delay, IP6_ONE_SECOND_IN_MS); >>>> - Delay = RShiftU64 (Delay, 32); >>>> - >>>> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Mld.c b/NetworkPkg/Ip6Dxe/Ip6Mld.c >>>> -index e6b2b653e2..498a118543 100644 >>>> ---- a/NetworkPkg/Ip6Dxe/Ip6Mld.c >>>> -+++ b/NetworkPkg/Ip6Dxe/Ip6Mld.c >>>> -@@ -696,7 +696,15 @@ Ip6UpdateDelayTimer ( >>>> - IN OUT IP6_MLD_GROUP *Group >>>> - ) >>>> - { >>>> -- UINT32 Delay; >>>> -+ UINT32 Delay; >>>> -+ EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - // >>>> - // If the Query packet specifies a Maximum Response Delay of zero, perform timer >>>> -@@ -715,7 +723,7 @@ Ip6UpdateDelayTimer ( >>>> - // is less than the remaining value of the running timer. >>>> - // >>>> - if ((Group->DelayTimer == 0) || (Delay < Group->DelayTimer)) { >>>> -- Group->DelayTimer = Delay / 4294967295UL * NET_RANDOM (NetRandomInitSeed ()); >>>> -+ Group->DelayTimer = Delay / 4294967295UL * Random; >>>> - } >>>> - >>>> - return EFI_SUCCESS; >>>> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.c b/NetworkPkg/Ip6Dxe/Ip6Nd.c >>>> -index c10c7017f8..72aa45c10f 100644 >>>> ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.c >>>> -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.c >>>> -@@ -2,7 +2,7 @@ >>>> - Implementation of Neighbor Discovery support routines. >>>> - >>>> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -16,17 +16,28 @@ EFI_MAC_ADDRESS mZeroMacAddress; >>>> - >>>> - @param[in, out] IpSb Points to the IP6_SERVICE. >>>> - >>>> -+ @retval EFI_SUCCESS ReachableTime Updated >>>> -+ @retval others Failed to update ReachableTime >>>> - **/ >>>> --VOID >>>> -+EFI_STATUS >>>> - Ip6UpdateReachableTime ( >>>> - IN OUT IP6_SERVICE *IpSb >>>> - ) >>>> - { >>>> -- UINT32 Random; >>>> -+ UINT32 Random; >>>> -+ EFI_STATUS Status; >>>> - >>>> -- Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> -+ Random = (Random / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; >>>> - Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED; >>>> - IpSb->ReachableTime = (IpSb->BaseReachableTime * Random) / IP6_RANDOM_FACTOR_SCALE; >>>> -+ >>>> -+ return EFI_SUCCESS; >>>> - } >>>> - >>>> - /** >>>> -@@ -972,10 +983,17 @@ Ip6InitDADProcess ( >>>> - IP6_SERVICE *IpSb; >>>> - EFI_STATUS Status; >>>> - UINT32 MaxDelayTick; >>>> -+ UINT32 Random; >>>> - >>>> - NET_CHECK_SIGNATURE (IpIf, IP6_INTERFACE_SIGNATURE); >>>> - ASSERT (AddressInfo != NULL); >>>> - >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - // >>>> - // Do nothing if we have already started DAD on the address. >>>> - // >>>> -@@ -1014,7 +1032,7 @@ Ip6InitDADProcess ( >>>> - Entry->Transmit = 0; >>>> - Entry->Receive = 0; >>>> - MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS; >>>> -- Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5; >>>> -+ Entry->RetransTick = (MaxDelayTick * ((Random % 5) + 1)) / 5; >>>> - Entry->AddressInfo = AddressInfo; >>>> - Entry->Callback = Callback; >>>> - Entry->Context = Context; >>>> -@@ -2078,7 +2096,10 @@ Ip6ProcessRouterAdvertise ( >>>> - // in BaseReachableTime and recompute a ReachableTime. >>>> - // >>>> - IpSb->BaseReachableTime = ReachableTime; >>>> -- Ip6UpdateReachableTime (IpSb); >>>> -+ Status = Ip6UpdateReachableTime (IpSb); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ goto Exit; >>>> -+ } >>>> - } >>>> - >>>> - if (RetransTimer != 0) { >>>> -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.h b/NetworkPkg/Ip6Dxe/Ip6Nd.h >>>> -index bf64e9114e..5795e23c7d 100644 >>>> ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.h >>>> -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.h >>>> -@@ -2,7 +2,7 @@ >>>> - Definition of Neighbor Discovery support routines. >>>> - >>>> - Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -780,10 +780,10 @@ Ip6OnArpResolved ( >>>> - /** >>>> - Update the ReachableTime in IP6 service binding instance data, in milliseconds. >>>> - >>>> -- @param[in, out] IpSb Points to the IP6_SERVICE. >>>> -- >>>> -+ @retval EFI_SUCCESS ReachableTime Updated >>>> -+ @retval others Failed to update ReachableTime >>>> - **/ >>>> --VOID >>>> -+EFI_STATUS >>>> - Ip6UpdateReachableTime ( >>>> - IN OUT IP6_SERVICE *IpSb >>>> - ); >>>> -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c >>>> -index fd4a9e15a8..01c13c08d2 100644 >>>> ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c >>>> -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c >>>> -@@ -3,6 +3,7 @@ >>>> - >>>> - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> >>>> - (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - **/ >>>> - >>>> -@@ -31,6 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - #include <Library/DevicePathLib.h> >>>> - #include <Library/PrintLib.h> >>>> - #include <Library/UefiLib.h> >>>> -+#include <Protocol/Rng.h> >>>> - >>>> - #define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE) >>>> - #define DEFAULT_ZERO_START ((UINTN) ~0) >>>> -@@ -127,6 +129,25 @@ GLOBAL_REMOVE_IF_UNREFERENCED VLAN_DEVICE_PATH mNetVlanDevicePathTemplate = { >>>> - 0 >>>> - }; >>>> - >>>> -+// >>>> -+// These represent UEFI SPEC defined algorithms that should be supported by >>>> -+// the RNG protocol and are generally considered secure. >>>> -+// >>>> -+// The order of the algorithms in this array is important. This order is the order >>>> -+// in which the algorithms will be tried by the RNG protocol. >>>> -+// If your platform needs to use a specific algorithm for the random number generator, >>>> -+// then you should place that algorithm first in the array. >>>> -+// >>>> -+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID *mSecureHashAlgorithms[] = { >>>> -+ &gEfiRngAlgorithmSp80090Ctr256Guid, // SP800-90A DRBG CTR using AES-256 >>>> -+ &gEfiRngAlgorithmSp80090Hmac256Guid, // SP800-90A DRBG HMAC using SHA-256 >>>> -+ &gEfiRngAlgorithmSp80090Hash256Guid, // SP800-90A DRBG Hash using SHA-256 >>>> -+ &gEfiRngAlgorithmArmRndr, // unspecified SP800-90A DRBG via ARM RNDR register >>>> -+ &gEfiRngAlgorithmRaw, // Raw data from NRBG (or TRNG) >>>> -+}; >>>> -+ >>>> -+#define SECURE_HASH_ALGORITHMS_SIZE (sizeof (mSecureHashAlgorithms) / sizeof (EFI_GUID *)) >>>> -+ >>>> - /** >>>> - Locate the handles that support SNP, then open one of them >>>> - to send the syslog packets. The caller isn't required to close >>>> -@@ -884,34 +905,107 @@ Ip6Swap128 ( >>>> - } >>>> - >>>> - /** >>>> -- Initialize a random seed using current time and monotonic count. >>>> -+ Generate a Random output data given a length. >>>> - >>>> -- Get current time and monotonic count first. Then initialize a random seed >>>> -- based on some basic mathematics operation on the hour, day, minute, second, >>>> -- nanosecond and year of the current time and the monotonic count value. >>>> -+ @param[out] Output - The buffer to store the generated random data. >>>> -+ @param[in] OutputLength - The length of the output buffer. >>>> - >>>> -- @return The random seed initialized with current time. >>>> -+ @retval EFI_SUCCESS On Success >>>> -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero >>>> -+ @retval EFI_NOT_FOUND RNG protocol not found >>>> -+ @retval Others Error from RngProtocol->GetRNG() >>>> - >>>> -+ @return Status code >>>> - **/ >>>> --UINT32 >>>> -+EFI_STATUS >>>> - EFIAPI >>>> --NetRandomInitSeed ( >>>> -- VOID >>>> -+PseudoRandom ( >>>> -+ OUT VOID *Output, >>>> -+ IN UINTN OutputLength >>>> - ) >>>> - { >>>> -- EFI_TIME Time; >>>> -- UINT32 Seed; >>>> -- UINT64 MonotonicCount; >>>> -+ EFI_RNG_PROTOCOL *RngProtocol; >>>> -+ EFI_STATUS Status; >>>> -+ UINTN AlgorithmIndex; >>>> -+ >>>> -+ if ((Output == NULL) || (OutputLength == 0)) { >>>> -+ return EFI_INVALID_PARAMETER; >>>> -+ } >>>> -+ >>>> -+ Status = gBS->LocateProtocol (&gEfiRngProtocolGuid, NULL, (VOID **)&RngProtocol); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "Failed to locate EFI_RNG_PROTOCOL: %r\n", Status)); >>>> -+ ASSERT_EFI_ERROR (Status); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> -+ if (PcdGetBool (PcdEnforceSecureRngAlgorithms)) { >>>> -+ for (AlgorithmIndex = 0; AlgorithmIndex < SECURE_HASH_ALGORITHMS_SIZE; AlgorithmIndex++) { >>>> -+ Status = RngProtocol->GetRNG (RngProtocol, mSecureHashAlgorithms[AlgorithmIndex], OutputLength, (UINT8 *)Output); >>>> -+ if (!EFI_ERROR (Status)) { >>>> -+ // >>>> -+ // Secure Algorithm was supported on this platform >>>> -+ // >>>> -+ return EFI_SUCCESS; >>>> -+ } else if (Status == EFI_UNSUPPORTED) { >>>> -+ // >>>> -+ // Secure Algorithm was not supported on this platform >>>> -+ // >>>> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); >>>> -+ >>>> -+ // >>>> -+ // Try the next secure algorithm >>>> -+ // >>>> -+ continue; >>>> -+ } else { >>>> -+ // >>>> -+ // Some other error occurred >>>> -+ // >>>> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); >>>> -+ ASSERT_EFI_ERROR (Status); >>>> -+ return Status; >>>> -+ } >>>> -+ } >>>> -+ >>>> -+ // >>>> -+ // If we get here, we failed to generate random data using any secure algorithm >>>> -+ // Platform owner should ensure that at least one secure algorithm is supported >>>> -+ // >>>> -+ ASSERT_EFI_ERROR (Status); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> -+ // >>>> -+ // Lets try using the default algorithm (which may not be secure) >>>> -+ // >>>> -+ Status = RngProtocol->GetRNG (RngProtocol, NULL, OutputLength, (UINT8 *)Output); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random data: %r\n", __func__, Status)); >>>> -+ ASSERT_EFI_ERROR (Status); >>>> -+ return Status; >>>> -+ } >>>> - >>>> -- gRT->GetTime (&Time, NULL); >>>> -- Seed = (Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second); >>>> -- Seed ^= Time.Nanosecond; >>>> -- Seed ^= Time.Year << 7; >>>> -+ return EFI_SUCCESS; >>>> -+} >>>> -+ >>>> -+/** >>>> -+ Generate a 32-bit pseudo-random number. >>>> - >>>> -- gBS->GetNextMonotonicCount (&MonotonicCount); >>>> -- Seed += (UINT32)MonotonicCount; >>>> -+ @param[out] Output - The buffer to store the generated random number. >>>> - >>>> -- return Seed; >>>> -+ @retval EFI_SUCCESS On Success >>>> -+ @retval EFI_NOT_FOUND RNG protocol not found >>>> -+ @retval Others Error from RngProtocol->GetRNG() >>>> -+ >>>> -+ @return Status code >>>> -+**/ >>>> -+EFI_STATUS >>>> -+EFIAPI >>>> -+PseudoRandomU32 ( >>>> -+ OUT UINT32 *Output >>>> -+ ) >>>> -+{ >>>> -+ return PseudoRandom (Output, sizeof (*Output)); >>>> - } >>>> - >>>> - /** >>>> -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >>>> -index 8145d256ec..a8f534a293 100644 >>>> ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >>>> -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >>>> -@@ -3,6 +3,7 @@ >>>> - # >>>> - # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >>>> - # (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> >>>> -+# Copyright (c) Microsoft Corporation >>>> - # SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - # >>>> - ## >>>> -@@ -49,7 +50,11 @@ >>>> - gEfiSmbiosTableGuid ## SOMETIMES_CONSUMES ## SystemTable >>>> - gEfiSmbios3TableGuid ## SOMETIMES_CONSUMES ## SystemTable >>>> - gEfiAdapterInfoMediaStateGuid ## SOMETIMES_CONSUMES >>>> -- >>>> -+ gEfiRngAlgorithmRaw ## CONSUMES >>>> -+ gEfiRngAlgorithmSp80090Ctr256Guid ## CONSUMES >>>> -+ gEfiRngAlgorithmSp80090Hmac256Guid ## CONSUMES >>>> -+ gEfiRngAlgorithmSp80090Hash256Guid ## CONSUMES >>>> -+ gEfiRngAlgorithmArmRndr ## CONSUMES >>>> - >>>> - [Protocols] >>>> - gEfiSimpleNetworkProtocolGuid ## SOMETIMES_CONSUMES >>>> -@@ -59,3 +64,10 @@ >>>> - gEfiComponentNameProtocolGuid ## SOMETIMES_CONSUMES >>>> - gEfiComponentName2ProtocolGuid ## SOMETIMES_CONSUMES >>>> - gEfiAdapterInformationProtocolGuid ## SOMETIMES_CONSUMES >>>> -+ gEfiRngProtocolGuid ## CONSUMES >>>> -+ >>>> -+[FixedPcd] >>>> -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms ## CONSUMES >>>> -+ >>>> -+[Depex] >>>> -+ gEfiRngProtocolGuid >>>> -diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec >>>> -index 928e84fec4..ff335e957c 100644 >>>> ---- a/NetworkPkg/NetworkPkg.dec >>>> -+++ b/NetworkPkg/NetworkPkg.dec >>>> -@@ -5,6 +5,7 @@ >>>> - # >>>> - # Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR> >>>> - # (C) Copyright 2015-2020 Hewlett Packard Enterprise Development LP<BR> >>>> -+# Copyright (c) Microsoft Corporation >>>> - # >>>> - # SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - # >>>> -@@ -127,6 +128,12 @@ >>>> - # @Prompt Indicates whether SnpDxe creates event for ExitBootServices() call. >>>> - gEfiNetworkPkgTokenSpaceGuid.PcdSnpCreateExitBootServicesEvent|TRUE|BOOLEAN|0x1000000C >>>> - >>>> -+ ## Enforces the use of Secure UEFI spec defined RNG algorithms for all network connections. >>>> -+ # TRUE - Enforce the use of Secure UEFI spec defined RNG algorithms. >>>> -+ # FALSE - Do not enforce and depend on the default implementation of RNG algorithm from the provider. >>>> -+ # @Prompt Enforce the use of Secure UEFI spec defined RNG algorithms. >>>> -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms|TRUE|BOOLEAN|0x1000000D >>>> -+ >>>> - [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] >>>> - ## IPv6 DHCP Unique Identifier (DUID) Type configuration (From RFCs 3315 and 6355). >>>> - # 01 = DUID Based on Link-layer Address Plus Time [DUID-LLT] >>>> -diff --git a/NetworkPkg/SecurityFixes.yaml b/NetworkPkg/SecurityFixes.yaml >>>> -index 7e900483fe..2b2c794697 100644 >>>> ---- a/NetworkPkg/SecurityFixes.yaml >>>> -+++ b/NetworkPkg/SecurityFixes.yaml >>>> -@@ -121,3 +121,42 @@ CVE_2023_45235: >>>> - - http://www.openwall.com/lists/oss-security/2024/01/16/2 >>>> - - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html >>>> - - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html >>>> -+CVE_2023_45237: >>>> -+ commit_titles: >>>> -+ - "NetworkPkg:: SECURITY PATCH CVE 2023-45237" >>>> -+ cve: CVE-2023-45237 >>>> -+ date_reported: 2023-08-28 13:56 UTC >>>> -+ description: "Bug 09 - Use of a Weak PseudoRandom Number Generator" >>>> -+ note: >>>> -+ files_impacted: >>>> -+ - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c >>>> -+ - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c >>>> -+ - NetworkPkg/DnsDxe/DnsDhcp.c >>>> -+ - NetworkPkg/DnsDxe/DnsImpl.c >>>> -+ - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c >>>> -+ - NetworkPkg/IScsiDxe/IScsiCHAP.c >>>> -+ - NetworkPkg/IScsiDxe/IScsiMisc.c >>>> -+ - NetworkPkg/IScsiDxe/IScsiMisc.h >>>> -+ - NetworkPkg/Include/Library/NetLib.h >>>> -+ - NetworkPkg/Ip4Dxe/Ip4Driver.c >>>> -+ - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c >>>> -+ - NetworkPkg/Ip6Dxe/Ip6Driver.c >>>> -+ - NetworkPkg/Ip6Dxe/Ip6If.c >>>> -+ - NetworkPkg/Ip6Dxe/Ip6Mld.c >>>> -+ - NetworkPkg/Ip6Dxe/Ip6Nd.c >>>> -+ - NetworkPkg/Ip6Dxe/Ip6Nd.h >>>> -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.c >>>> -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf >>>> -+ - NetworkPkg/NetworkPkg.dec >>>> -+ - NetworkPkg/TcpDxe/TcpDriver.c >>>> -+ - NetworkPkg/Udp4Dxe/Udp4Driver.c >>>> -+ - NetworkPkg/Udp6Dxe/Udp6Driver.c >>>> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >>>> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >>>> -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >>>> -+ links: >>>> -+ - https://bugzilla.tianocore.org/show_bug.cgi?id=4542 >>>> -+ - https://nvd.nist.gov/vuln/detail/CVE-2023-45237 >>>> -+ - http://www.openwall.com/lists/oss-security/2024/01/16/2 >>>> -+ - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html >>>> -+ - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html >>>> -diff --git a/NetworkPkg/TcpDxe/TcpDriver.c b/NetworkPkg/TcpDxe/TcpDriver.c >>>> -index 98a90e0210..8fe6badd68 100644 >>>> ---- a/NetworkPkg/TcpDxe/TcpDriver.c >>>> -+++ b/NetworkPkg/TcpDxe/TcpDriver.c >>>> -@@ -2,7 +2,7 @@ >>>> - The driver binding and service binding protocol for the TCP driver. >>>> - >>>> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -163,7 +163,13 @@ TcpDriverEntryPoint ( >>>> - ) >>>> - { >>>> - EFI_STATUS Status; >>>> -- UINT32 Seed; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a Failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - // >>>> - // Install the TCP Driver Binding Protocol >>>> -@@ -203,9 +209,8 @@ TcpDriverEntryPoint ( >>>> - // >>>> - // Initialize ISS and random port. >>>> - // >>>> -- Seed = NetRandomInitSeed (); >>>> -- mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; >>>> -- mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (NET_RANDOM (Seed) % TCP_PORT_KNOWN)); >>>> -+ mTcpGlobalIss = Random % mTcpGlobalIss; >>>> -+ mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (Random % TCP_PORT_KNOWN)); >>>> - mTcp6RandomPort = mTcp4RandomPort; >>>> - >>>> - return EFI_SUCCESS; >>>> -diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf >>>> -index c0acbdca57..cf5423f4c5 100644 >>>> ---- a/NetworkPkg/TcpDxe/TcpDxe.inf >>>> -+++ b/NetworkPkg/TcpDxe/TcpDxe.inf >>>> -@@ -82,5 +82,8 @@ >>>> - gEfiTcp6ProtocolGuid ## BY_START >>>> - gEfiTcp6ServiceBindingProtocolGuid ## BY_START >>>> - >>>> -+[Depex] >>>> -+ gEfiHash2ServiceBindingProtocolGuid >>>> -+ >>>> - [UserExtensions.TianoCore."ExtraFiles"] >>>> - TcpDxeExtra.uni >>>> -diff --git a/NetworkPkg/Udp4Dxe/Udp4Driver.c b/NetworkPkg/Udp4Dxe/Udp4Driver.c >>>> -index cb917fcfc9..c7ea16f4cd 100644 >>>> ---- a/NetworkPkg/Udp4Dxe/Udp4Driver.c >>>> -+++ b/NetworkPkg/Udp4Dxe/Udp4Driver.c >>>> -@@ -1,6 +1,7 @@ >>>> - /** @file >>>> - >>>> - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -+Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -555,6 +556,13 @@ Udp4DriverEntryPoint ( >>>> - ) >>>> - { >>>> - EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - // >>>> - // Install the Udp4DriverBinding and Udp4ComponentName protocols. >>>> -@@ -571,7 +579,7 @@ Udp4DriverEntryPoint ( >>>> - // >>>> - // Initialize the UDP random port. >>>> - // >>>> -- mUdp4RandomPort = (UINT16)(((UINT16)NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); >>>> -+ mUdp4RandomPort = (UINT16)(((UINT16)Random) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); >>>> - } >>>> - >>>> - return Status; >>>> -diff --git a/NetworkPkg/Udp6Dxe/Udp6Driver.c b/NetworkPkg/Udp6Dxe/Udp6Driver.c >>>> -index ae96fb9966..edb758d57c 100644 >>>> ---- a/NetworkPkg/Udp6Dxe/Udp6Driver.c >>>> -+++ b/NetworkPkg/Udp6Dxe/Udp6Driver.c >>>> -@@ -2,7 +2,7 @@ >>>> - Driver Binding functions and Service Binding functions for the Network driver module. >>>> - >>>> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -596,6 +596,13 @@ Udp6DriverEntryPoint ( >>>> - ) >>>> - { >>>> - EFI_STATUS Status; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - // >>>> - // Install the Udp6DriverBinding and Udp6ComponentName protocols. >>>> -@@ -614,7 +621,7 @@ Udp6DriverEntryPoint ( >>>> - // Initialize the UDP random port. >>>> - // >>>> - mUdp6RandomPort = (UINT16)( >>>> -- ((UINT16)NetRandomInitSeed ()) % >>>> -+ ((UINT16)Random) % >>>> - UDP6_PORT_KNOWN + >>>> - UDP6_PORT_KNOWN >>>> - ); >>>> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >>>> -index 91146b78cb..452038c219 100644 >>>> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >>>> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c >>>> -@@ -2,7 +2,7 @@ >>>> - Functions implementation related with DHCPv4 for UefiPxeBc Driver. >>>> - >>>> - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> >>>> -- >>>> -+ Copyright (c) Microsoft Corporation >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> - **/ >>>> -@@ -1381,6 +1381,12 @@ PxeBcDhcp4Discover ( >>>> - UINT8 VendorOptLen; >>>> - UINT32 Xid; >>>> - >>>> -+ Status = PseudoRandomU32 (&Xid); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - Mode = Private->PxeBc.Mode; >>>> - Dhcp4 = Private->Dhcp4; >>>> - Status = EFI_SUCCESS; >>>> -@@ -1471,7 +1477,6 @@ PxeBcDhcp4Discover ( >>>> - // >>>> - // Set fields of the token for the request packet. >>>> - // >>>> -- Xid = NET_RANDOM (NetRandomInitSeed ()); >>>> - Token.Packet->Dhcp4.Header.Xid = HTONL (Xid); >>>> - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)((IsBCast) ? 0x8000 : 0x0)); >>>> - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); >>>> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >>>> -index 7fd1281c11..bcabbd2219 100644 >>>> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >>>> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c >>>> -@@ -2180,7 +2180,7 @@ PxeBcDhcp6Discover ( >>>> - UINTN ReadSize; >>>> - UINT16 OpCode; >>>> - UINT16 OpLen; >>>> -- UINT32 Xid; >>>> -+ UINT32 Random; >>>> - EFI_STATUS Status; >>>> - UINTN DiscoverLenNeeded; >>>> - >>>> -@@ -2198,6 +2198,12 @@ PxeBcDhcp6Discover ( >>>> - return EFI_DEVICE_ERROR; >>>> - } >>>> - >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); >>>> -+ return Status; >>>> -+ } >>>> -+ >>>> - DiscoverLenNeeded = sizeof (EFI_PXE_BASE_CODE_DHCPV6_PACKET); >>>> - Discover = AllocateZeroPool (DiscoverLenNeeded); >>>> - if (Discover == NULL) { >>>> -@@ -2207,8 +2213,7 @@ PxeBcDhcp6Discover ( >>>> - // >>>> - // Build the discover packet by the cached request packet before. >>>> - // >>>> -- Xid = NET_RANDOM (NetRandomInitSeed ()); >>>> -- Discover->TransactionId = HTONL (Xid); >>>> -+ Discover->TransactionId = HTONL (Random); >>>> - Discover->MessageType = Request->Dhcp6.Header.MessageType; >>>> - RequestOpt = Request->Dhcp6.Option; >>>> - DiscoverOpt = Discover->DhcpOptions; >>>> -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >>>> -index d84aca7e85..4cd915b411 100644 >>>> ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >>>> -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c >>>> -@@ -3,6 +3,7 @@ >>>> - >>>> - (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> >>>> - Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR> >>>> -+ Copyright (c) Microsoft Corporation >>>> - >>>> - SPDX-License-Identifier: BSD-2-Clause-Patent >>>> - >>>> -@@ -892,6 +893,13 @@ PxeBcCreateIp6Children ( >>>> - PXEBC_PRIVATE_PROTOCOL *Id; >>>> - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; >>>> - UINTN Index; >>>> -+ UINT32 Random; >>>> -+ >>>> -+ Status = PseudoRandomU32 (&Random); >>>> -+ if (EFI_ERROR (Status)) { >>>> -+ DEBUG ((DEBUG_ERROR, "Failed to generate random number using EFI_RNG_PROTOCOL: %r\n", Status)); >>>> -+ return Status; >>>> -+ } >>>> - >>>> - if (Private->Ip6Nic != NULL) { >>>> - // >>>> -@@ -935,9 +943,9 @@ PxeBcCreateIp6Children ( >>>> - } >>>> - >>>> - // >>>> -- // Generate a random IAID for the Dhcp6 assigned address. >>>> -+ // Set a random IAID for the Dhcp6 assigned address. >>>> - // >>>> -- Private->IaId = NET_RANDOM (NetRandomInitSeed ()); >>>> -+ Private->IaId = Random; >>>> - if (Private->Snp != NULL) { >>>> - for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) { >>>> - Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31)); >>>> --- >>>> -2.40.0 >>>> - >>>> diff --git a/meta/recipes-core/ovmf/ovmf_git.bb b/meta/recipes-core/ovmf/ovmf_git.bb >>>> index d52e3f4971..bb345688ac 100644 >>>> --- a/meta/recipes-core/ovmf/ovmf_git.bb >>>> +++ b/meta/recipes-core/ovmf/ovmf_git.bb >>>> @@ -47,8 +47,6 @@ SRC_URI = "gitsm://github.com/tianocore/edk2.git;branch=master;protocol=https \ >>>> file://CVE-2023-45229-0002.patch \ >>>> file://CVE-2023-45229-0003.patch \ >>>> file://CVE-2023-45229-0004.patch \ >>>> - file://CVE-2023-45237-0001.patch \ >>>> - file://CVE-2023-45237-0002.patch \ >>>> file://CVE-2023-45236.patch \ >>>> file://CVE-2022-36765-0001.patch \ >>>> file://CVE-2022-36765-0002.patch \ >>>> -- >>>> 2.34.1 >>>> >>>> >>>> -=-=-=-=-=-=-=-=-=-=-=- >>>> Links: You receive all messages sent to this group. >>>> View/Reply Online (#211699): https://lists.openembedded.org/g/openembedded-core/message/211699 >>>> Mute This Topic: https://lists.openembedded.org/mt/111267276/3620601 >>>> Group Owner: openembedded-core+owner@lists.openembedded.org >>>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [steve@sakoman.com] >>>> -=-=-=-=-=-=-=-=-=-=-=- >>>> >> -- >> Kai Kang >> Wind River Linux >>
diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch deleted file mode 100644 index d1dcb8dc44..0000000000 --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0001.patch +++ /dev/null @@ -1,78 +0,0 @@ -From cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c Mon Sep 17 00:00:00 2001 -From: Pierre Gondois <pierre.gondois@arm.com> -Date: Fri, 11 Aug 2023 16:33:06 +0200 -Subject: [PATCH] MdePkg/Rng: Add GUID to describe Arm Rndr Rng algorithms - -BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4441 - -The EFI_RNG_PROTOCOL can rely on the RngLib. The RngLib has multiple -implementations, some of them are unsafe (e.g. BaseRngLibTimerLib). -To allow the RngDxe to detect when such implementation is used, -a GetRngGuid() function is added in a following patch. - -Prepare GetRngGuid() return values and add a gEfiRngAlgorithmArmRndr -to describe a Rng algorithm accessed through Arm's RNDR instruction. -[1] states that the implementation of this algorithm should be -compliant to NIST SP900-80. The compliance is not guaranteed. - -[1] Arm Architecture Reference Manual Armv8, for A-profile architecture -sK12.1 'Properties of the generated random number' - -Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> -Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> -Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> -Acked-by: Ard Biesheuvel <ardb@kernel.org> -Tested-by: Kun Qin <kun.qin@microsoft.com> - -CVE: CVE-2023-45237 - -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c] - -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> ---- - MdePkg/Include/Protocol/Rng.h | 10 ++++++++++ - MdePkg/MdePkg.dec | 1 + - 2 files changed, 11 insertions(+) - -diff --git a/MdePkg/Include/Protocol/Rng.h b/MdePkg/Include/Protocol/Rng.h -index baf425587b..38bde53240 100644 ---- a/MdePkg/Include/Protocol/Rng.h -+++ b/MdePkg/Include/Protocol/Rng.h -@@ -67,6 +67,15 @@ typedef EFI_GUID EFI_RNG_ALGORITHM; - { \ - 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 } \ - } -+/// -+/// The Arm Architecture states the RNDR that the DRBG algorithm should be compliant -+/// with NIST SP800-90A, while not mandating a particular algorithm, so as to be -+/// inclusive of different geographies. -+/// -+#define EFI_RNG_ALGORITHM_ARM_RNDR \ -+ { \ -+ 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41} \ -+ } - - /** - Returns information about the random number generation implementation. -@@ -146,5 +155,6 @@ extern EFI_GUID gEfiRngAlgorithmSp80090Ctr256Guid; - extern EFI_GUID gEfiRngAlgorithmX9313DesGuid; - extern EFI_GUID gEfiRngAlgorithmX931AesGuid; - extern EFI_GUID gEfiRngAlgorithmRaw; -+extern EFI_GUID gEfiRngAlgorithmArmRndr; - - #endif -diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec -index 59b405928b..a449dbc556 100644 ---- a/MdePkg/MdePkg.dec -+++ b/MdePkg/MdePkg.dec -@@ -594,6 +594,7 @@ - gEfiRngAlgorithmX9313DesGuid = { 0x63c4785a, 0xca34, 0x4012, {0xa3, 0xc8, 0x0b, 0x6a, 0x32, 0x4f, 0x55, 0x46 }} - gEfiRngAlgorithmX931AesGuid = { 0xacd03321, 0x777e, 0x4d3d, {0xb1, 0xc8, 0x20, 0xcf, 0xd8, 0x88, 0x20, 0xc9 }} - gEfiRngAlgorithmRaw = { 0xe43176d7, 0xb6e8, 0x4827, {0xb7, 0x84, 0x7f, 0xfd, 0xc4, 0xb6, 0x85, 0x61 }} -+ gEfiRngAlgorithmArmRndr = { 0x43d2fde3, 0x9d4e, 0x4d79, {0x02, 0x96, 0xa8, 0x9b, 0xca, 0x78, 0x08, 0x41 }} - - ## Include/Protocol/AdapterInformation.h - gEfiAdapterInfoMediaStateGuid = { 0xD7C74207, 0xA831, 0x4A26, {0xB1, 0xF5, 0xD1, 0x93, 0x06, 0x5C, 0xE8, 0xB6 }} --- -2.40.0 - diff --git a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch b/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch deleted file mode 100644 index 722a6cd530..0000000000 --- a/meta/recipes-core/ovmf/ovmf/CVE-2023-45237-0002.patch +++ /dev/null @@ -1,1288 +0,0 @@ -From 4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345 Mon Sep 17 00:00:00 2001 -From: Doug Flick <dougflick@microsoft.com> -Date: Wed, 8 May 2024 22:56:28 -0700 -Subject: [PATCH] NetworkPkg: SECURITY PATCH CVE-2023-45237 - -REF:https://bugzilla.tianocore.org/show_bug.cgi?id=4542 - -Bug Overview: -PixieFail Bug #9 -CVE-2023-45237 -CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N -CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG) - -Use of a Weak PseudoRandom Number Generator - -Change Overview: - -Updates all Instances of NET_RANDOM (NetRandomInitSeed ()) to either - -> -> EFI_STATUS -> EFIAPI -> PseudoRandomU32 ( -> OUT UINT32 *Output -> ); -> - -or (depending on the use case) - -> -> EFI_STATUS -> EFIAPI -> PseudoRandom ( -> OUT VOID *Output, -> IN UINTN OutputLength -> ); -> - -This is because the use of - -Example: - -The following code snippet PseudoRandomU32 () function is used: - -> -> UINT32 Random; -> -> Status = PseudoRandomU32 (&Random); -> if (EFI_ERROR (Status)) { -> DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", -__func__, Status)); -> return Status; -> } -> - -This also introduces a new PCD to enable/disable the use of the -secure implementation of algorithms for PseudoRandom () and -instead depend on the default implementation. This may be required for -some platforms where the UEFI Spec defined algorithms are not available. - -> -> PcdEnforceSecureRngAlgorithms -> - -If the platform does not have any one of the UEFI defined -secure RNG algorithms then the driver will assert. - -Cc: Saloni Kasbekar <saloni.kasbekar@intel.com> -Cc: Zachary Clark-williams <zachary.clark-williams@intel.com> - -Signed-off-by: Doug Flick [MSFT] <doug.edk2@gmail.com> -Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com> - -CVE: CVE-2023-45237 - -Upstream-Status: Backport [https://github.com/tianocore/edk2/commit/4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345] - -Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com> ---- - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c | 10 +- - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c | 11 +- - NetworkPkg/DnsDxe/DnsDhcp.c | 10 +- - NetworkPkg/DnsDxe/DnsImpl.c | 11 +- - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c | 10 +- - NetworkPkg/IScsiDxe/IScsiCHAP.c | 19 ++- - NetworkPkg/IScsiDxe/IScsiMisc.c | 14 +-- - NetworkPkg/IScsiDxe/IScsiMisc.h | 6 +- - NetworkPkg/Include/Library/NetLib.h | 40 +++++-- - NetworkPkg/Ip4Dxe/Ip4Driver.c | 10 +- - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c | 9 +- - NetworkPkg/Ip6Dxe/Ip6Driver.c | 17 ++- - NetworkPkg/Ip6Dxe/Ip6If.c | 12 +- - NetworkPkg/Ip6Dxe/Ip6Mld.c | 12 +- - NetworkPkg/Ip6Dxe/Ip6Nd.c | 33 +++++- - NetworkPkg/Ip6Dxe/Ip6Nd.h | 8 +- - NetworkPkg/Library/DxeNetLib/DxeNetLib.c | 130 ++++++++++++++++++--- - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf | 14 ++- - NetworkPkg/NetworkPkg.dec | 7 ++ - NetworkPkg/SecurityFixes.yaml | 39 +++++++ - NetworkPkg/TcpDxe/TcpDriver.c | 15 ++- - NetworkPkg/TcpDxe/TcpDxe.inf | 3 + - NetworkPkg/Udp4Dxe/Udp4Driver.c | 10 +- - NetworkPkg/Udp6Dxe/Udp6Driver.c | 11 +- - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c | 9 +- - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c | 11 +- - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c | 12 +- - 27 files changed, 410 insertions(+), 83 deletions(-) - -diff --git a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c -index 8c37e93be3..892caee368 100644 ---- a/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c -+++ b/NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c -@@ -1,6 +1,7 @@ - /** @file - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -189,6 +190,13 @@ Dhcp4CreateService ( - { - DHCP_SERVICE *DhcpSb; - EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - *Service = NULL; - DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE)); -@@ -203,7 +211,7 @@ Dhcp4CreateService ( - DhcpSb->Image = ImageHandle; - InitializeListHead (&DhcpSb->Children); - DhcpSb->DhcpState = Dhcp4Stopped; -- DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ()); -+ DhcpSb->Xid = Random; - CopyMem ( - &DhcpSb->ServiceBinding, - &mDhcp4ServiceBindingTemplate, -diff --git a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c -index b591a4605b..e7f2787a98 100644 ---- a/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c -+++ b/NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c -@@ -3,7 +3,7 @@ - implementation for Dhcp6 Driver. - - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -123,6 +123,13 @@ Dhcp6CreateService ( - { - DHCP6_SERVICE *Dhcp6Srv; - EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - *Service = NULL; - Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE)); -@@ -147,7 +154,7 @@ Dhcp6CreateService ( - Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE; - Dhcp6Srv->Controller = Controller; - Dhcp6Srv->Image = ImageHandle; -- Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ())); -+ Dhcp6Srv->Xid = (0xffffff & Random); - - CopyMem ( - &Dhcp6Srv->ServiceBinding, -diff --git a/NetworkPkg/DnsDxe/DnsDhcp.c b/NetworkPkg/DnsDxe/DnsDhcp.c -index 933565a32d..9eb3c1d2d8 100644 ---- a/NetworkPkg/DnsDxe/DnsDhcp.c -+++ b/NetworkPkg/DnsDxe/DnsDhcp.c -@@ -2,6 +2,7 @@ - Functions implementation related with DHCPv4/v6 for DNS driver. - - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -277,6 +278,7 @@ GetDns4ServerFromDhcp4 ( - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token; - BOOLEAN IsDone; - UINTN Index; -+ UINT32 Random; - - Image = Instance->Service->ImageHandle; - Controller = Instance->Service->ControllerHandle; -@@ -292,6 +294,12 @@ GetDns4ServerFromDhcp4 ( - Data = NULL; - InterfaceInfo = NULL; - -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - ZeroMem ((UINT8 *)ParaList, sizeof (ParaList)); - - ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA)); -@@ -467,7 +475,7 @@ GetDns4ServerFromDhcp4 ( - - Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet); - -- Token.Packet->Dhcp4.Header.Xid = HTONL (NET_RANDOM (NetRandomInitSeed ())); -+ Token.Packet->Dhcp4.Header.Xid = Random; - - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000); - -diff --git a/NetworkPkg/DnsDxe/DnsImpl.c b/NetworkPkg/DnsDxe/DnsImpl.c -index d311812800..c2629bb8df 100644 ---- a/NetworkPkg/DnsDxe/DnsImpl.c -+++ b/NetworkPkg/DnsDxe/DnsImpl.c -@@ -2,6 +2,7 @@ - DnsDxe support functions implementation. - - Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -1963,6 +1964,14 @@ ConstructDNSQuery ( - NET_FRAGMENT Frag; - DNS_HEADER *DnsHeader; - DNS_QUERY_SECTION *DnsQuery; -+ EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - // - // Messages carried by UDP are restricted to 512 bytes (not counting the IP -@@ -1977,7 +1986,7 @@ ConstructDNSQuery ( - // Fill header - // - DnsHeader = (DNS_HEADER *)Frag.Bulk; -- DnsHeader->Identification = (UINT16)NET_RANDOM (NetRandomInitSeed ()); -+ DnsHeader->Identification = (UINT16)Random; - DnsHeader->Flags.Uint16 = 0x0000; - DnsHeader->Flags.Bits.RD = 1; - DnsHeader->Flags.Bits.OpCode = DNS_FLAGS_OPCODE_STANDARD; -diff --git a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c -index b22cef4ff5..f964515b0f 100644 ---- a/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c -+++ b/NetworkPkg/HttpBootDxe/HttpBootDhcp6.c -@@ -2,6 +2,7 @@ - Functions implementation related with DHCPv6 for HTTP boot driver. - - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -951,6 +952,7 @@ HttpBootDhcp6Sarr ( - UINT32 OptCount; - UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE]; - EFI_STATUS Status; -+ UINT32 Random; - - Dhcp6 = Private->Dhcp6; - ASSERT (Dhcp6 != NULL); -@@ -961,6 +963,12 @@ HttpBootDhcp6Sarr ( - OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer); - ASSERT (OptCount > 0); - -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION)); - if (Retransmit == NULL) { - return EFI_OUT_OF_RESOURCES; -@@ -976,7 +984,7 @@ HttpBootDhcp6Sarr ( - Config.IaInfoEvent = NULL; - Config.RapidCommit = FALSE; - Config.ReconfigureAccept = FALSE; -- Config.IaDescriptor.IaId = NET_RANDOM (NetRandomInitSeed ()); -+ Config.IaDescriptor.IaId = Random; - Config.IaDescriptor.Type = EFI_DHCP6_IA_TYPE_NA; - Config.SolicitRetransmission = Retransmit; - Retransmit->Irt = 4; -diff --git a/NetworkPkg/IScsiDxe/IScsiCHAP.c b/NetworkPkg/IScsiDxe/IScsiCHAP.c -index b507f11cd4..bebb1ac29b 100644 ---- a/NetworkPkg/IScsiDxe/IScsiCHAP.c -+++ b/NetworkPkg/IScsiDxe/IScsiCHAP.c -@@ -3,6 +3,7 @@ - Configuration. - - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -576,16 +577,24 @@ IScsiCHAPToSendReq ( - // - // CHAP_I=<I> - // -- IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); -+ Status = IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1); -+ if (EFI_ERROR (Status)) { -+ break; -+ } -+ - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier); - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr); - // - // CHAP_C=<C> - // -- IScsiGenRandom ( -- (UINT8 *)AuthData->OutChallenge, -- AuthData->Hash->DigestSize -- ); -+ Status = IScsiGenRandom ( -+ (UINT8 *)AuthData->OutChallenge, -+ AuthData->Hash->DigestSize -+ ); -+ if (EFI_ERROR (Status)) { -+ break; -+ } -+ - BinToHexStatus = IScsiBinToHex ( - (UINT8 *)AuthData->OutChallenge, - AuthData->Hash->DigestSize, -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c -index b3ea90158f..cd77f1a13e 100644 ---- a/NetworkPkg/IScsiDxe/IScsiMisc.c -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c -@@ -2,6 +2,7 @@ - Miscellaneous routines for iSCSI driver. - - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -474,20 +475,17 @@ IScsiNetNtoi ( - @param[in, out] Rand The buffer to contain random numbers. - @param[in] RandLength The length of the Rand buffer. - -+ @retval EFI_SUCCESS on success -+ @retval others on error -+ - **/ --VOID -+EFI_STATUS - IScsiGenRandom ( - IN OUT UINT8 *Rand, - IN UINTN RandLength - ) - { -- UINT32 Random; -- -- while (RandLength > 0) { -- Random = NET_RANDOM (NetRandomInitSeed ()); -- *Rand++ = (UINT8)(Random); -- RandLength--; -- } -+ return PseudoRandom (Rand, RandLength); - } - - /** -diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h -index a951eee70e..91b2cd2261 100644 ---- a/NetworkPkg/IScsiDxe/IScsiMisc.h -+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h -@@ -2,6 +2,7 @@ - Miscellaneous definitions for iSCSI driver. - - Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -202,8 +203,11 @@ IScsiNetNtoi ( - @param[in, out] Rand The buffer to contain random numbers. - @param[in] RandLength The length of the Rand buffer. - -+ @retval EFI_SUCCESS on success -+ @retval others on error -+ - **/ --VOID -+EFI_STATUS - IScsiGenRandom ( - IN OUT UINT8 *Rand, - IN UINTN RandLength -diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h -index 8c0e62b388..e8108b79db 100644 ---- a/NetworkPkg/Include/Library/NetLib.h -+++ b/NetworkPkg/Include/Library/NetLib.h -@@ -3,6 +3,7 @@ - It provides basic functions for the UEFI network stack. - - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -539,8 +540,6 @@ extern EFI_IPv4_ADDRESS mZeroIp4Addr; - #define TICKS_PER_MS 10000U - #define TICKS_PER_SECOND 10000000U - --#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL) -- - /** - Extract a UINT32 from a byte stream. - -@@ -580,19 +579,40 @@ NetPutUint32 ( - ); - - /** -- Initialize a random seed using current time and monotonic count. -+ Generate a Random output data given a length. - -- Get current time and monotonic count first. Then initialize a random seed -- based on some basic mathematics operation on the hour, day, minute, second, -- nanosecond and year of the current time and the monotonic count value. -+ @param[out] Output - The buffer to store the generated random data. -+ @param[in] OutputLength - The length of the output buffer. - -- @return The random seed initialized with current time. -+ @retval EFI_SUCCESS On Success -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero -+ @retval EFI_NOT_FOUND RNG protocol not found -+ @retval Others Error from RngProtocol->GetRNG() - -+ @return Status code - **/ --UINT32 -+EFI_STATUS - EFIAPI --NetRandomInitSeed ( -- VOID -+PseudoRandom ( -+ OUT VOID *Output, -+ IN UINTN OutputLength -+ ); -+ -+/** -+ Generate a 32-bit pseudo-random number. -+ -+ @param[out] Output - The buffer to store the generated random number. -+ -+ @retval EFI_SUCCESS On Success -+ @retval EFI_NOT_FOUND RNG protocol not found -+ @retval Others Error from RngProtocol->GetRNG() -+ -+ @return Status code -+**/ -+EFI_STATUS -+EFIAPI -+PseudoRandomU32 ( -+ OUT UINT32 *Output - ); - - #define NET_LIST_USER_STRUCT(Entry, Type, Field) \ -diff --git a/NetworkPkg/Ip4Dxe/Ip4Driver.c b/NetworkPkg/Ip4Dxe/Ip4Driver.c -index ec483ff01f..683423f38d 100644 ---- a/NetworkPkg/Ip4Dxe/Ip4Driver.c -+++ b/NetworkPkg/Ip4Dxe/Ip4Driver.c -@@ -2,6 +2,7 @@ - The driver binding and service binding protocol for IP4 driver. - - Copyright (c) 2005 - 2019, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> - - SPDX-License-Identifier: BSD-2-Clause-Patent -@@ -549,11 +550,18 @@ Ip4DriverBindingStart ( - EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2; - UINTN Index; - IP4_CONFIG2_DATA_ITEM *DataItem; -+ UINT32 Random; - - IpSb = NULL; - Ip4Cfg2 = NULL; - DataItem = NULL; - -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - // - // Test for the Ip4 service binding protocol - // -@@ -653,7 +661,7 @@ Ip4DriverBindingStart ( - // - // Initialize the IP4 ID - // -- mIp4Id = (UINT16)NET_RANDOM (NetRandomInitSeed ()); -+ mIp4Id = (UINT16)Random; - - return Status; - -diff --git a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c -index 70e232ce6c..4c1354d26c 100644 ---- a/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c -+++ b/NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c -@@ -2276,6 +2276,13 @@ Ip6ConfigInitInstance ( - UINTN Index; - UINT16 IfIndex; - IP6_CONFIG_DATA_ITEM *DataItem; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance); - -@@ -2381,7 +2388,7 @@ Ip6ConfigInitInstance ( - // The NV variable is not set, so generate a random IAID, and write down the - // fresh new configuration as the NV variable now. - // -- Instance->IaId = NET_RANDOM (NetRandomInitSeed ()); -+ Instance->IaId = Random; - - for (Index = 0; Index < IpSb->SnpMode.HwAddressSize; Index++) { - Instance->IaId |= (IpSb->SnpMode.CurrentAddress.Addr[Index] << ((Index << 3) & 31)); -diff --git a/NetworkPkg/Ip6Dxe/Ip6Driver.c b/NetworkPkg/Ip6Dxe/Ip6Driver.c -index b483a7d136..cbe011dad4 100644 ---- a/NetworkPkg/Ip6Dxe/Ip6Driver.c -+++ b/NetworkPkg/Ip6Dxe/Ip6Driver.c -@@ -3,7 +3,7 @@ - - Copyright (c) 2009 - 2019, Intel Corporation. All rights reserved.<BR> - (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -316,7 +316,11 @@ Ip6CreateService ( - IpSb->CurHopLimit = IP6_HOP_LIMIT; - IpSb->LinkMTU = IP6_MIN_LINK_MTU; - IpSb->BaseReachableTime = IP6_REACHABLE_TIME; -- Ip6UpdateReachableTime (IpSb); -+ Status = Ip6UpdateReachableTime (IpSb); -+ if (EFI_ERROR (Status)) { -+ goto ON_ERROR; -+ } -+ - // - // RFC4861 RETRANS_TIMER: 1,000 milliseconds - // -@@ -516,11 +520,18 @@ Ip6DriverBindingStart ( - EFI_STATUS Status; - EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg; - IP6_CONFIG_DATA_ITEM *DataItem; -+ UINT32 Random; - - IpSb = NULL; - Ip6Cfg = NULL; - DataItem = NULL; - -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - // - // Test for the Ip6 service binding protocol - // -@@ -656,7 +667,7 @@ Ip6DriverBindingStart ( - // - // Initialize the IP6 ID - // -- mIp6Id = NET_RANDOM (NetRandomInitSeed ()); -+ mIp6Id = Random; - - return EFI_SUCCESS; - -diff --git a/NetworkPkg/Ip6Dxe/Ip6If.c b/NetworkPkg/Ip6Dxe/Ip6If.c -index 4629c05f25..f3d11c4d21 100644 ---- a/NetworkPkg/Ip6Dxe/Ip6If.c -+++ b/NetworkPkg/Ip6Dxe/Ip6If.c -@@ -2,7 +2,7 @@ - Implement IP6 pseudo interface. - - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -89,6 +89,14 @@ Ip6SetAddress ( - IP6_PREFIX_LIST_ENTRY *PrefixEntry; - UINT64 Delay; - IP6_DELAY_JOIN_LIST *DelayNode; -+ EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - NET_CHECK_SIGNATURE (Interface, IP6_INTERFACE_SIGNATURE); - -@@ -164,7 +172,7 @@ Ip6SetAddress ( - // Thus queue the address to be processed in Duplicate Address Detection module - // after the delay time (in milliseconds). - // -- Delay = (UINT64)NET_RANDOM (NetRandomInitSeed ()); -+ Delay = (UINT64)Random; - Delay = MultU64x32 (Delay, IP6_ONE_SECOND_IN_MS); - Delay = RShiftU64 (Delay, 32); - -diff --git a/NetworkPkg/Ip6Dxe/Ip6Mld.c b/NetworkPkg/Ip6Dxe/Ip6Mld.c -index e6b2b653e2..498a118543 100644 ---- a/NetworkPkg/Ip6Dxe/Ip6Mld.c -+++ b/NetworkPkg/Ip6Dxe/Ip6Mld.c -@@ -696,7 +696,15 @@ Ip6UpdateDelayTimer ( - IN OUT IP6_MLD_GROUP *Group - ) - { -- UINT32 Delay; -+ UINT32 Delay; -+ EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - // - // If the Query packet specifies a Maximum Response Delay of zero, perform timer -@@ -715,7 +723,7 @@ Ip6UpdateDelayTimer ( - // is less than the remaining value of the running timer. - // - if ((Group->DelayTimer == 0) || (Delay < Group->DelayTimer)) { -- Group->DelayTimer = Delay / 4294967295UL * NET_RANDOM (NetRandomInitSeed ()); -+ Group->DelayTimer = Delay / 4294967295UL * Random; - } - - return EFI_SUCCESS; -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.c b/NetworkPkg/Ip6Dxe/Ip6Nd.c -index c10c7017f8..72aa45c10f 100644 ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.c -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.c -@@ -2,7 +2,7 @@ - Implementation of Neighbor Discovery support routines. - - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -16,17 +16,28 @@ EFI_MAC_ADDRESS mZeroMacAddress; - - @param[in, out] IpSb Points to the IP6_SERVICE. - -+ @retval EFI_SUCCESS ReachableTime Updated -+ @retval others Failed to update ReachableTime - **/ --VOID -+EFI_STATUS - Ip6UpdateReachableTime ( - IN OUT IP6_SERVICE *IpSb - ) - { -- UINT32 Random; -+ UINT32 Random; -+ EFI_STATUS Status; - -- Random = (NetRandomInitSeed () / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ -+ Random = (Random / 4294967295UL) * IP6_RANDOM_FACTOR_SCALE; - Random = Random + IP6_MIN_RANDOM_FACTOR_SCALED; - IpSb->ReachableTime = (IpSb->BaseReachableTime * Random) / IP6_RANDOM_FACTOR_SCALE; -+ -+ return EFI_SUCCESS; - } - - /** -@@ -972,10 +983,17 @@ Ip6InitDADProcess ( - IP6_SERVICE *IpSb; - EFI_STATUS Status; - UINT32 MaxDelayTick; -+ UINT32 Random; - - NET_CHECK_SIGNATURE (IpIf, IP6_INTERFACE_SIGNATURE); - ASSERT (AddressInfo != NULL); - -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - // - // Do nothing if we have already started DAD on the address. - // -@@ -1014,7 +1032,7 @@ Ip6InitDADProcess ( - Entry->Transmit = 0; - Entry->Receive = 0; - MaxDelayTick = IP6_MAX_RTR_SOLICITATION_DELAY / IP6_TIMER_INTERVAL_IN_MS; -- Entry->RetransTick = (MaxDelayTick * ((NET_RANDOM (NetRandomInitSeed ()) % 5) + 1)) / 5; -+ Entry->RetransTick = (MaxDelayTick * ((Random % 5) + 1)) / 5; - Entry->AddressInfo = AddressInfo; - Entry->Callback = Callback; - Entry->Context = Context; -@@ -2078,7 +2096,10 @@ Ip6ProcessRouterAdvertise ( - // in BaseReachableTime and recompute a ReachableTime. - // - IpSb->BaseReachableTime = ReachableTime; -- Ip6UpdateReachableTime (IpSb); -+ Status = Ip6UpdateReachableTime (IpSb); -+ if (EFI_ERROR (Status)) { -+ goto Exit; -+ } - } - - if (RetransTimer != 0) { -diff --git a/NetworkPkg/Ip6Dxe/Ip6Nd.h b/NetworkPkg/Ip6Dxe/Ip6Nd.h -index bf64e9114e..5795e23c7d 100644 ---- a/NetworkPkg/Ip6Dxe/Ip6Nd.h -+++ b/NetworkPkg/Ip6Dxe/Ip6Nd.h -@@ -2,7 +2,7 @@ - Definition of Neighbor Discovery support routines. - - Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -780,10 +780,10 @@ Ip6OnArpResolved ( - /** - Update the ReachableTime in IP6 service binding instance data, in milliseconds. - -- @param[in, out] IpSb Points to the IP6_SERVICE. -- -+ @retval EFI_SUCCESS ReachableTime Updated -+ @retval others Failed to update ReachableTime - **/ --VOID -+EFI_STATUS - Ip6UpdateReachableTime ( - IN OUT IP6_SERVICE *IpSb - ); -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c -index fd4a9e15a8..01c13c08d2 100644 ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.c -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.c -@@ -3,6 +3,7 @@ - - Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR> - (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - **/ - -@@ -31,6 +32,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent - #include <Library/DevicePathLib.h> - #include <Library/PrintLib.h> - #include <Library/UefiLib.h> -+#include <Protocol/Rng.h> - - #define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE) - #define DEFAULT_ZERO_START ((UINTN) ~0) -@@ -127,6 +129,25 @@ GLOBAL_REMOVE_IF_UNREFERENCED VLAN_DEVICE_PATH mNetVlanDevicePathTemplate = { - 0 - }; - -+// -+// These represent UEFI SPEC defined algorithms that should be supported by -+// the RNG protocol and are generally considered secure. -+// -+// The order of the algorithms in this array is important. This order is the order -+// in which the algorithms will be tried by the RNG protocol. -+// If your platform needs to use a specific algorithm for the random number generator, -+// then you should place that algorithm first in the array. -+// -+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID *mSecureHashAlgorithms[] = { -+ &gEfiRngAlgorithmSp80090Ctr256Guid, // SP800-90A DRBG CTR using AES-256 -+ &gEfiRngAlgorithmSp80090Hmac256Guid, // SP800-90A DRBG HMAC using SHA-256 -+ &gEfiRngAlgorithmSp80090Hash256Guid, // SP800-90A DRBG Hash using SHA-256 -+ &gEfiRngAlgorithmArmRndr, // unspecified SP800-90A DRBG via ARM RNDR register -+ &gEfiRngAlgorithmRaw, // Raw data from NRBG (or TRNG) -+}; -+ -+#define SECURE_HASH_ALGORITHMS_SIZE (sizeof (mSecureHashAlgorithms) / sizeof (EFI_GUID *)) -+ - /** - Locate the handles that support SNP, then open one of them - to send the syslog packets. The caller isn't required to close -@@ -884,34 +905,107 @@ Ip6Swap128 ( - } - - /** -- Initialize a random seed using current time and monotonic count. -+ Generate a Random output data given a length. - -- Get current time and monotonic count first. Then initialize a random seed -- based on some basic mathematics operation on the hour, day, minute, second, -- nanosecond and year of the current time and the monotonic count value. -+ @param[out] Output - The buffer to store the generated random data. -+ @param[in] OutputLength - The length of the output buffer. - -- @return The random seed initialized with current time. -+ @retval EFI_SUCCESS On Success -+ @retval EFI_INVALID_PARAMETER Pointer is null or size is zero -+ @retval EFI_NOT_FOUND RNG protocol not found -+ @retval Others Error from RngProtocol->GetRNG() - -+ @return Status code - **/ --UINT32 -+EFI_STATUS - EFIAPI --NetRandomInitSeed ( -- VOID -+PseudoRandom ( -+ OUT VOID *Output, -+ IN UINTN OutputLength - ) - { -- EFI_TIME Time; -- UINT32 Seed; -- UINT64 MonotonicCount; -+ EFI_RNG_PROTOCOL *RngProtocol; -+ EFI_STATUS Status; -+ UINTN AlgorithmIndex; -+ -+ if ((Output == NULL) || (OutputLength == 0)) { -+ return EFI_INVALID_PARAMETER; -+ } -+ -+ Status = gBS->LocateProtocol (&gEfiRngProtocolGuid, NULL, (VOID **)&RngProtocol); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "Failed to locate EFI_RNG_PROTOCOL: %r\n", Status)); -+ ASSERT_EFI_ERROR (Status); -+ return Status; -+ } -+ -+ if (PcdGetBool (PcdEnforceSecureRngAlgorithms)) { -+ for (AlgorithmIndex = 0; AlgorithmIndex < SECURE_HASH_ALGORITHMS_SIZE; AlgorithmIndex++) { -+ Status = RngProtocol->GetRNG (RngProtocol, mSecureHashAlgorithms[AlgorithmIndex], OutputLength, (UINT8 *)Output); -+ if (!EFI_ERROR (Status)) { -+ // -+ // Secure Algorithm was supported on this platform -+ // -+ return EFI_SUCCESS; -+ } else if (Status == EFI_UNSUPPORTED) { -+ // -+ // Secure Algorithm was not supported on this platform -+ // -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); -+ -+ // -+ // Try the next secure algorithm -+ // -+ continue; -+ } else { -+ // -+ // Some other error occurred -+ // -+ DEBUG ((DEBUG_ERROR, "Failed to generate random data using secure algorithm %d: %r\n", AlgorithmIndex, Status)); -+ ASSERT_EFI_ERROR (Status); -+ return Status; -+ } -+ } -+ -+ // -+ // If we get here, we failed to generate random data using any secure algorithm -+ // Platform owner should ensure that at least one secure algorithm is supported -+ // -+ ASSERT_EFI_ERROR (Status); -+ return Status; -+ } -+ -+ // -+ // Lets try using the default algorithm (which may not be secure) -+ // -+ Status = RngProtocol->GetRNG (RngProtocol, NULL, OutputLength, (UINT8 *)Output); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random data: %r\n", __func__, Status)); -+ ASSERT_EFI_ERROR (Status); -+ return Status; -+ } - -- gRT->GetTime (&Time, NULL); -- Seed = (Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second); -- Seed ^= Time.Nanosecond; -- Seed ^= Time.Year << 7; -+ return EFI_SUCCESS; -+} -+ -+/** -+ Generate a 32-bit pseudo-random number. - -- gBS->GetNextMonotonicCount (&MonotonicCount); -- Seed += (UINT32)MonotonicCount; -+ @param[out] Output - The buffer to store the generated random number. - -- return Seed; -+ @retval EFI_SUCCESS On Success -+ @retval EFI_NOT_FOUND RNG protocol not found -+ @retval Others Error from RngProtocol->GetRNG() -+ -+ @return Status code -+**/ -+EFI_STATUS -+EFIAPI -+PseudoRandomU32 ( -+ OUT UINT32 *Output -+ ) -+{ -+ return PseudoRandom (Output, sizeof (*Output)); - } - - /** -diff --git a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf -index 8145d256ec..a8f534a293 100644 ---- a/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf -+++ b/NetworkPkg/Library/DxeNetLib/DxeNetLib.inf -@@ -3,6 +3,7 @@ - # - # Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> - # (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> -+# Copyright (c) Microsoft Corporation - # SPDX-License-Identifier: BSD-2-Clause-Patent - # - ## -@@ -49,7 +50,11 @@ - gEfiSmbiosTableGuid ## SOMETIMES_CONSUMES ## SystemTable - gEfiSmbios3TableGuid ## SOMETIMES_CONSUMES ## SystemTable - gEfiAdapterInfoMediaStateGuid ## SOMETIMES_CONSUMES -- -+ gEfiRngAlgorithmRaw ## CONSUMES -+ gEfiRngAlgorithmSp80090Ctr256Guid ## CONSUMES -+ gEfiRngAlgorithmSp80090Hmac256Guid ## CONSUMES -+ gEfiRngAlgorithmSp80090Hash256Guid ## CONSUMES -+ gEfiRngAlgorithmArmRndr ## CONSUMES - - [Protocols] - gEfiSimpleNetworkProtocolGuid ## SOMETIMES_CONSUMES -@@ -59,3 +64,10 @@ - gEfiComponentNameProtocolGuid ## SOMETIMES_CONSUMES - gEfiComponentName2ProtocolGuid ## SOMETIMES_CONSUMES - gEfiAdapterInformationProtocolGuid ## SOMETIMES_CONSUMES -+ gEfiRngProtocolGuid ## CONSUMES -+ -+[FixedPcd] -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms ## CONSUMES -+ -+[Depex] -+ gEfiRngProtocolGuid -diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec -index 928e84fec4..ff335e957c 100644 ---- a/NetworkPkg/NetworkPkg.dec -+++ b/NetworkPkg/NetworkPkg.dec -@@ -5,6 +5,7 @@ - # - # Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR> - # (C) Copyright 2015-2020 Hewlett Packard Enterprise Development LP<BR> -+# Copyright (c) Microsoft Corporation - # - # SPDX-License-Identifier: BSD-2-Clause-Patent - # -@@ -127,6 +128,12 @@ - # @Prompt Indicates whether SnpDxe creates event for ExitBootServices() call. - gEfiNetworkPkgTokenSpaceGuid.PcdSnpCreateExitBootServicesEvent|TRUE|BOOLEAN|0x1000000C - -+ ## Enforces the use of Secure UEFI spec defined RNG algorithms for all network connections. -+ # TRUE - Enforce the use of Secure UEFI spec defined RNG algorithms. -+ # FALSE - Do not enforce and depend on the default implementation of RNG algorithm from the provider. -+ # @Prompt Enforce the use of Secure UEFI spec defined RNG algorithms. -+ gEfiNetworkPkgTokenSpaceGuid.PcdEnforceSecureRngAlgorithms|TRUE|BOOLEAN|0x1000000D -+ - [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] - ## IPv6 DHCP Unique Identifier (DUID) Type configuration (From RFCs 3315 and 6355). - # 01 = DUID Based on Link-layer Address Plus Time [DUID-LLT] -diff --git a/NetworkPkg/SecurityFixes.yaml b/NetworkPkg/SecurityFixes.yaml -index 7e900483fe..2b2c794697 100644 ---- a/NetworkPkg/SecurityFixes.yaml -+++ b/NetworkPkg/SecurityFixes.yaml -@@ -121,3 +121,42 @@ CVE_2023_45235: - - http://www.openwall.com/lists/oss-security/2024/01/16/2 - - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html - - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html -+CVE_2023_45237: -+ commit_titles: -+ - "NetworkPkg:: SECURITY PATCH CVE 2023-45237" -+ cve: CVE-2023-45237 -+ date_reported: 2023-08-28 13:56 UTC -+ description: "Bug 09 - Use of a Weak PseudoRandom Number Generator" -+ note: -+ files_impacted: -+ - NetworkPkg/Dhcp4Dxe/Dhcp4Driver.c -+ - NetworkPkg/Dhcp6Dxe/Dhcp6Driver.c -+ - NetworkPkg/DnsDxe/DnsDhcp.c -+ - NetworkPkg/DnsDxe/DnsImpl.c -+ - NetworkPkg/HttpBootDxe/HttpBootDhcp6.c -+ - NetworkPkg/IScsiDxe/IScsiCHAP.c -+ - NetworkPkg/IScsiDxe/IScsiMisc.c -+ - NetworkPkg/IScsiDxe/IScsiMisc.h -+ - NetworkPkg/Include/Library/NetLib.h -+ - NetworkPkg/Ip4Dxe/Ip4Driver.c -+ - NetworkPkg/Ip6Dxe/Ip6ConfigImpl.c -+ - NetworkPkg/Ip6Dxe/Ip6Driver.c -+ - NetworkPkg/Ip6Dxe/Ip6If.c -+ - NetworkPkg/Ip6Dxe/Ip6Mld.c -+ - NetworkPkg/Ip6Dxe/Ip6Nd.c -+ - NetworkPkg/Ip6Dxe/Ip6Nd.h -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.c -+ - NetworkPkg/Library/DxeNetLib/DxeNetLib.inf -+ - NetworkPkg/NetworkPkg.dec -+ - NetworkPkg/TcpDxe/TcpDriver.c -+ - NetworkPkg/Udp4Dxe/Udp4Driver.c -+ - NetworkPkg/Udp6Dxe/Udp6Driver.c -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c -+ - NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c -+ links: -+ - https://bugzilla.tianocore.org/show_bug.cgi?id=4542 -+ - https://nvd.nist.gov/vuln/detail/CVE-2023-45237 -+ - http://www.openwall.com/lists/oss-security/2024/01/16/2 -+ - http://packetstormsecurity.com/files/176574/PixieFail-Proof-Of-Concepts.html -+ - https://blog.quarkslab.com/pixiefail-nine-vulnerabilities-in-tianocores-edk-ii-ipv6-network-stack.html -diff --git a/NetworkPkg/TcpDxe/TcpDriver.c b/NetworkPkg/TcpDxe/TcpDriver.c -index 98a90e0210..8fe6badd68 100644 ---- a/NetworkPkg/TcpDxe/TcpDriver.c -+++ b/NetworkPkg/TcpDxe/TcpDriver.c -@@ -2,7 +2,7 @@ - The driver binding and service binding protocol for the TCP driver. - - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -163,7 +163,13 @@ TcpDriverEntryPoint ( - ) - { - EFI_STATUS Status; -- UINT32 Seed; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a Failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - // - // Install the TCP Driver Binding Protocol -@@ -203,9 +209,8 @@ TcpDriverEntryPoint ( - // - // Initialize ISS and random port. - // -- Seed = NetRandomInitSeed (); -- mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss; -- mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (NET_RANDOM (Seed) % TCP_PORT_KNOWN)); -+ mTcpGlobalIss = Random % mTcpGlobalIss; -+ mTcp4RandomPort = (UINT16)(TCP_PORT_KNOWN + (Random % TCP_PORT_KNOWN)); - mTcp6RandomPort = mTcp4RandomPort; - - return EFI_SUCCESS; -diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf -index c0acbdca57..cf5423f4c5 100644 ---- a/NetworkPkg/TcpDxe/TcpDxe.inf -+++ b/NetworkPkg/TcpDxe/TcpDxe.inf -@@ -82,5 +82,8 @@ - gEfiTcp6ProtocolGuid ## BY_START - gEfiTcp6ServiceBindingProtocolGuid ## BY_START - -+[Depex] -+ gEfiHash2ServiceBindingProtocolGuid -+ - [UserExtensions.TianoCore."ExtraFiles"] - TcpDxeExtra.uni -diff --git a/NetworkPkg/Udp4Dxe/Udp4Driver.c b/NetworkPkg/Udp4Dxe/Udp4Driver.c -index cb917fcfc9..c7ea16f4cd 100644 ---- a/NetworkPkg/Udp4Dxe/Udp4Driver.c -+++ b/NetworkPkg/Udp4Dxe/Udp4Driver.c -@@ -1,6 +1,7 @@ - /** @file - - Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> -+Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -555,6 +556,13 @@ Udp4DriverEntryPoint ( - ) - { - EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - // - // Install the Udp4DriverBinding and Udp4ComponentName protocols. -@@ -571,7 +579,7 @@ Udp4DriverEntryPoint ( - // - // Initialize the UDP random port. - // -- mUdp4RandomPort = (UINT16)(((UINT16)NetRandomInitSeed ()) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); -+ mUdp4RandomPort = (UINT16)(((UINT16)Random) % UDP4_PORT_KNOWN + UDP4_PORT_KNOWN); - } - - return Status; -diff --git a/NetworkPkg/Udp6Dxe/Udp6Driver.c b/NetworkPkg/Udp6Dxe/Udp6Driver.c -index ae96fb9966..edb758d57c 100644 ---- a/NetworkPkg/Udp6Dxe/Udp6Driver.c -+++ b/NetworkPkg/Udp6Dxe/Udp6Driver.c -@@ -2,7 +2,7 @@ - Driver Binding functions and Service Binding functions for the Network driver module. - - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -596,6 +596,13 @@ Udp6DriverEntryPoint ( - ) - { - EFI_STATUS Status; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } - - // - // Install the Udp6DriverBinding and Udp6ComponentName protocols. -@@ -614,7 +621,7 @@ Udp6DriverEntryPoint ( - // Initialize the UDP random port. - // - mUdp6RandomPort = (UINT16)( -- ((UINT16)NetRandomInitSeed ()) % -+ ((UINT16)Random) % - UDP6_PORT_KNOWN + - UDP6_PORT_KNOWN - ); -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c -index 91146b78cb..452038c219 100644 ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp4.c -@@ -2,7 +2,7 @@ - Functions implementation related with DHCPv4 for UefiPxeBc Driver. - - Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> -- -+ Copyright (c) Microsoft Corporation - SPDX-License-Identifier: BSD-2-Clause-Patent - - **/ -@@ -1381,6 +1381,12 @@ PxeBcDhcp4Discover ( - UINT8 VendorOptLen; - UINT32 Xid; - -+ Status = PseudoRandomU32 (&Xid); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - Mode = Private->PxeBc.Mode; - Dhcp4 = Private->Dhcp4; - Status = EFI_SUCCESS; -@@ -1471,7 +1477,6 @@ PxeBcDhcp4Discover ( - // - // Set fields of the token for the request packet. - // -- Xid = NET_RANDOM (NetRandomInitSeed ()); - Token.Packet->Dhcp4.Header.Xid = HTONL (Xid); - Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)((IsBCast) ? 0x8000 : 0x0)); - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS)); -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c -index 7fd1281c11..bcabbd2219 100644 ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDhcp6.c -@@ -2180,7 +2180,7 @@ PxeBcDhcp6Discover ( - UINTN ReadSize; - UINT16 OpCode; - UINT16 OpLen; -- UINT32 Xid; -+ UINT32 Random; - EFI_STATUS Status; - UINTN DiscoverLenNeeded; - -@@ -2198,6 +2198,12 @@ PxeBcDhcp6Discover ( - return EFI_DEVICE_ERROR; - } - -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "%a failed to generate random number: %r\n", __func__, Status)); -+ return Status; -+ } -+ - DiscoverLenNeeded = sizeof (EFI_PXE_BASE_CODE_DHCPV6_PACKET); - Discover = AllocateZeroPool (DiscoverLenNeeded); - if (Discover == NULL) { -@@ -2207,8 +2213,7 @@ PxeBcDhcp6Discover ( - // - // Build the discover packet by the cached request packet before. - // -- Xid = NET_RANDOM (NetRandomInitSeed ()); -- Discover->TransactionId = HTONL (Xid); -+ Discover->TransactionId = HTONL (Random); - Discover->MessageType = Request->Dhcp6.Header.MessageType; - RequestOpt = Request->Dhcp6.Option; - DiscoverOpt = Discover->DhcpOptions; -diff --git a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c -index d84aca7e85..4cd915b411 100644 ---- a/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c -+++ b/NetworkPkg/UefiPxeBcDxe/PxeBcDriver.c -@@ -3,6 +3,7 @@ - - (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR> - Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR> -+ Copyright (c) Microsoft Corporation - - SPDX-License-Identifier: BSD-2-Clause-Patent - -@@ -892,6 +893,13 @@ PxeBcCreateIp6Children ( - PXEBC_PRIVATE_PROTOCOL *Id; - EFI_SIMPLE_NETWORK_PROTOCOL *Snp; - UINTN Index; -+ UINT32 Random; -+ -+ Status = PseudoRandomU32 (&Random); -+ if (EFI_ERROR (Status)) { -+ DEBUG ((DEBUG_ERROR, "Failed to generate random number using EFI_RNG_PROTOCOL: %r\n", Status)); -+ return Status; -+ } - - if (Private->Ip6Nic != NULL) { - // -@@ -935,9 +943,9 @@ PxeBcCreateIp6Children ( - } - - // -- // Generate a random IAID for the Dhcp6 assigned address. -+ // Set a random IAID for the Dhcp6 assigned address. - // -- Private->IaId = NET_RANDOM (NetRandomInitSeed ()); -+ Private->IaId = Random; - if (Private->Snp != NULL) { - for (Index = 0; Index < Private->Snp->Mode->HwAddressSize; Index++) { - Private->IaId |= (Private->Snp->Mode->CurrentAddress.Addr[Index] << ((Index << 3) & 31)); --- -2.40.0 - diff --git a/meta/recipes-core/ovmf/ovmf_git.bb b/meta/recipes-core/ovmf/ovmf_git.bb index d52e3f4971..bb345688ac 100644 --- a/meta/recipes-core/ovmf/ovmf_git.bb +++ b/meta/recipes-core/ovmf/ovmf_git.bb @@ -47,8 +47,6 @@ SRC_URI = "gitsm://github.com/tianocore/edk2.git;branch=master;protocol=https \ file://CVE-2023-45229-0002.patch \ file://CVE-2023-45229-0003.patch \ file://CVE-2023-45229-0004.patch \ - file://CVE-2023-45237-0001.patch \ - file://CVE-2023-45237-0002.patch \ file://CVE-2023-45236.patch \ file://CVE-2022-36765-0001.patch \ file://CVE-2022-36765-0002.patch \