/* See LICENSE for licensing and NOTICE for copyright. */
package org.cryptacular.generator.sp80038a;
import org.bouncycastle.crypto.prng.drbg.SP80090DRBG;
import org.cryptacular.generator.LimitException;
import org.cryptacular.generator.Nonce;
import org.cryptacular.util.NonceUtil;
/**
* Nonce generation strategy that produces a random value according to NIST <a href="http://goo.gl/S9z8qF">
* SP-800-38a</a>, appendix C, method 2 (random number generator), suitable for use with any block cipher mode described
* in that standard except OFB.
*
* <p>Instances of this class are thread safe.</p>
*
* @author Middleware Services
*/
public class RBGNonce implements Nonce
{
/** Length of generated nonces. */
private final int length;
/** Random bit generator. */
private final SP80090DRBG rbg;
/** Creates a new instance that produces 16-bytes (128-bits) of random data. */
public RBGNonce()
{
this(16);
}
/**
* Creates a new instance that produces length bytes of random data.
*
* @param length Number of bytes in generated nonce values.
*/
public RBGNonce(final int length)
{
if (length < 1) {
throw new IllegalArgumentException("Length must be positive");
}
this.length = length;
this.rbg = NonceUtil.newRBG(length);
}
@Override
public byte[] generate()
throws LimitException
{
final byte[] random = new byte[length];
synchronized (rbg) {
rbg.generate(random, null, false);
}
return random;
}
@Override
public int getLength()
{
return length;
}
}