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);