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>