public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
@ 2022-10-28 15:32 PierreGondois
  2022-10-28 15:32 ` [PATCH v9 01/19] ArmPkg: PCD to select conduit for monitor calls PierreGondois
                   ` (20 more replies)
  0 siblings, 21 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

Bugzilla: Bug 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

The Arm True Random Number Generator Firmware, Interface 1.0, specification
defines an interface between an Operating System (OS) executing at EL1 and
Firmware (FW) exposing a conditioned entropy source that is provided by a
TRNG back end.
This patch-set:
- defines an Arm TRNG library class that provides an interface to access
  the entropy source on a platform.
- implements an Arm TRNG library instance that uses the Arm FW-TRNG
  interface.
- Adds RawAlgorithm support to RngDxe for Arm architecture using the Arm
  TRNG interface.
- Enables RNG support using Arm TRNG interface for Kvmtool Guest/Virtual
  firmware.

This patch-set is based on the v2 from Sami Mujawar:
[PATCH v2 0/8] Add Raw algorithm support using Arm FW-TRNG interface 
v2:
https://edk2.groups.io/g/devel/message/83775
v3:
https://edk2.groups.io/g/devel/message/90845
https://github.com/PierreARM/edk2/tree/Arm_Trng_v3
v4:
https://github.com/PierreARM/edk2/tree/Arm_Trng_v4
v5:
https://github.com/PierreARM/edk2/tree/Arm_Trng_v5
v6:
https://github.com/PierreARM/edk2/tree/Arm_Trng_v6
v7:
https://github.com/PierreARM/edk2/tree/Arm_Trng_v7
v8:
https://github.com/PierreARM/edk2/tree/Arm_Trng_v8
v9:
https://github.com/PierreARM/edk2/tree/Arm_Trng_v9

v9:
 - Added BaseArmTrngLibNull as default in MdePkg/MdeLibs.dsc.inc. [Liming]
 - Renamed TrngLib to ArmTrngLib and updated documentation, commit
   messages, function names accordingly. [Jiewen, Leif]
v8:
 - Added Reviewed-by/Acked-by from Leif on ArmPkg/SecurityPkg
   patches. [Leif]
 - Renamed FID_TRNG_* macros to ARM_SMC_ID_TRNG_*. [Leif]
v7:
 - Removed Reviewed-by from Leif.
 - Remove Sami's Signed-off.
V6:
 - Added my signed-off on patches authored by Sami. [Leif]
 - New patch to make it easier to add new libraries in alphabetical
   order: ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc [Leif]
 - Renmaed ArmHvcNullLib to ArmHvcLibNull. [Leif]
 - Added RISCV64 to the list of VALID_ARCHITECTURES for BaseTrngLibNull. [Leif]
 - Removed unnecessary space in function parameter documentation
   ('[in, out]'). [Rebecca]
 - Updated INF_VERSION to latest spec (1.29) for new libraries. [Rebecca]
 - Dropped the following patches [Leif]:
  - ArmPkg/ArmLib: Add ArmHasRngExt()
  - ArmPkg/ArmLib: Add ArmReadIdIsar0() helper
  - MdePkg/BaseRngLib: Rename ArmReadIdIsar0() to ArmGetFeatRng()
V5:
 - Removed references in Trnglib.h to 'Special Publication'
   800-90A and 800-90C, and only reference 'Arm True Random
   Number Generator Firmware, Interface 1.0' in the Arm
   implementation of the TrngLib. [Jiewen]
V4:
 - Removed dependencies on ArmPkg and dropped patch:
    [PATCH v3 12/22] SecurityPkg: Update Securitypkg.ci.yaml
   [Jiewen]
 - Use a dynamically allocated array to hold available algorithms.
   The array is freed in a new UNLOAD_IMAGE function and
   allocated in arch specific implementations of
   GetAvailableAlgorithms(), available in AArch64/AArch64Algo.c
   and Arm/ArmAlgo.c.
 - Correctly reference gEfiRngAlgorithmSp80090Ctr256Guid
   Guid by copying its address (add missing '&'). [Jiewen]
V3:
 - Address Leif's comment (moving definitions, optimizations, ...)
 - Add ArmMonitorLib to choose Hvc/Smc conduit depending on a Pcd.
 - Re-factor some parts of SecurityPkg/RngDxe/ to ease the addition
   of new algorithms.
 - Add ArmHasRngExt() function to check Arm's FEAT_RNG extension.
V2:
 - Updates TrngLib definitions to use RETURN_STATUS as the return type
   from the interface functions as TrngLib is base type library.
 - Drops the patch "MdePkg: Add definition for NULL GUID" as there is
   already an equivalent definition provided by gZeroGuid. Thus, the
   use of gNullGuid has been replaced with gZeroGuid.

Pierre Gondois (11):
  ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class
  ArmPkg/ArmMonitorLib: Add ArmMonitorLib
  ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
  ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib
  SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid
  SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms()
  SecurityPkg/RngDxe: Documentation/include/parameter cleanup
  SecurityPkg/RngDxe: Check before advertising Cpu Rng algo
  SecurityPkg/RngDxe: Add debug warning for NULL
    PcdCpuRngSupportedAlgorithm
  SecurityPkg/RngDxe: Rename AArch64/RngDxe.c
  SecurityPkg/RngDxe: Add Arm support of RngDxe

