EntropyMixer: Write entropy at shutdown / reboot / power
Write out entropy if we're shutting down or rebooting,
or if someone plugs in the power.
Bug: 8312061
Change-Id: Id9a48064a7bdfe6c05a9227ea95a1bdbd0e9b8ae
diff --git a/services/java/com/android/server/EntropyMixer.java b/services/java/com/android/server/EntropyMixer.java
index 8c0d260..fbb66f9 100644
--- a/services/java/com/android/server/EntropyMixer.java
+++ b/services/java/com/android/server/EntropyMixer.java
@@ -23,6 +23,10 @@
import java.io.OutputStream;
import java.io.PrintWriter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
@@ -44,9 +48,6 @@
* <p>This class was modeled after the script in
* <a href="http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html">man
* 4 random</a>.
- *
- * <p>TODO: Investigate attempting to write entropy data at shutdown time
- * instead of periodically.
*/
public class EntropyMixer extends Binder {
private static final String TAG = "EntropyMixer";
@@ -73,12 +74,19 @@
}
};
- public EntropyMixer() {
- this(getSystemDir() + "/entropy.dat", "/dev/urandom");
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ writeEntropy();
+ }
+ };
+
+ public EntropyMixer(Context context) {
+ this(context, getSystemDir() + "/entropy.dat", "/dev/urandom");
}
/** Test only interface, not for public use */
- public EntropyMixer(String entropyFile, String randomDevice) {
+ public EntropyMixer(Context context, String entropyFile, String randomDevice) {
if (randomDevice == null) { throw new NullPointerException("randomDevice"); }
if (entropyFile == null) { throw new NullPointerException("entropyFile"); }
@@ -88,6 +96,10 @@
addDeviceSpecificEntropy();
writeEntropy();
scheduleEntropyWriter();
+ IntentFilter broadcastFilter = new IntentFilter(Intent.ACTION_SHUTDOWN);
+ broadcastFilter.addAction(Intent.ACTION_POWER_CONNECTED);
+ broadcastFilter.addAction(Intent.ACTION_REBOOT);
+ context.registerReceiver(mBroadcastReceiver, broadcastFilter);
}
private void scheduleEntropyWriter() {
@@ -107,6 +119,7 @@
private void writeEntropy() {
try {
+ Slog.i(TAG, "Writing entropy...");
RandomBlock.fromFile(randomDevice).toFile(entropyFile, true);
} catch (IOException e) {
Slog.w(TAG, "Unable to write entropy", e);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 8ef247e..4631395 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -206,9 +206,6 @@
installer = new Installer();
installer.ping();
- Slog.i(TAG, "Entropy Mixer");
- ServiceManager.addService("entropy", new EntropyMixer());
-
Slog.i(TAG, "Power Manager");
power = new PowerManagerService();
ServiceManager.addService(Context.POWER_SERVICE, power);
@@ -257,6 +254,9 @@
ActivityManagerService.setSystemProcess();
+ Slog.i(TAG, "Entropy Mixer");
+ ServiceManager.addService("entropy", new EntropyMixer(context));
+
Slog.i(TAG, "User Service");
ServiceManager.addService(Context.USER_SERVICE,
UserManagerService.getInstance());