Package net.i2p.util

Class FortunaRandomSource

All Implemented Interfaces:
Serializable, java.util.random.RandomGenerator, EntropyHarvester

public class FortunaRandomSource extends RandomSource implements EntropyHarvester
Wrapper around GNU-Crypto's Fortuna PRNG. This seeds from /dev/urandom and ./prngseed.rnd on startup (if they exist), writing a new seed to ./prngseed.rnd on an explicit call to saveSeed().
See Also:
  • Constructor Details

    • FortunaRandomSource

      public FortunaRandomSource(I2PAppContext context)
      May block up to 10 seconds or forever
  • Method Details

    • shutdown

      public void shutdown()
      Note - methods may hang or NPE or throw IllegalStateExceptions after this
      Since:
      0.8.8
    • setSeed

      public void setSeed(byte[] buf)
      Overrides:
      setSeed in class SecureRandom
    • nextInt

      public int nextInt(int n)
      According to the java docs (http://java.sun.com/j2se/1.4.1/docs/api/java/util/Random.html#nextInt(int)) nextInt(n) should return a number between 0 and n (including 0 and excluding n). However, their pseudocode, as well as sun's, kaffe's, and classpath's implementation INCLUDES NEGATIVE VALUES. Ok, so we're going to have it return between 0 and n (including 0, excluding n), since thats what it has been used for. Unlike Java's Random, which throws IAE, this returns 0 if n is 0.
      Specified by:
      nextInt in interface java.util.random.RandomGenerator
      Overrides:
      nextInt in class RandomSource
      Parameters:
      n - non-negative
      Throws:
      IllegalArgumentException - if n is negative
    • nextInt

      public int nextInt()
      Specified by:
      nextInt in interface java.util.random.RandomGenerator
      Overrides:
      nextInt in class Random
    • signedNextInt

      public int signedNextInt()
      Description copied from class: RandomSource
      This code unused, see FortunaRandomSource override
      Overrides:
      signedNextInt in class RandomSource
      Returns:
      all possible int values, positive and negative
      Since:
      0.9.54
    • nextLong

      public long nextLong(long n)
      Like the modified nextInt, nextLong(n) returns a random number from 0 through n, including 0, excluding n. Unlike Java's Random, which throws IAE, this returns 0 if n is 0.
      Specified by:
      nextLong in interface java.util.random.RandomGenerator
      Overrides:
      nextLong in class RandomSource
      Parameters:
      n - non-negative
      Throws:
      IllegalArgumentException - if n is negative
    • nextLong

      public long nextLong()
      Specified by:
      nextLong in interface java.util.random.RandomGenerator
      Overrides:
      nextLong in class Random
      Returns:
      all possible long values, positive and negative
    • nextBoolean

      public boolean nextBoolean()
      Specified by:
      nextBoolean in interface java.util.random.RandomGenerator
      Overrides:
      nextBoolean in class Random
    • nextBytes

      public void nextBytes(byte[] buf)
      Specified by:
      nextBytes in interface java.util.random.RandomGenerator
      Overrides:
      nextBytes in class SecureRandom
    • nextBytes

      public void nextBytes(byte[] buf, int offset, int length)
      Not part of java.util.SecureRandom, but added for efficiency, since Fortuna supports it.
      Overrides:
      nextBytes in class RandomSource
      Since:
      0.8.12
    • nextByte

      public byte nextByte()
      Not part of java.util.SecureRandom, but added for efficiency, since Fortuna supports it.
      Since:
      0.9.24
    • nextDouble

      public double nextDouble()
      Implementation from sun's java.util.Random javadocs
      Specified by:
      nextDouble in interface java.util.random.RandomGenerator
      Overrides:
      nextDouble in class Random
    • nextFloat

      public float nextFloat()
      Implementation from sun's java.util.Random javadocs
      Specified by:
      nextFloat in interface java.util.random.RandomGenerator
      Overrides:
      nextFloat in class Random
    • nextGaussian

      public double nextGaussian()
      Implementation from sun's java.util.Random javadocs
      Specified by:
      nextGaussian in interface java.util.random.RandomGenerator
      Overrides:
      nextGaussian in class Random
    • nextBits

      protected int nextBits(int numBits)
      Pull the next numBits of random data off the fortuna instance (returning 0 through 2^numBits-1 Caller must synchronize!
    • feedEntropy

      public void feedEntropy(String source, long data, int bitoffset, int bits)
      reseed the fortuna
      Specified by:
      feedEntropy in interface EntropyHarvester
      Overrides:
      feedEntropy in class RandomSource
      Parameters:
      source - origin of the entropy, allowing the harvester to determine how much to value the data
      bitoffset - bit index into the data array to start (using java standard big-endian)
      bits - how many bits to use
    • feedEntropy

      public void feedEntropy(String source, byte[] data, int offset, int len)
      reseed the fortuna
      Specified by:
      feedEntropy in interface EntropyHarvester
      Overrides:
      feedEntropy in class RandomSource
      Parameters:
      source - origin of the entropy, allowing the harvester to determine how much to value the data
      offset - index into the data array to start
      len - how many bytes to use
    • main

      public static void main(String[] args)
      Outputs to stdout for dieharder: java -cp build/i2p.jar net.i2p.util.FortunaRandomSource | dieharder -a -g 200