Sami Mujawar (8):
  ArmPkg: PCD to select conduit for monitor calls
  MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface
  MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library
  ArmPkg: Add FID definitions for Arm TRNG
  ArmPkg/ArmTrngLib: Add Arm TRNG library
  SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name
  SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through
    ArmTrngLib
  ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface

 ArmPkg/ArmPkg.dec                             |  12 +-
 ArmPkg/ArmPkg.dsc                             |   5 +-
 ArmPkg/Include/IndustryStandard/ArmStdSmc.h   | 109 ++++-
 ArmPkg/Include/Library/ArmMonitorLib.h        |  42 ++
 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c  |  29 ++
 .../Library/ArmHvcLibNull/ArmHvcLibNull.inf   |  22 +
 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c  |  34 ++
 .../Library/ArmMonitorLib/ArmMonitorLib.inf   |  29 ++
 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h       |  50 +++
 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c        | 388 ++++++++++++++++++
 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf      |  29 ++
 ArmVirtPkg/ArmVirtKvmTool.dsc                 |  10 +
 ArmVirtPkg/ArmVirtKvmTool.fdf                 |   5 +
 MdePkg/Include/Library/ArmTrngLib.h           | 106 +++++
 .../BaseArmTrngLibNull/BaseArmTrngLibNull.c   | 121 ++++++
 .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf |  30 ++
 .../BaseArmTrngLibNull/BaseArmTrngLibNull.uni |  12 +
 MdePkg/MdeLibs.dsc.inc                        |   1 +
 MdePkg/MdePkg.dec                             |   5 +
 MdePkg/MdePkg.dsc                             |   1 +
 .../RngDxe/AArch64/AArch64Algo.c              |  72 ++++
 .../RngDxe/Arm/ArmAlgo.c                      |  51 +++
 .../RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c}  |  81 +++-
 .../RandomNumberGenerator/RngDxe/ArmTrng.c    |  71 ++++
 .../RngDxe/Rand/RdRand.c                      |  14 +-
 .../RngDxe/Rand/RdRand.h                      |  43 --
 .../RngDxe/Rand/RngDxe.c                      |  62 ++-
 .../RandomNumberGenerator/RngDxe/RngDxe.c     |  90 ++--
 .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  18 +-
 .../RngDxe/RngDxeInternals.h                  |  71 ++--
 SecurityPkg/SecurityPkg.dsc                   |   5 +-
 31 files changed, 1462 insertions(+), 156 deletions(-)
 create mode 100644 ArmPkg/Include/Library/ArmMonitorLib.h
 create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
 create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
 create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
 create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
 create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
 create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
 create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
 create mode 100644 MdePkg/Include/Library/ArmTrngLib.h
 create mode 100644 MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
 create mode 100644 MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
 create mode 100644 MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
 create mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
 create mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
 rename SecurityPkg/RandomNumberGenerator/RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c} (64%)
 create mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
 delete mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH v9 01/19] ArmPkg: PCD to select conduit for monitor calls
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 02/19] ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class PierreGondois
                   ` (19 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Define a PCD 'PcdMonitorConduitHvc' to select the conduit to use for
monitor calls. PcdMonitorConduitHvc is defined as FALSE by default,
meaning the SMC conduit is enabled as default.

Adding PcdMonitorConduitHvc allows selection of HVC conduit to be used
by virtual firmware implementations.

Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 ArmPkg/ArmPkg.dec | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
index cfb6fe602485..99cb024d0f93 100644
--- a/ArmPkg/ArmPkg.dec
+++ b/ArmPkg/ArmPkg.dec
@@ -2,7 +2,7 @@
 # ARM processor package.
 #
 # Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
-# Copyright (c) 2011 - 2021, ARM Limited. All rights reserved.
+# Copyright (c) 2011 - 2022, ARM Limited. All rights reserved.
 # Copyright (c) 2021, Ampere Computing LLC. All rights reserved.
 #
 #    SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -134,6 +134,11 @@ [PcdsFeatureFlag.common]
   # Define if the GICv3 controller should use the GICv2 legacy
   gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE|BOOLEAN|0x00000042
 
+  ## Define the conduit to use for monitor calls.
+  # Default PcdMonitorConduitHvc = FALSE, conduit = SMC
+  # If PcdMonitorConduitHvc = TRUE, conduit = HVC
+  gArmTokenSpaceGuid.PcdMonitorConduitHvc|FALSE|BOOLEAN|0x00000047
+
 [PcdsFeatureFlag.ARM]
   # Whether to map normal memory as non-shareable. FALSE is the safe choice, but
   # TRUE may be appropriate to fix performance problems if you don't care about
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 02/19] ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
  2022-10-28 15:32 ` [PATCH v9 01/19] ArmPkg: PCD to select conduit for monitor calls PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 03/19] ArmPkg/ArmMonitorLib: Add ArmMonitorLib PierreGondois
                   ` (18 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <Pierre.Gondois@arm.com>

The ArmMonitorLib provides an abstract interface to issue
an HyperVisor Call (HVC) or System Monitor Call (SMC) depending
on the default conduit.
The PcdMonitorConduitHvc PCD allows to select the default conduit.

The new library relies on the ArmHvcLib and ArmSmcLib libraries.
A Null instance of these libraries can be used for the unused conduit.

Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 ArmPkg/ArmPkg.dec                      |  5 +++
 ArmPkg/Include/Library/ArmMonitorLib.h | 42 ++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 ArmPkg/Include/Library/ArmMonitorLib.h

diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec
index 99cb024d0f93..f17ba913e6de 100644
--- a/ArmPkg/ArmPkg.dec
+++ b/ArmPkg/ArmPkg.dec
@@ -71,6 +71,11 @@ [LibraryClasses.common]
   #
   ArmSvcLib|Include/Library/ArmSvcLib.h
 
+  ##  @libraryclass  Provides a Monitor Call interface that will use the
+  #   default conduit (HVC or SMC).
+  #
+  ArmMonitorLib|Include/Library/ArmMonitorLib.h
+
   ##  @libraryclass  Provides a default exception handler.
   #
   DefaultExceptionHandlerLib|Include/Library/DefaultExceptionHandlerLib.h
diff --git a/ArmPkg/Include/Library/ArmMonitorLib.h b/ArmPkg/Include/Library/ArmMonitorLib.h
new file mode 100644
index 000000000000..d6e13b61d63d
--- /dev/null
+++ b/ArmPkg/Include/Library/ArmMonitorLib.h
@@ -0,0 +1,42 @@
+/** @file
+
+  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef ARM_MONITOR_LIB_H_
+#define ARM_MONITOR_LIB_H_
+
+/** The size of the SMC arguments is different between AArch64 and AArch32.
+
+  The native size is used for the arguments.
+  It will be casted to either HVC or SMC args.
+*/
+typedef struct {
+  UINTN    Arg0;
+  UINTN    Arg1;
+  UINTN    Arg2;
+  UINTN    Arg3;
+  UINTN    Arg4;
+  UINTN    Arg5;
+  UINTN    Arg6;
+  UINTN    Arg7;
+} ARM_MONITOR_ARGS;
+
+/** Monitor call.
+
+  An HyperVisor Call (HVC) or System Monitor Call (SMC) will be issued
+  depending on the default conduit. PcdMonitorConduitHvc determines the type
+  of the call: if true, do an HVC.
+
+  @param [in,out]  Args    Arguments for the HVC/SMC.
+**/
+VOID
+EFIAPI
+ArmMonitorCall (
+  IN OUT ARM_MONITOR_ARGS  *Args
+  );
+
+#endif // ARM_MONITOR_LIB_H_
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 03/19] ArmPkg/ArmMonitorLib: Add ArmMonitorLib
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
  2022-10-28 15:32 ` [PATCH v9 01/19] ArmPkg: PCD to select conduit for monitor calls PierreGondois
  2022-10-28 15:32 ` [PATCH v9 02/19] ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 04/19] ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc PierreGondois
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <Pierre.Gondois@arm.com>

The ArmMonitorLib provides an abstract interface to issue
an HyperVisor Call (HVC) or System Monitor Call (SMC) depending
on the default conduit.
The PcdMonitorConduitHvc PCD allows to select the default conduit.

Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 ArmPkg/ArmPkg.dsc                             |  1 +
 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c  | 34 +++++++++++++++++++
 .../Library/ArmMonitorLib/ArmMonitorLib.inf   | 29 ++++++++++++++++
 3 files changed, 64 insertions(+)
 create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
 create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf

diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc
index 59fd8f295d4f..3afd212f472b 100644
--- a/ArmPkg/ArmPkg.dsc
+++ b/ArmPkg/ArmPkg.dsc
@@ -135,6 +135,7 @@ [Components.common]
   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
   ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
   ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
+  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
   ArmPkg/Library/OpteeLib/OpteeLib.inf
 
   ArmPkg/Filesystem/SemihostFs/SemihostFs.inf
diff --git a/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c b/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
new file mode 100644
index 000000000000..741f5c615744
--- /dev/null
+++ b/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
@@ -0,0 +1,34 @@
+/** @file
+  Arm Monitor Library.
+
+  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/ArmHvcLib.h>
+#include <Library/ArmMonitorLib.h>
+#include <Library/ArmSmcLib.h>
+#include <Library/PcdLib.h>
+
+/** Monitor call.
+
+  An HyperVisor Call (HVC) or System Monitor Call (SMC) will be issued
+  depending on the default conduit. PcdMonitorConduitHvc determines the type
+  of the call: if true, do an HVC.
+
+  @param [in,out]  Args    Arguments for the HVC/SMC.
+**/
+VOID
+EFIAPI
+ArmMonitorCall (
+  IN OUT ARM_MONITOR_ARGS  *Args
+  )
+{
+  if (FeaturePcdGet (PcdMonitorConduitHvc)) {
+    ArmCallHvc ((ARM_HVC_ARGS *)Args);
+  } else {
+    ArmCallSmc ((ARM_SMC_ARGS *)Args);
+  }
+}
diff --git a/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf b/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
new file mode 100644
index 000000000000..f504cb80f1fc
--- /dev/null
+++ b/ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
@@ -0,0 +1,29 @@
+## @file
+#  Arm Monitor Library
+#
+#  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION                    = 1.29
+  BASE_NAME                      = ArmMonitorLib
+  FILE_GUID                      = F918DACB-FBB8-4CB6-A61D-08E75AF0E7CD
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = ArmMonitorLib
+
+[Sources]
+  ArmMonitorLib.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  ArmHvcLib
+  ArmSmcLib
+
+[Pcd]
+  gArmTokenSpaceGuid.PcdMonitorConduitHvc
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 04/19] ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (2 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 03/19] ArmPkg/ArmMonitorLib: Add ArmMonitorLib PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 05/19] ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib PierreGondois
                   ` (16 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

Sort the section containing HVC/SMC libraries prior to
adding new libraries in this specific section.

Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
 ArmPkg/ArmPkg.dsc | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc
index 3afd212f472b..13e20a258e9e 100644
--- a/ArmPkg/ArmPkg.dsc
+++ b/ArmPkg/ArmPkg.dsc
@@ -131,11 +131,11 @@ [Components.common]
   ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
   ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.inf
 
+  ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
+  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
   ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
-  ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
   ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
-  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
   ArmPkg/Library/OpteeLib/OpteeLib.inf
 
   ArmPkg/Filesystem/SemihostFs/SemihostFs.inf
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 05/19] ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (3 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 04/19] ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 06/19] MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface PierreGondois
                   ` (15 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <Pierre.Gondois@arm.com>

Add a Null instance of ArmHvcLib in case of library dependencies.

Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
 ArmPkg/ArmPkg.dsc                             |  1 +
 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c  | 29 +++++++++++++++++++
 .../Library/ArmHvcLibNull/ArmHvcLibNull.inf   | 22 ++++++++++++++
 3 files changed, 52 insertions(+)
 create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
 create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf

diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc
index 13e20a258e9e..11b473974463 100644
--- a/ArmPkg/ArmPkg.dsc
+++ b/ArmPkg/ArmPkg.dsc
@@ -132,6 +132,7 @@ [Components.common]
   ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.inf
 
   ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
+  ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
   ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
   ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
   ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
diff --git a/ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c b/ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
new file mode 100644
index 000000000000..8edda01a7f0a
--- /dev/null
+++ b/ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
@@ -0,0 +1,29 @@
+/** @file
+  Arm HyperVisor Call (HVC) Null Library.
+
+  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/ArmHvcLib.h>
+#include <Library/DebugLib.h>
+
+/**
+  Trigger an HVC call
+
+  HVC calls can take up to 8 arguments and return up to 4 return values.
+  Therefore, the 4 first fields in the ARM_HVC_ARGS structure are used
+  for both input and output values.
+
+  @param [in,out]  Args    Arguments for the HVC call.
+**/
+VOID
+ArmCallHvc (
+  IN OUT ARM_HVC_ARGS  *Args
+  )
+{
+  ASSERT (FALSE);
+  return;
+}
diff --git a/ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf b/ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
new file mode 100644
index 000000000000..e390a5fbbe21
--- /dev/null
+++ b/ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
@@ -0,0 +1,22 @@
+## @file
+#  Arm Hvc Null Library
+#
+#  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION                    = 1.29
+  BASE_NAME                      = ArmHvcLibNull
+  FILE_GUID                      = 02076A46-D6DB-48DD-8E5F-153172DD73A1
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = ArmHvcLib
+
+[Sources]
+  ArmHvcLibNull.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdePkg/MdePkg.dec
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 06/19] MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (4 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 05/19] ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 07/19] MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library PierreGondois
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

The NIST Special Publications 800-90A, 800-90B and 800-90C
provide recommendations for random number generation. The
NIST 800-90C, Recommendation for Random Bit Generator (RBG)
Constructions, defines the GetEntropy() interface that is
used to access the entropy source. The GetEntropy() interface
is further used by Deterministic Random Bit Generators (DRBG)
to generate random numbers.

The Arm True Random Number Generator (TRNG) library defines an
interface to access the entropy source on a platform, following
the 'Arm True Random Number Generator Firmware Interface'
specification.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 MdePkg/Include/Library/ArmTrngLib.h | 106 ++++++++++++++++++++++++++++
 MdePkg/MdePkg.dec                   |   5 ++
 2 files changed, 111 insertions(+)
 create mode 100644 MdePkg/Include/Library/ArmTrngLib.h

diff --git a/MdePkg/Include/Library/ArmTrngLib.h b/MdePkg/Include/Library/ArmTrngLib.h
new file mode 100644
index 000000000000..551c24413761
--- /dev/null
+++ b/MdePkg/Include/Library/ArmTrngLib.h
@@ -0,0 +1,106 @@
+/** @file
+  Arm TRNG interface library definitions (Cf. [1]).
+
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - [1] Arm True Random Number Generator Firmware, Interface 1.0,
+        Platform Design Document.
+        (https://developer.arm.com/documentation/den0098/latest/)
+  - [2] NIST Special Publication 800-90B, Recommendation for the Entropy
+        Sources Used for Random Bit Generation.
+        (https://csrc.nist.gov/publications/detail/sp/800-90b/final)
+
+  @par Glossary:
+    - TRNG - True Random Number Generator
+**/
+
+#ifndef ARM_TRNG_LIB_H_
+#define ARM_TRNG_LIB_H_
+
+/** Get the version of the Arm TRNG backend.
+
+  A TRNG may be implemented by the system firmware, in which case this
+  function shall return the version of the Arm TRNG backend.
+  The implementation must return NOT_SUPPORTED if a Back end is not present.
+
+  @param [out]  MajorRevision     Major revision.
+  @param [out]  MinorRevision     Minor revision.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Backend not present.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngVersion (
+  OUT UINT16  *MajorRevision,
+  OUT UINT16  *MinorRevision
+  );
+
+/** Get the UUID of the Arm TRNG backend.
+
+  A TRNG may be implemented by the system firmware, in which case this
+  function shall return the UUID of the TRNG backend.
+  Returning the Arm TRNG UUID is optional and if not implemented,
+  RETURN_UNSUPPORTED shall be returned.
+
+  Note: The caller must not rely on the returned UUID as a trustworthy Arm TRNG
+        Back end identity
+
+  @param [out]  Guid              UUID of the Arm TRNG backend.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngUuid (
+  OUT GUID  *Guid
+  );
+
+/** Returns maximum number of entropy bits that can be returned in a single
+    call.
+
+  @return Returns the maximum number of Entropy bits that can be returned
+          in a single call to GetArmTrngEntropy().
+**/
+UINTN
+EFIAPI
+GetArmTrngMaxSupportedEntropyBits (
+  VOID
+  );
+
+/** Returns N bits of conditioned entropy.
+
+  See [2] Section 2.3.1 GetEntropy: An Interface to the Entropy Source
+    GetEntropy
+      Input:
+        bits_of_entropy: the requested amount of entropy
+      Output:
+        entropy_bitstring: The string that provides the requested entropy.
+      status: A Boolean value that is TRUE if the request has been satisfied,
+              and is FALSE otherwise.
+
+  @param  [in]   EntropyBits  Number of entropy bits requested.
+  @param  [in]   BufferSize   Size of the Buffer in bytes.
+  @param  [out]  Buffer       Buffer to return the entropy bits.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+  @retval  RETURN_BAD_BUFFER_SIZE    Buffer size is too small.
+  @retval  RETURN_NOT_READY          No Entropy available.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngEntropy (
+  IN  UINTN  EntropyBits,
+  IN  UINTN  BufferSize,
+  OUT UINT8  *Buffer
+  );
+
+#endif // ARM_TRNG_LIB_H_
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 4c81cbd75ab2..fb28d0a5f40a 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -8,6 +8,7 @@
 # Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
 # (C) Copyright 2016 - 2021 Hewlett Packard Enterprise Development LP<BR>
 # Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
+# Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
 #
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
@@ -279,6 +280,10 @@ [LibraryClasses]
   ## @libraryclass  Provides function for SMM CPU Rendezvous Library.
   SmmCpuRendezvousLib|Include/Library/SmmCpuRendezvousLib.h
 
+  ##  @libraryclass  Provides services to generate Entropy using a TRNG.
+  #
+  ArmTrngLib|Include/Library/ArmTrngLib.h
+
 [LibraryClasses.IA32, LibraryClasses.X64, LibraryClasses.AARCH64]
   ##  @libraryclass  Provides services to generate random number.
   #
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 07/19] MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (5 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 06/19] MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 08/19] ArmPkg: Add FID definitions for Arm TRNG PierreGondois
                   ` (13 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

The Arm True Random Number Generator (TRNG) library defines an
interface to access the entropy source on a platform. On platforms
that do not have access to an entropy source, a NULL instance of
the TRNG library may be useful to satisfy the build dependency.

Therefore, add a NULL instance of the Arm TRNG library.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../BaseArmTrngLibNull/BaseArmTrngLibNull.c   | 121 ++++++++++++++++++
 .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf |  30 +++++
 .../BaseArmTrngLibNull/BaseArmTrngLibNull.uni |  12 ++
 MdePkg/MdeLibs.dsc.inc                        |   1 +
 MdePkg/MdePkg.dsc                             |   1 +
 5 files changed, 165 insertions(+)
 create mode 100644 MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
 create mode 100644 MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
 create mode 100644 MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni

diff --git a/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
new file mode 100644
index 000000000000..316d78bf5e83
--- /dev/null
+++ b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
@@ -0,0 +1,121 @@
+/** @file
+  Null version of the Arm TRNG (True Random Number Generator) services
+  (Cf [1]).
+
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - [1] Arm True Random Number Generator Firmware, Interface 1.0,
+        Platform Design Document.
+        (https://developer.arm.com/documentation/den0098/latest/)
+  - [2] NIST Special Publication 800-90B, Recommendation for the Entropy
+        Sources Used for Random Bit Generation.
+        (https://csrc.nist.gov/publications/detail/sp/800-90b/final)
+
+  @par Glossary:
+    - TRNG - True Random Number Generator
+**/
+
+#include <Library/DebugLib.h>
+#include <Library/ArmTrngLib.h>
+
+/** Get the version of the Arm TRNG backend.
+
+  A TRNG may be implemented by the system firmware, in which case this
+  function shall return the version of the Arm TRNG backend.
+  The implementation must return NOT_SUPPORTED if a Back end is not present.
+
+  @param [out]  MajorRevision     Major revision.
+  @param [out]  MinorRevision     Minor revision.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Backend not present.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngVersion (
+  OUT UINT16  *MajorRevision,
+  OUT UINT16  *MinorRevision
+  )
+{
+  ASSERT (FALSE);
+  return RETURN_UNSUPPORTED;
+}
+
+/** Get the UUID of the Arm TRNG backend.
+
+  A TRNG may be implemented by the system firmware, in which case this
+  function shall return the UUID of the TRNG backend.
+  Returning the Arm TRNG UUID is optional and if not implemented,
+  RETURN_UNSUPPORTED shall be returned.
+
+  Note: The caller must not rely on the returned UUID as a trustworthy Arm TRNG
+        Back end identity
+
+  @param [out]  Guid              UUID of the Arm TRNG backend.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngUuid (
+  OUT GUID  *Guid
+  )
+{
+  ASSERT (FALSE);
+  return RETURN_UNSUPPORTED;
+}
+
+/** Returns maximum number of entropy bits that can be returned in a single
+    call.
+
+  @return Returns the maximum number of Entropy bits that can be returned
+          in a single call to GetArmTrngEntropy().
+**/
+UINTN
+EFIAPI
+GetArmTrngMaxSupportedEntropyBits (
+  VOID
+  )
+{
+  ASSERT (FALSE);
+  return 0;
+}
+
+/** Returns N bits of conditioned entropy.
+
+  See [2] Section 2.3.1 GetEntropy: An Interface to the Entropy Source
+    GetEntropy
+      Input:
+        bits_of_entropy: the requested amount of entropy
+      Output:
+        entropy_bitstring: The string that provides the requested entropy.
+      status: A Boolean value that is TRUE if the request has been satisfied,
+              and is FALSE otherwise.
+
+  @param  [in]   EntropyBits  Number of entropy bits requested.
+  @param  [in]   BufferSize   Size of the Buffer in bytes.
+  @param  [out]  Buffer       Buffer to return the entropy bits.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+  @retval  RETURN_BAD_BUFFER_SIZE    Buffer size is too small.
+  @retval  RETURN_NOT_READY          No Entropy available.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngEntropy (
+  IN  UINTN  EntropyBits,
+  IN  UINTN  BufferSize,
+  OUT UINT8  *Buffer
+  )
+{
+  ASSERT (FALSE);
+  return RETURN_UNSUPPORTED;
+}
diff --git a/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
new file mode 100644
index 000000000000..256df1373eee
--- /dev/null
+++ b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
@@ -0,0 +1,30 @@
+## @file
+#  Null instance of the Arm TRNG (True Random Number Generator) Library.
+#
+#  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 1.29
+  BASE_NAME                      = BaseArmTrngLibNull
+  MODULE_UNI_FILE                = BaseArmTrngLibNull.uni
+  FILE_GUID                      = ABDE1C87-4F50-4B82-9133-7A79E13F69AB
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = ArmTrngLib
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64 RISCV64
+#
+
+[Sources]
+  BaseArmTrngLibNull.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  DebugLib
diff --git a/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
new file mode 100644
index 000000000000..876764b8bebc
--- /dev/null
+++ b/MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
@@ -0,0 +1,12 @@
+// /** @file
+// Null Instance of the Arm TRNG (True Random Number Generator) Library.
+//
+//  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+
+#string STR_MODULE_ABSTRACT             #language en-US "Null instance of TRNG Library"
+
+#string STR_MODULE_DESCRIPTION          #language en-US "This library instance should be used with modules that inherit an (indirect) dependency on the ArmTrngLib class, but never actually call ArmTrngLib APIs for consuming Entropy."
diff --git a/MdePkg/MdeLibs.dsc.inc b/MdePkg/MdeLibs.dsc.inc
index fc6f385b304d..4580481cb580 100644
--- a/MdePkg/MdeLibs.dsc.inc
+++ b/MdePkg/MdeLibs.dsc.inc
@@ -12,6 +12,7 @@
 ##
 
 [LibraryClasses]
+  ArmTrngLib|MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
   RegisterFilterLib|MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf
   CpuLib|MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
   SmmCpuRendezvousLib|MdePkg/Library/SmmCpuRendezvousLibNull/SmmCpuRendezvousLibNull.inf
diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc
index 493a13ec9197..32a852dc466e 100644
--- a/MdePkg/MdePkg.dsc
+++ b/MdePkg/MdePkg.dsc
@@ -57,6 +57,7 @@ [Components]
   MdePkg/Library/PciSegmentLibSegmentInfo/BasePciSegmentLibSegmentInfo.inf
   MdePkg/Library/PciSegmentLibSegmentInfo/DxeRuntimePciSegmentLibSegmentInfo.inf
   MdePkg/Library/BaseS3PciSegmentLib/BaseS3PciSegmentLib.inf
+  MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
   MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
   MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf
   MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 08/19] ArmPkg: Add FID definitions for Arm TRNG
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (6 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 07/19] MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 09/19] ArmPkg/ArmTrngLib: Add Arm TRNG library PierreGondois
                   ` (12 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

The Arm True Random Number Generator Firmware, Interface 1.0,
Platform Design Document
(https://developer.arm.com/documentation/den0098/latest/)
defines an interface between an Operating System (OS) executing
at EL1 and Firmware (FW) exposing a conditioned entropy source
that is provided by a TRNG back end.

New function IDs have been defined by the specification for
accessing the TRNG services. Therefore, add these definitions
to the Arm standard SMC header.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 ArmPkg/Include/IndustryStandard/ArmStdSmc.h | 109 +++++++++++++++++++-
 1 file changed, 107 insertions(+), 2 deletions(-)

diff --git a/ArmPkg/Include/IndustryStandard/ArmStdSmc.h b/ArmPkg/Include/IndustryStandard/ArmStdSmc.h
index 78ce77cd734d..374b9ded7f5f 100644
--- a/ArmPkg/Include/IndustryStandard/ArmStdSmc.h
+++ b/ArmPkg/Include/IndustryStandard/ArmStdSmc.h
@@ -1,13 +1,20 @@
 /** @file
 *
 *  Copyright (c) 2020, NUVIA Inc. All rights reserved.<BR>
-*  Copyright (c) 2012-2017, ARM Limited. All rights reserved.
+*  Copyright (c) 2012 - 2022, Arm Limited. All rights reserved.
 *
 *  SPDX-License-Identifier: BSD-2-Clause-Patent
 *
 * @par Revision Reference:
-*  - SMC Calling Convention version 1.2
+*  - [1] SMC Calling Convention version 1.2
 *    (https://developer.arm.com/documentation/den0028/c/?lang=en)
+*  - [2] Arm True Random Number Generator Firmware, Interface 1.0,
+*    Platform Design Document.
+*    (https://developer.arm.com/documentation/den0098/latest/)
+*
+*  @par Glossary:
+*    - TRNG - True Random Number Generator
+*
 **/
 
 #ifndef ARM_STD_SMC_H_
@@ -139,4 +146,102 @@
 /*                                    0xbf00ff02 is reserved */
 #define ARM_SMC_ID_TOS_REVISION  0xbf00ff03
 
+// Firmware TRNG interface Function IDs
+
+/*
+  SMC/HVC call to get the version of the TRNG backend,
+  Cf. [2], 2.1 TRNG_VERSION
+  Input values:
+    W0    0x8400_0050
+    W1-W7 Reserved (MBZ)
+  Return values:
+    Success (W0 > 0) W0[31] MBZ
+      W0[30:16] Major revision
+      W0[15:0] Minor revision
+      W1 - W3 Reserved (MBZ)
+    Error (W0 < 0)
+      NOT_SUPPORTED Function not implemented
+*/
+#define ARM_SMC_ID_TRNG_VERSION  0x84000050
+
+/*
+  SMC/HVC call to check if a TRNG function ID is implemented by the backend,
+  Cf. [2], Section 2.2 TRNG_FEATURES
+  Input Values
+    W0    0x8400_0051
+    W1    trng_func_id
+    W2-W7 Reserved (MBZ)
+  Return values:
+    Success (W0 >= 0):
+      SUCCESS Function is implemented.
+        > 0     Function is implemented and
+                has specific capabilities,
+                see function definition.
+    Error (W0 < 0)
+      NOT_SUPPORTED Function with FID=trng_func_id
+      is not implemented
+*/
+#define ARM_SMC_ID_TRNG_FEATURES  0x84000051
+
+/*
+  SMC/HVC call to get the UUID of the TRNG backend,
+  Cf. [2], Section 2.3 TRNG_GET_UUID
+  Input Values:
+    W0    0x8400_0052
+    W1-W7 Reserved (MBZ)
+  Return Values:
+    Success (W0 != -1)
+        W0 UUID[31:0]
+        W1 UUID[63:32]
+        W2 UUID[95:64]
+        W3 UUID[127:96]
+    Error (W0 = -1)
+        W0 NOT_SUPPORTED
+*/
+#define ARM_SMC_ID_TRNG_GET_UUID  0x84000052
+
+/*
+  AARCH32 SMC/HVC call to get entropy bits, Cf. [2], Section 2.4 TRNG_RND.
+  Input values:
+    W0    0x8400_0053
+    W2-W7 Reserved (MBZ)
+  Return values:
+    Success (W0 = 0):
+      W0 MBZ
+      W1 Entropy[95:64]
+      W2 Entropy[63:32]
+      W3 Entropy[31:0]
+    Error (W0 < 0)
+          W0 NOT_SUPPORTED
+          NO_ENTROPY
+          INVALID_PARAMETERS
+          W1 - W3 Reserved (MBZ)
+*/
+#define ARM_SMC_ID_TRNG_RND_AARCH32  0x84000053
+
+/*
+  AARCH64 SMC/HVC call to get entropy bits, Cf. [2], Section 2.4 TRNG_RND.
+  Input values:
+      X0    0xC400_0053
+      X2-X7 Reserved (MBZ)
+  Return values:
+    Success (X0 = 0):
+      X0 MBZ
+      X1 Entropy[191:128]
+      X2 Entropy[127:64]
+      X3 Entropy[63:0]
+    Error (X0 < 0)
+          X0 NOT_SUPPORTED
+          NO_ENTROPY
+          INVALID_PARAMETERS
+          X1 - X3 Reserved (MBZ)
+*/
+#define ARM_SMC_ID_TRNG_RND_AARCH64  0xC4000053
+
+// Firmware TRNG status codes
+#define TRNG_STATUS_SUCCESS            (INT32)(0)
+#define TRNG_STATUS_NOT_SUPPORTED      (INT32)(-1)
+#define TRNG_STATUS_INVALID_PARAMETER  (INT32)(-2)
+#define TRNG_STATUS_NO_ENTROPY         (INT32)(-3)
+
 #endif // ARM_STD_SMC_H_
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 09/19] ArmPkg/ArmTrngLib: Add Arm TRNG library
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (7 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 08/19] ArmPkg: Add FID definitions for Arm TRNG PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 10/19] SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name PierreGondois
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

