package org.limewire.security; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.security.SecureRandom; import org.limewire.util.FileUtils; /** Provides a non-blocking cryptographically strong random number generator. */ public class SecurityUtils { /** * On some OSes, creating a new <code>SeucureRandom</code> instance * with the default constructor may block if the OS's * internal entropy pool runs low. On MS Windows, OS X, and Linux, and * pretty much any modern Unix, this method will not block. */ public static SecureRandom createSecureRandomNoBlock() { File urandom = new File("/dev/urandom"); InputStream randStream = null; try { if (urandom.canRead()) { // OS X, Linux, FreeBSD, Solaris, etc. byte[] seed = new byte[32]; randStream = new FileInputStream(urandom); for(int offset=0; offset < 32;) { offset += randStream.read(seed, offset, 32-offset); } return new SecureRandom(seed); } } catch (SecurityException ignored) { } catch (IOException ignored) { } finally { FileUtils.close(randStream); } // Either we're on MS Windows, or some fringe OS that // doesn't have /dev/urandom or doesn't let normal // users use /dev/urandom. In the Windows case, this // won't block. return new SecureRandom(); } }