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 <[email protected]> wrote: > > From: Kai Kang <[email protected]> > > 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 <[email protected]> > --- > > 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 <[email protected]> > -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 <[email protected]> > -Reviewed-by: Sami Mujawar <[email protected]> > -Reviewed-by: Liming Gao <[email protected]> > -Acked-by: Ard Biesheuvel <[email protected]> > -Tested-by: Kun Qin <[email protected]> > - > -CVE: CVE-2023-45237 > - > -Upstream-Status: Backport > [https://github.com/tianocore/edk2/commit/cf07238e5fa4f8b1138ac1c9e80530b4d4e59f1c] > - > -Signed-off-by: Soumya Sambu <[email protected]> > ---- > - 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 <[email protected]> > -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 <[email protected]> > -Cc: Zachary Clark-williams <[email protected]> > - > -Signed-off-by: Doug Flick [MSFT] <[email protected]> > -Reviewed-by: Saloni Kasbekar <[email protected]> > - > -CVE: CVE-2023-45237 > - > -Upstream-Status: Backport > [https://github.com/tianocore/edk2/commit/4c4ceb2ceb80c42fd5545b2a4bd80321f07f4345] > - > -Signed-off-by: Soumya Sambu <[email protected]> > ---- > - 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 (#211712): https://lists.openembedded.org/g/openembedded-core/message/211712 Mute This Topic: https://lists.openembedded.org/mt/111267276/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
