package com.limegroup.gnutella.security;

import java.security.SecureRandom;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 *  A collection of utility methods related to 
 *  com.limegroup.gnutella.security or java.security
 *
 */
public class SecurityUtils {

    /**
     * On some OSes, creating a new SeucureRandom 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");
        try {
            if (urandom.canRead()) {
                // OS X, Linux, FreeBSD, Solaris, etc.
                byte[] seed = new byte[32];
                FileInputStream 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) {}
        
        // 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();
    }
    
}
