Merge "Stop manually mixing /dev/hw_random."

This commit is contained in:
Elliott Hughes
2021-02-09 16:24:26 +00:00
committed by Gerrit Code Review
2 changed files with 11 additions and 42 deletions

View File

@@ -16,12 +16,6 @@
package com.android.server; package com.android.server;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -33,10 +27,15 @@ import android.os.Message;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.util.Slog; import android.util.Slog;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
/** /**
* A service designed to load and periodically save "randomness" * A service designed to load and periodically save "randomness"
* for the Linux kernel RNG and to mix in data from Hardware RNG (if present) * for the Linux kernel RNG.
* into the Linux RNG.
* *
* <p>When a Linux system starts up, the entropy pool associated with * <p>When a Linux system starts up, the entropy pool associated with
* {@code /dev/random} may be in a fairly predictable state. Applications which * {@code /dev/random} may be in a fairly predictable state. Applications which
@@ -45,15 +44,8 @@ import android.util.Slog;
* this effect, it's helpful to carry the entropy pool information across * this effect, it's helpful to carry the entropy pool information across
* shutdowns and startups. * shutdowns and startups.
* *
* <p>On systems with Hardware RNG (/dev/hw_random), a block of output from HW
* RNG is mixed into the Linux RNG on EntropyMixer's startup and whenever
* EntropyMixer periodically runs to save a block of output from Linux RNG on
* disk. This mixing is done in a way that does not increase the Linux RNG's
* entropy estimate is not increased. This is to avoid having to trust/verify
* the quality and authenticity of the &quot;randomness&quot; of the HW RNG.
*
* <p>This class was modeled after the script in the * <p>This class was modeled after the script in the
* <a href="http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html"> * <a href="https://man7.org/linux/man-pages/man4/random.4.html">
* random(4) manual page</a>. * random(4) manual page</a>.
*/ */
public class EntropyMixer extends Binder { public class EntropyMixer extends Binder {
@@ -64,7 +56,6 @@ public class EntropyMixer extends Binder {
private static final long START_NANOTIME = System.nanoTime(); private static final long START_NANOTIME = System.nanoTime();
private final String randomDevice; private final String randomDevice;
private final String hwRandomDevice;
private final String entropyFile; private final String entropyFile;
/** /**
@@ -80,7 +71,6 @@ public class EntropyMixer extends Binder {
Slog.e(TAG, "Will not process invalid message"); Slog.e(TAG, "Will not process invalid message");
return; return;
} }
addHwRandomEntropy();
writeEntropy(); writeEntropy();
scheduleEntropyWriter(); scheduleEntropyWriter();
} }
@@ -94,25 +84,21 @@ public class EntropyMixer extends Binder {
}; };
public EntropyMixer(Context context) { public EntropyMixer(Context context) {
this(context, getSystemDir() + "/entropy.dat", "/dev/urandom", "/dev/hw_random"); this(context, getSystemDir() + "/entropy.dat", "/dev/urandom");
} }
/** Test only interface, not for public use */ /** Test only interface, not for public use */
public EntropyMixer( public EntropyMixer(
Context context, Context context,
String entropyFile, String entropyFile,
String randomDevice, String randomDevice) {
String hwRandomDevice) {
if (randomDevice == null) { throw new NullPointerException("randomDevice"); } if (randomDevice == null) { throw new NullPointerException("randomDevice"); }
if (hwRandomDevice == null) { throw new NullPointerException("hwRandomDevice"); }
if (entropyFile == null) { throw new NullPointerException("entropyFile"); } if (entropyFile == null) { throw new NullPointerException("entropyFile"); }
this.randomDevice = randomDevice; this.randomDevice = randomDevice;
this.hwRandomDevice = hwRandomDevice;
this.entropyFile = entropyFile; this.entropyFile = entropyFile;
loadInitialEntropy(); loadInitialEntropy();
addDeviceSpecificEntropy(); addDeviceSpecificEntropy();
addHwRandomEntropy();
writeEntropy(); writeEntropy();
scheduleEntropyWriter(); scheduleEntropyWriter();
IntentFilter broadcastFilter = new IntentFilter(Intent.ACTION_SHUTDOWN); IntentFilter broadcastFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
@@ -192,23 +178,6 @@ public class EntropyMixer extends Binder {
} }
} }
/**
* Mixes in the output from HW RNG (if present) into the Linux RNG.
*/
private void addHwRandomEntropy() {
if (!new File(hwRandomDevice).exists()) {
// HW RNG not present/exposed -- ignore
return;
}
try {
RandomBlock.fromFile(hwRandomDevice).toFile(randomDevice, false);
Slog.i(TAG, "Added HW RNG output to entropy pool");
} catch (IOException e) {
Slog.w(TAG, "Failed to add HW RNG output to entropy pool", e);
}
}
private static String getSystemDir() { private static String getSystemDir() {
File dataDir = Environment.getDataDirectory(); File dataDir = Environment.getDataDirectory();
File systemDir = new File(dataDir, "system"); File systemDir = new File(dataDir, "system");

View File

@@ -34,7 +34,7 @@ public class EntropyMixerTest extends AndroidTestCase {
assertEquals(0, FileUtils.readTextFile(file, 0, null).length()); assertEquals(0, FileUtils.readTextFile(file, 0, null).length());
// The constructor has the side effect of writing to file // The constructor has the side effect of writing to file
new EntropyMixer(getContext(), "/dev/null", file.getCanonicalPath(), "/dev/null"); new EntropyMixer(getContext(), "/dev/null", file.getCanonicalPath());
assertTrue(FileUtils.readTextFile(file, 0, null).length() > 0); assertTrue(FileUtils.readTextFile(file, 0, null).length() > 0);
} }