summaryrefslogtreecommitdiff
path: root/random/rndhw.c
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@iki.fi>2021-01-21 22:15:50 +0200
committerJussi Kivilinna <jussi.kivilinna@iki.fi>2021-01-26 19:41:09 +0200
commit8d404a629167d67ed56e45de3e65d1e0b7cdeb24 (patch)
tree05d2f1de652f6efad983ce012298f18469e54c50 /random/rndhw.c
parent3b34bd6e178614d6021ee7d1140646f7c8ed7519 (diff)
downloadlibgcrypt-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.c15
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;
}