org.bouncycastle.crypto.prng.ThreadedSeedGenerator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bcprov-ext-debug-jdk18on Show documentation
Show all versions of bcprov-ext-debug-jdk18on Show documentation
The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for Java 1.8 and later with debug enabled.
The newest version!
package org.bouncycastle.crypto.prng;
/**
* A thread based seed generator - one source of randomness.
*
* Based on an idea from Marcus Lippert.
*
*/
public class ThreadedSeedGenerator
{
private static class SeedGenerator
implements Runnable
{
private volatile int counter = 0;
private volatile boolean stop = false;
public void run()
{
while (!this.stop)
{
this.counter++;
}
}
public byte[] generateSeed(
int numbytes,
boolean fast)
{
Thread t = new Thread(this);
byte[] result = new byte[numbytes];
this.counter = 0;
this.stop = false;
int last = 0;
int end;
t.start();
if(fast)
{
end = numbytes;
}
else
{
end = numbytes * 8;
}
for (int i = 0; i < end; i++)
{
while (this.counter == last)
{
try
{
Thread.sleep(1);
}
catch (InterruptedException e)
{
// ignore
}
}
last = this.counter;
if (fast)
{
result[i] = (byte) (last & 0xff);
}
else
{
int bytepos = i/8;
result[bytepos] = (byte) ((result[bytepos] << 1) | (last & 1));
}
}
stop = true;
return result;
}
}
/**
* Generate seed bytes. Set fast to false for best quality.
*
* If fast is set to true, the code should be round about 8 times faster when
* generating a long sequence of random bytes. 20 bytes of random values using
* the fast mode take less than half a second on a Nokia e70. If fast is set to false,
* it takes round about 2500 ms.
*
* @param numBytes the number of bytes to generate
* @param fast true if fast mode should be used
*/
public byte[] generateSeed(
int numBytes,
boolean fast)
{
SeedGenerator gen = new SeedGenerator();
return gen.generateSeed(numBytes, fast);
}
}