diff options
author | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2021-01-21 22:15:50 +0200 |
---|---|---|
committer | Jussi Kivilinna <jussi.kivilinna@iki.fi> | 2021-01-26 19:41:09 +0200 |
commit | 8d404a629167d67ed56e45de3e65d1e0b7cdeb24 (patch) | |
tree | 05d2f1de652f6efad983ce012298f18469e54c50 /random/rndhw.c | |
parent | 3b34bd6e178614d6021ee7d1140646f7c8ed7519 (diff) | |
download | libgcrypt-8d404a629167d67ed56e45de3e65d1e0b7cdeb24.tar.gz |
Define HW-feature flags per architecture
* random/rand-internal.h (_gcry_rndhw_poll_slow): Add requested length
parameter.
* random/rndhw.c (_gcry_rndhw_poll_slow): Limit accounted bytes to 50%
(or 25% for RDRAND) - this code is moved from caller side.
* random/rndlinux.c (_gcry_rndlinux_gather_random): Move
HWF_INTEL_RDRAND check to _gcry_rndhw_poll_slow.
* src/g10lib.h (HWF_PADLOCK_*, HWF_INTEL_*): Define only if
HAVE_CPU_ARCH_X86.
(HWF_ARM_*): Define only if HAVE_CPU_ARCH_ARM.
(HWF_PPC_*): Define only if HAVE_CPU_ARCH_PPC.
(HWF_S390X_*): Define only if HAVE_CPU_ARCH_S390X.
--
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
Diffstat (limited to 'random/rndhw.c')
-rw-r--r-- | random/rndhw.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/random/rndhw.c b/random/rndhw.c index 2829382c..3cf9acc3 100644 --- a/random/rndhw.c +++ b/random/rndhw.c @@ -198,24 +198,33 @@ _gcry_rndhw_poll_fast (void (*add)(const void*, size_t, enum random_origins), /* Read 64 bytes from a hardware RNG and return the number of bytes - actually read. */ + actually read. However hardware source is let account only + for up to 50% (or 25% for RDRAND) of the requested bytes. */ size_t _gcry_rndhw_poll_slow (void (*add)(const void*, size_t, enum random_origins), - enum random_origins origin) + enum random_origins origin, size_t req_length) { size_t nbytes = 0; (void)add; (void)origin; + req_length /= 2; /* Up to 50%. */ + #ifdef USE_DRNG if ((_gcry_get_hw_features () & HWF_INTEL_RDRAND)) - nbytes += poll_drng (add, origin, 0); + { + req_length /= 2; /* Up to 25%. */ + nbytes += poll_drng (add, origin, 0); + } #endif #ifdef USE_PADLOCK if ((_gcry_get_hw_features () & HWF_PADLOCK_RNG)) nbytes += poll_padlock (add, origin, 0); #endif + if (nbytes > req_length) + nbytes = req_length; + return nbytes; } |