package org.bouncycastle.crypto.prng; import java.security.SecureRandom; public class X931SecureRandom extends SecureRandom { private final boolean predictionResistant; private final SecureRandom randomSource; private final X931RNG drbg; X931SecureRandom(SecureRandom randomSource, X931RNG drbg, boolean predictionResistant) { this.randomSource = randomSource; this.drbg = drbg; this.predictionResistant = predictionResistant; } public void setSeed(byte[] seed) { synchronized (this) { if (randomSource != null) { this.randomSource.setSeed(seed); } } } public void setSeed(long seed) { synchronized (this) { // this will happen when SecureRandom() is created if (randomSource != null) { this.randomSource.setSeed(seed); } } } public void nextBytes(byte[] bytes) { synchronized (this) { // check if a reseed is required... if (drbg.generate(bytes, predictionResistant) < 0) { drbg.reseed(); drbg.generate(bytes, predictionResistant); } } } public byte[] generateSeed(int numBytes) { return EntropyUtil.generateSeed(drbg.getEntropySource(), numBytes); } }