The Arm True Random Number Generator Firmware, Interface 1.0,
Platform Design Document
(https://developer.arm.com/documentation/den0098/latest/)
defines an interface between an Operating System (OS) executing
at EL1 and Firmware (FW) exposing a conditioned entropy source
that is provided by a TRNG back end.

The conditioned entropy, that is provided by the Arm TRNG interface,
is commonly used to seed deterministic random number generators.

This patch adds an ArmTrngLib library that implements the Arm TRNG
interface.

Acked-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 ArmPkg/ArmPkg.dsc                        |   1 +
 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h  |  50 +++
 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c   | 388 +++++++++++++++++++++++
 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf |  29 ++
 4 files changed, 468 insertions(+)
 create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
 create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
 create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf

diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc
index 11b473974463..ac24ebce4892 100644
--- a/ArmPkg/ArmPkg.dsc
+++ b/ArmPkg/ArmPkg.dsc
@@ -131,6 +131,7 @@ [Components.common]
   ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
   ArmPkg/Library/ArmGenericTimerVirtCounterLib/ArmGenericTimerVirtCounterLib.inf
 
+  ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
   ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
   ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
   ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
diff --git a/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h b/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
new file mode 100644
index 000000000000..8038a968b50f
--- /dev/null
+++ b/ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
@@ -0,0 +1,50 @@
+/** @file
+  Arm Firmware TRNG definitions.
+
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - [1] Arm True Random Number Generator Firmware, Interface 1.0,
+        Platform Design Document.
+        (https://developer.arm.com/documentation/den0098/latest/)
+
+  @par Glossary:
+    - TRNG - True Random Number Generator
+    - FID  - Function ID
+**/
+
+#ifndef ARM_FW_TRNG_DEFS_H_
+#define ARM_FW_TRNG_DEFS_H_
+
+#include <IndustryStandard/ArmStdSmc.h>
+
+// Firmware TRNG revision mask and shift
+#define TRNG_REV_MAJOR_MASK   0x7FFF
+#define TRNG_REV_MINOR_MASK   0xFFFF
+#define TRNG_REV_MAJOR_SHIFT  16
+
+#if defined (MDE_CPU_ARM)
+
+/** FID to use on AArch32 platform to request entropy.
+*/
+#define ARM_SMC_ID_TRNG_RND  ARM_SMC_ID_TRNG_RND_AARCH32
+
+/** Maximum bits of entropy supported on AArch32.
+*/
+#define MAX_ENTROPY_BITS  96
+#elif defined (MDE_CPU_AARCH64)
+
+/** FID to use on AArch64 platform to request entropy.
+*/
+#define ARM_SMC_ID_TRNG_RND  ARM_SMC_ID_TRNG_RND_AARCH64
+
+/** Maximum bits of entropy supported on AArch64.
+*/
+#define MAX_ENTROPY_BITS  192
+#else
+  #error "Firmware TRNG not supported. Unknown chipset."
+#endif
+
+#endif // ARM_FW_TRNG_DEFS_H_
diff --git a/ArmPkg/Library/ArmTrngLib/ArmTrngLib.c b/ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
new file mode 100644
index 000000000000..b974a9423880
--- /dev/null
+++ b/ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
@@ -0,0 +1,388 @@
+/** @file
+  Arm Firmware TRNG interface library.
+
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Reference(s):
+  - [1] Arm True Random Number Generator Firmware, Interface 1.0,
+        Platform Design Document.
+        (https://developer.arm.com/documentation/den0098/latest/)
+  - [2] NIST Special Publication 800-90B, Recommendation for the Entropy
+        Sources Used for Random Bit Generation.
+        (https://csrc.nist.gov/publications/detail/sp/800-90b/final)
+
+  @par Glossary:
+    - TRNG - True Random Number Generator
+    - FID  - Function ID
+**/
+
+#include <Base.h>
+#include <Library/ArmLib.h>
+#include <Library/ArmMonitorLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+
+#include "ArmTrngDefs.h"
+
+/** Convert TRNG status codes to RETURN status codes.
+
+  @param [in]  TrngStatus    TRNG status code.
+
+  @retval  RETURN_SUCCESS            Success.
+  @retval  RETURN_UNSUPPORTED        Function not implemented or
+                                     negative return code.
+  @retval  RETURN_INVALID_PARAMETER  A parameter is invalid.
+  @retval  RETURN_NOT_READY          No Entropy available.
+**/
+STATIC
+RETURN_STATUS
+TrngStatusToReturnStatus (
+  IN  INT32  TrngStatus
+  )
+{
+  switch (TrngStatus) {
+    case TRNG_STATUS_NOT_SUPPORTED:
+      return RETURN_UNSUPPORTED;
+
+    case TRNG_STATUS_INVALID_PARAMETER:
+      return RETURN_INVALID_PARAMETER;
+
+    case TRNG_STATUS_NO_ENTROPY:
+      return RETURN_NOT_READY;
+
+    case TRNG_STATUS_SUCCESS:
+      return RETURN_SUCCESS;
+
+    default:
+      if (TrngStatus < 0) {
+        return RETURN_UNSUPPORTED;
+      }
+
+      return RETURN_SUCCESS;
+  }
+}
+
+/** Get the version of the Arm TRNG backend.
+
+  A TRNG may be implemented by the system firmware, in which case this
+  function shall return the version of the Arm TRNG backend.
+  The implementation must return NOT_SUPPORTED if a Back end is not present.
+
+  @param [out]  MajorRevision     Major revision.
+  @param [out]  MinorRevision     Minor revision.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Backend not present.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngVersion (
+  OUT UINT16  *MajorRevision,
+  OUT UINT16  *MinorRevision
+  )
+{
+  RETURN_STATUS     Status;
+  ARM_MONITOR_ARGS  Parameters;
+  INT32             Revision;
+
+  if ((MajorRevision == NULL) || (MinorRevision == NULL)) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  ZeroMem (&Parameters, sizeof (Parameters));
+
+  Parameters.Arg0 = ARM_SMC_ID_TRNG_VERSION;
+  ArmMonitorCall (&Parameters);
+
+  Revision = (INT32)Parameters.Arg0;
+  Status   = TrngStatusToReturnStatus (Revision);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  *MinorRevision = (Revision & TRNG_REV_MINOR_MASK);
+  *MajorRevision = ((Revision >> TRNG_REV_MAJOR_SHIFT) & TRNG_REV_MAJOR_MASK);
+  return RETURN_SUCCESS;
+}
+
+/** Get the features supported by the Arm TRNG backend.
+
+  The caller can determine if functions defined in the Arm TRNG ABI are
+  present in the ABI implementation.
+
+  @param [in]  FunctionId         Function Id.
+  @param [out] Capability         Function specific capability if present.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+**/
+STATIC
+RETURN_STATUS
+EFIAPI
+GetArmTrngFeatures (
+  IN  CONST UINT32  FunctionId,
+  OUT       UINT32  *Capability      OPTIONAL
+  )
+{
+  ARM_MONITOR_ARGS  Parameters;
+  RETURN_STATUS     Status;
+
+  ZeroMem (&Parameters, sizeof (Parameters));
+
+  Parameters.Arg0 = ARM_SMC_ID_TRNG_FEATURES;
+  Parameters.Arg1 = FunctionId;
+  ArmMonitorCall (&Parameters);
+
+  Status = TrngStatusToReturnStatus (Parameters.Arg0);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  if (Capability != NULL) {
+    *Capability = (UINT32)Parameters.Arg0;
+  }
+
+  return RETURN_SUCCESS;
+}
+
+/** Get the UUID of the Arm TRNG backend.
+
+  A TRNG may be implemented by the system firmware, in which case this
+  function shall return the UUID of the TRNG backend.
+  Returning the Arm TRNG UUID is optional and if not implemented,
+  RETURN_UNSUPPORTED shall be returned.
+
+  Note: The caller must not rely on the returned UUID as a trustworthy Arm TRNG
+        Back end identity
+
+  @param [out]  Guid              UUID of the Arm TRNG backend.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngUuid (
+  OUT GUID  *Guid
+  )
+{
+  ARM_MONITOR_ARGS  Parameters;
+
+  if (Guid == NULL) {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  ZeroMem (&Parameters, sizeof (Parameters));
+
+  Parameters.Arg0 = ARM_SMC_ID_TRNG_GET_UUID;
+  ArmMonitorCall (&Parameters);
+
+  // Only invalid value is TRNG_STATUS_NOT_SUPPORTED (-1).
+  if ((INT32)Parameters.Arg0 == TRNG_STATUS_NOT_SUPPORTED) {
+    return TrngStatusToReturnStatus ((INT32)Parameters.Arg0);
+  }
+
+  Guid->Data1 = (Parameters.Arg0 & MAX_UINT32);
+  Guid->Data2 = (Parameters.Arg1 & MAX_UINT16);
+  Guid->Data3 = ((Parameters.Arg1 >> 16) & MAX_UINT16);
+
+  Guid->Data4[0] = (Parameters.Arg2 & MAX_UINT8);
+  Guid->Data4[1] = ((Parameters.Arg2 >> 8) & MAX_UINT8);
+  Guid->Data4[2] = ((Parameters.Arg2 >> 16) & MAX_UINT8);
+  Guid->Data4[3] = ((Parameters.Arg2 >> 24) & MAX_UINT8);
+
+  Guid->Data4[4] = (Parameters.Arg3 & MAX_UINT8);
+  Guid->Data4[5] = ((Parameters.Arg3 >> 8) & MAX_UINT8);
+  Guid->Data4[6] = ((Parameters.Arg3 >> 16) & MAX_UINT8);
+  Guid->Data4[7] = ((Parameters.Arg3 >> 24) & MAX_UINT8);
+
+  DEBUG ((DEBUG_INFO, "FW-TRNG: UUID %g\n", Guid));
+
+  return RETURN_SUCCESS;
+}
+
+/** Returns maximum number of entropy bits that can be returned in a single
+    call.
+
+  @return Returns the maximum number of Entropy bits that can be returned
+          in a single call to GetArmTrngEntropy().
+**/
+UINTN
+EFIAPI
+GetArmTrngMaxSupportedEntropyBits (
+  VOID
+  )
+{
+  return MAX_ENTROPY_BITS;
+}
+
+/** Returns N bits of conditioned entropy.
+
+  See [2] Section 2.3.1 GetEntropy: An Interface to the Entropy Source
+    GetEntropy
+      Input:
+        bits_of_entropy: the requested amount of entropy
+      Output:
+        entropy_bitstring: The string that provides the requested entropy.
+      status: A Boolean value that is TRUE if the request has been satisfied,
+              and is FALSE otherwise.
+
+  @param  [in]   EntropyBits  Number of entropy bits requested.
+  @param  [in]   BufferSize   Size of the Buffer in bytes.
+  @param  [out]  Buffer       Buffer to return the entropy bits.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+  @retval  RETURN_BAD_BUFFER_SIZE    Buffer size is too small.
+  @retval  RETURN_NOT_READY          No Entropy available.
+**/
+RETURN_STATUS
+EFIAPI
+GetArmTrngEntropy (
+  IN  UINTN  EntropyBits,
+  IN  UINTN  BufferSize,
+  OUT UINT8  *Buffer
+  )
+{
+  RETURN_STATUS     Status;
+  ARM_MONITOR_ARGS  Parameters;
+  UINTN             EntropyBytes;
+  UINTN             LastValidBits;
+  UINTN             BytesToClear;
+  UINTN             EntropyData[3];
+
+  if ((EntropyBits == 0)                ||
+      (EntropyBits > MAX_ENTROPY_BITS)  ||
+      (Buffer == NULL))
+  {
+    return RETURN_INVALID_PARAMETER;
+  }
+
+  EntropyBytes = (EntropyBits + 7) >> 3;
+  if (EntropyBytes > BufferSize) {
+    return RETURN_BAD_BUFFER_SIZE;
+  }
+
+  ZeroMem (Buffer, BufferSize);
+  ZeroMem (&Parameters, sizeof (Parameters));
+
+  Parameters.Arg0 = ARM_SMC_ID_TRNG_RND;
+  Parameters.Arg1 = EntropyBits;
+  ArmMonitorCall (&Parameters);
+
+  Status = TrngStatusToReturnStatus ((INT32)Parameters.Arg0);
+  if (RETURN_ERROR (Status)) {
+    return Status;
+  }
+
+  // The entropy data is returned in the Parameters.Arg<3..1>
+  // With the lower order bytes in Parameters.Arg3 and the higher
+  // order bytes being stored in Parameters.Arg1.
+  EntropyData[0] = Parameters.Arg3;
+  EntropyData[1] = Parameters.Arg2;
+  EntropyData[2] = Parameters.Arg1;
+
+  CopyMem (Buffer, EntropyData, EntropyBytes);
+
+  // Mask off any unused top bytes, in accordance with specification.
+  BytesToClear = BufferSize - EntropyBytes;
+  if (BytesToClear != 0) {
+    ZeroMem (&Buffer[EntropyBytes], BytesToClear);
+  }
+
+  // Clear the unused MSB bits of the last byte.
+  LastValidBits = EntropyBits & 0x7;
+  if (LastValidBits != 0) {
+    Buffer[EntropyBytes - 1] &= (0xFF >> (8 - LastValidBits));
+  }
+
+  return Status;
+}
+
+/** The constructor checks that the FW-TRNG interface is supported
+    by the host firmware.
+
+  It will ASSERT() if FW-TRNG is not supported.
+  It will always return RETURN_SUCCESS.
+
+  @retval RETURN_SUCCESS   The constructor always returns RETURN_SUCCESS.
+**/
+RETURN_STATUS
+EFIAPI
+ArmTrngLibConstructor (
+  VOID
+  )
+{
+  ARM_MONITOR_ARGS  Parameters;
+  RETURN_STATUS     Status;
+  UINT16            MajorRev;
+  UINT16            MinorRev;
+  GUID              Guid;
+
+  ZeroMem (&Parameters, sizeof (Parameters));
+
+  Parameters.Arg0 = SMCCC_VERSION;
+  ArmMonitorCall (&Parameters);
+  Status = TrngStatusToReturnStatus ((INT32)Parameters.Arg0);
+  if (RETURN_ERROR (Status)) {
+    ASSERT_RETURN_ERROR (Status);
+    goto ErrorHandler;
+  }
+
+  // Cf [1] s2.1.3 'Caller responsibilities',
+  // SMCCC version must be greater or equal than 1.1
+  if ((INT32)Parameters.Arg0 < 0x10001) {
+    ASSERT_RETURN_ERROR (RETURN_UNSUPPORTED);
+    goto ErrorHandler;
+  }
+
+  Status = GetArmTrngVersion (&MajorRev, &MinorRev);
+  if (RETURN_ERROR (Status)) {
+    ASSERT_RETURN_ERROR (Status);
+    goto ErrorHandler;
+  }
+
+  // Check that the required features are present.
+  Status = GetArmTrngFeatures (ARM_SMC_ID_TRNG_RND, NULL);
+  if (RETURN_ERROR (Status)) {
+    ASSERT_RETURN_ERROR (Status);
+    goto ErrorHandler;
+  }
+
+  // Check if TRNG UUID is supported and if so trace the GUID.
+  Status = GetArmTrngFeatures (ARM_SMC_ID_TRNG_GET_UUID, NULL);
+  if (RETURN_ERROR (Status)) {
+    ASSERT_RETURN_ERROR (Status);
+    goto ErrorHandler;
+  }
+
+  DEBUG_CODE_BEGIN ();
+
+  Status = GetArmTrngUuid (&Guid);
+  if (RETURN_ERROR (Status)) {
+    ASSERT_RETURN_ERROR (Status);
+    goto ErrorHandler;
+  }
+
+  DEBUG ((
+    DEBUG_INFO,
+    "FW-TRNG: Version %d.%d, GUID {%g}\n",
+    MajorRev,
+    MinorRev,
+    Guid
+    ));
+
+  DEBUG_CODE_END ();
+
+  return RETURN_SUCCESS;
+
+ErrorHandler:
+  DEBUG ((DEBUG_ERROR, "ArmTrngLib could not be correctly initialized.\n"));
+  return RETURN_SUCCESS;
+}
diff --git a/ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf b/ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
new file mode 100644
index 000000000000..d89efcdc9806
--- /dev/null
+++ b/ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
@@ -0,0 +1,29 @@
+## @file
+#  Arm Firmware TRNG interface library.
+#
+#  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION       = 1.29
+  BASE_NAME         = ArmTrngLib
+  FILE_GUID         = 10DE97C9-28E4-4C9B-A53E-8D7D1B0DD4E0
+  VERSION_STRING    = 1.0
+  MODULE_TYPE       = BASE
+  LIBRARY_CLASS     = ArmTrngLib
+  CONSTRUCTOR       = ArmTrngLibConstructor
+
+[Sources]
+  ArmTrngDefs.h
+  ArmTrngLib.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  ArmMonitorLib
+  BaseLib
+  BaseMemoryLib
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 10/19] SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (8 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 09/19] ArmPkg/ArmTrngLib: Add Arm TRNG library PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 11/19] SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid PierreGondois
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

Rename RdRandGenerateEntropy() to GenerateEntropy() to provide a
common interface to generate entropy on other architectures.
GenerateEntropy() is intended to generate high quality entropy.

Also move the definition to RngDxeInternals.h

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../RngDxe/Rand/RdRand.c                      | 14 ++++--
 .../RngDxe/Rand/RdRand.h                      | 43 -------------------
 .../RngDxe/Rand/RngDxe.c                      |  7 ++-
 .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  2 +-
 .../RngDxe/RngDxeInternals.h                  | 19 ++++++++
 5 files changed, 36 insertions(+), 49 deletions(-)
 delete mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.c
index 5b6644138231..4b011c7e8e49 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.c
@@ -1,15 +1,23 @@
 /** @file
-  Support routines for RDRAND instruction access.
+  Support routines for RDRAND instruction access, which will leverage
+  Intel Secure Key technology to provide high-quality random numbers for use
+  in applications, or entropy for seeding other random number generators.
+  Refer to http://software.intel.com/en-us/articles/intel-digital-random-number
+  -generator-drng-software-implementation-guide/ for more information about Intel
+  Secure Key technology.
 
+Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
 Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
 (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
 #include <Library/RngLib.h>
+#include <Library/TimerLib.h>
 
 #include "AesCore.h"
-#include "RdRand.h"
 #include "RngDxeInternals.h"
 
 /**
@@ -87,7 +95,7 @@ RdRandGetSeed128 (
 **/
 EFI_STATUS
 EFIAPI
