diff --git a/core/java/src/net/i2p/util/FortunaRandomSource.java b/core/java/src/net/i2p/util/FortunaRandomSource.java index 606a6cd233f195c8f690fa3f9b85fa06b28d51af..508bac7e1747b2554ceaf67d4085c0c4f9eb0425 100644 --- a/core/java/src/net/i2p/util/FortunaRandomSource.java +++ b/core/java/src/net/i2p/util/FortunaRandomSource.java @@ -13,6 +13,7 @@ import gnu.crypto.prng.AsyncFortunaStandalone; import java.io.IOException; import java.security.SecureRandom; +import java.util.Random; import net.i2p.I2PAppContext; import net.i2p.crypto.EntropyHarvester; @@ -40,7 +41,9 @@ public class FortunaRandomSource extends RandomSource implements EntropyHarveste _fortuna.seed(seed); } else { // may block forever - SecureRandom sr = new SecureRandom(); + //SecureRandom sr = new SecureRandom(); + // SecureRandom already failed in initSeed(), so try Random + Random sr = new Random(); sr.nextBytes(seed); _fortuna.seed(seed); } diff --git a/core/java/src/net/i2p/util/RandomSource.java b/core/java/src/net/i2p/util/RandomSource.java index b92295e633852983f489b8240a2fdabb15e1f75d..04e457a08a8bf6d5460ce97da34def0ccbd9b16e 100644 --- a/core/java/src/net/i2p/util/RandomSource.java +++ b/core/java/src/net/i2p/util/RandomSource.java @@ -195,8 +195,9 @@ public class RandomSource extends SecureRandom implements EntropyHarvester { } if (ok) System.arraycopy(tbuf, 0, buf, 0, buf.length); - else - System.out.println("INFO: SecureRandom init failed or took too long"); + // See FortunaRandomSource constructor for fallback + //else + // System.out.println("INFO: SecureRandom init failed or took too long"); } } catch (InterruptedException ie) {} @@ -218,17 +219,23 @@ public class RandomSource extends SecureRandom implements EntropyHarvester { */ private static class SecureRandomInit implements Runnable { private final byte[] buf; + private static final int SZ = 64; public SecureRandomInit(byte[] buf) { this.buf = buf; } public void run() { - byte[] buf2 = new byte[buf.length]; + byte[] buf2 = new byte[SZ]; + // do this 64 bytes at a time, so if system is low on entropy we will + // hopefully get something before the timeout try { - SecureRandom.getInstance("SHA1PRNG").nextBytes(buf2); - synchronized(buf) { - System.arraycopy(buf2, 0, buf, 0, buf.length); + SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); + for (int i = 0; i < buf.length; i += SZ) { + sr.nextBytes(buf2); + synchronized(buf) { + System.arraycopy(buf2, 0, buf, i, Math.min(SZ, buf.length - i)); + } } } catch (NoSuchAlgorithmException e) {} }