package org.bouncycastle.util.test; import java.security.SecureRandom; import org.bouncycastle.crypto.prng.EntropySource; import org.bouncycastle.crypto.prng.EntropySourceProvider; /** * A class for returning "quick entropy" for testing purposes. */ public class TestRandomEntropySourceProvider implements EntropySourceProvider { private final SecureRandom _sr; private final boolean _predictionResistant; /** * Create a test entropy source provider. * * @param isPredictionResistant boolean indicating if the SecureRandom is based on prediction resistant entropy or not (true if it is). */ public TestRandomEntropySourceProvider(boolean isPredictionResistant) { _sr = new SecureRandom(); _predictionResistant = isPredictionResistant; } /** * Return an entropy source that will create bitsRequired bits of entropy on * each invocation of getEntropy(). * * @param bitsRequired size (in bits) of entropy to be created by the provided source. * @return an EntropySource that generates bitsRequired bits of entropy on each call to its getEntropy() method. */ public EntropySource get(final int bitsRequired) { return new EntropySource() { public boolean isPredictionResistant() { return _predictionResistant; } public byte[] getEntropy() { byte[] rv = new byte[(bitsRequired + 7) / 8]; _sr.nextBytes(rv); return rv; } public int entropySize() { return bitsRequired; } }; } }