You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.6 KiB
142 lines
4.6 KiB
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);
|