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 | |
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')
-rw-r--r-- | random/rand-internal.h | 2 | ||||
-rw-r--r-- | random/rndhw.c | 15 | ||||
-rw-r--r-- | random/rndlinux.c | 17 |
3 files changed, 17 insertions, 17 deletions
diff --git a/random/rand-internal.h b/random/rand-internal.h index d99c6671..34221569 100644 --- a/random/rand-internal.h +++ b/random/rand-internal.h @@ -141,7 +141,7 @@ void _gcry_rndhw_poll_fast (void (*add)(const void*, size_t, enum random_origins origin); 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); 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; } diff --git a/random/rndlinux.c b/random/rndlinux.c index 04e2a464..7cbf6ac2 100644 --- a/random/rndlinux.c +++ b/random/rndlinux.c @@ -186,19 +186,10 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t, } - /* First read from a hardware source. However let it account only - for up to 50% (or 25% for RDRAND) of the requested bytes. */ - n_hw = _gcry_rndhw_poll_slow (add, origin); - if ((_gcry_get_hw_features () & HWF_INTEL_RDRAND)) - { - if (n_hw > length/4) - n_hw = length/4; - } - else - { - if (n_hw > length/2) - n_hw = length/2; - } + /* First read from a hardware source. Note that _gcry_rndhw_poll_slow lets + it account only for up to 50% (or 25% for RDRAND) of the requested + bytes. */ + n_hw = _gcry_rndhw_poll_slow (add, origin, length); if (length > 1) length -= n_hw; |