package org.bouncycastle.pqc.crypto.ntru;

import java.nio.ByteBuffer;

import org.bouncycastle.crypto.Digest;

An implementation of the deterministic pseudo-random generator in EESS section 3.7.3.1
/** * An implementation of the deterministic pseudo-random generator in EESS section 3.7.3.1 */
public class NTRUSignerPrng { private int counter; private byte[] seed; private Digest hashAlg;
Constructs a new PRNG and seeds it with a byte array.
Params:
  • seed – a seed
  • hashAlg – the hash algorithm to use
/** * Constructs a new PRNG and seeds it with a byte array. * * @param seed a seed * @param hashAlg the hash algorithm to use */
NTRUSignerPrng(byte[] seed, Digest hashAlg) { counter = 0; this.seed = seed; this.hashAlg = hashAlg; }
Returns n random bytes
Params:
  • n – number of bytes to return
Returns:the next n random bytes
/** * Returns <code>n</code> random bytes * * @param n number of bytes to return * @return the next <code>n</code> random bytes */
byte[] nextBytes(int n) { ByteBuffer buf = ByteBuffer.allocate(n); while (buf.hasRemaining()) { ByteBuffer cbuf = ByteBuffer.allocate(seed.length + 4); cbuf.put(seed); cbuf.putInt(counter); byte[] array = cbuf.array(); byte[] hash = new byte[hashAlg.getDigestSize()]; hashAlg.update(array, 0, array.length); hashAlg.doFinal(hash, 0); if (buf.remaining() < hash.length) { buf.put(hash, 0, buf.remaining()); } else { buf.put(hash); } counter++; } return buf.array(); } }