diff mbox series

[kirkstone,1/2] Revert "ovmf: Fix CVE-2023-45237"

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

Commit Message

Kai Feb. 19, 2025, 10:21 a.m. UTC
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

Comments

Steve Sakoman Feb. 19, 2025, 3:19 p.m. UTC | #1
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]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Kai Feb. 20, 2025, 6:03 a.m. UTC | #2
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]
>> -=-=-=-=-=-=-=-=-=-=-=-
>>
Steve Sakoman Feb. 20, 2025, 2:27 p.m. UTC | #3
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
>
Kai Feb. 21, 2025, 12:41 a.m. UTC | #4
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 mbox series

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 \