Improve the rdrand-rng driver to be robust in the face of various
errors and edge cases. Specifically,
- arch_get_random_long() and arch_get_random_seed_long() can fail.
Check their return values to deal with this appropriately.
- The number of random bytes requested can be arbitrary; so fill in
the supplied buffer carefully.
- Prefer rdseed over rdrand whenever possible.
Thanks to Joao Lima and Lonnie Abelbeck (@abelbeck) for suggesting
some of these improvements.
Change-Id: If1e90e683bd4aaded097859669d87ec6c423e538
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5727
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Sharath George
... | ... |
@@ -12,14 +12,15 @@ entropy-starved virtual machines. |
12 | 12 |
|
13 | 13 |
Signed-off-by: Srivatsa S. Bhat <srivatsa@csail.mit.edu> |
14 | 14 |
--- |
15 |
- drivers/char/hw_random/Kconfig | 14 +++++++++ |
|
15 |
+ |
|
16 |
+ drivers/char/hw_random/Kconfig | 14 ++++++++ |
|
16 | 17 |
drivers/char/hw_random/Makefile | 1 + |
17 |
- drivers/char/hw_random/rdrand-rng.c | 61 +++++++++++++++++++++++++++++++++++++ |
|
18 |
- 3 files changed, 76 insertions(+) |
|
18 |
+ drivers/char/hw_random/rdrand-rng.c | 72 +++++++++++++++++++++++++++++++++++++ |
|
19 |
+ 3 files changed, 87 insertions(+) |
|
19 | 20 |
create mode 100644 drivers/char/hw_random/rdrand-rng.c |
20 | 21 |
|
21 | 22 |
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig |
22 |
-index dbf2271..b4e558d 100644 |
|
23 |
+index dbf2271..32e6196 100644 |
|
23 | 24 |
--- a/drivers/char/hw_random/Kconfig |
24 | 25 |
+++ b/drivers/char/hw_random/Kconfig |
25 | 26 |
@@ -62,6 +62,20 @@ config HW_RANDOM_AMD |
... | ... |
@@ -32,7 +33,7 @@ index dbf2271..b4e558d 100644 |
32 | 32 |
+ default HW_RANDOM |
33 | 33 |
+ ---help--- |
34 | 34 |
+ This driver provides kernel-side support for a Random Number |
35 |
-+ Generator that uses the 'rdrand' instruction on modern Intel |
|
35 |
++ Generator that uses the RDRAND/RDSEED instructions on modern Intel |
|
36 | 36 |
+ and AMD CPUs. |
37 | 37 |
+ |
38 | 38 |
+ To compile this driver as a module, choose M here: the |
... | ... |
@@ -57,13 +58,13 @@ index 5ad3976..c186ddb 100644 |
57 | 57 |
obj-$(CONFIG_HW_RANDOM_GEODE) += geode-rng.o |
58 | 58 |
diff --git a/drivers/char/hw_random/rdrand-rng.c b/drivers/char/hw_random/rdrand-rng.c |
59 | 59 |
new file mode 100644 |
60 |
-index 0000000..e1cf7f3 |
|
60 |
+index 0000000..ba017f3 |
|
61 | 61 |
--- /dev/null |
62 | 62 |
+++ b/drivers/char/hw_random/rdrand-rng.c |
63 |
-@@ -0,0 +1,61 @@ |
|
63 |
+@@ -0,0 +1,72 @@ |
|
64 | 64 |
+// SPDX-License-Identifier: GPL-2.0 |
65 | 65 |
+/* |
66 |
-+ * RNG driver that uses the 'rdrand' instruction (found on modern |
|
66 |
++ * RNG driver that uses the RDRAND/RDSEED instructions (found on modern |
|
67 | 67 |
+ * Intel and AMD CPUs). |
68 | 68 |
+ * |
69 | 69 |
+ * Author: Srivatsa S. Bhat <srivatsa@csail.mit.edu> |
... | ... |
@@ -77,18 +78,27 @@ index 0000000..e1cf7f3 |
77 | 77 |
+ |
78 | 78 |
+#define PFX KBUILD_MODNAME ": " |
79 | 79 |
+ |
80 |
-+static int rdrand_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
|
80 |
++static int rdrand_rng_read(struct hwrng *rng, void *buf, size_t max_bytes, bool wait) |
|
81 | 81 |
+{ |
82 |
-+ unsigned long *data = buf; |
|
83 |
-+ size_t read = 0; |
|
84 |
-+ |
|
85 |
-+ while (read < max) { |
|
86 |
-+ arch_get_random_long(data); |
|
87 |
-+ data++; |
|
88 |
-+ read += sizeof(unsigned long); |
|
82 |
++ char *p = buf; |
|
83 |
++ size_t read_bytes = 0; |
|
84 |
++ |
|
85 |
++ while (max_bytes) { |
|
86 |
++ unsigned long v; |
|
87 |
++ size_t chunk = min(max_bytes, (int)sizeof(unsigned long)); |
|
88 |
++ |
|
89 |
++ if (unlikely(!arch_get_random_seed_long(&v)) && |
|
90 |
++ unlikely(!arch_get_random_long(&v))) { |
|
91 |
++ break; |
|
92 |
++ } |
|
93 |
++ |
|
94 |
++ memcpy(p, &v, chunk); |
|
95 |
++ p += chunk; |
|
96 |
++ max_bytes -= chunk; |
|
97 |
++ read_bytes += chunk; |
|
89 | 98 |
+ } |
90 | 99 |
+ |
91 |
-+ return read; |
|
100 |
++ return read_bytes; |
|
92 | 101 |
+} |
93 | 102 |
+ |
94 | 103 |
+static struct hwrng rdrand_rng = { |
... | ... |
@@ -101,8 +111,10 @@ index 0000000..e1cf7f3 |
101 | 101 |
+{ |
102 | 102 |
+ int err = -ENODEV; |
103 | 103 |
+ |
104 |
-+ if (!arch_has_random()) |
|
105 |
-+ return err; /* rdrand not available. */ |
|
104 |
++ if (!arch_has_random_seed() && !arch_has_random()) { |
|
105 |
++ pr_err(PFX "Neither RDSEED nor RDRAND is available.\n"); |
|
106 |
++ return err; |
|
107 |
++ } |
|
106 | 108 |
+ |
107 | 109 |
+ err = hwrng_register(&rdrand_rng); |
108 | 110 |
+ if (err) |
... | ... |
@@ -120,7 +132,7 @@ index 0000000..e1cf7f3 |
120 | 120 |
+module_exit(mod_exit); |
121 | 121 |
+ |
122 | 122 |
+MODULE_AUTHOR("Srivatsa S. Bhat <srivatsa@csail.mit.edu>"); |
123 |
-+MODULE_DESCRIPTION("H/W RNG driver for x86 CPUs that support rdrand"); |
|
123 |
++MODULE_DESCRIPTION("H/W RNG driver for x86 CPUs that support RDRAND/RDSEED"); |
|
124 | 124 |
+MODULE_LICENSE("GPL"); |
125 | 125 |
-- |
126 | 126 |
2.7.4 |
... | ... |
@@ -2,7 +2,7 @@ |
2 | 2 |
Summary: Kernel |
3 | 3 |
Name: linux-esx |
4 | 4 |
Version: 4.4.153 |
5 |
-Release: 2%{?dist} |
|
5 |
+Release: 3%{?dist} |
|
6 | 6 |
License: GPLv2 |
7 | 7 |
URL: http://www.kernel.org/ |
8 | 8 |
Group: System Environment/Kernel |
... | ... |
@@ -238,6 +238,8 @@ ln -sf linux-%{uname_r}.cfg /boot/photon.cfg |
238 | 238 |
/usr/src/linux-headers-%{uname_r} |
239 | 239 |
|
240 | 240 |
%changelog |
241 |
+* Tue Sep 18 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-3 |
|
242 |
+- Improve error-handling of rdrand-rng kernel driver. |
|
241 | 243 |
* Fri Sep 07 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-2 |
242 | 244 |
- Fix CVE-2018-13053 |
243 | 245 |
* Tue Sep 04 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-1 |
... | ... |
@@ -2,7 +2,7 @@ |
2 | 2 |
Summary: Kernel |
3 | 3 |
Name: linux |
4 | 4 |
Version: 4.4.153 |
5 |
-Release: 2%{?kat_build:.%kat_build}%{?dist} |
|
5 |
+Release: 3%{?kat_build:.%kat_build}%{?dist} |
|
6 | 6 |
License: GPLv2 |
7 | 7 |
URL: http://www.kernel.org/ |
8 | 8 |
Group: System Environment/Kernel |
... | ... |
@@ -339,6 +339,8 @@ ln -sf %{name}-%{uname_r}.cfg /boot/photon.cfg |
339 | 339 |
/usr/share/perf-core |
340 | 340 |
|
341 | 341 |
%changelog |
342 |
+* Tue Sep 18 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-3 |
|
343 |
+- Improve error-handling of rdrand-rng kernel driver. |
|
342 | 344 |
* Fri Sep 07 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-2 |
343 | 345 |
- Fix CVE-2018-13053 |
344 | 346 |
* Tue Sep 04 2018 Srivatsa S. Bhat <srivatsa@csail.mit.edu> 4.4.153-1 |