Author: nextgens
Date: 2007-10-21 14:19:15 +0000 (Sun, 21 Oct 2007)
New Revision: 15468

Modified:
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
Log:
Reintroduce the "generate and sign the DH exponents off-thread" patch.

The code is much simpler that way; not as ambitious as the previous one though.
We will renew the DH exponents at most once every 30sec using the ticker.

That should work even for opennet :p

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-10-21 
13:07:09 UTC (rev 15467)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-10-21 
14:19:15 UTC (rev 15468)
@@ -81,7 +81,7 @@
                JFK_PREFIX_RESPONDER = R;
        }

-       /** We renew it every 30mins (the spec. says "once a while") - access 
is synchronized! */
+       /** We renew it every 30sec (the spec. says "once a while") - access is 
synchronized! */
        private DiffieHellmanLightContext currentDHContext = null;
        private long currentDHContextLifetime = 0;

@@ -2431,7 +2431,7 @@
        }

        public int[] supportedNegTypes() {
-               return new int[] { 2, 1 };
+               return new int[] { 1, 2 };
        }

        public int fullHeadersLengthOneMessage() {
@@ -2454,16 +2454,48 @@
                return crypto.config.alwaysAllowLocalAddresses();
        }

+       private DiffieHellmanLightContext _genLightDiffieHellmanContext() {
+               DiffieHellmanLightContext ctx = 
DiffieHellman.generateLightContext();
+               
ctx.setSignature(crypto.sign(SHA256.digest(assembleDHParams(ctx.myExponential, 
crypto.getCryptoGroup()))));
+               
+               return ctx;
+       }
+       
+       /**
+        * Change the DH Exponents on a regular basis but at most once every 
30sec
+        * 
+        * @return {@link DiffieHellmanLightContext}
+        */
        private DiffieHellmanLightContext getLightDiffieHellmanContext() {
                final long now = System.currentTimeMillis();

+               boolean changeDHExponents = false;
+               
                synchronized (this) {
-                       if((currentDHContext == null) || 
(currentDHContextLifetime + 1800000 /*30mins*/) < now) {
+                       if((currentDHContext == null) || 
(currentDHContextLifetime + 30000 /*30sec*/) < now) {
+                               changeDHExponents = true;
                                currentDHContextLifetime = now;
-                               currentDHContext = 
DiffieHellman.generateLightContext();
-                               
currentDHContext.setSignature(crypto.sign(SHA256.digest(assembleDHParams(currentDHContext.myExponential,
 crypto.getCryptoGroup()))));
                        }
                }
+               
+               if(changeDHExponents) {
+                       if(currentDHContext == null) {
+                               Logger.minor(this, "No DH exponent have been 
created; generate the context on-thread!");
+                               // No need to synchronize here as we are 
on-thread
+                               currentDHContext = 
_genLightDiffieHellmanContext();
+                       } else {
+                               // Use the ticket to do it off-thread
+                               node.getTicker().queueTimedJob(new Runnable() {
+                                       public void run() {
+                                               synchronized (this) {
+                                                       currentDHContext = 
_genLightDiffieHellmanContext();
+                                               }
+                                       }
+                               }, 0);
+                               Logger.minor(this, "The DH exponents will been 
renewed soonish");
+                       }
+               }
+               
                return currentDHContext;
        }



Reply via email to