All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fitbur.bouncycastle.crypto.prng.ThreadedSeedGenerator Maven / Gradle / Ivy

There is a newer version: 1.0.0
Show newest version
package com.fitbur.bouncycastle.crypto.prng;

/**
 * A thread based seed generator - one source of randomness.
 * 

* Based on an idea from Marcus Lippert. *

*/ public class ThreadedSeedGenerator { private 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); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy