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 |