summaryrefslogtreecommitdiff
blob: 875c223700821fa4697d0dcefc4c39b895638db9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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);