-RdRandGenerateEntropy (
+GenerateEntropy (
   IN UINTN   Length,
   OUT UINT8  *Entropy
   )
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h
deleted file mode 100644
index 7fdb6891bd63..000000000000
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/** @file
-  Header for the RDRAND APIs used by RNG DXE driver.
-
-  Support API definitions for RDRAND instruction access, which will leverage
-  Intel Secure Key technology to provide high-quality random numbers for use
-  in applications, or entropy for seeding other random number generators.
-  Refer to http://software.intel.com/en-us/articles/intel-digital-random-number
-  -generator-drng-software-implementation-guide/ for more information about Intel
-  Secure Key technology.
-
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
-(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#ifndef __RD_RAND_H__
-#define __RD_RAND_H__
-
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/TimerLib.h>
-#include <Protocol/Rng.h>
-
-/**
-  Generate high-quality entropy source through RDRAND.
-
-  @param[in]   Length        Size of the buffer, in bytes, to fill with.
-  @param[out]  Entropy       Pointer to the buffer to store the entropy data.
-
-  @retval EFI_SUCCESS        Entropy generation succeeded.
-  @retval EFI_NOT_READY      Failed to request random data.
-
-**/
-EFI_STATUS
-EFIAPI
-RdRandGenerateEntropy (
-  IN UINTN   Length,
-  OUT UINT8  *Entropy
-  );
-
-#endif // __RD_RAND_H__
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
index 2df4ed44329a..8d44f0636c3d 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
@@ -14,13 +14,16 @@
    - EFI_RNG_ALGORITHM_X9_31_3DES_GUID        - Unsupported
    - EFI_RNG_ALGORITHM_X9_31_AES_GUID         - Unsupported
 
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
   Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
   (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
-#include "RdRand.h"
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+
 #include "RngDxeInternals.h"
 
 /**
@@ -88,7 +91,7 @@ RngGetRNG (
       return EFI_INVALID_PARAMETER;
     }
 
-    Status = RdRandGenerateEntropy (RNGValueLength, RNGValue);
+    Status = GenerateEntropy (RNGValueLength, RNGValue);
     return Status;
   }
 
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
index f3300971993f..60efb5562ee0 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
@@ -10,6 +10,7 @@
 #
 #  Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
 #  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
+#  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
 #  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
@@ -36,7 +37,6 @@ [Sources.common]
 [Sources.IA32, Sources.X64]
   Rand/RngDxe.c
   Rand/RdRand.c
-  Rand/RdRand.h
   Rand/AesCore.c
   Rand/AesCore.h
 
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
index 224d8bd4ea5f..48d2d27c1608 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
@@ -10,6 +10,8 @@
 #ifndef RNGDXE_INTERNALS_H_
 #define RNGDXE_INTERNALS_H_
 
+#include <Protocol/Rng.h>
+
 /**
   Returns information about the random number generation implementation.
 
@@ -114,4 +116,21 @@ RngGetBytes (
   OUT UINT8  *RandBuffer
   );
 
+/**
+  Generate high-quality entropy source using a TRNG or through RDRAND.
+
+  @param[in]   Length        Size of the buffer, in bytes, to fill with.
+  @param[out]  Entropy       Pointer to the buffer to store the entropy data.
+
+  @retval EFI_SUCCESS        Entropy generation succeeded.
+  @retval EFI_NOT_READY      Failed to request random data.
+
+**/
+EFI_STATUS
+EFIAPI
+GenerateEntropy (
+  IN UINTN   Length,
+  OUT UINT8  *Entropy
+  );
+
 #endif // RNGDXE_INTERNALS_H_
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 11/19] SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (9 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 10/19] SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 12/19] SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms() PierreGondois
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

gEfiRngAlgorithmSp80090Ctr256Guid was used as the default algorithm
in RngGetRNG(). The commit below set the default algorithm to
PcdCpuRngSupportedAlgorithm, which is a zero GUID by default.

As the Pcd value is not defined for any platform in the edk2-platfoms
repository, assume it was an error and go back to the first version,
using gEfiRngAlgorithmSp80090Ctr256Guid.

Fixes 4e5ecdbac8bd ("SecurityPkg: Add support for RngDxe on AARCH64")
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
 SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
index 8d44f0636c3d..df7db12b771c 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
@@ -126,8 +126,7 @@ ArchGetSupportedRngAlgorithms (
   OUT    EFI_RNG_ALGORITHM  *RNGAlgorithmList
   )
 {
-  UINTN              RequiredSize;
-  EFI_RNG_ALGORITHM  *CpuRngSupportedAlgorithm;
+  UINTN  RequiredSize;
 
   RequiredSize = 2 * sizeof (EFI_RNG_ALGORITHM);
 
@@ -136,9 +135,7 @@ ArchGetSupportedRngAlgorithms (
     return EFI_BUFFER_TOO_SMALL;
   }
 
-  CpuRngSupportedAlgorithm = PcdGetPtr (PcdCpuRngSupportedAlgorithm);
-
-  CopyMem (&RNGAlgorithmList[0], CpuRngSupportedAlgorithm, sizeof (EFI_RNG_ALGORITHM));
+  CopyMem (&RNGAlgorithmList[0], &gEfiRngAlgorithmSp80090Ctr256Guid, sizeof (EFI_RNG_ALGORITHM));
 
   // x86 platforms also support EFI_RNG_ALGORITHM_RAW via RDSEED
   CopyMem (&RNGAlgorithmList[1], &gEfiRngAlgorithmRaw, sizeof (EFI_RNG_ALGORITHM));
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 12/19] SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms()
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (10 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 11/19] SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 13/19] SecurityPkg/RngDxe: Documentation/include/parameter cleanup PierreGondois
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <Pierre.Gondois@arm.com>

RngGetInfo() is one of the 2 functions of the EFI_RNG_PROTOCOL.
RngGetInfo() is currently a mere wrapper around
ArchGetSupportedRngAlgorithms() which is implemented differently
depending on the architecture used.

RngGetInfo() does nothing more than calling
ArchGetSupportedRngAlgorithms(). So remove it, and let RngGetInfo()
be implemented differently according to the architecture.

