| 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 |
| */ |
| public class NTRUSignerPrng |
| { |
| private int counter; |
| private byte[] seed; |
| private Digest hashAlg; |
| |
| /** |
| * 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 <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(); |
| } |
| } |