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>

Reply via email to