org.bouncycastle.crypto.prng.ReversedWindowGenerator 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;
/**
* Takes bytes generated by an underling RandomGenerator and reverses the order in
* each small window (of configurable size).
*
* Access to internals is synchronized so a single one of these can be shared.
*
*/
public class ReversedWindowGenerator
implements RandomGenerator
{
private final RandomGenerator generator;
private byte[] window;
private int windowCount;
public ReversedWindowGenerator(
RandomGenerator generator,
int windowSize)
{
if (generator == null)
{
throw new IllegalArgumentException("generator cannot be null");
}
if (windowSize < 2)
{
throw new IllegalArgumentException("windowSize must be at least 2");
}
this.generator = generator;
this.window = new byte[windowSize];
}
/**
* Add more seed material to the generator.
*
* @param seed a byte array to be mixed into the generator's state.
*/
public void addSeedMaterial(
byte[] seed)
{
synchronized (this)
{
windowCount = 0;
generator.addSeedMaterial(seed);
}
}
/**
* Add more seed material to the generator.
*
* @param seed a long value to be mixed into the generator's state.
*/
public void addSeedMaterial(
long seed)
{
synchronized (this)
{
windowCount = 0;
generator.addSeedMaterial(seed);
}
}
/**
* Fill bytes with random values.
*
* @param bytes byte array to be filled.
*/
public void nextBytes(
byte[] bytes)
{
doNextBytes(bytes, 0, bytes.length);
}
/**
* Fill part of bytes with random values.
*
* @param bytes byte array to be filled.
* @param start index to start filling at.
* @param len length of segment to fill.
*/
public void nextBytes(
byte[] bytes,
int start,
int len)
{
doNextBytes(bytes, start, len);
}
private void doNextBytes(
byte[] bytes,
int start,
int len)
{
synchronized (this)
{
int done = 0;
while (done < len)
{
if (windowCount < 1)
{
generator.nextBytes(window, 0, window.length);
windowCount = window.length;
}
bytes[start + done++] = window[--windowCount];
}
}
}
}