This follows the implementation of the other function of the
EFI_RNG_PROTOCOL, RngGetRNG().

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../RngDxe/AArch64/RngDxe.c                   | 19 +++++--
 .../RngDxe/Rand/RngDxe.c                      | 22 +++++++--
 .../RandomNumberGenerator/RngDxe/RngDxe.c     | 49 -------------------
 .../RngDxe/RngDxeInternals.h                  | 25 ----------
 4 files changed, 33 insertions(+), 82 deletions(-)

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
index 3daf847d46d3..6d989f7ea376 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
@@ -14,6 +14,7 @@
   Copyright (c) 2021, NUVIA Inc. All rights reserved.<BR>
   Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
   (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
 
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
@@ -85,6 +86,7 @@ RngGetRNG (
 /**
   Returns information about the random number generation implementation.
 
+  @param[in]     This                 A pointer to the EFI_RNG_PROTOCOL instance.
   @param[in,out] RNGAlgorithmListSize On input, the size in bytes of RNGAlgorithmList.
                                       On output with a return code of EFI_SUCCESS, the size
                                       in bytes of the data returned in RNGAlgorithmList. On output
@@ -97,14 +99,19 @@ RngGetRNG (
                                       is the default algorithm for the driver.
 
   @retval EFI_SUCCESS                 The RNG algorithm list was returned successfully.
+  @retval EFI_UNSUPPORTED             The services is not supported by this driver.
+  @retval EFI_DEVICE_ERROR            The list of algorithms could not be retrieved due to a
+                                      hardware or firmware error.
+  @retval EFI_INVALID_PARAMETER       One or more of the parameters are incorrect.
   @retval EFI_BUFFER_TOO_SMALL        The buffer RNGAlgorithmList is too small to hold the result.
 
 **/
-UINTN
+EFI_STATUS
 EFIAPI
-ArchGetSupportedRngAlgorithms (
-  IN OUT UINTN              *RNGAlgorithmListSize,
-  OUT    EFI_RNG_ALGORITHM  *RNGAlgorithmList
+RngGetInfo (
+  IN EFI_RNG_PROTOCOL    *This,
+  IN OUT UINTN           *RNGAlgorithmListSize,
+  OUT EFI_RNG_ALGORITHM  *RNGAlgorithmList
   )
 {
   UINTN              RequiredSize;
@@ -112,6 +119,10 @@ ArchGetSupportedRngAlgorithms (
 
   RequiredSize = sizeof (EFI_RNG_ALGORITHM);
 
+  if ((This == NULL) || (RNGAlgorithmListSize == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
   if (*RNGAlgorithmListSize < RequiredSize) {
     *RNGAlgorithmListSize = RequiredSize;
     return EFI_BUFFER_TOO_SMALL;
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
index df7db12b771c..b2d2236380fd 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
@@ -104,6 +104,7 @@ RngGetRNG (
 /**
   Returns information about the random number generation implementation.
 
+  @param[in]     This                 A pointer to the EFI_RNG_PROTOCOL instance.
   @param[in,out] RNGAlgorithmListSize On input, the size in bytes of RNGAlgorithmList.
                                       On output with a return code of EFI_SUCCESS, the size
                                       in bytes of the data returned in RNGAlgorithmList. On output
@@ -116,18 +117,27 @@ RngGetRNG (
                                       is the default algorithm for the driver.
 
   @retval EFI_SUCCESS                 The RNG algorithm list was returned successfully.
+  @retval EFI_UNSUPPORTED             No supported algorithms found.
+  @retval EFI_DEVICE_ERROR            The list of algorithms could not be retrieved due to a
+                                      hardware or firmware error.
+  @retval EFI_INVALID_PARAMETER       One or more of the parameters are incorrect.
   @retval EFI_BUFFER_TOO_SMALL        The buffer RNGAlgorithmList is too small to hold the result.
 
 **/
-UINTN
+EFI_STATUS
 EFIAPI
-ArchGetSupportedRngAlgorithms (
-  IN OUT UINTN              *RNGAlgorithmListSize,
-  OUT    EFI_RNG_ALGORITHM  *RNGAlgorithmList
+RngGetInfo (
+  IN EFI_RNG_PROTOCOL    *This,
+  IN OUT UINTN           *RNGAlgorithmListSize,
+  OUT EFI_RNG_ALGORITHM  *RNGAlgorithmList
   )
 {
   UINTN  RequiredSize;
 
+  if ((This == NULL) || (RNGAlgorithmListSize == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
   RequiredSize = 2 * sizeof (EFI_RNG_ALGORITHM);
 
   if (*RNGAlgorithmListSize < RequiredSize) {
@@ -135,6 +145,10 @@ ArchGetSupportedRngAlgorithms (
     return EFI_BUFFER_TOO_SMALL;
   }
 
+  if (RNGAlgorithmList == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
   CopyMem (&RNGAlgorithmList[0], &gEfiRngAlgorithmSp80090Ctr256Guid, sizeof (EFI_RNG_ALGORITHM));
 
   // x86 platforms also support EFI_RNG_ALGORITHM_RAW via RDSEED
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
index 6f52eeff4a09..6608ca8804a5 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
@@ -28,55 +28,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 
 #include "RngDxeInternals.h"
 
-/**
-  Returns information about the random number generation implementation.
-
-  @param[in]     This                 A pointer to the EFI_RNG_PROTOCOL instance.
-  @param[in,out] RNGAlgorithmListSize On input, the size in bytes of RNGAlgorithmList.
-                                      On output with a return code of EFI_SUCCESS, the size
-                                      in bytes of the data returned in RNGAlgorithmList. On output
-                                      with a return code of EFI_BUFFER_TOO_SMALL,
-                                      the size of RNGAlgorithmList required to obtain the list.
-  @param[out] RNGAlgorithmList        A caller-allocated memory buffer filled by the driver
-                                      with one EFI_RNG_ALGORITHM element for each supported
-                                      RNG algorithm. The list must not change across multiple
-                                      calls to the same driver. The first algorithm in the list
-                                      is the default algorithm for the driver.
-
-  @retval EFI_SUCCESS                 The RNG algorithm list was returned successfully.
-  @retval EFI_UNSUPPORTED             The services is not supported by this driver.
-  @retval EFI_DEVICE_ERROR            The list of algorithms could not be retrieved due to a
-                                      hardware or firmware error.
-  @retval EFI_INVALID_PARAMETER       One or more of the parameters are incorrect.
-  @retval EFI_BUFFER_TOO_SMALL        The buffer RNGAlgorithmList is too small to hold the result.
-
-**/
-EFI_STATUS
-EFIAPI
-RngGetInfo (
-  IN EFI_RNG_PROTOCOL    *This,
-  IN OUT UINTN           *RNGAlgorithmListSize,
-  OUT EFI_RNG_ALGORITHM  *RNGAlgorithmList
-  )
-{
-  EFI_STATUS  Status;
-
-  if ((This == NULL) || (RNGAlgorithmListSize == NULL)) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  // Return algorithm list supported by driver.
-  //
-  if (RNGAlgorithmList != NULL) {
-    Status = ArchGetSupportedRngAlgorithms (RNGAlgorithmListSize, RNGAlgorithmList);
-  } else {
-    Status = EFI_INVALID_PARAMETER;
-  }
-
-  return Status;
-}
-
 //
 // The Random Number Generator (RNG) protocol
 //
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
index 48d2d27c1608..7ecab140483d 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
@@ -74,31 +74,6 @@ RngGetRNG (
   OUT UINT8             *RNGValue
   );
 
-/**
-  Returns information about the random number generation implementation.
-
-  @param[in,out] RNGAlgorithmListSize On input, the size in bytes of RNGAlgorithmList.
-                                      On output with a return code of EFI_SUCCESS, the size
-                                      in bytes of the data returned in RNGAlgorithmList. On output
-                                      with a return code of EFI_BUFFER_TOO_SMALL,
-                                      the size of RNGAlgorithmList required to obtain the list.
-  @param[out] RNGAlgorithmList        A caller-allocated memory buffer filled by the driver
-                                      with one EFI_RNG_ALGORITHM element for each supported
-                                      RNG algorithm. The list must not change across multiple
-                                      calls to the same driver. The first algorithm in the list
-                                      is the default algorithm for the driver.
-
-  @retval EFI_SUCCESS                 The RNG algorithm list was returned successfully.
-  @retval EFI_BUFFER_TOO_SMALL        The buffer RNGAlgorithmList is too small to hold the result.
-
-**/
-UINTN
-EFIAPI
-ArchGetSupportedRngAlgorithms (
-  IN OUT UINTN              *RNGAlgorithmListSize,
-  OUT    EFI_RNG_ALGORITHM  *RNGAlgorithmList
-  );
-
 /**
   Runs CPU RNG instruction to fill a buffer of arbitrary size with random bytes.
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 13/19] SecurityPkg/RngDxe: Documentation/include/parameter cleanup
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (11 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 12/19] SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms() PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 14/19] SecurityPkg/RngDxe: Check before advertising Cpu Rng algo PierreGondois
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <Pierre.Gondois@arm.com>

This patch:
-Update RngGetBytes() documentation to align the function
 definition and declaration.
-Improve input parameter checking. Even though 'This'
 it is not used, the parameter should always point to the
 current EFI_RNG_PROTOCOL.
-Removes TimerLib inclusion as unused.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c | 3 +--
 SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c    | 2 +-
 SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c         | 3 +--
 3 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
index 6d989f7ea376..f9c740d761ff 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
@@ -23,7 +23,6 @@
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
 #include <Library/UefiBootServicesTableLib.h>
-#include <Library/TimerLib.h>
 #include <Protocol/Rng.h>
 
 #include "RngDxeInternals.h"
@@ -61,7 +60,7 @@ RngGetRNG (
 {
   EFI_STATUS  Status;
 
-  if ((RNGValueLength == 0) || (RNGValue == NULL)) {
+  if ((This == NULL) || (RNGValueLength == 0) || (RNGValue == NULL)) {
     return EFI_INVALID_PARAMETER;
   }
 
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
index b2d2236380fd..8f5d8e740f5e 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
@@ -59,7 +59,7 @@ RngGetRNG (
 {
   EFI_STATUS  Status;
 
-  if ((RNGValueLength == 0) || (RNGValue == NULL)) {
+  if ((This == NULL) || (RNGValueLength == 0) || (RNGValue == NULL)) {
     return EFI_INVALID_PARAMETER;
   }
 
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
index 6608ca8804a5..d7905a7f4d72 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
@@ -23,7 +23,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/BaseMemoryLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/RngLib.h>
-#include <Library/TimerLib.h>
 #include <Protocol/Rng.h>
 
 #include "RngDxeInternals.h"
@@ -72,7 +71,7 @@ RngDriverEntry (
 }
 
 /**
-  Calls RDRAND to fill a buffer of arbitrary size with random bytes.
+  Runs CPU RNG instruction to fill a buffer of arbitrary size with random bytes.
 
   @param[in]   Length        Size of the buffer, in bytes,  to fill with.
   @param[out]  RandBuffer    Pointer to the buffer to store the random result.
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 14/19] SecurityPkg/RngDxe: Check before advertising Cpu Rng algo
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (12 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 13/19] SecurityPkg/RngDxe: Documentation/include/parameter cleanup PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 15/19] SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through ArmTrngLib PierreGondois
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

RngGetBytes() relies on the RngLib. The RngLib might use the RNDR
instruction if the FEAT_RNG feature is present. RngGetInfo and
RngGetRNG both must check that RngGetBytes() is working before
advertising/using it.

To do so, allocate an array storing the available algorithms.
The Rng algorithm at the lowest index will be the default Rng
algorithm. The array is shared between RngGetInfo and RngGetRNG.

This array is allocated when the driver is loaded, and freed
when unloaded.

This patch also prevents from having PcdCpuRngSupportedAlgorithm
let to a zero GUID, but let the possibility to have no valid Rng
algorithm in such case.

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
 .../RngDxe/AArch64/RngDxe.c                   | 87 +++++++++++++++++--
 .../RngDxe/Rand/RngDxe.c                      | 26 ++++++
 .../RandomNumberGenerator/RngDxe/RngDxe.c     | 40 ++++++++-
 .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  1 +
 .../RngDxe/RngDxeInternals.h                  | 27 ++++++
 5 files changed, 172 insertions(+), 9 deletions(-)

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
index f9c740d761ff..09a5924a699b 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
@@ -22,11 +22,63 @@
 
 #include <Library/BaseLib.h>
 #include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
 #include <Library/UefiBootServicesTableLib.h>
+#include <Library/RngLib.h>
 #include <Protocol/Rng.h>
 
 #include "RngDxeInternals.h"
 
+// Maximum number of Rng algorithms.
+#define RNG_AVAILABLE_ALGO_MAX  1
+
+/** Allocate and initialize mAvailableAlgoArray with the available
+    Rng algorithms. Also update mAvailableAlgoArrayCount.
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+GetAvailableAlgorithms (
+  VOID
+  )
+{
+  UINT64  DummyRand;
+
+  // Allocate RNG_AVAILABLE_ALGO_MAX entries to avoid evaluating
+  // Rng algorithms 2 times, one for the allocation, one to populate.
+  mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX);
+  if (mAvailableAlgoArray == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  // Check RngGetBytes() before advertising PcdCpuRngSupportedAlgorithm.
+  if (!EFI_ERROR (RngGetBytes (sizeof (DummyRand), (UINT8 *)&DummyRand))) {
+    CopyMem (
+      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
+      PcdGetPtr (PcdCpuRngSupportedAlgorithm),
+      sizeof (EFI_RNG_ALGORITHM)
+      );
+    mAvailableAlgoArrayCount++;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/** Free mAvailableAlgoArray.
+**/
+VOID
+EFIAPI
+FreeAvailableAlgorithms (
+  VOID
+  )
+{
+  FreePool (mAvailableAlgoArray);
+  return;
+}
+
 /**
   Produces and returns an RNG value using either the default or specified RNG algorithm.
 
@@ -59,6 +111,7 @@ RngGetRNG (
   )
 {
   EFI_STATUS  Status;
+  UINTN       Index;
 
   if ((This == NULL) || (RNGValueLength == 0) || (RNGValue == NULL)) {
     return EFI_INVALID_PARAMETER;
@@ -68,9 +121,21 @@ RngGetRNG (
     //
     // Use the default RNG algorithm if RNGAlgorithm is NULL.
     //
-    RNGAlgorithm = PcdGetPtr (PcdCpuRngSupportedAlgorithm);
+    for (Index = 0; Index < mAvailableAlgoArrayCount; Index++) {
+      if (!IsZeroGuid (&mAvailableAlgoArray[Index])) {
+        RNGAlgorithm = &mAvailableAlgoArray[Index];
+        goto FoundAlgo;
+      }
+    }
+
+    if (Index == mAvailableAlgoArrayCount) {
+      // No algorithm available.
+      ASSERT (Index != mAvailableAlgoArrayCount);
+      return EFI_DEVICE_ERROR;
+    }
   }
 
+FoundAlgo:
   if (CompareGuid (RNGAlgorithm, PcdGetPtr (PcdCpuRngSupportedAlgorithm))) {
     Status = RngGetBytes (RNGValueLength, RNGValue);
     return Status;
@@ -113,24 +178,30 @@ RngGetInfo (
   OUT EFI_RNG_ALGORITHM  *RNGAlgorithmList
   )
 {
-  UINTN              RequiredSize;
-  EFI_RNG_ALGORITHM  *CpuRngSupportedAlgorithm;
-
-  RequiredSize = sizeof (EFI_RNG_ALGORITHM);
+  UINTN  RequiredSize;
 
   if ((This == NULL) || (RNGAlgorithmListSize == NULL)) {
     return EFI_INVALID_PARAMETER;
   }
 
+  RequiredSize = mAvailableAlgoArrayCount * sizeof (EFI_RNG_ALGORITHM);
+
+  if (RequiredSize == 0) {
+    // No supported algorithms found.
+    return EFI_UNSUPPORTED;
+  }
+
   if (*RNGAlgorithmListSize < RequiredSize) {
     *RNGAlgorithmListSize = RequiredSize;
     return EFI_BUFFER_TOO_SMALL;
   }
 
-  CpuRngSupportedAlgorithm = PcdGetPtr (PcdCpuRngSupportedAlgorithm);
-
-  CopyMem (&RNGAlgorithmList[0], CpuRngSupportedAlgorithm, sizeof (EFI_RNG_ALGORITHM));
+  if (RNGAlgorithmList == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
 
+  // There is no gap in the array, so copy the block.
+  CopyMem (RNGAlgorithmList, mAvailableAlgoArray, RequiredSize);
   *RNGAlgorithmListSize = RequiredSize;
   return EFI_SUCCESS;
 }
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
index 8f5d8e740f5e..677600bed7ab 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RngDxe.c
@@ -26,6 +26,32 @@
 
 #include "RngDxeInternals.h"
 
+/** Allocate and initialize mAvailableAlgoArray with the available
+    Rng algorithms. Also update mAvailableAlgoArrayCount.
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+GetAvailableAlgorithms (
+  VOID
+  )
+{
+  return EFI_SUCCESS;
+}
+
+/** Free mAvailableAlgoArray.
+**/
+VOID
+EFIAPI
+FreeAvailableAlgorithms (
+  VOID
+  )
+{
+  return;
+}
+
 /**
   Produces and returns an RNG value using either the default or specified RNG algorithm.
 
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
index d7905a7f4d72..421abb52b8bf 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.c
@@ -27,6 +27,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 
 #include "RngDxeInternals.h"
 
+//
+// Array containing the validated Rng algorithm.
+// The entry with the lowest index will be the default algorithm.
+//
+UINTN              mAvailableAlgoArrayCount;
+EFI_RNG_ALGORITHM  *mAvailableAlgoArray;
+
 //
 // The Random Number Generator (RNG) protocol
 //
@@ -66,8 +73,39 @@ RngDriverEntry (
                   &mRngRdRand,
                   NULL
                   );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
 
-  return Status;
+  //
+  // Get the list of available algorithm.
+  //
+  return GetAvailableAlgorithms ();
+}
+
+/**
+  This is the unload handle for RndgDxe module.
+
+  Disconnect the driver specified by ImageHandle from all the devices in the handle database.
+  Uninstall all the protocols installed in the driver entry point.
+
+  @param[in] ImageHandle           The drivers' driver image.
+
+  @retval    EFI_SUCCESS           The image is unloaded.
+  @retval    Others                Failed to unload the image.
+
+**/
+EFI_STATUS
+EFIAPI
+RngDriverUnLoad (
+  IN EFI_HANDLE  ImageHandle
+  )
+{
+  //
+  // Free the list of available algorithm.
+  //
+  FreeAvailableAlgorithms ();
+  return EFI_SUCCESS;
 }
 
 /**
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
index 60efb5562ee0..1985dfbb4619 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
@@ -22,6 +22,7 @@ [Defines]
   MODULE_TYPE                    = DXE_DRIVER
   VERSION_STRING                 = 1.0
   ENTRY_POINT                    = RngDriverEntry
+  UNLOAD_IMAGE                   = RngDriverUnLoad
   MODULE_UNI_FILE                = RngDxe.uni
 
 #
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
index 7ecab140483d..f75140260820 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxeInternals.h
@@ -12,6 +12,33 @@
 
 #include <Protocol/Rng.h>
 
+//
+// Array containing the validated Rng algorithm.
+// The entry with the lowest index will be the default algorithm.
+//
+extern UINTN              mAvailableAlgoArrayCount;
+extern EFI_RNG_ALGORITHM  *mAvailableAlgoArray;
+
+/** Allocate and initialize mAvailableAlgoArray with the available
+    Rng algorithms. Also update mAvailableAlgoArrayCount.
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+GetAvailableAlgorithms (
+  VOID
+  );
+
+/** Free mAvailableAlgoArray.
+**/
+VOID
+EFIAPI
+FreeAvailableAlgorithms (
+  VOID
+  );
+
 /**
   Returns information about the random number generation implementation.
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 15/19] SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through ArmTrngLib
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (13 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 14/19] SecurityPkg/RngDxe: Check before advertising Cpu Rng algo PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 16/19] SecurityPkg/RngDxe: Add debug warning for NULL PcdCpuRngSupportedAlgorithm PierreGondois
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

RawAlgorithm is used to provide access to entropy that is suitable
for cryptographic applications. Therefore, add RawAlgorithm support
that provides access to entropy using the ArmTrngLib.

Also remove unused UefiBootServicesTableLib library inclusion
and Status variable.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../RngDxe/AArch64/RngDxe.c                   | 28 ++++++--
 .../RandomNumberGenerator/RngDxe/ArmTrng.c    | 71 +++++++++++++++++++
 .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  5 ++
 SecurityPkg/SecurityPkg.dsc                   |  3 +
 4 files changed, 103 insertions(+), 4 deletions(-)
 create mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
index 09a5924a699b..ceddc8f08a45 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
@@ -1,11 +1,13 @@
 /** @file
   RNG Driver to produce the UEFI Random Number Generator protocol.
 
-  The driver will use the RNDR instruction to produce random numbers.
+  The driver can use RNDR instruction (through the RngLib and if FEAT_RNG is
+  present) to produce random numbers. It also uses the Arm FW-TRNG interface
+  to implement EFI_RNG_ALGORITHM_RAW.
 
   RNG Algorithms defined in UEFI 2.4:
    - EFI_RNG_ALGORITHM_SP800_90_CTR_256_GUID
-   - EFI_RNG_ALGORITHM_RAW                    - Unsupported
+   - EFI_RNG_ALGORITHM_RAW
    - EFI_RNG_ALGORITHM_SP800_90_HMAC_256_GUID
    - EFI_RNG_ALGORITHM_SP800_90_HASH_256_GUID
    - EFI_RNG_ALGORITHM_X9_31_3DES_GUID        - Unsupported
@@ -26,12 +28,14 @@
 #include <Library/MemoryAllocationLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/RngLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ArmTrngLib.h>
 #include <Protocol/Rng.h>
 
 #include "RngDxeInternals.h"
 
 // Maximum number of Rng algorithms.
-#define RNG_AVAILABLE_ALGO_MAX  1
+#define RNG_AVAILABLE_ALGO_MAX  2
 
 /** Allocate and initialize mAvailableAlgoArray with the available
     Rng algorithms. Also update mAvailableAlgoArrayCount.
@@ -46,8 +50,9 @@ GetAvailableAlgorithms (
   )
 {
   UINT64  DummyRand;
+  UINT16  MajorRevision;
+  UINT16  MinorRevision;
 
-  // Allocate RNG_AVAILABLE_ALGO_MAX entries to avoid evaluating
   // Rng algorithms 2 times, one for the allocation, one to populate.
   mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX);
   if (mAvailableAlgoArray == NULL) {
@@ -64,6 +69,16 @@ GetAvailableAlgorithms (
     mAvailableAlgoArrayCount++;
   }
 
+  // Raw algorithm (Trng)
+  if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) {
+    CopyMem (
+      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
+      &gEfiRngAlgorithmRaw,
+      sizeof (EFI_RNG_ALGORITHM)
+      );
+    mAvailableAlgoArrayCount++;
+  }
+
   return EFI_SUCCESS;
 }
 
@@ -141,6 +156,11 @@ FoundAlgo:
     return Status;
   }
 
+  // Raw algorithm (Trng)
+  if (CompareGuid (RNGAlgorithm, &gEfiRngAlgorithmRaw)) {
+    return GenerateEntropy (RNGValueLength, RNGValue);
+  }
+
   //
   // Other algorithms are unsupported by this driver.
   //
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c b/SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
new file mode 100644
index 000000000000..ffe557b6925a
--- /dev/null
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
@@ -0,0 +1,71 @@
+/** @file
+  RNG Driver to produce the UEFI Random Number Generator protocol.
+
+  The driver implements the EFI_RNG_ALGORITHM_RAW using the FW-TRNG
+  interface to provide entropy.
+
+  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/ArmTrngLib.h>
+#include <Protocol/Rng.h>
+
+#include "RngDxeInternals.h"
+
+/**
+  Generate high-quality entropy source using a TRNG or through RDRAND.
+
+  @param[in]   Length        Size of the buffer, in bytes, to fill with.
+  @param[out]  Entropy       Pointer to the buffer to store the entropy data.
+
+  @retval  RETURN_SUCCESS            The function completed successfully.
+  @retval  RETURN_INVALID_PARAMETER  Invalid parameter.
+  @retval  RETURN_UNSUPPORTED        Function not implemented.
+  @retval  RETURN_BAD_BUFFER_SIZE    Buffer size is too small.
+  @retval  RETURN_NOT_READY          No Entropy available.
+**/
+EFI_STATUS
+EFIAPI
+GenerateEntropy (
+  IN  UINTN  Length,
+  OUT UINT8  *Entropy
+  )
+{
+  EFI_STATUS  Status;
+  UINTN       CollectedEntropyBits;
+  UINTN       RequiredEntropyBits;
+  UINTN       EntropyBits;
+  UINTN       Index;
+  UINTN       MaxBits;
+
+  ZeroMem (Entropy, Length);
+
+  RequiredEntropyBits  = (Length << 3);
+  Index                = 0;
+  CollectedEntropyBits = 0;
+  MaxBits              = GetArmTrngMaxSupportedEntropyBits ();
+  while (CollectedEntropyBits < RequiredEntropyBits) {
+    EntropyBits = MIN ((RequiredEntropyBits - CollectedEntropyBits), MaxBits);
+    Status      = GetArmTrngEntropy (
+                    EntropyBits,
+                    (Length - Index),
+                    &Entropy[Index]
+                    );
+    if (EFI_ERROR (Status)) {
+      // Discard the collected bits.
+      ZeroMem (Entropy, Length);
+      return Status;
+    }
+
+    CollectedEntropyBits += EntropyBits;
+    Index                += (EntropyBits >> 3);
+  } // while
+
+  return Status;
+}
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
index 1985dfbb4619..e0e767cbf32b 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
@@ -43,8 +43,10 @@ [Sources.IA32, Sources.X64]
 
 [Sources.AARCH64]
   AArch64/RngDxe.c
+  ArmTrng.c
 
 [Packages]
+  MdeModulePkg/MdeModulePkg.dec
   MdePkg/MdePkg.dec
   SecurityPkg/SecurityPkg.dec
 
@@ -57,6 +59,9 @@ [LibraryClasses]
   TimerLib
   RngLib
 
+[LibraryClasses.AARCH64]
+  ArmTrngLib
+
 [Guids]
   gEfiRngAlgorithmSp80090Hash256Guid  ## SOMETIMES_PRODUCES    ## GUID        # Unique ID of the algorithm for RNG
   gEfiRngAlgorithmSp80090Hmac256Guid  ## SOMETIMES_PRODUCES    ## GUID        # Unique ID of the algorithm for RNG
diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc
index 6bf53c565882..f71ab7738efe 100644
--- a/SecurityPkg/SecurityPkg.dsc
+++ b/SecurityPkg/SecurityPkg.dsc
@@ -4,6 +4,7 @@
 # Copyright (c) 2009 - 2021, Intel Corporation. All rights reserved.<BR>
 # (C) Copyright 2015-2020 Hewlett Packard Enterprise Development LP<BR>
 # Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
+# Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
 # SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
@@ -89,6 +90,8 @@ [LibraryClasses.ARM, LibraryClasses.AARCH64]
 
   ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
 
+  ArmTrngLib|MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
+
 [LibraryClasses.ARM]
   RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 16/19] SecurityPkg/RngDxe: Add debug warning for NULL PcdCpuRngSupportedAlgorithm
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (14 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 15/19] SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through ArmTrngLib PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 17/19] SecurityPkg/RngDxe: Rename AArch64/RngDxe.c PierreGondois
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

PcdCpuRngSupportedAlgorithm should allow to identify the the algorithm
used by the RNDR CPU instruction to generate a random number.
Add a debug warning if the Pcd is not set.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../RandomNumberGenerator/RngDxe/AArch64/RngDxe.c      | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
index ceddc8f08a45..318876d69330 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
@@ -67,6 +67,16 @@ GetAvailableAlgorithms (
       sizeof (EFI_RNG_ALGORITHM)
       );
     mAvailableAlgoArrayCount++;
+
+    DEBUG_CODE_BEGIN ();
+    if (IsZeroGuid (PcdGetPtr (PcdCpuRngSupportedAlgorithm))) {
+      DEBUG ((
+        DEBUG_WARN,
+        "PcdCpuRngSupportedAlgorithm should be a non-zero GUID\n"
+        ));
+    }
+
+    DEBUG_CODE_END ();
   }
 
   // Raw algorithm (Trng)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 17/19] SecurityPkg/RngDxe: Rename AArch64/RngDxe.c
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (15 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 16/19] SecurityPkg/RngDxe: Add debug warning for NULL PcdCpuRngSupportedAlgorithm PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 18/19] SecurityPkg/RngDxe: Add Arm support of RngDxe PierreGondois
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

To re-use the AArch64/RngDxe.c for an Arm implementation,
rename AArch64/RngDxe.c to ArmRngDxe.c.

Acked-by: Leif Lindholm <quic_llindhol@quicinc.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
 .../RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c}                    | 0
 SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf             | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename SecurityPkg/RandomNumberGenerator/RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c} (100%)

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/ArmRngDxe.c
similarity index 100%
rename from SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/RngDxe.c
rename to SecurityPkg/RandomNumberGenerator/RngDxe/ArmRngDxe.c
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
index e0e767cbf32b..1d0bdef57da4 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
@@ -42,7 +42,7 @@ [Sources.IA32, Sources.X64]
   Rand/AesCore.h
 
 [Sources.AARCH64]
-  AArch64/RngDxe.c
+  ArmRngDxe.c
   ArmTrng.c
 
 [Packages]
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 18/19] SecurityPkg/RngDxe: Add Arm support of RngDxe
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (16 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 17/19] SecurityPkg/RngDxe: Rename AArch64/RngDxe.c PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-10-28 15:32 ` [PATCH v9 19/19] ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface PierreGondois
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Pierre Gondois <pierre.gondois@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

Add RngDxe support for Arm. This implementation uses the ArmTrngLib
to support the RawAlgorithm and doens't support the RNDR instruction.

To re-use the RngGetRNG(), RngGetInfo() and FreeAvailableAlgorithms()
functions, create Arm/AArch64 files which implement the arch specific
function GetAvailableAlgorithms(). Indeed, FEAT_RNG instruction is not
supported on Arm.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 .../RngDxe/AArch64/AArch64Algo.c              | 72 +++++++++++++++++++
 .../RngDxe/Arm/ArmAlgo.c                      | 51 +++++++++++++
 .../RandomNumberGenerator/RngDxe/ArmRngDxe.c  | 60 ----------------
 .../RandomNumberGenerator/RngDxe/RngDxe.inf   | 12 +++-
 SecurityPkg/SecurityPkg.dsc                   |  2 +-
 5 files changed, 133 insertions(+), 64 deletions(-)
 create mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
 create mode 100644 SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c

diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
new file mode 100644
index 000000000000..e8be217f8a8c
--- /dev/null
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
@@ -0,0 +1,72 @@
+/** @file
+  Aarch64 specific code.
+
+  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/ArmTrngLib.h>
+
+#include "RngDxeInternals.h"
+
+// Maximum number of Rng algorithms.
+#define RNG_AVAILABLE_ALGO_MAX  2
+
+/** Allocate and initialize mAvailableAlgoArray with the available
+    Rng algorithms. Also update mAvailableAlgoArrayCount.
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+GetAvailableAlgorithms (
+  VOID
+  )
+{
+  UINT64  DummyRand;
+  UINT16  MajorRevision;
+  UINT16  MinorRevision;
+
+  // Rng algorithms 2 times, one for the allocation, one to populate.
+  mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX);
+  if (mAvailableAlgoArray == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  // Check RngGetBytes() before advertising PcdCpuRngSupportedAlgorithm.
+  if (!EFI_ERROR (RngGetBytes (sizeof (DummyRand), (UINT8 *)&DummyRand))) {
+    CopyMem (
+      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
+      PcdGetPtr (PcdCpuRngSupportedAlgorithm),
+      sizeof (EFI_RNG_ALGORITHM)
+      );
+    mAvailableAlgoArrayCount++;
+
+    DEBUG_CODE_BEGIN ();
+    if (IsZeroGuid (PcdGetPtr (PcdCpuRngSupportedAlgorithm))) {
+      DEBUG ((
+        DEBUG_WARN,
+        "PcdCpuRngSupportedAlgorithm should be a non-zero GUID\n"
+        ));
+    }
+
+    DEBUG_CODE_END ();
+  }
+
+  // Raw algorithm (Trng)
+  if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) {
+    CopyMem (
+      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
+      &gEfiRngAlgorithmRaw,
+      sizeof (EFI_RNG_ALGORITHM)
+      );
+    mAvailableAlgoArrayCount++;
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c b/SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
new file mode 100644
index 000000000000..4b24f5c4a69b
--- /dev/null
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
@@ -0,0 +1,51 @@
+/** @file
+  Arm specific code.
+
+  Copyright (c) 2022, Arm Limited. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/ArmTrngLib.h>
+
+#include "RngDxeInternals.h"
+
+// Maximum number of Rng algorithms.
+#define RNG_AVAILABLE_ALGO_MAX  1
+
+/** Allocate and initialize mAvailableAlgoArray with the available
+    Rng algorithms. Also update mAvailableAlgoArrayCount.
+
+  @retval EFI_SUCCESS             The function completed successfully.
+  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+GetAvailableAlgorithms (
+  VOID
+  )
+{
+  UINT16  MajorRevision;
+  UINT16  MinorRevision;
+
+  // Rng algorithms 2 times, one for the allocation, one to populate.
+  mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX);
+  if (mAvailableAlgoArray == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  // Raw algorithm (Trng)
+  if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) {
+    CopyMem (
+      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
+      &gEfiRngAlgorithmRaw,
+      sizeof (EFI_RNG_ALGORITHM)
+      );
+    mAvailableAlgoArrayCount++;
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/ArmRngDxe.c b/SecurityPkg/RandomNumberGenerator/RngDxe/ArmRngDxe.c
index 318876d69330..5ba319899ce9 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/ArmRngDxe.c
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/ArmRngDxe.c
@@ -28,70 +28,10 @@
 #include <Library/MemoryAllocationLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/RngLib.h>
-#include <Library/DebugLib.h>
-#include <Library/ArmTrngLib.h>
 #include <Protocol/Rng.h>
 
 #include "RngDxeInternals.h"
 
-// Maximum number of Rng algorithms.
-#define RNG_AVAILABLE_ALGO_MAX  2
-
-/** Allocate and initialize mAvailableAlgoArray with the available
-    Rng algorithms. Also update mAvailableAlgoArrayCount.
-
-  @retval EFI_SUCCESS             The function completed successfully.
-  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
-**/
-EFI_STATUS
-EFIAPI
-GetAvailableAlgorithms (
-  VOID
-  )
-{
-  UINT64  DummyRand;
-  UINT16  MajorRevision;
-  UINT16  MinorRevision;
-
-  // Rng algorithms 2 times, one for the allocation, one to populate.
-  mAvailableAlgoArray = AllocateZeroPool (RNG_AVAILABLE_ALGO_MAX);
-  if (mAvailableAlgoArray == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  // Check RngGetBytes() before advertising PcdCpuRngSupportedAlgorithm.
-  if (!EFI_ERROR (RngGetBytes (sizeof (DummyRand), (UINT8 *)&DummyRand))) {
-    CopyMem (
-      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
-      PcdGetPtr (PcdCpuRngSupportedAlgorithm),
-      sizeof (EFI_RNG_ALGORITHM)
-      );
-    mAvailableAlgoArrayCount++;
-
-    DEBUG_CODE_BEGIN ();
-    if (IsZeroGuid (PcdGetPtr (PcdCpuRngSupportedAlgorithm))) {
-      DEBUG ((
-        DEBUG_WARN,
-        "PcdCpuRngSupportedAlgorithm should be a non-zero GUID\n"
-        ));
-    }
-
-    DEBUG_CODE_END ();
-  }
-
-  // Raw algorithm (Trng)
-  if (!EFI_ERROR (GetArmTrngVersion (&MajorRevision, &MinorRevision))) {
-    CopyMem (
-      &mAvailableAlgoArray[mAvailableAlgoArrayCount],
-      &gEfiRngAlgorithmRaw,
-      sizeof (EFI_RNG_ALGORITHM)
-      );
-    mAvailableAlgoArrayCount++;
-  }
-
-  return EFI_SUCCESS;
-}
-
 /** Free mAvailableAlgoArray.
 **/
 VOID
diff --git a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
index 1d0bdef57da4..c8e0ee4ae5d9 100644
--- a/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+++ b/SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
@@ -28,7 +28,7 @@ [Defines]
 #
 # The following information is for reference only and not required by the build tools.
 #
-#  VALID_ARCHITECTURES           = IA32 X64 AARCH64
+#  VALID_ARCHITECTURES           = IA32 X64 AARCH64 ARM
 #
 
 [Sources.common]
@@ -41,10 +41,16 @@ [Sources.IA32, Sources.X64]
   Rand/AesCore.c
   Rand/AesCore.h
 
-[Sources.AARCH64]
+[Sources.AARCH64, Sources.ARM]
   ArmRngDxe.c
   ArmTrng.c
 
+[Sources.AARCH64]
+  AArch64/AArch64Algo.c
+
+[Sources.ARM]
+  Arm/ArmAlgo.c
+
 [Packages]
   MdeModulePkg/MdeModulePkg.dec
   MdePkg/MdePkg.dec
@@ -59,7 +65,7 @@ [LibraryClasses]
   TimerLib
   RngLib
 
-[LibraryClasses.AARCH64]
+[LibraryClasses.AARCH64, LibraryClasses.ARM]
   ArmTrngLib
 
 [Guids]
diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc
index f71ab7738efe..30d911d8a141 100644
--- a/SecurityPkg/SecurityPkg.dsc
+++ b/SecurityPkg/SecurityPkg.dsc
@@ -291,7 +291,7 @@ [Components.IA32, Components.X64, Components.ARM, Components.AARCH64]
   SecurityPkg/EnrollFromDefaultKeysApp/EnrollFromDefaultKeysApp.inf
   SecurityPkg/VariableAuthenticated/SecureBootDefaultKeysDxe/SecureBootDefaultKeysDxe.inf
 
-[Components.IA32, Components.X64, Components.AARCH64]
+[Components.IA32, Components.X64, Components.AARCH64, Components.ARM]
   #
   # Random Number Generator
   #
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH v9 19/19] ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (17 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 18/19] SecurityPkg/RngDxe: Add Arm support of RngDxe PierreGondois
@ 2022-10-28 15:32 ` PierreGondois
  2022-11-01  1:10 ` 回复: [PATCH v9 00/19] Add Raw algorithm " gaoliming
  2022-11-01  8:55 ` Yao, Jiewen
  20 siblings, 0 replies; 25+ messages in thread
From: PierreGondois @ 2022-10-28 15:32 UTC (permalink / raw)
  To: devel
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Michael D Kinney, Liming Gao, Jiewen Yao, Jian J Wang

From: Sami Mujawar <sami.mujawar@arm.com>

Bugzilla: 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)

The EFI_RNG_PROTOCOL published by RngDxe has been updated to
implement the EFI_RNG_ALGORITHM_RAW using the Arm TRNG interface
to provide access to entropy.

Therefore, enable EFI_RNG_PROTOCOL for the Kvmtool guest/virtual
firmware.

Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 ArmVirtPkg/ArmVirtKvmTool.dsc | 10 ++++++++++
 ArmVirtPkg/ArmVirtKvmTool.fdf |  5 +++++
 2 files changed, 15 insertions(+)

diff --git a/ArmVirtPkg/ArmVirtKvmTool.dsc b/ArmVirtPkg/ArmVirtKvmTool.dsc
index c598903b33d2..2ba00bd08ff1 100644
--- a/ArmVirtPkg/ArmVirtKvmTool.dsc
+++ b/ArmVirtPkg/ArmVirtKvmTool.dsc
@@ -81,6 +81,9 @@ [LibraryClasses.common]
   HwInfoParserLib|DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf
   DynamicPlatRepoLib|DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/DynamicPlatRepoLib.inf
 
+  ArmMonitorLib|ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
+  ArmTrngLib|ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
+
 [LibraryClasses.common.SEC, LibraryClasses.common.PEI_CORE, LibraryClasses.common.PEIM]
   PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf
   PlatformHookLib|ArmVirtPkg/Library/Fdt16550SerialPortHookLib/EarlyFdt16550SerialPortHookLib.inf
@@ -112,6 +115,8 @@ [PcdsFeatureFlag.common]
   # Use MMIO for accessing RTC controller registers.
   gPcAtChipsetPkgTokenSpaceGuid.PcdRtcUseMmio|TRUE
 
+  gArmTokenSpaceGuid.PcdMonitorConduitHvc|TRUE
+
 [PcdsFixedAtBuild.common]
   gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x8000000F
 
@@ -362,6 +367,11 @@ [Components.common]
   OvmfPkg/VirtioPciDeviceDxe/VirtioPciDeviceDxe.inf
   OvmfPkg/Virtio10Dxe/Virtio10.inf
 
+  #
+  # Rng Support
+  #
+  SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+
 !if $(ARCH) == AARCH64
   #
   # ACPI Support
diff --git a/ArmVirtPkg/ArmVirtKvmTool.fdf b/ArmVirtPkg/ArmVirtKvmTool.fdf
index b696bffc7ccb..82aff47673cb 100644
--- a/ArmVirtPkg/ArmVirtKvmTool.fdf
+++ b/ArmVirtPkg/ArmVirtKvmTool.fdf
@@ -224,6 +224,11 @@ [FV.FvMain]
   #
   INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf
 
+  #
+  # Rng Support
+  #
+  INF SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
+
 [FV.FVMAIN_COMPACT]
 FvAlignment        = 16
 ERASE_POLARITY     = 1
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* 回复: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (18 preceding siblings ...)
  2022-10-28 15:32 ` [PATCH v9 19/19] ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface PierreGondois
@ 2022-11-01  1:10 ` gaoliming
  2022-11-01  8:55 ` Yao, Jiewen
  20 siblings, 0 replies; 25+ messages in thread
From: gaoliming @ 2022-11-01  1:10 UTC (permalink / raw)
  To: Pierre.Gondois, devel
  Cc: 'Sami Mujawar', 'Leif Lindholm',
	'Ard Biesheuvel', 'Rebecca Cran',
	'Michael D Kinney', 'Jiewen Yao',
	'Jian J Wang'

Pierre:
  New change in MdePkg to rename library class name is good to me.
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>

Thanks
Liming
> -----邮件原件-----
> 发件人: Pierre.Gondois@arm.com <Pierre.Gondois@arm.com>
> 发送时间: 2022年10月28日 23:33
> 收件人: devel@edk2.groups.io
> 抄送: Sami Mujawar <sami.mujawar@arm.com>; Leif Lindholm
> <quic_llindhol@quicinc.com>; Ard Biesheuvel <ardb+tianocore@kernel.org>;
> Rebecca Cran <rebecca@bsdio.com>; Michael D Kinney
> <michael.d.kinney@intel.com>; Liming Gao <gaoliming@byosoft.com.cn>;
> Jiewen Yao <jiewen.yao@intel.com>; Jian J Wang <jian.j.wang@intel.com>
> 主题: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
> 
> From: Pierre Gondois <pierre.gondois@arm.com>
> 
> Bugzilla: Bug 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)
> 
> The Arm True Random Number Generator Firmware, Interface 1.0,
> specification
> defines an interface between an Operating System (OS) executing at EL1 and
> Firmware (FW) exposing a conditioned entropy source that is provided by a
> TRNG back end.
> This patch-set:
> - defines an Arm TRNG library class that provides an interface to access
>   the entropy source on a platform.
> - implements an Arm TRNG library instance that uses the Arm FW-TRNG
>   interface.
> - Adds RawAlgorithm support to RngDxe for Arm architecture using the Arm
>   TRNG interface.
> - Enables RNG support using Arm TRNG interface for Kvmtool Guest/Virtual
>   firmware.
> 
> This patch-set is based on the v2 from Sami Mujawar:
> [PATCH v2 0/8] Add Raw algorithm support using Arm FW-TRNG interface
> v2:
> https://edk2.groups.io/g/devel/message/83775
> v3:
> https://edk2.groups.io/g/devel/message/90845
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v3
> v4:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v4
> v5:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v5
> v6:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v6
> v7:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v7
> v8:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v8
> v9:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v9
> 
> v9:
>  - Added BaseArmTrngLibNull as default in MdePkg/MdeLibs.dsc.inc. [Liming]
>  - Renamed TrngLib to ArmTrngLib and updated documentation, commit
>    messages, function names accordingly. [Jiewen, Leif]
> v8:
>  - Added Reviewed-by/Acked-by from Leif on ArmPkg/SecurityPkg
>    patches. [Leif]
>  - Renamed FID_TRNG_* macros to ARM_SMC_ID_TRNG_*. [Leif]
> v7:
>  - Removed Reviewed-by from Leif.
>  - Remove Sami's Signed-off.
> V6:
>  - Added my signed-off on patches authored by Sami. [Leif]
>  - New patch to make it easier to add new libraries in alphabetical
>    order: ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc [Leif]
>  - Renmaed ArmHvcNullLib to ArmHvcLibNull. [Leif]
>  - Added RISCV64 to the list of VALID_ARCHITECTURES for BaseTrngLibNull.
> [Leif]
>  - Removed unnecessary space in function parameter documentation
>    ('[in, out]'). [Rebecca]
>  - Updated INF_VERSION to latest spec (1.29) for new libraries. [Rebecca]
>  - Dropped the following patches [Leif]:
>   - ArmPkg/ArmLib: Add ArmHasRngExt()
>   - ArmPkg/ArmLib: Add ArmReadIdIsar0() helper
>   - MdePkg/BaseRngLib: Rename ArmReadIdIsar0() to ArmGetFeatRng()
> V5:
>  - Removed references in Trnglib.h to 'Special Publication'
>    800-90A and 800-90C, and only reference 'Arm True Random
>    Number Generator Firmware, Interface 1.0' in the Arm
>    implementation of the TrngLib. [Jiewen]
> V4:
>  - Removed dependencies on ArmPkg and dropped patch:
>     [PATCH v3 12/22] SecurityPkg: Update Securitypkg.ci.yaml
>    [Jiewen]
>  - Use a dynamically allocated array to hold available algorithms.
>    The array is freed in a new UNLOAD_IMAGE function and
>    allocated in arch specific implementations of
>    GetAvailableAlgorithms(), available in AArch64/AArch64Algo.c
>    and Arm/ArmAlgo.c.
>  - Correctly reference gEfiRngAlgorithmSp80090Ctr256Guid
>    Guid by copying its address (add missing '&'). [Jiewen]
> V3:
>  - Address Leif's comment (moving definitions, optimizations, ...)
>  - Add ArmMonitorLib to choose Hvc/Smc conduit depending on a Pcd.
>  - Re-factor some parts of SecurityPkg/RngDxe/ to ease the addition
>    of new algorithms.
>  - Add ArmHasRngExt() function to check Arm's FEAT_RNG extension.
> V2:
>  - Updates TrngLib definitions to use RETURN_STATUS as the return type
>    from the interface functions as TrngLib is base type library.
>  - Drops the patch "MdePkg: Add definition for NULL GUID" as there is
>    already an equivalent definition provided by gZeroGuid. Thus, the
>    use of gNullGuid has been replaced with gZeroGuid.
> 
> Pierre Gondois (11):
>   ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class
>   ArmPkg/ArmMonitorLib: Add ArmMonitorLib
>   ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
>   ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib
>   SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid
>   SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms()
>   SecurityPkg/RngDxe: Documentation/include/parameter cleanup
>   SecurityPkg/RngDxe: Check before advertising Cpu Rng algo
>   SecurityPkg/RngDxe: Add debug warning for NULL
>     PcdCpuRngSupportedAlgorithm
>   SecurityPkg/RngDxe: Rename AArch64/RngDxe.c
>   SecurityPkg/RngDxe: Add Arm support of RngDxe
> 
> Sami Mujawar (8):
>   ArmPkg: PCD to select conduit for monitor calls
>   MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface
>   MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library
>   ArmPkg: Add FID definitions for Arm TRNG
>   ArmPkg/ArmTrngLib: Add Arm TRNG library
>   SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name
>   SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through
>     ArmTrngLib
>   ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface
> 
>  ArmPkg/ArmPkg.dec                             |  12 +-
>  ArmPkg/ArmPkg.dsc                             |   5 +-
>  ArmPkg/Include/IndustryStandard/ArmStdSmc.h   | 109 ++++-
>  ArmPkg/Include/Library/ArmMonitorLib.h        |  42 ++
>  ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c  |  29 ++
>  .../Library/ArmHvcLibNull/ArmHvcLibNull.inf   |  22 +
>  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c  |  34 ++
>  .../Library/ArmMonitorLib/ArmMonitorLib.inf   |  29 ++
>  ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h       |  50 +++
>  ArmPkg/Library/ArmTrngLib/ArmTrngLib.c        | 388
> ++++++++++++++++++
>  ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf      |  29 ++
>  ArmVirtPkg/ArmVirtKvmTool.dsc                 |  10 +
>  ArmVirtPkg/ArmVirtKvmTool.fdf                 |   5 +
>  MdePkg/Include/Library/ArmTrngLib.h           | 106 +++++
>  .../BaseArmTrngLibNull/BaseArmTrngLibNull.c   | 121 ++++++
>  .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf |  30 ++
>  .../BaseArmTrngLibNull/BaseArmTrngLibNull.uni |  12 +
>  MdePkg/MdeLibs.dsc.inc                        |   1 +
>  MdePkg/MdePkg.dec                             |   5 +
>  MdePkg/MdePkg.dsc                             |   1 +
>  .../RngDxe/AArch64/AArch64Algo.c              |  72 ++++
>  .../RngDxe/Arm/ArmAlgo.c                      |  51 +++
>  .../RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c}  |  81 +++-
>  .../RandomNumberGenerator/RngDxe/ArmTrng.c    |  71 ++++
>  .../RngDxe/Rand/RdRand.c                      |  14 +-
>  .../RngDxe/Rand/RdRand.h                      |  43 --
>  .../RngDxe/Rand/RngDxe.c                      |  62 ++-
>  .../RandomNumberGenerator/RngDxe/RngDxe.c     |  90 ++--
>  .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  18 +-
>  .../RngDxe/RngDxeInternals.h                  |  71 ++--
>  SecurityPkg/SecurityPkg.dsc                   |   5 +-
>  31 files changed, 1462 insertions(+), 156 deletions(-)
>  create mode 100644 ArmPkg/Include/Library/ArmMonitorLib.h
>  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
>  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
>  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
>  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
>  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
>  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
>  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
>  create mode 100644 MdePkg/Include/Library/ArmTrngLib.h
>  create mode 100644
> MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
>  create mode 100644
> MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
>  create mode 100644
> MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
>  create mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
>  create mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
>  rename SecurityPkg/RandomNumberGenerator/RngDxe/{AArch64/RngDxe.c
> => ArmRngDxe.c} (64%)
>  create mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
>  delete mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h
> 
> --
> 2.25.1




^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
  2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
                   ` (19 preceding siblings ...)
  2022-11-01  1:10 ` 回复: [PATCH v9 00/19] Add Raw algorithm " gaoliming
@ 2022-11-01  8:55 ` Yao, Jiewen
  2022-11-04  1:16   ` 回复: " gaoliming
  20 siblings, 1 reply; 25+ messages in thread
From: Yao, Jiewen @ 2022-11-01  8:55 UTC (permalink / raw)
  To: Pierre.Gondois@arm.com, devel@edk2.groups.io
  Cc: Sami Mujawar, Leif Lindholm, Ard Biesheuvel, Rebecca Cran,
	Kinney, Michael D, Gao, Liming, Wang, Jian J

Thanks for the update.

For SecurityPkg (11~18), Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
Since the update is for AARCH64, I recommend to have an ARM people to give Reviewed-by.

Thank you
Yao Jiewen


> -----Original Message-----
> From: Pierre.Gondois@arm.com <Pierre.Gondois@arm.com>
> Sent: Friday, October 28, 2022 11:33 PM
> To: devel@edk2.groups.io
> Cc: Sami Mujawar <sami.mujawar@arm.com>; Leif Lindholm
> <quic_llindhol@quicinc.com>; Ard Biesheuvel
> <ardb+tianocore@kernel.org>; Rebecca Cran <rebecca@bsdio.com>; Kinney,
> Michael D <michael.d.kinney@intel.com>; Gao, Liming
> <gaoliming@byosoft.com.cn>; Yao, Jiewen <jiewen.yao@intel.com>; Wang,
> Jian J <jian.j.wang@intel.com>
> Subject: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG
> interface
> 
> From: Pierre Gondois <pierre.gondois@arm.com>
> 
> Bugzilla: Bug 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)
> 
> The Arm True Random Number Generator Firmware, Interface 1.0,
> specification
> defines an interface between an Operating System (OS) executing at EL1 and
> Firmware (FW) exposing a conditioned entropy source that is provided by a
> TRNG back end.
> This patch-set:
> - defines an Arm TRNG library class that provides an interface to access
>   the entropy source on a platform.
> - implements an Arm TRNG library instance that uses the Arm FW-TRNG
>   interface.
> - Adds RawAlgorithm support to RngDxe for Arm architecture using the Arm
>   TRNG interface.
> - Enables RNG support using Arm TRNG interface for Kvmtool Guest/Virtual
>   firmware.
> 
> This patch-set is based on the v2 from Sami Mujawar:
> [PATCH v2 0/8] Add Raw algorithm support using Arm FW-TRNG interface
> v2:
> https://edk2.groups.io/g/devel/message/83775
> v3:
> https://edk2.groups.io/g/devel/message/90845
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v3
> v4:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v4
> v5:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v5
> v6:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v6
> v7:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v7
> v8:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v8
> v9:
> https://github.com/PierreARM/edk2/tree/Arm_Trng_v9
> 
> v9:
>  - Added BaseArmTrngLibNull as default in MdePkg/MdeLibs.dsc.inc. [Liming]
>  - Renamed TrngLib to ArmTrngLib and updated documentation, commit
>    messages, function names accordingly. [Jiewen, Leif]
> v8:
>  - Added Reviewed-by/Acked-by from Leif on ArmPkg/SecurityPkg
>    patches. [Leif]
>  - Renamed FID_TRNG_* macros to ARM_SMC_ID_TRNG_*. [Leif]
> v7:
>  - Removed Reviewed-by from Leif.
>  - Remove Sami's Signed-off.
> V6:
>  - Added my signed-off on patches authored by Sami. [Leif]
>  - New patch to make it easier to add new libraries in alphabetical
>    order: ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc [Leif]
>  - Renmaed ArmHvcNullLib to ArmHvcLibNull. [Leif]
>  - Added RISCV64 to the list of VALID_ARCHITECTURES for BaseTrngLibNull.
> [Leif]
>  - Removed unnecessary space in function parameter documentation
>    ('[in, out]'). [Rebecca]
>  - Updated INF_VERSION to latest spec (1.29) for new libraries. [Rebecca]
>  - Dropped the following patches [Leif]:
>   - ArmPkg/ArmLib: Add ArmHasRngExt()
>   - ArmPkg/ArmLib: Add ArmReadIdIsar0() helper
>   - MdePkg/BaseRngLib: Rename ArmReadIdIsar0() to ArmGetFeatRng()
> V5:
>  - Removed references in Trnglib.h to 'Special Publication'
>    800-90A and 800-90C, and only reference 'Arm True Random
>    Number Generator Firmware, Interface 1.0' in the Arm
>    implementation of the TrngLib. [Jiewen]
> V4:
>  - Removed dependencies on ArmPkg and dropped patch:
>     [PATCH v3 12/22] SecurityPkg: Update Securitypkg.ci.yaml
>    [Jiewen]
>  - Use a dynamically allocated array to hold available algorithms.
>    The array is freed in a new UNLOAD_IMAGE function and
>    allocated in arch specific implementations of
>    GetAvailableAlgorithms(), available in AArch64/AArch64Algo.c
>    and Arm/ArmAlgo.c.
>  - Correctly reference gEfiRngAlgorithmSp80090Ctr256Guid
>    Guid by copying its address (add missing '&'). [Jiewen]
> V3:
>  - Address Leif's comment (moving definitions, optimizations, ...)
>  - Add ArmMonitorLib to choose Hvc/Smc conduit depending on a Pcd.
>  - Re-factor some parts of SecurityPkg/RngDxe/ to ease the addition
>    of new algorithms.
>  - Add ArmHasRngExt() function to check Arm's FEAT_RNG extension.
> V2:
>  - Updates TrngLib definitions to use RETURN_STATUS as the return type
>    from the interface functions as TrngLib is base type library.
>  - Drops the patch "MdePkg: Add definition for NULL GUID" as there is
>    already an equivalent definition provided by gZeroGuid. Thus, the
>    use of gNullGuid has been replaced with gZeroGuid.
> 
> Pierre Gondois (11):
>   ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class
>   ArmPkg/ArmMonitorLib: Add ArmMonitorLib
>   ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
>   ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib
>   SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid
>   SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms()
>   SecurityPkg/RngDxe: Documentation/include/parameter cleanup
>   SecurityPkg/RngDxe: Check before advertising Cpu Rng algo
>   SecurityPkg/RngDxe: Add debug warning for NULL
>     PcdCpuRngSupportedAlgorithm
>   SecurityPkg/RngDxe: Rename AArch64/RngDxe.c
>   SecurityPkg/RngDxe: Add Arm support of RngDxe
> 
> Sami Mujawar (8):
>   ArmPkg: PCD to select conduit for monitor calls
>   MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface
>   MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library
>   ArmPkg: Add FID definitions for Arm TRNG
>   ArmPkg/ArmTrngLib: Add Arm TRNG library
>   SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name
>   SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through
>     ArmTrngLib
>   ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface
> 
>  ArmPkg/ArmPkg.dec                             |  12 +-
>  ArmPkg/ArmPkg.dsc                             |   5 +-
>  ArmPkg/Include/IndustryStandard/ArmStdSmc.h   | 109 ++++-
>  ArmPkg/Include/Library/ArmMonitorLib.h        |  42 ++
>  ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c  |  29 ++
>  .../Library/ArmHvcLibNull/ArmHvcLibNull.inf   |  22 +
>  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c  |  34 ++
>  .../Library/ArmMonitorLib/ArmMonitorLib.inf   |  29 ++
>  ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h       |  50 +++
>  ArmPkg/Library/ArmTrngLib/ArmTrngLib.c        | 388
> ++++++++++++++++++
>  ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf      |  29 ++
>  ArmVirtPkg/ArmVirtKvmTool.dsc                 |  10 +
>  ArmVirtPkg/ArmVirtKvmTool.fdf                 |   5 +
>  MdePkg/Include/Library/ArmTrngLib.h           | 106 +++++
>  .../BaseArmTrngLibNull/BaseArmTrngLibNull.c   | 121 ++++++
>  .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf |  30 ++
>  .../BaseArmTrngLibNull/BaseArmTrngLibNull.uni |  12 +
>  MdePkg/MdeLibs.dsc.inc                        |   1 +
>  MdePkg/MdePkg.dec                             |   5 +
>  MdePkg/MdePkg.dsc                             |   1 +
>  .../RngDxe/AArch64/AArch64Algo.c              |  72 ++++
>  .../RngDxe/Arm/ArmAlgo.c                      |  51 +++
>  .../RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c}  |  81 +++-
>  .../RandomNumberGenerator/RngDxe/ArmTrng.c    |  71 ++++
>  .../RngDxe/Rand/RdRand.c                      |  14 +-
>  .../RngDxe/Rand/RdRand.h                      |  43 --
>  .../RngDxe/Rand/RngDxe.c                      |  62 ++-
>  .../RandomNumberGenerator/RngDxe/RngDxe.c     |  90 ++--
>  .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  18 +-
>  .../RngDxe/RngDxeInternals.h                  |  71 ++--
>  SecurityPkg/SecurityPkg.dsc                   |   5 +-
>  31 files changed, 1462 insertions(+), 156 deletions(-)
>  create mode 100644 ArmPkg/Include/Library/ArmMonitorLib.h
>  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
>  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
>  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
>  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
>  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
>  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
>  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
>  create mode 100644 MdePkg/Include/Library/ArmTrngLib.h
>  create mode 100644
> MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
>  create mode 100644
> MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
>  create mode 100644
> MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
>  create mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
>  create mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
>  rename
> SecurityPkg/RandomNumberGenerator/RngDxe/{AArch64/RngDxe.c =>
> ArmRngDxe.c} (64%)
>  create mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
>  delete mode 100644
> SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h
> 
> --
> 2.25.1


^ permalink raw reply	[flat|nested] 25+ messages in thread

* 回复: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
  2022-11-01  8:55 ` Yao, Jiewen
@ 2022-11-04  1:16   ` gaoliming
  2022-11-04 17:34     ` [edk2-devel] " Ard Biesheuvel
  0 siblings, 1 reply; 25+ messages in thread
From: gaoliming @ 2022-11-04  1:16 UTC (permalink / raw)
  To: 'Yao, Jiewen', Pierre.Gondois, devel
  Cc: 'Sami Mujawar', 'Leif Lindholm',
	'Ard Biesheuvel', 'Rebecca Cran',
	'Kinney, Michael D', 'Wang, Jian J'

Sami, Leif, Ard:
  Can you give your Reviewed-by for this patch set this week? If so, this
feature can catch stable tag 202211.
  
  Stable202211 tag soft feature freeze will start on next Monday Nov 7th. 

Thanks
Liming
> -----邮件原件-----
> 发件人: Yao, Jiewen <jiewen.yao@intel.com>
> 发送时间: 2022年11月1日 16:56
> 收件人: Pierre.Gondois@arm.com; devel@edk2.groups.io
> 抄送: Sami Mujawar <sami.mujawar@arm.com>; Leif Lindholm
> <quic_llindhol@quicinc.com>; Ard Biesheuvel <ardb+tianocore@kernel.org>;
> Rebecca Cran <rebecca@bsdio.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>;
> Wang, Jian J <jian.j.wang@intel.com>
> 主题: RE: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG
> interface
> 
> Thanks for the update.
> 
> For SecurityPkg (11~18), Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
> Since the update is for AARCH64, I recommend to have an ARM people to give
> Reviewed-by.
> 
> Thank you
> Yao Jiewen
> 
> 
> > -----Original Message-----
> > From: Pierre.Gondois@arm.com <Pierre.Gondois@arm.com>
> > Sent: Friday, October 28, 2022 11:33 PM
> > To: devel@edk2.groups.io
> > Cc: Sami Mujawar <sami.mujawar@arm.com>; Leif Lindholm
> > <quic_llindhol@quicinc.com>; Ard Biesheuvel
> > <ardb+tianocore@kernel.org>; Rebecca Cran <rebecca@bsdio.com>;
> Kinney,
> > Michael D <michael.d.kinney@intel.com>; Gao, Liming
> > <gaoliming@byosoft.com.cn>; Yao, Jiewen <jiewen.yao@intel.com>; Wang,
> > Jian J <jian.j.wang@intel.com>
> > Subject: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG
> > interface
> >
> > From: Pierre Gondois <pierre.gondois@arm.com>
> >
> > Bugzilla: Bug 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)
> >
> > The Arm True Random Number Generator Firmware, Interface 1.0,
> > specification
> > defines an interface between an Operating System (OS) executing at EL1
> and
> > Firmware (FW) exposing a conditioned entropy source that is provided by
a
> > TRNG back end.
> > This patch-set:
> > - defines an Arm TRNG library class that provides an interface to access
> >   the entropy source on a platform.
> > - implements an Arm TRNG library instance that uses the Arm FW-TRNG
> >   interface.
> > - Adds RawAlgorithm support to RngDxe for Arm architecture using the Arm
> >   TRNG interface.
> > - Enables RNG support using Arm TRNG interface for Kvmtool Guest/Virtual
> >   firmware.
> >
> > This patch-set is based on the v2 from Sami Mujawar:
> > [PATCH v2 0/8] Add Raw algorithm support using Arm FW-TRNG interface
> > v2:
> > https://edk2.groups.io/g/devel/message/83775
> > v3:
> > https://edk2.groups.io/g/devel/message/90845
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v3
> > v4:
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v4
> > v5:
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v5
> > v6:
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v6
> > v7:
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v7
> > v8:
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v8
> > v9:
> > https://github.com/PierreARM/edk2/tree/Arm_Trng_v9
> >
> > v9:
> >  - Added BaseArmTrngLibNull as default in MdePkg/MdeLibs.dsc.inc.
> [Liming]
> >  - Renamed TrngLib to ArmTrngLib and updated documentation, commit
> >    messages, function names accordingly. [Jiewen, Leif]
> > v8:
> >  - Added Reviewed-by/Acked-by from Leif on ArmPkg/SecurityPkg
> >    patches. [Leif]
> >  - Renamed FID_TRNG_* macros to ARM_SMC_ID_TRNG_*. [Leif]
> > v7:
> >  - Removed Reviewed-by from Leif.
> >  - Remove Sami's Signed-off.
> > V6:
> >  - Added my signed-off on patches authored by Sami. [Leif]
> >  - New patch to make it easier to add new libraries in alphabetical
> >    order: ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
[Leif]
> >  - Renmaed ArmHvcNullLib to ArmHvcLibNull. [Leif]
> >  - Added RISCV64 to the list of VALID_ARCHITECTURES for
> BaseTrngLibNull.
> > [Leif]
> >  - Removed unnecessary space in function parameter documentation
> >    ('[in, out]'). [Rebecca]
> >  - Updated INF_VERSION to latest spec (1.29) for new libraries.
[Rebecca]
> >  - Dropped the following patches [Leif]:
> >   - ArmPkg/ArmLib: Add ArmHasRngExt()
> >   - ArmPkg/ArmLib: Add ArmReadIdIsar0() helper
> >   - MdePkg/BaseRngLib: Rename ArmReadIdIsar0() to ArmGetFeatRng()
> > V5:
> >  - Removed references in Trnglib.h to 'Special Publication'
> >    800-90A and 800-90C, and only reference 'Arm True Random
> >    Number Generator Firmware, Interface 1.0' in the Arm
> >    implementation of the TrngLib. [Jiewen]
> > V4:
> >  - Removed dependencies on ArmPkg and dropped patch:
> >     [PATCH v3 12/22] SecurityPkg: Update Securitypkg.ci.yaml
> >    [Jiewen]
> >  - Use a dynamically allocated array to hold available algorithms.
> >    The array is freed in a new UNLOAD_IMAGE function and
> >    allocated in arch specific implementations of
> >    GetAvailableAlgorithms(), available in AArch64/AArch64Algo.c
> >    and Arm/ArmAlgo.c.
> >  - Correctly reference gEfiRngAlgorithmSp80090Ctr256Guid
> >    Guid by copying its address (add missing '&'). [Jiewen]
> > V3:
> >  - Address Leif's comment (moving definitions, optimizations, ...)
> >  - Add ArmMonitorLib to choose Hvc/Smc conduit depending on a Pcd.
> >  - Re-factor some parts of SecurityPkg/RngDxe/ to ease the addition
> >    of new algorithms.
> >  - Add ArmHasRngExt() function to check Arm's FEAT_RNG extension.
> > V2:
> >  - Updates TrngLib definitions to use RETURN_STATUS as the return type
> >    from the interface functions as TrngLib is base type library.
> >  - Drops the patch "MdePkg: Add definition for NULL GUID" as there is
> >    already an equivalent definition provided by gZeroGuid. Thus, the
> >    use of gNullGuid has been replaced with gZeroGuid.
> >
> > Pierre Gondois (11):
> >   ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class
> >   ArmPkg/ArmMonitorLib: Add ArmMonitorLib
> >   ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
> >   ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib
> >   SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid
> >   SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms()
> >   SecurityPkg/RngDxe: Documentation/include/parameter cleanup
> >   SecurityPkg/RngDxe: Check before advertising Cpu Rng algo
> >   SecurityPkg/RngDxe: Add debug warning for NULL
> >     PcdCpuRngSupportedAlgorithm
> >   SecurityPkg/RngDxe: Rename AArch64/RngDxe.c
> >   SecurityPkg/RngDxe: Add Arm support of RngDxe
> >
> > Sami Mujawar (8):
> >   ArmPkg: PCD to select conduit for monitor calls
> >   MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface
> >   MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library
> >   ArmPkg: Add FID definitions for Arm TRNG
> >   ArmPkg/ArmTrngLib: Add Arm TRNG library
> >   SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name
> >   SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through
> >     ArmTrngLib
> >   ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface
> >
> >  ArmPkg/ArmPkg.dec                             |  12 +-
> >  ArmPkg/ArmPkg.dsc                             |   5 +-
> >  ArmPkg/Include/IndustryStandard/ArmStdSmc.h   | 109 ++++-
> >  ArmPkg/Include/Library/ArmMonitorLib.h        |  42 ++
> >  ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c  |  29 ++
> >  .../Library/ArmHvcLibNull/ArmHvcLibNull.inf   |  22 +
> >  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c  |  34 ++
> >  .../Library/ArmMonitorLib/ArmMonitorLib.inf   |  29 ++
> >  ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h       |  50 +++
> >  ArmPkg/Library/ArmTrngLib/ArmTrngLib.c        | 388
> > ++++++++++++++++++
> >  ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf      |  29 ++
> >  ArmVirtPkg/ArmVirtKvmTool.dsc                 |  10 +
> >  ArmVirtPkg/ArmVirtKvmTool.fdf                 |   5 +
> >  MdePkg/Include/Library/ArmTrngLib.h           | 106 +++++
> >  .../BaseArmTrngLibNull/BaseArmTrngLibNull.c   | 121 ++++++
> >  .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf |  30 ++
> >  .../BaseArmTrngLibNull/BaseArmTrngLibNull.uni |  12 +
> >  MdePkg/MdeLibs.dsc.inc                        |   1 +
> >  MdePkg/MdePkg.dec                             |   5 +
> >  MdePkg/MdePkg.dsc                             |   1 +
> >  .../RngDxe/AArch64/AArch64Algo.c              |  72 ++++
> >  .../RngDxe/Arm/ArmAlgo.c                      |  51 +++
> >  .../RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c}  |  81 +++-
> >  .../RandomNumberGenerator/RngDxe/ArmTrng.c    |  71 ++++
> >  .../RngDxe/Rand/RdRand.c                      |  14 +-
> >  .../RngDxe/Rand/RdRand.h                      |  43 --
> >  .../RngDxe/Rand/RngDxe.c                      |  62 ++-
> >  .../RandomNumberGenerator/RngDxe/RngDxe.c     |  90 ++--
> >  .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  18 +-
> >  .../RngDxe/RngDxeInternals.h                  |  71 ++--
> >  SecurityPkg/SecurityPkg.dsc                   |   5 +-
> >  31 files changed, 1462 insertions(+), 156 deletions(-)
> >  create mode 100644 ArmPkg/Include/Library/ArmMonitorLib.h
> >  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
> >  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
> >  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
> >  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
> >  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
> >  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
> >  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
> >  create mode 100644 MdePkg/Include/Library/ArmTrngLib.h
> >  create mode 100644
> > MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
> >  create mode 100644
> > MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
> >  create mode 100644
> > MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
> >  create mode 100644
> > SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
> >  create mode 100644
> > SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
> >  rename
> > SecurityPkg/RandomNumberGenerator/RngDxe/{AArch64/RngDxe.c =>
> > ArmRngDxe.c} (64%)
> >  create mode 100644
> > SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
> >  delete mode 100644
> > SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h
> >
> > --
> > 2.25.1




^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [edk2-devel] 回复: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
  2022-11-04  1:16   ` 回复: " gaoliming
@ 2022-11-04 17:34     ` Ard Biesheuvel
  2022-11-06 16:57       ` Ard Biesheuvel
  0 siblings, 1 reply; 25+ messages in thread
From: Ard Biesheuvel @ 2022-11-04 17:34 UTC (permalink / raw)
  To: devel, gaoliming
  Cc: Yao, Jiewen, Pierre.Gondois, Sami Mujawar, Leif Lindholm,
	Ard Biesheuvel, Rebecca Cran, Kinney, Michael D, Wang, Jian J

On Fri, 4 Nov 2022 at 02:16, gaoliming via groups.io
<gaoliming=byosoft.com.cn@groups.io> wrote:
>
> Sami, Leif, Ard:
>   Can you give your Reviewed-by for this patch set this week? If so, this
> feature can catch stable tag 202211.
>
>   Stable202211 tag soft feature freeze will start on next Monday Nov 7th.
>

I will try to look at this before monday.


> > -----邮件原件-----
> > 发件人: Yao, Jiewen <jiewen.yao@intel.com>
> > 发送时间: 2022年11月1日 16:56
> > 收件人: Pierre.Gondois@arm.com; devel@edk2.groups.io
> > 抄送: Sami Mujawar <sami.mujawar@arm.com>; Leif Lindholm
> > <quic_llindhol@quicinc.com>; Ard Biesheuvel <ardb+tianocore@kernel.org>;
> > Rebecca Cran <rebecca@bsdio.com>; Kinney, Michael D
> > <michael.d.kinney@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>;
> > Wang, Jian J <jian.j.wang@intel.com>
> > 主题: RE: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG
> > interface
> >
> > Thanks for the update.
> >
> > For SecurityPkg (11~18), Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
> > Since the update is for AARCH64, I recommend to have an ARM people to give
> > Reviewed-by.
> >
> > Thank you
> > Yao Jiewen
> >
> >
> > > -----Original Message-----
> > > From: Pierre.Gondois@arm.com <Pierre.Gondois@arm.com>
> > > Sent: Friday, October 28, 2022 11:33 PM
> > > To: devel@edk2.groups.io
> > > Cc: Sami Mujawar <sami.mujawar@arm.com>; Leif Lindholm
> > > <quic_llindhol@quicinc.com>; Ard Biesheuvel
> > > <ardb+tianocore@kernel.org>; Rebecca Cran <rebecca@bsdio.com>;
> > Kinney,
> > > Michael D <michael.d.kinney@intel.com>; Gao, Liming
> > > <gaoliming@byosoft.com.cn>; Yao, Jiewen <jiewen.yao@intel.com>; Wang,
> > > Jian J <jian.j.wang@intel.com>
> > > Subject: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG
> > > interface
> > >
> > > From: Pierre Gondois <pierre.gondois@arm.com>
> > >
> > > Bugzilla: Bug 3668 (https://bugzilla.tianocore.org/show_bug.cgi?id=3668)
> > >
> > > The Arm True Random Number Generator Firmware, Interface 1.0,
> > > specification
> > > defines an interface between an Operating System (OS) executing at EL1
> > and
> > > Firmware (FW) exposing a conditioned entropy source that is provided by
> a
> > > TRNG back end.
> > > This patch-set:
> > > - defines an Arm TRNG library class that provides an interface to access
> > >   the entropy source on a platform.
> > > - implements an Arm TRNG library instance that uses the Arm FW-TRNG
> > >   interface.
> > > - Adds RawAlgorithm support to RngDxe for Arm architecture using the Arm
> > >   TRNG interface.
> > > - Enables RNG support using Arm TRNG interface for Kvmtool Guest/Virtual
> > >   firmware.
> > >
> > > This patch-set is based on the v2 from Sami Mujawar:
> > > [PATCH v2 0/8] Add Raw algorithm support using Arm FW-TRNG interface
> > > v2:
> > > https://edk2.groups.io/g/devel/message/83775
> > > v3:
> > > https://edk2.groups.io/g/devel/message/90845
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v3
> > > v4:
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v4
> > > v5:
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v5
> > > v6:
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v6
> > > v7:
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v7
> > > v8:
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v8
> > > v9:
> > > https://github.com/PierreARM/edk2/tree/Arm_Trng_v9
> > >
> > > v9:
> > >  - Added BaseArmTrngLibNull as default in MdePkg/MdeLibs.dsc.inc.
> > [Liming]
> > >  - Renamed TrngLib to ArmTrngLib and updated documentation, commit
> > >    messages, function names accordingly. [Jiewen, Leif]
> > > v8:
> > >  - Added Reviewed-by/Acked-by from Leif on ArmPkg/SecurityPkg
> > >    patches. [Leif]
> > >  - Renamed FID_TRNG_* macros to ARM_SMC_ID_TRNG_*. [Leif]
> > > v7:
> > >  - Removed Reviewed-by from Leif.
> > >  - Remove Sami's Signed-off.
> > > V6:
> > >  - Added my signed-off on patches authored by Sami. [Leif]
> > >  - New patch to make it easier to add new libraries in alphabetical
> > >    order: ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
> [Leif]
> > >  - Renmaed ArmHvcNullLib to ArmHvcLibNull. [Leif]
> > >  - Added RISCV64 to the list of VALID_ARCHITECTURES for
> > BaseTrngLibNull.
> > > [Leif]
> > >  - Removed unnecessary space in function parameter documentation
> > >    ('[in, out]'). [Rebecca]
> > >  - Updated INF_VERSION to latest spec (1.29) for new libraries.
> [Rebecca]
> > >  - Dropped the following patches [Leif]:
> > >   - ArmPkg/ArmLib: Add ArmHasRngExt()
> > >   - ArmPkg/ArmLib: Add ArmReadIdIsar0() helper
> > >   - MdePkg/BaseRngLib: Rename ArmReadIdIsar0() to ArmGetFeatRng()
> > > V5:
> > >  - Removed references in Trnglib.h to 'Special Publication'
> > >    800-90A and 800-90C, and only reference 'Arm True Random
> > >    Number Generator Firmware, Interface 1.0' in the Arm
> > >    implementation of the TrngLib. [Jiewen]
> > > V4:
> > >  - Removed dependencies on ArmPkg and dropped patch:
> > >     [PATCH v3 12/22] SecurityPkg: Update Securitypkg.ci.yaml
> > >    [Jiewen]
> > >  - Use a dynamically allocated array to hold available algorithms.
> > >    The array is freed in a new UNLOAD_IMAGE function and
> > >    allocated in arch specific implementations of
> > >    GetAvailableAlgorithms(), available in AArch64/AArch64Algo.c
> > >    and Arm/ArmAlgo.c.
> > >  - Correctly reference gEfiRngAlgorithmSp80090Ctr256Guid
> > >    Guid by copying its address (add missing '&'). [Jiewen]
> > > V3:
> > >  - Address Leif's comment (moving definitions, optimizations, ...)
> > >  - Add ArmMonitorLib to choose Hvc/Smc conduit depending on a Pcd.
> > >  - Re-factor some parts of SecurityPkg/RngDxe/ to ease the addition
> > >    of new algorithms.
> > >  - Add ArmHasRngExt() function to check Arm's FEAT_RNG extension.
> > > V2:
> > >  - Updates TrngLib definitions to use RETURN_STATUS as the return type
> > >    from the interface functions as TrngLib is base type library.
> > >  - Drops the patch "MdePkg: Add definition for NULL GUID" as there is
> > >    already an equivalent definition provided by gZeroGuid. Thus, the
> > >    use of gNullGuid has been replaced with gZeroGuid.
> > >
> > > Pierre Gondois (11):
> > >   ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class
> > >   ArmPkg/ArmMonitorLib: Add ArmMonitorLib
> > >   ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc
> > >   ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib
> > >   SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid
> > >   SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms()
> > >   SecurityPkg/RngDxe: Documentation/include/parameter cleanup
> > >   SecurityPkg/RngDxe: Check before advertising Cpu Rng algo
> > >   SecurityPkg/RngDxe: Add debug warning for NULL
> > >     PcdCpuRngSupportedAlgorithm
> > >   SecurityPkg/RngDxe: Rename AArch64/RngDxe.c
> > >   SecurityPkg/RngDxe: Add Arm support of RngDxe
> > >
> > > Sami Mujawar (8):
> > >   ArmPkg: PCD to select conduit for monitor calls
> > >   MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface
> > >   MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library
> > >   ArmPkg: Add FID definitions for Arm TRNG
> > >   ArmPkg/ArmTrngLib: Add Arm TRNG library
> > >   SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name
> > >   SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through
> > >     ArmTrngLib
> > >   ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface
> > >
> > >  ArmPkg/ArmPkg.dec                             |  12 +-
> > >  ArmPkg/ArmPkg.dsc                             |   5 +-
> > >  ArmPkg/Include/IndustryStandard/ArmStdSmc.h   | 109 ++++-
> > >  ArmPkg/Include/Library/ArmMonitorLib.h        |  42 ++
> > >  ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c  |  29 ++
> > >  .../Library/ArmHvcLibNull/ArmHvcLibNull.inf   |  22 +
> > >  ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c  |  34 ++
> > >  .../Library/ArmMonitorLib/ArmMonitorLib.inf   |  29 ++
> > >  ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h       |  50 +++
> > >  ArmPkg/Library/ArmTrngLib/ArmTrngLib.c        | 388
> > > ++++++++++++++++++
> > >  ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf      |  29 ++
> > >  ArmVirtPkg/ArmVirtKvmTool.dsc                 |  10 +
> > >  ArmVirtPkg/ArmVirtKvmTool.fdf                 |   5 +
> > >  MdePkg/Include/Library/ArmTrngLib.h           | 106 +++++
> > >  .../BaseArmTrngLibNull/BaseArmTrngLibNull.c   | 121 ++++++
> > >  .../BaseArmTrngLibNull/BaseArmTrngLibNull.inf |  30 ++
> > >  .../BaseArmTrngLibNull/BaseArmTrngLibNull.uni |  12 +
> > >  MdePkg/MdeLibs.dsc.inc                        |   1 +
> > >  MdePkg/MdePkg.dec                             |   5 +
> > >  MdePkg/MdePkg.dsc                             |   1 +
> > >  .../RngDxe/AArch64/AArch64Algo.c              |  72 ++++
> > >  .../RngDxe/Arm/ArmAlgo.c                      |  51 +++
> > >  .../RngDxe/{AArch64/RngDxe.c => ArmRngDxe.c}  |  81 +++-
> > >  .../RandomNumberGenerator/RngDxe/ArmTrng.c    |  71 ++++
> > >  .../RngDxe/Rand/RdRand.c                      |  14 +-
> > >  .../RngDxe/Rand/RdRand.h                      |  43 --
> > >  .../RngDxe/Rand/RngDxe.c                      |  62 ++-
> > >  .../RandomNumberGenerator/RngDxe/RngDxe.c     |  90 ++--
> > >  .../RandomNumberGenerator/RngDxe/RngDxe.inf   |  18 +-
> > >  .../RngDxe/RngDxeInternals.h                  |  71 ++--
> > >  SecurityPkg/SecurityPkg.dsc                   |   5 +-
> > >  31 files changed, 1462 insertions(+), 156 deletions(-)
> > >  create mode 100644 ArmPkg/Include/Library/ArmMonitorLib.h
> > >  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.c
> > >  create mode 100644 ArmPkg/Library/ArmHvcLibNull/ArmHvcLibNull.inf
> > >  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.c
> > >  create mode 100644 ArmPkg/Library/ArmMonitorLib/ArmMonitorLib.inf
> > >  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngDefs.h
> > >  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.c
> > >  create mode 100644 ArmPkg/Library/ArmTrngLib/ArmTrngLib.inf
> > >  create mode 100644 MdePkg/Include/Library/ArmTrngLib.h
> > >  create mode 100644
> > > MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.c
> > >  create mode 100644
> > > MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.inf
> > >  create mode 100644
> > > MdePkg/Library/BaseArmTrngLibNull/BaseArmTrngLibNull.uni
> > >  create mode 100644
> > > SecurityPkg/RandomNumberGenerator/RngDxe/AArch64/AArch64Algo.c
> > >  create mode 100644
> > > SecurityPkg/RandomNumberGenerator/RngDxe/Arm/ArmAlgo.c
> > >  rename
> > > SecurityPkg/RandomNumberGenerator/RngDxe/{AArch64/RngDxe.c =>
> > > ArmRngDxe.c} (64%)
> > >  create mode 100644
> > > SecurityPkg/RandomNumberGenerator/RngDxe/ArmTrng.c
> > >  delete mode 100644
> > > SecurityPkg/RandomNumberGenerator/RngDxe/Rand/RdRand.h
> > >
> > > --
> > > 2.25.1
>
>
>
>
>
> 
>
>

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [edk2-devel] 回复: [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface
  2022-11-04 17:34     ` [edk2-devel] " Ard Biesheuvel
@ 2022-11-06 16:57       ` Ard Biesheuvel
  0 siblings, 0 replies; 25+ messages in thread
From: Ard Biesheuvel @ 2022-11-06 16:57 UTC (permalink / raw)
  To: devel, gaoliming
  Cc: Yao, Jiewen, Pierre.Gondois, Sami Mujawar, Leif Lindholm,
	Ard Biesheuvel, Rebecca Cran, Kinney, Michael D, Wang, Jian J

On Fri, 4 Nov 2022 at 18:34, Ard Biesheuvel <ardb@kernel.org> wrote:
>
> On Fri, 4 Nov 2022 at 02:16, gaoliming via groups.io
> <gaoliming=byosoft.com.cn@groups.io> wrote:
> >
> > Sami, Leif, Ard:
> >   Can you give your Reviewed-by for this patch set this week? If so, this
> > feature can catch stable tag 202211.
> >
> >   Stable202211 tag soft feature freeze will start on next Monday Nov 7th.
> >
>
> I will try to look at this before monday.
>
>

For patch 8 and 19:

Reviewed-by: Ard Biesheuvel <ardb@kernel.org>

Series merged as #3603

^ permalink raw reply	[flat|nested] 25+ messages in thread

end of thread, other threads:[~2022-11-06 16:58 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-28 15:32 [PATCH v9 00/19] Add Raw algorithm support using Arm TRNG interface PierreGondois
2022-10-28 15:32 ` [PATCH v9 01/19] ArmPkg: PCD to select conduit for monitor calls PierreGondois
2022-10-28 15:32 ` [PATCH v9 02/19] ArmPkg/ArmMonitorLib: Definition for ArmMonitorLib library class PierreGondois
2022-10-28 15:32 ` [PATCH v9 03/19] ArmPkg/ArmMonitorLib: Add ArmMonitorLib PierreGondois
2022-10-28 15:32 ` [PATCH v9 04/19] ArmPkg: Sort HVC/SMC section alphbetically in ArmPkg.dsc PierreGondois
2022-10-28 15:32 ` [PATCH v9 05/19] ArmPkg/ArmHvcLibNull: Add NULL instance of ArmHvcLib PierreGondois
2022-10-28 15:32 ` [PATCH v9 06/19] MdePkg/ArmTrngLib: Definition for Arm TRNG library class interface PierreGondois
2022-10-28 15:32 ` [PATCH v9 07/19] MdePkg/ArmTrngLib: Add NULL instance of Arm TRNG Library PierreGondois
2022-10-28 15:32 ` [PATCH v9 08/19] ArmPkg: Add FID definitions for Arm TRNG PierreGondois
2022-10-28 15:32 ` [PATCH v9 09/19] ArmPkg/ArmTrngLib: Add Arm TRNG library PierreGondois
2022-10-28 15:32 ` [PATCH v9 10/19] SecurityPkg/RngDxe: Rename RdRandGenerateEntropy to generic name PierreGondois
2022-10-28 15:32 ` [PATCH v9 11/19] SecurityPkg/RngDxe: Replace Pcd with Sp80090Ctr256Guid PierreGondois
2022-10-28 15:32 ` [PATCH v9 12/19] SecurityPkg/RngDxe: Remove ArchGetSupportedRngAlgorithms() PierreGondois
2022-10-28 15:32 ` [PATCH v9 13/19] SecurityPkg/RngDxe: Documentation/include/parameter cleanup PierreGondois
2022-10-28 15:32 ` [PATCH v9 14/19] SecurityPkg/RngDxe: Check before advertising Cpu Rng algo PierreGondois
2022-10-28 15:32 ` [PATCH v9 15/19] SecurityPkg/RngDxe: Add AArch64 RawAlgorithm support through ArmTrngLib PierreGondois
2022-10-28 15:32 ` [PATCH v9 16/19] SecurityPkg/RngDxe: Add debug warning for NULL PcdCpuRngSupportedAlgorithm PierreGondois
2022-10-28 15:32 ` [PATCH v9 17/19] SecurityPkg/RngDxe: Rename AArch64/RngDxe.c PierreGondois
2022-10-28 15:32 ` [PATCH v9 18/19] SecurityPkg/RngDxe: Add Arm support of RngDxe PierreGondois
2022-10-28 15:32 ` [PATCH v9 19/19] ArmVirtPkg: Kvmtool: Add RNG support using Arm TRNG interface PierreGondois
2022-11-01  1:10 ` 回复: [PATCH v9 00/19] Add Raw algorithm " gaoliming
2022-11-01  8:55 ` Yao, Jiewen
2022-11-04  1:16   ` 回复: " gaoliming
2022-11-04 17:34     ` [edk2-devel] " Ard Biesheuvel
2022-11-06 16:57       ` Ard Biesheuvel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox