From cff857461be443339aa39d614635d9a4eae8f8b2 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 15 Feb 2023 22:43:33 +0000 Subject: [rng] Add RDRAND as an entropy source Signed-off-by: Michael Brown --- src/arch/x86/include/ipxe/cpuid.h | 3 +++ src/arch/x86/include/ipxe/rdrand.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/arch/x86/include/ipxe/rdrand.h (limited to 'src/arch/x86/include/ipxe') diff --git a/src/arch/x86/include/ipxe/cpuid.h b/src/arch/x86/include/ipxe/cpuid.h index 3983dfb89..90d1bf01d 100644 --- a/src/arch/x86/include/ipxe/cpuid.h +++ b/src/arch/x86/include/ipxe/cpuid.h @@ -39,6 +39,9 @@ struct x86_features { /** Get standard features */ #define CPUID_FEATURES 0x00000001UL +/** RDRAND instruction is supported */ +#define CPUID_FEATURES_INTEL_ECX_RDRAND 0x40000000UL + /** Hypervisor is present */ #define CPUID_FEATURES_INTEL_ECX_HYPERVISOR 0x80000000UL diff --git a/src/arch/x86/include/ipxe/rdrand.h b/src/arch/x86/include/ipxe/rdrand.h new file mode 100644 index 000000000..c9c170fb0 --- /dev/null +++ b/src/arch/x86/include/ipxe/rdrand.h @@ -0,0 +1,37 @@ +#ifndef _IPXE_RDRAND_H +#define _IPXE_RDRAND_H + +/** @file + * + * Hardware random number generator + * + */ + +FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); + +#include +#include + +#ifdef ENTROPY_RDRAND +#define ENTROPY_PREFIX_rdrand +#else +#define ENTROPY_PREFIX_rdrand __rdrand_ +#endif + +/** + * min-entropy per sample + * + * @ret min_entropy min-entropy of each sample + */ +static inline __always_inline min_entropy_t +ENTROPY_INLINE ( rdrand, min_entropy_per_sample ) ( void ) { + + /* Data returned by RDRAND is theoretically full entropy, up + * to a security strength of 128 bits. + */ + if ( DRBG_SECURITY_STRENGTH > 128 ) + return 0; + return MIN_ENTROPY ( 8 * sizeof ( noise_sample_t ) ); +} + +#endif /* _IPXE_RDRAND_H */ -- cgit v1.2.3-55-g7522