| Broken in https://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commitdiff;h=8d404a629167d67ed56e45de3e65d1e0b7cdeb24;hp=3b34bd6e178614d6021ee7d1140646f7c8ed7519 |
| https://dev.gnupg.org/T5277 |
| https://bugs.gentoo.org/767859 |
| |
| This is a revert of that commit, as suggested by upstream in the linked bug. |
| diff --git a/random/rand-internal.h b/random/rand-internal.h |
| index 34221569..d99c6671 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, size_t req_length); |
| + enum random_origins origin); |
| |
| |
| |
| diff --git a/random/rndhw.c b/random/rndhw.c |
| index 3cf9acc3..2829382c 100644 |
| --- a/random/rndhw.c |
| +++ b/random/rndhw.c |
| @@ -198,33 +198,24 @@ _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. However hardware source is let account only |
| - for up to 50% (or 25% for RDRAND) of the requested bytes. */ |
| + actually read. */ |
| size_t |
| _gcry_rndhw_poll_slow (void (*add)(const void*, size_t, enum random_origins), |
| - enum random_origins origin, size_t req_length) |
| + enum random_origins origin) |
| { |
| 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)) |
| - { |
| - req_length /= 2; /* Up to 25%. */ |
| - nbytes += poll_drng (add, origin, 0); |
| - } |
| + 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 a22db177..f378a549 100644 |
| --- a/random/rndlinux.c |
| +++ b/random/rndlinux.c |
| @@ -190,10 +190,19 @@ _gcry_rndlinux_gather_random (void (*add)(const void*, size_t, |
| } |
| |
| |
| - /* 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); |
| + /* 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; |
| + } |
| if (length > 1) |
| length -= n_hw; |
| |
| diff --git a/src/g10lib.h b/src/g10lib.h |
| index 243997eb..cba2e237 100644 |
| --- a/src/g10lib.h |
| +++ b/src/g10lib.h |
| @@ -217,8 +217,6 @@ char **_gcry_strtokenize (const char *string, const char *delim); |
| |
| |
| /*-- src/hwfeatures.c --*/ |
| -#if defined(HAVE_CPU_ARCH_X86) |
| - |
| #define HWF_PADLOCK_RNG (1 << 0) |
| #define HWF_PADLOCK_AES (1 << 1) |
| #define HWF_PADLOCK_SHA (1 << 2) |
| @@ -238,28 +236,20 @@ char **_gcry_strtokenize (const char *string, const char *delim); |
| #define HWF_INTEL_RDTSC (1 << 15) |
| #define HWF_INTEL_SHAEXT (1 << 16) |
| |
| -#elif defined(HAVE_CPU_ARCH_ARM) |
| - |
| -#define HWF_ARM_NEON (1 << 0) |
| -#define HWF_ARM_AES (1 << 1) |
| -#define HWF_ARM_SHA1 (1 << 2) |
| -#define HWF_ARM_SHA2 (1 << 3) |
| -#define HWF_ARM_PMULL (1 << 4) |
| - |
| -#elif defined(HAVE_CPU_ARCH_PPC) |
| +#define HWF_ARM_NEON (1 << 17) |
| +#define HWF_ARM_AES (1 << 18) |
| +#define HWF_ARM_SHA1 (1 << 19) |
| +#define HWF_ARM_SHA2 (1 << 20) |
| +#define HWF_ARM_PMULL (1 << 21) |
| |
| -#define HWF_PPC_VCRYPTO (1 << 0) |
| -#define HWF_PPC_ARCH_3_00 (1 << 1) |
| -#define HWF_PPC_ARCH_2_07 (1 << 2) |
| +#define HWF_PPC_VCRYPTO (1 << 22) |
| +#define HWF_PPC_ARCH_3_00 (1 << 23) |
| +#define HWF_PPC_ARCH_2_07 (1 << 24) |
| |
| -#elif defined(HAVE_CPU_ARCH_S390X) |
| - |
| -#define HWF_S390X_MSA (1 << 0) |
| -#define HWF_S390X_MSA_4 (1 << 1) |
| -#define HWF_S390X_MSA_8 (1 << 2) |
| -#define HWF_S390X_VX (1 << 3) |
| - |
| -#endif |
| +#define HWF_S390X_MSA (1 << 25) |
| +#define HWF_S390X_MSA_4 (1 << 26) |
| +#define HWF_S390X_MSA_8 (1 << 27) |
| +#define HWF_S390X_VX (1 << 28) |
| |
| gpg_err_code_t _gcry_disable_hw_feature (const char *name); |
| void _gcry_detect_hw_features (void); |