/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.crypt; import java.util.Arrays; import java.security.SecureRandom; import java.security.NoSuchAlgorithmException; import junit.framework.TestCase; import freenet.support.math.MersenneTwister; import freenet.support.Fields; public class CryptUtilTest extends TestCase { public void testRandomBytes() { // two predictable pseudo-random sequence MersenneTwister mt1 = new MersenneTwister(Long.MAX_VALUE); MersenneTwister mt2 = new MersenneTwister(Long.MAX_VALUE); for(int off = 0; off < 15; off++) { for(int len = 0; len < 31; len++) { byte[] b1 = new byte[len]; byte[] b2 = new byte[len + off]; mt1.nextBytes(b1); Util.randomBytes(mt2, b2, off, len); assertTrue("Random offset="+off+" length="+len, Fields.byteArrayEqual(b1, b2, 0, off, len)); } } } public void testSecureRandomBytes() { SecureRandom r1; SecureRandom r2; try { r1 = SecureRandom.getInstance("SHA1PRNG"); r2 = SecureRandom.getInstance("SHA1PRNG"); } catch(NoSuchAlgorithmException e) { System.err.println("Cannot acquire SHA1PRNG, skipping test: "+e); e.printStackTrace(); return; } // SHA1PRNG have repeatable output when seeded try { byte[] seed = "foobar barfoo feedbeef barfeed".getBytes("UTF-8"); r1.setSeed(seed); r2.setSeed(seed); } catch(Throwable e) { throw new Error("Cannot seed SHA1PRNG", e); } // Confirm { byte[] b1 = new byte[128]; byte[] b2 = new byte[128]; r1.nextBytes(b1); r2.nextBytes(b2); if (!Arrays.equals(b1, b2)) { System.err.println("SHA1PRNG is not repeatable despite same seed, skipping test"); return; } } for(int off = 0; off < 15; off++) { for(int len = 0; len < 31; len++) { byte[] b1 = new byte[len]; byte[] b2 = new byte[len + off]; r1.nextBytes(b1); Util.randomBytes(r2, b2, off, len); assertTrue("SecureRandom offset="+off+" length="+len, Fields.byteArrayEqual(b1, b2, 0, off, len)); } } } }