Jian, According to the NASM docuimentation, the rdseed instruction has been supported since 2.10.02.
https://www.nasm.us/xdoc/2.10.09/html/nasmdocc.html Please use rdseed instead of db bytes. Thanks, Mike > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On > Behalf Of Wang, Jian J > Sent: Wednesday, November 13, 2019 6:18 PM > To: devel@edk2.groups.io > Cc: Kinney, Michael D <michael.d.kin...@intel.com>; > Gao, Liming <liming....@intel.com>; Ni, Ray > <ray...@intel.com> > Subject: [edk2-devel] [PATCH 04/11] MdePkg/BaseLib: add > interface to wrap rdseed IA instruction > > BaseRngLib uses rdrand instruction to get random number > from DRNG in the processor, which is not a good > candidate for seeding openssl rand interface. > > rdseed in x86 cpu provides non-deterministic random > number (NRBG) which meets NIST SP 800-90B and NIST > SP800-90C standards and can be used as seed for other > software DRNG. This patch adds a C interface > AsmRdSeed() to wrap it in BaseLib so that we can add a > new RngLib for users to choose in their platform, if > their processor support rdseed instruction. > > Ref: > https://bugzilla.tianocore.org/show_bug.cgi?id=1871 > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Liming Gao <liming....@intel.com> > Cc: Ray Ni <ray...@intel.com> > Signed-off-by: Jian J Wang <jian.j.w...@intel.com> > --- > MdePkg/Include/Library/BaseLib.h | 51 > +++++++++++++ > MdePkg/Library/BaseLib/BaseLib.inf | 4 ++ > MdePkg/Library/BaseLib/BaseLibInternals.h | 46 > ++++++++++++ > MdePkg/Library/BaseLib/Ia32/RdSeed.nasm | 87 > +++++++++++++++++++++++ > MdePkg/Library/BaseLib/X64/RdSeed.nasm | 80 > +++++++++++++++++++++ > MdePkg/Library/BaseLib/X86RdSeed.c | 73 > +++++++++++++++++++ > 6 files changed, 341 insertions(+) > create mode 100644 > MdePkg/Library/BaseLib/Ia32/RdSeed.nasm > create mode 100644 > MdePkg/Library/BaseLib/X64/RdSeed.nasm > create mode 100644 MdePkg/Library/BaseLib/X86RdSeed.c > > diff --git a/MdePkg/Include/Library/BaseLib.h > b/MdePkg/Include/Library/BaseLib.h > index 2a75bc023f..e2f9bf121e 100644 > --- a/MdePkg/Include/Library/BaseLib.h > +++ b/MdePkg/Include/Library/BaseLib.h > @@ -7856,6 +7856,57 @@ AsmRdRand64 ( > OUT UINT64 *Rand > ); > > +/** > + Generates a 16-bit random seed through RDSEED > instruction. > + > + if Seed is NULL, then ASSERT(). > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > + **/ > +BOOLEAN > +EFIAPI > +AsmRdSeed16 ( > + OUT UINT16 *Seed > + ); > + > +/** > + Generates a 32-bit random seed through RDSEED > instruction. > + > + if Seed is NULL, then ASSERT(). > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > +**/ > +BOOLEAN > +EFIAPI > +AsmRdSeed32 ( > + OUT UINT32 *Seed > + ); > + > +/** > + Generates a 64-bit random seed through RDSEED > instruction. > + > + if Seed is NULL, then ASSERT(). > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > +**/ > +BOOLEAN > +EFIAPI > +AsmRdSeed64 ( > + OUT UINT64 *Seed > + ); > + > /** > Load given selector into TR register. > > diff --git a/MdePkg/Library/BaseLib/BaseLib.inf > b/MdePkg/Library/BaseLib/BaseLib.inf > index 3586beb0ab..5e12093ba3 100644 > --- a/MdePkg/Library/BaseLib/BaseLib.inf > +++ b/MdePkg/Library/BaseLib/BaseLib.inf > @@ -181,6 +181,7 @@ > Ia32/EnableCache.nasm| GCC > Ia32/DisableCache.nasm| GCC > Ia32/RdRand.nasm > + Ia32/RdSeed.nasm > > Ia32/DivS64x64Remainder.c > Ia32/InternalSwitchStack.c | MSFT > @@ -202,6 +203,7 @@ > X86DisablePaging64.c > X86DisablePaging32.c > X86RdRand.c > + X86RdSeed.c > X86PatchInstruction.c > X86SpeculationBarrier.c > > @@ -306,12 +308,14 @@ > X86DisablePaging64.c > X86DisablePaging32.c > X86RdRand.c > + X86RdSeed.c > X86PatchInstruction.c > X86SpeculationBarrier.c > X64/GccInline.c | GCC > X64/EnableDisableInterrupts.nasm > X64/DisablePaging64.nasm > X64/RdRand.nasm > + X64/RdSeed.nasm > ChkStkGcc.c | GCC > > [Sources.EBC] > diff --git a/MdePkg/Library/BaseLib/BaseLibInternals.h > b/MdePkg/Library/BaseLib/BaseLibInternals.h > index 6837d67d90..7b18b192c9 100644 > --- a/MdePkg/Library/BaseLib/BaseLibInternals.h > +++ b/MdePkg/Library/BaseLib/BaseLibInternals.h > @@ -862,6 +862,52 @@ InternalX86RdRand64 ( > OUT UINT64 *Rand > ); > > +/** > + Generates a 16-bit random seed through RDSEED > instruction. > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > + **/ > +BOOLEAN > +EFIAPI > +InternalX86RdSeed16 ( > + OUT UINT16 *Seed > + ); > + > +/** > + Generates a 32-bit random seed through RDSEED > instruction. > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > +**/ > +BOOLEAN > +EFIAPI > +InternalX86RdSeed32 ( > + OUT UINT32 *Seed > + ); > + > +/** > + Generates a 64-bit random seed through RDSEED > instruction. > + > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > +**/ > +BOOLEAN > +EFIAPI > +InternalX86RdSeed64 ( > + OUT UINT64 *Seed > + ); > + > #else > > #endif > diff --git a/MdePkg/Library/BaseLib/Ia32/RdSeed.nasm > b/MdePkg/Library/BaseLib/Ia32/RdSeed.nasm > new file mode 100644 > index 0000000000..0a4de30db6 > --- /dev/null > +++ b/MdePkg/Library/BaseLib/Ia32/RdSeed.nasm > @@ -0,0 +1,87 @@ > +;----------------------------------------------------- > ----------------- > +-------- > +; > +; Copyright (c) 2019, Intel Corporation. All rights > reserved.<BR> ; > +SPDX-License-Identifier: BSD-2-Clause-Patent ; ; > Module Name: > +; > +; RdSeed.nasm > +; > +; Abstract: > +; > +; Generates random seed through CPU RdSeed > instruction under 32-bit platform. > +; > +; Notes: > +; > +;----------------------------------------------------- > ----------------- > +-------- > + > +SECTION .text > + > +;----------------------------------------------------- > ----------------- > +-------- ; Generates a 16 bit random seed through > RDSEED instruction. > +; Return TRUE if Seed generated successfully, or > FALSE if not. > +; > +; BOOLEAN EFIAPI InternalX86RdSeed16 (UINT16 *Seed); > +;----------------------------------------------------- > ----------------- > +-------- > +global ASM_PFX(InternalX86RdSeed16) > +ASM_PFX(InternalX86RdSeed16): > + ; rdseed ax ; generate a 16 bit > RN into ax > + ; CF=1 if RN > generated ok, otherwise CF=0 > + db 0xf, 0xc7, 0xf8 ; rdseed r16: "0f > c7 /7 ModRM:r/m(w)" > + jc rn16_ok ; jmp if CF=1 > + xor eax, eax ; reg=0 if CF=0 > + pause > + ret ; return with > failure status > +rn16_ok: > + mov edx, dword [esp + 4] > + mov [edx], ax > + mov eax, 1 > + ret > + > +;----------------------------------------------------- > ----------------- > +-------- ; Generates a 32 bit random seed through > RDSEED instruction. > +; Return TRUE if Seed generated successfully, or > FALSE if not. > +; > +; BOOLEAN EFIAPI InternalX86RdSeed32 (UINT32 *Seed); > +;----------------------------------------------------- > ----------------- > +-------- > +global ASM_PFX(InternalX86RdSeed32) > +ASM_PFX(InternalX86RdSeed32): > + ; rdseed eax ; generate a 32 bit > RN into eax > + ; CF=1 if RN > generated ok, otherwise CF=0 > + db 0xf, 0xc7, 0xf8 ; rdseed r32: "0f > c7 /7 ModRM:r/m(w)" > + jc rn32_ok ; jmp if CF=1 > + xor eax, eax ; reg=0 if CF=0 > + pause > + ret ; return with > failure status > +rn32_ok: > + mov edx, dword [esp + 4] > + mov [edx], eax > + mov eax, 1 > + ret > + > +;----------------------------------------------------- > ----------------- > +-------- ; Generates a 64 bit random seed through > RDSEED instruction. > +; Return TRUE if Seed generated successfully, or > FALSE if not. > +; > +; BOOLEAN EFIAPI InternalX86RdSeed64 (UINT64 *Seed); > +;----------------------------------------------------- > ----------------- > +-------- > +global ASM_PFX(InternalX86RdSeed64) > +ASM_PFX(InternalX86RdSeed64): > + ; rdseed eax ; generate a 32 bit > RN into eax > + ; CF=1 if RN > generated ok, otherwise CF=0 > + db 0xf, 0xc7, 0xf8 ; rdseed r32: "0f > c7 /7 ModRM:r/m(w)" > + jnc rn64_ret ; jmp if CF=0 > + mov edx, dword [esp + 4] > + mov [edx], eax > + > + db 0xf, 0xc7, 0xf0 ; generate another > 32 bit RN > + jnc rn64_ret ; jmp if CF=0 > + mov [edx + 4], eax > + > + mov eax, 1 > + ret > +rn64_ret: > + xor eax, eax > + pause > + ret ; return with > failure status > + > diff --git a/MdePkg/Library/BaseLib/X64/RdSeed.nasm > b/MdePkg/Library/BaseLib/X64/RdSeed.nasm > new file mode 100644 > index 0000000000..a60acfeace > --- /dev/null > +++ b/MdePkg/Library/BaseLib/X64/RdSeed.nasm > @@ -0,0 +1,80 @@ > +;----------------------------------------------------- > ----------------- > +-------- > +; > +; Copyright (c) 2019, Intel Corporation. All rights > reserved.<BR> ; > +SPDX-License-Identifier: BSD-2-Clause-Patent ; ; > Module Name: > +; > +; RdSeed.nasm > +; > +; Abstract: > +; > +; Generates random seed through CPU RdSeed > instruction under 64-bit platform. > +; > +; Notes: > +; > +;----------------------------------------------------- > ----------------- > +-------- > + > + DEFAULT REL > + SECTION .text > + > +;----------------------------------------------------- > ----------------- > +-------- ; Generates a 16 bit random seed through > RDSEED instruction. > +; Return TRUE if Seed generated successfully, or > FALSE if not. > +; > +; BOOLEAN EFIAPI InternalX86RdSeed16 (UINT16 *Seed); > +;----------------------------------------------------- > ----------------- > +-------- > +global ASM_PFX(InternalX86RdSeed16) > +ASM_PFX(InternalX86RdSeed16): > + ; rdseed ax ; generate a 16 bit > RN into eax, > + ; CF=1 if RN > generated ok, otherwise CF=0 > + db 0xf, 0xc7, 0xf8 ; rdseed r16: "0f > c7 /7 ModRM:r/m(w)" > + jc rn16_ok ; jmp if CF=1 > + xor rax, rax ; reg=0 if CF=0 > + pause > + ret ; return with > failure status > +rn16_ok: > + mov [rcx], ax > + mov rax, 1 > + ret > + > +;----------------------------------------------------- > ----------------- > +-------- ; Generates a 32 bit random seed through > RDSEED instruction. > +; Return TRUE if Seed generated successfully, or > FALSE if not. > +; > +; BOOLEAN EFIAPI InternalX86RdSeed32 (UINT32 *Seed); > +;----------------------------------------------------- > ----------------- > +-------- > +global ASM_PFX(InternalX86RdSeed32) > +ASM_PFX(InternalX86RdSeed32): > + ; rdseed eax ; generate a 32 bit > RN into eax, > + ; CF=1 if RN > generated ok, otherwise CF=0 > + db 0xf, 0xc7, 0xf8 ; rdseed r32: "0f > c7 /7 ModRM:r/m(w)" > + jc rn32_ok ; jmp if CF=1 > + xor rax, rax ; reg=0 if CF=0 > + pause > + ret ; return with > failure status > +rn32_ok: > + mov [rcx], eax > + mov rax, 1 > + ret > + > +;----------------------------------------------------- > ----------------- > +-------- ; Generates a 64 bit random seed through one > RDSEED > +instruction. > +; Return TRUE if Seed generated successfully, or > FALSE if not. > +; > +; BOOLEAN EFIAPI InternalX86RdSeed64 (UINT64 *Seed); > +;----------------------------------------------------- > ----------------- > +-------- > +global ASM_PFX(InternalX86RdSeed64) > +ASM_PFX(InternalX86RdSeed64): > + ; rdseed rax ; generate a 64 bit > RN into rax, > + ; CF=1 if RN > generated ok, otherwise CF=0 > + db 0x48, 0xf, 0xc7, 0xf8 ; rdseed r64: > "REX.W + 0f c7 /7 ModRM:r/m(w)" > + jc rn64_ok ; jmp if CF=1 > + xor rax, rax ; reg=0 if CF=0 > + pause > + ret ; return with > failure status > +rn64_ok: > + mov [rcx], rax > + mov rax, 1 > + ret > + > diff --git a/MdePkg/Library/BaseLib/X86RdSeed.c > b/MdePkg/Library/BaseLib/X86RdSeed.c > new file mode 100644 > index 0000000000..9fa7948ff1 > --- /dev/null > +++ b/MdePkg/Library/BaseLib/X86RdSeed.c > @@ -0,0 +1,73 @@ > +/** @file > + IA-32/x64 AsmRdSeedxx() > + Generates random seed through CPU RdSeed > instruction. > + > + Copyright (c) 2019, Intel Corporation. All rights > reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "BaseLibInternals.h" > + > +/** > + Generates a 16-bit random seed through RDSEED > instruction. > + > + if Seed is NULL, then ASSERT(). > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > + **/ > +BOOLEAN > +EFIAPI > +AsmRdSeed16 ( > + OUT UINT16 *Seed > + ) > +{ > + ASSERT (Seed != NULL); > + return InternalX86RdSeed16 (Seed); > +} > + > +/** > + Generates a 32-bit random seed through RDSEED > instruction. > + > + if Seed is NULL, then ASSERT(). > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > +**/ > +BOOLEAN > +EFIAPI > +AsmRdSeed32 ( > + OUT UINT32 *Seed > + ) > +{ > + ASSERT (Seed != NULL); > + return InternalX86RdSeed32 (Seed); > +} > + > +/** > + Generates a 64-bit random seed through RDSEED > instruction. > + > + if Seed is NULL, then ASSERT(). > + > + @param[out] Seed Buffer pointer to store the > seed data. > + > + @retval TRUE RDSEED call was successful. > + @retval FALSE Failed attempts to call > RDSEED. > + > +**/ > +BOOLEAN > +EFIAPI > +AsmRdSeed64 ( > + OUT UINT64 *Seed > + ) > +{ > + ASSERT (Seed != NULL); > + return InternalX86RdSeed64 (Seed); > +} > -- > 2.17.1.windows.2 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#50620): https://edk2.groups.io/g/devel/message/50620 Mute This Topic: https://groups.io/mt/56714069/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-