This should really be passed in. We can pass in the fastWeakRandom too. We don't want one Yarrow per node in a simulator, and the DiffieHellman init should be global i.e. once only.
On Saturday 21 June 2008 15:04, nextgens at freenetproject.org wrote: > Author: nextgens > Date: 2008-06-21 14:04:42 +0000 (Sat, 21 Jun 2008) > New Revision: 20567 > > Modified: > trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java > trunk/freenet/src/freenet/clients/http/StartupToadlet.java > trunk/freenet/src/freenet/crypt/Yarrow.java > trunk/freenet/src/freenet/node/Node.java > trunk/freenet/src/freenet/node/NodeStarter.java > Log: > untested implementation of bug #229: More entropy issues > > *TESTING IS REQUIRED* > > Modified: trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java > =================================================================== > --- trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java 2008-06-21 13:33:00 UTC (rev 20566) > +++ trunk/freenet/src/freenet/clients/http/SimpleToadletServer.java 2008-06-21 14:04:42 UTC (rev 20567) > @@ -465,10 +465,12 @@ > > } > > - private StartupToadlet startupToadlet; > + public StartupToadlet startupToadlet; > > public void removeStartupToadlet() { > unregister(startupToadlet); > + // Ready to be GCed > + startupToadlet = null; > // Not in the navbar. > } > > @@ -520,6 +522,10 @@ > } > } > > + public StartupToadlet getStartupToadlet() { > + return startupToadlet; > + } > + > public Toadlet findToadlet(URI uri) throws PermanentRedirectException { > Iterator i = toadlets.iterator(); > String path = uri.getPath(); > > Modified: trunk/freenet/src/freenet/clients/http/StartupToadlet.java > =================================================================== > --- trunk/freenet/src/freenet/clients/http/StartupToadlet.java > 2008-06-21 13:33:00 UTC (rev 20566) > +++ trunk/freenet/src/freenet/clients/http/StartupToadlet.java > 2008-06-21 14:04:42 UTC (rev 20567) > @@ -9,9 +9,10 @@ > /** > * Toadlet for "Freenet is starting up" page. > */ > -class StartupToadlet extends Toadlet { > +public class StartupToadlet extends Toadlet { > > private StaticToadlet staticToadlet; > + private volatile boolean isPRNGReady = false; > > public StartupToadlet(StaticToadlet staticToadlet) { > super(null); > @@ -31,12 +32,19 @@ > HTMLNode headNode = ctx.getPageMaker().getHeadNode(pageNode); > headNode.addChild("meta", new String[] {"http-equiv", "content"}, new String[]{"refresh", "20; url="}); > HTMLNode contentNode = ctx.getPageMaker().getContentNode(pageNode); > + > + if(!isPRNGReady) { > + HTMLNode prngInfobox = contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", desc)); > + HTMLNode prngInfoboxContent = ctx.getPageMaker().getContentNode(prngInfobox); > + prngInfoboxContent.addChild("#", "There isn't enough > entropy available on your system... Freenet won't start until it can gather enough."); > + } > > HTMLNode infobox = contentNode.addChild(ctx.getPageMaker().getInfobox("infobox-error", desc)); > HTMLNode infoboxContent = ctx.getPageMaker().getContentNode(infobox); > infoboxContent.addChild("#", "Your freenet node is starting up, please hold on."); > > WelcomeToadlet.maybeDisplayWrapperLogfile(ctx, contentNode); > + > //TODO: send a Retry-After header ? > writeHTMLReply(ctx, 503, desc, pageNode.generate()); > } > @@ -45,4 +53,8 @@ > public String supportedMethods() { > return "GET"; > } > + > + public void setIsPRNGReady() { > + isPRNGReady = true; > + } > } > \ No newline at end of file > > Modified: trunk/freenet/src/freenet/crypt/Yarrow.java > =================================================================== > --- trunk/freenet/src/freenet/crypt/Yarrow.java 2008-06-21 13:33:00 UTC > (rev 20566) > +++ trunk/freenet/src/freenet/crypt/Yarrow.java 2008-06-21 14:04:42 UTC > (rev 20567) > @@ -85,7 +85,7 @@ > throw new RuntimeException("Cannot initialize Yarrow!: "+e, e); > } > entropy_init(seed); > - seedFromExternalStuff(false); > + seedFromExternalStuff(true); > if (updateSeed && !(seed.toString()).equals("/dev/urandom")) > //Dont try to update the seedfile if we know that it wont be possible anyways > seedfile = seed; > else > > Modified: trunk/freenet/src/freenet/node/Node.java > =================================================================== > --- trunk/freenet/src/freenet/node/Node.java 2008-06-21 13:33:00 UTC (rev 20566) > +++ trunk/freenet/src/freenet/node/Node.java 2008-06-21 14:04:42 UTC (rev 20567) > @@ -33,6 +33,7 @@ > > import freenet.client.FetchContext; > import freenet.clients.http.SimpleToadletServer; > +import freenet.clients.http.StartupToadlet; > import freenet.config.EnumerableOptionCallback; > import freenet.config.FreenetFilePersistentConfig; > import freenet.config.InvalidConfigValueException; > @@ -40,6 +41,7 @@ > import freenet.config.PersistentConfig; > import freenet.config.SubConfig; > import freenet.crypt.DSAPublicKey; > +import freenet.crypt.DiffieHellman; > import freenet.crypt.RandomSource; > import freenet.crypt.SHA256; > import freenet.crypt.Yarrow; > @@ -118,6 +120,7 @@ > import freenet.support.io.FileUtil; > import freenet.support.io.NativeThread; > import freenet.support.transport.ip.HostnameSyntaxException; > +import java.net.URI; > > /** > * @author amphibian > @@ -604,11 +607,11 @@ > * @param config The Config object for this node. > * @param random The random number generator for this node. Passed in because we may want > * to use a non-secure RNG for e.g. one-JVM live-code simulations. > Should be a Yarrow in > - * a production node. > + * a production node. Yarrow will be used if that parameter is null > * @param the loggingHandler > * @throws NodeInitException If the node initialization fails. > */ > - Node(PersistentConfig config, RandomSource random, > LoggingConfigHandler lc, NodeStarter ns, Executor executor) throws NodeInitException { > + Node(PersistentConfig config, RandomSource r, LoggingConfigHandler lc, NodeStarter ns, Executor executor) throws NodeInitException { > // Easy stuff > logMINOR = Logger.shouldLog(Logger.MINOR, this); > String tmp = "Initializing Node using Freenet Build #"+Version.buildNumber()+" r"+Version.cvsRevision+" and freenet-ext Build #"+NodeStarter.extBuildNumber+" r"+NodeStarter.extRevisionNumber+" with "+System.getProperty("java.vendor")+" JVM version "+System.getProperty("java.version")+" running on "+System.getProperty("os.arch")+' '+System.getProperty("os.name")+' '+System.getProperty("os.version"); > @@ -629,7 +632,6 @@ > > // FProxy config needs to be here too > SubConfig fproxyConfig = new SubConfig("fproxy", config); > - > try { > toadlets = new SimpleToadletServer(fproxyConfig, new ArrayBucketFactory(), executor); > fproxyConfig.finishedInitialization(); > @@ -644,14 +646,18 @@ > e4.printStackTrace(); > throw new NodeInitException(NodeInitException.EXIT_COULD_NOT_START_FPROXY, "Could not start FProxy: "+e4); > } > - > + > + // Setup RNG if needed : DO NOT USE IT BEFORE THAT POINT! > + this.random = (r == null ? new Yarrow() : r); > + DiffieHellman.init(random); > + byte buffer[] = new byte[16]; > + random.nextBytes(buffer); > + this.fastWeakRandom = new MersenneTwister(buffer); > + toadlets.getStartupToadlet().setIsPRNGReady(); > + > nodeNameUserAlert = new MeaningfulNodeNameUserAlert(this); > recentlyCompletedIDs = new LRUQueue(); > this.config = config; > - this.random = random; > - byte buffer[] = new byte[16]; > - random.nextBytes(buffer); > - this.fastWeakRandom = new MersenneTwister(buffer); > cachedPubKeys = new LRUHashtable(); > lm = new LocationManager(random, this); > > > Modified: trunk/freenet/src/freenet/node/NodeStarter.java > =================================================================== > --- trunk/freenet/src/freenet/node/NodeStarter.java 2008-06-21 13:33:00 UTC (rev 20566) > +++ trunk/freenet/src/freenet/node/NodeStarter.java 2008-06-21 14:04:42 UTC (rev 20567) > @@ -113,11 +113,6 @@ > // Prevent timeouts for a while. The DiffieHellman init for > example could take some time on a very slow system. > WrapperManager.signalStarting(500000); > > - // Setup RNG > - RandomSource random = new Yarrow(); > - > - DiffieHellman.init(random); > - > // Thread to keep the node up. > // JVM deadlocks losing a lock when two threads of different > types (daemon|app) > // are contended for the same lock. So make USM daemon, and use > useless to keep the JVM > @@ -154,7 +149,7 @@ > SSL.init(sslConfig); > > try { > - node = new Node(cfg, random, logConfigHandler, this, > executor); > + node = new Node(cfg, null, logConfigHandler, this, > executor); > node.start(false); > System.out.println("Node initialization completed."); > } catch(NodeInitException e) { > > _______________________________________________ > cvs mailing list > cvs at freenetproject.org > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs > > -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: application/pgp-signature Size: 189 bytes Desc: not available URL: <https://emu.freenetproject.org/pipermail/devl/attachments/20080730/612b4398/attachment.pgp>